лабы салапура / ООП ЛАБА 2
.docxМинистерство образования Республики Беларусь
Министерство образования Республики Беларусь
БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ
Кафедра эконмической информатики
Объектно-ориентированное программирование
Лабораторная работа №2
“ ОРГАНИЗАЦИЯ ВВОДА/ВЫВОДА,
ДИНАМИЧЕСКОЕ ВЫДЕЛЕНИЕ ПАМЯТИ В ЯЗЫКЕ С++ ”
Вариант 16
Выполнила: Студентка группы
972303
Рушева Маргарита
Владиславовна
Проверила: Григорьева Юлия
Юрьевна
Минск, 2020
1 ЦЕЛЬ ЛАБОРАТОРНОЙ РАБОТЫ
Изучить организацию ввода/вывода данных и работу с динамической памятью при программировании алгоритмов на языке С++
2 ТЕОРИЯ ПО ЛАБОРАТОРНОЙ РАБОТЕ
ВВОД/ВЫВОД ДАННЫХ
В языке С++ ввод и вывод данных производится потоками байт. Поток (stream) – общий логический интерфейс с различными устройствами, составляющими компьютер и подключаемые к нему. При операциях ввода байты направляются от устройства в основную память (т. е. поток потребляет информацию). В операциях вывода – наоборот. Существует два типа потоков: текстовый и бинарный. Текстовый поток используется для ввода-вывода символов. При этом могут происходить некоторые преобразования символов. Двоичный поток можно использовать с данными любого типа, при этом преобразования символов не выполняется. В языке С++ имеется четыре встроенных потока (связанных с ними объекта), обеспечивающих ввод и вывод информации и определенных в заголовочном файле iostream (Input/Output Stream, «поток ввода-вывода»). В файле iostream используются объекты, которые являются частью стандартной библиотеки C++ и частью стандартного пространства имён
— std: cout//стандартный поток вывода (экран),
cin//стандартный поток ввода (клавиатура),
cerr//стандартный поток диагностики (ошибки) без буферизации,
clog//стандартный поток диагностики (ошибки) с буферизацией.
ОБЪЕКТЫ CIN, COUT
Для ввода информации с клавиатуры используется объект cin. Формат работы с объектом cin имеет следующий вид:
cin [>>имя_переменной];
Объект cout позволяет выводить информацию на стандартное устройство вывода – экран. Формат работы с объектом cout имеет следующий вид:
сout<< data [ <<data];
Где data − это переменные, константы, выражения или комбинации всех трех типов.
Идентификатор endl называется манипулятором. Он очищает поток и добавляет новую строку. Для управления выводом информации в языке С++ используются манипуляторы. Манипуляторы позволяют встраивать инструкции форматирования в выражение ввода-вывода. Для использования манипуляторов необходим заголовочный файл iomanip. Манипуляторы изменяют значение некоторых переменных в объекте cout. Эти переменные называются флагами состояния. Когда объект посылает данные на экран, он проверяет эти флаги и в соответствии с их значениями изменяет своё состояние. Наряду с перечисленными выше манипуляторами в языке С++ используются также манипуляторы
T2 setiosflags(ios_base::fmtflags mask);
T1 resetiosflags(ios_base::fmtflags mask);
Для установки глобальных флагов, используемых при вводе и выводе информации. На эти флаги ссылаются как на переменные состояния.
СОЗДАНИЕ СОБСТВЕННЫХ МАНИПУЛЯТОРНЫХ ФУНКЦИЙ
Существует два типа манипуляторных функций: принимающие и не принимающие аргументы. Несмотря на то, что манипулятор принимает в качестве единственного аргумента указатель на поток, который он обрабатывает, при использовании манипулятора в результирующем выражении ввода/вывода аргументы не указываются вообще. Собственные манипуляторы полезны, во-первых, когда возникает необходимость выполнять операции ввода-вывода с использованием устройства, к которому ни один из встроенных манипуляторов не применяется.
ДИНАМИЧЕСКОЕ РАСПРЕДЕЛЕНИЕ ПАМЯТИ
Память можно выделять динамически, т.е. размещать в свободной памяти (free store). Свободная память – это предоставляемая системой область памяти для объектов, время жизни которых устанавливается программистом. В С++ для операций выделения и освобождения памяти используются встроенные операторы new и delete. Оператор delete уничтожает объект, созданный с помощью оператора new. Оператор delete имеет две формы записи:
[::] delete переменная_указатель// для указателя на один элемент
[::] delete [] переменная_указатель//для указателя на массив
Если не освободить зарезервированную память после прекращения ее использования, то она так и останется зарезервированной для приложения даже после его завершения. Это в свою очередь, сократит объем системной памяти, доступной для использования другими приложениями, а возможно, даже замедлит выполнение приложений. Это называется утечкой памяти, и ее следует избегать.
3 ИНДИВИДУАЛЬНОЕ ЗАДАНИЕ
Создать класс Array для работы с двумерными массивами (как целочисленными, так и дробными). Найти сумму отрицательных элементов массива, вывести на экран этот массив в обратном порядке. Память под массив выделять динамически. Размер массива указывает пользователь. Необходимо обязательно освобождать память, выделенную под массив. Написать свой манипулятор, выводящий содержимое массива в табличном виде.
4 КОД РЕШЕНИЯ ИНДИВИДУАЛЬНОГО ЗАДАНИЯ
“Array.cpp”
#include "pch.h"
#include "Array.h"
#include <iostream>
#include <iomanip>
using namespace std;
Array::Array(int n, int m)
{
this->n = n;
this->m = m;
this->a = new double* [n];
for (int i = 0; i < n; i++)
this->a[i] = new double[m];
cout << "Введите элементы массива" << endl;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> a[i][j];
}
double Array::sum()
{
double sum = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (a[i][j] < 0)
sum += a[i][j];
return sum;
}
void Array::print()
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cout << setw(7);
cout << setprecision(2);
cout << a[i][j];
}
cout << endl;
}
}
void Array::reverse()
{
for (int i = n - 1; i >= 0; i--)
{
for (int j = m - 1; j >= 0; j--)
{
cout << setw(7);
cout << setprecision(2);
cout << a[i][j];
}
cout << endl;
}
}
Array::~Array()
{
for (int i = 0; i < n; i++)
delete[] a[i];
delete[] a;
}
“Array.h”
#pragma once
#ifndef PCH_H
#define PCH_H
#endif //PCH_H
“ConsoleApplication.cpp”
#include "pch.h"
#include <iostream>
#include <windows.h>
#include "Array.h"
using namespace std;
int main()
{
while (1)
{
int q;
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int n, m;
cout << "Введите размерность массива" << endl;
cin >> n >> m;
Array x(n, m);
cout << "Исходный массив" << endl;
x.print();
cout << "Сумма отрицательныэ элементов " << x.sum() << endl;
cout << "Массив в обратном порядке" << endl;
x.reverse();
cout << "Хотите продолжить ввод данных?" << endl;
cout << "1 - да" << endl;
cout << "2 - нет, выйти" << endl;
cout << "Ваш выбор:" << endl;
cin >> q;
if (q == 1)
{
continue;
}
else if (q==2)
{
break;
}
}
return 0;
}
“pch.cpp”
// нужен для компиляции
#include "pch.h"
“pch.h”
#pragma once
class Array
{
private:
int n, m;
double** a;
public:
Array(int n, int m);
~Array();
double sum();
void print();
void reverse();
};
5 СКРИНШОТЫ ВЫПОЛНЕНИЯ ИНДИВИДУАЛЬНОГО ЗАДАНИЯ
Рисунок 5.1 – Ввод размерность массива
Рисунок 5.2 – Ввод элементов массива
Рисунок 5.3 – Вывод исходного массива, подсчет суммы отрицательных элементов и вывод массива в обратном порядке
ВЫВОДЫ
В ходе выполнения лабораторной работы была изучена организация ввода/вывода данных. Работа над лабораторной работой позволила научится работать с динамической памятью при программировании алгоритмов на языке C++, работать с манипуляторами. Была разработана программа с использованием новых понятий, изученных в лабораторной работе.