Академический Документы
Профессиональный Документы
Культура Документы
Лабораторная работа №2
«Организация ввода/вывода, динамическое выделение
памяти в языке С++»
Вариант 12
Минск 2021
Цель работы: изучить организацию ввода/вывода данных и работу с
динамической памятью при программировании алгоритмов на языке С++.
Теоретические сведения:
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"
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;