Вы находитесь на странице: 1из 6

Министерство образования Республики Беларусь

БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ


ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ
Кафедра экономической информатики
Инженерно-экономический факультет

Лабораторная работа №2
«Организация ввода/вывода, динамическое выделение
памяти в языке С++»
Вариант 12

Выполнил: студент группы 073603


Леванович М.А.

Проверил: старший преподаватель


кафедры ЭИ
Салапура М.Н.

Минск 2021
Цель работы: изучить организацию ввода/вывода данных и работу с
динамической памятью при программировании алгоритмов на языке С++.

Теоретические сведения:

В языке С++ ввод и вывод данных производится потоками байт. Поток


(последовательность байт) − это логическое устройство (интерфейс), которое
выдает и принимает информацию от/к пользователя(ю) и связано с
физическими устройствами ввода/вывода (файл, экран, клавиатура, сетевой
порт). Существует два типа потоков: текстовый и бинарный. Текстовый
поток используется для ввода-вывода символов.
Для управления выводом информации в языке С++ используются
манипуляторы. Манипуляторы позволяют встраивать инструкции
форматирования в выражение ввода-вывода. Для использования
манипуляторов необходим заголовочный файл iomanip.
В С++ для операций выделения и освобождения памяти используются
встроенные операторы new и delete, calloc, malloc,realloc.
Оператор new только запрашивает область памяти. Нет никакой
гарантии, что запрос всегда будет удовлетворен успешно, поскольку это
зависит от состояния системы и доступности ресурсов памяти. Оператор new
запрашивает надлежащий объем св+ободной памяти для хранения
указанного типа и возвращает базовый адрес объекта. Когда память
недоступна, оператор new возвращает NULL либо возбуждает (throw)
соответствующее исключение (типа std::bad_alloc)
Индивидуальное задание: Создать класс Array для работы с
двумерными массивами (как целочисленными, так и дробными). Составить
программу, выводящую на экран квадраты чисел от 10 до 20 включительно.
Для дробных чисел выбрать шаг 0,5. Память под массив выделять
динамически. Размер массива указывает пользователь. Необходимо
обязательно освобождать память, выделенную под массив. Написать свой
манипулятор, выводящий содержимое массива в табличном виде

Header.h
#include <windows.h>
#include<iostream>
#include<iomanip>
#include<math.h>
using namespace std;

class Array {
public:
float** arr;
int n;
int m;
Array();
~Array();
void input();
void output();
void Output_end();
};

Main.cpp
#include"Header.h"

int main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
Array a;
a.input();
a.output();
a.Output_end();
return 0;

Array.cpp
#include"Header.h"

ostream& table(ostream& stream) {


stream.setf(ios::left);
stream << setw(4) << setfill(' ') << " |";
return stream;
}

Array::Array() : arr(0), n(0), m(0) {}

Array::~Array() {
for (int i = 0; i < n; i++)
delete[] arr[i];
delete[] arr;
cout << "Матрица удалена" << endl;
}

void Array::input() {
cout << "Введите количество строк и столбцов" << endl;
cin >> n;
cin >> m;
arr = new float* [n];
float k = 0;
for (int j = 0; j < n; j++) arr[j] = new float[m];
for (int j = 0; j < m; j++) {
for (int i = 0; i < n; i++) {
arr[i][j] = 10 + k;
k += 0.5;
}
}
}

void Array::output() {
cout << "Исходная матрица" << endl;
for (int j = 0; j < m; j++) {
cout << endl;
// for (int k = 0; k < m; k++)
// cout << "_";
for (int i = 0; i < n; i++) {
cout << table << arr[i][j];
cout << "|";
}
}
cout << endl;
}

void Array::Output_end() {
float k = 0;
cout << "Результат" << endl;
for (int j = 0; j < m; j++) {
cout << endl;
for (int i = 0; i < n; i++) {
arr[i][j] = pow(10 + k,2);
k += 0.5;
cout << table << arr[i][j];
cout << "|";
}
}
cout << endl;
}

рисунок 1

Вывод: в результате выполнения лабораторной работы я изучил


организацию ввода/вывода данных и работу с динамической памятью при
программировании алгоритмов на языке С++. Написал свой табличный
манипулятор, повторил принципы работы с динамическим выделением
памяти.

Контрольные вопросы:
1. Ввод/вывод данных в языке С++ осуществляется потоками байт. Поток
байт – − это логическое устройство (интерфейс), которое выдает и
принимает информацию от/к пользователя(ю) и связано с физическими
устройствами ввода и вывода. Описание объектов для
управления вводом-выводом содержится в файле iostream.h.
Создаются так называемые виртуальные каналы связи cin для ввода с
клавиатуры и cout для вывода на экран, а также операции помещения в
поток << (поместить в выходной поток) и чтения из потока >> (считать
из входного потока ) – операторы побитового сдвига.
2. Манипулятор — объект особого типа, который управляет
потоками ввода/вывода, для форматирования передаваемой в потоки
информации.
3. Можно создавать собственные манипуляторы двух типов:
принимающие и не принимающие параметры. Манипулятор принимает
в качестве единственного аргумента указатель на поток, который
обрабатывает. И возвращает значение return stream.
4. Оператор new – оператор, обеспечивающий выделение
динамической памяти в куче. New пытается выделить достаточно
памяти в куче для размещения новых данных и, в случае успеха,
возвращает адрес выделенного участка памяти.
Оператор delete – уничтожает объект, созданный с помощью оператора
new.
Функция malloc() возвращает адрес на первый байт области памяти
размером size байт, которая была выделена из кучи. Если памяти
недостаточно, чтобы удовлетворить запрос,
функция malloc() возвращает нулевой указатель.
calloc выделяет память под массив данных, предварительно
инициализируя её нулями. принимает 2 аргумента.
malloc выделяет память без инициализации. принимает один аргумент.
Функция realloc() изменяет величину выделенной памяти, на которую
указывает ptr, на новую величину, задаваемую параметром newsize.
Отсновные отличия new от malloc/calloc состоят в том, что new
вызывает конструктор оьбъекта и может быть перегружен.
5. Для одномерного массива:
int *arr;
arr = new float[size]; delete[] arr;
Для двумерного массива:
int **arr;
arr = new float* [n];
for (int j = 0; j < n; j++) arr[j] = new float[m];
for (int i = 0; i < n; i++)
delete[] arr[i];
delete[] arr;

6. Если не освободить зарезервированную память после прекращения ее


использования, то она так и останется зарезервированной для
приложения даже после его завершения. Это в свою очередь, сократит
объем системной памяти, доступной для использования другими
приложениями, а возможно, даже замедлит выполнение приложений.
Это называется утечкой памяти, и ее следует избегать.
7. cerr – стандартный поток диагностики (ошибки) без буферизации
(поток вывода сообщений об ошибках).
clog – стандартный поток диагностики (ошибки) с буферизацией.
8. Setiosflags устанавливает указанные флаги (параметр mask), а
resetiosflags() сбрасывает (очищает) их.