Скачиваний:
25
Добавлен:
28.03.2021
Размер:
53.28 Кб
Скачать

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

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

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

ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ

Кафедра эконмической информатики

Объектно-ориентированное программирование

Лабораторная работа №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++, работать с манипуляторами. Была разработана программа с использованием новых понятий, изученных в лабораторной работе.

Соседние файлы в папке лабы салапура