Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
48
Добавлен:
08.12.2019
Размер:
438.67 Кб
Скачать

Минобрнауки РФ

Санкт-Петербургский государственный электротехнический университет

им. В.И. Ульянова (Ленина) «ЛЭТИ»

(СПбГЭТУ)

Факультет компьютерных технологий и информатики

Кафедра САПР

ОТЧЁТ

По лабораторной работе №5

«Двумерные массивы»

Преподаватель: ______________________ Калмычков В. А.

Студент гр. 8309: ______________________ Янтиков Д. А.

Санкт-Петербург

2018

Оглавление

Формулировка задания 3

Цель работы 3

Анализ задания и контрольный пример 3

Математическая постановка задачи 4

Блок – схемы 5

Текст программы 9

Примеры работы программы 12

Вывод 14

Формулировка задания

Написать программу, находящую наибольший элемент заштрихованной области таблицы A размера N*N.

M

X

X

X

X

X

X

X

X

X

X

X

X

X


Цель работы

Научиться обрабатывать двумерные массивы и разбивать программу на функции при написании программ разного вида.

Анализ задания и контрольный пример

При M = 3 и K = 3, элементы находящиеся в заштрихованной зоне (выделены красным):

1

2

3

4

5

1

7

8

9

10

11

12

13

14

15

16

17

18

190

20

2100

2200

23

24

56

26

27

28

29

387

31

32

33

34

35

36

37

38

39

40

41

42

430

44

4500

25

47

48

49



Наибольший элемент матрицы равен 4500.

Математическая постановка задачи

Дано: Двумерный массив N*N заданный в файле ввода in.txt и макет матрицы с заштрихованной областью.

Найти: Наибольший элемент заштрихованной области.

Способ решения: Производить проверку элементов по диагонали, горизонтали и вертикали, учитывая контрольную точку, и поочередно запоминать наибольший найденный элемент.

Организация диалога с пользователем: После запуска программа выводит приветствие и условие задания. После проведения операций обработки массива программа предлагает пользователю пройти в файл вывода out.txt.

Определение внутреннего формата представления данных:

Программа разбита на 4 функции: void input, int process, string output и int main.

  • Void input

Функция считывания массива из файла. Переменная b – типа char, используемая для посимвольного считывания массива из файла. Также в функцию передаются аргументы int c, и указатель *p.

  • Int process

Функция, проводящая все необходимые действия со считанным массивом и находящая его максимальный элемент. В функции используются переменные v и z типа int, необходимые для совершения действий. Также в функции используются переменные m, k, x типа int const. В функцию передается значение аргумента max типа int и указатель *p.

  • String output

Функция вывода полученного результата в файл вывода. Функция содержит все вышеперечисленные аргументы.

  • Int main

В данной функции мы определяем переменные i, j, x, k, m типа int. Также мы задаем указатель на массив A[N][N], где переменная N = 20 и представлена типом const int. Также в функции int main мы обращаемся к функциям input и output. В int main также выводится приветствие и условие задания.

Описание алгоритма:

  • Void input

В данной функции мы считываем матрицу, заданную пользователем из файла in.txt, при успешном открытии файла. Данное действие представлено двойным циклом и условием пропуска пробелов и отслеживания окончания файла.

  • Int process

Функция выполняется сравнение необходимых элементов матрицы сначала по диагонали, горизонтали, и затем по вертикали. Также функция выводит промежуточные значения максимальных элементов, найденные при каждой из проверок.

  • String output

Данная функция выводит количество столбцов и строк в считанном массиве (переменная x). Затем выводятся элементы массива, после чего мы обращаемся к функции process для вывода найденного максимального элемента заштрихованной области.

  • Int main

Функция выводит приветствие и условие задания, затем проверяет считанные переменные x, k и m на корректность. После чего обращается к функциям input и output.

Блок – схемы

  • Void input

  • Int process

  • String output

  • Int main

Текст программы

#include "pch.h"

#include <iostream>

#include <fstream>

#include <string>

using namespace std;

void input(int c, int *p, fstream &g)

{

char b;

setlocale(LC_ALL, "Russian");

for (int i = 0; i < c; i++) {

for (int j = 0; j < c; j++)

{

g >> *(p + c * i + j);

}

b = 0;

while (b != '\n' && !g.eof())

{

b = g.get();

}

}

}

int process(int *p, int const k, int const m, int const x, int &max, fstream &f)

{

setlocale(LC_ALL, "Russian");

int v = 0; int z = 0;

f << "Промежуточные вычисления значения максимального элемента массива\n";

max = *(p + x * (m - 1) + (k - 1));

f << max << endl;

for (int i = m - 1, j = k - 1; i > -1 && j < x; i--, j++)

{

v = i;

z = j;

}

for (int i = v, j = z; i < x && j > -1; i++, j--)

{

if ((m - 1 > i && k - 1 < j) && *(p + i * x + j) > max)

{

max = *(p + i * x + j);

f << max << endl;

}

if ((m - 1 < i && k - 1 > j) && *(p + i * x + j) > max)

{

max = *(p + i * x + j);

f << max << endl;

}

}

for (int i = m - 1; i < x; i++)

{

for (int j = k - 1; j < x; j++)

{

if (*(p + x * (m - 1) + j) > max)

{

max = *(p + i * x + j);

f << max << endl;

}

if (*(p + x * i + (k - 1)) > max)

{

max = *(p + i * x + j);

f << max << endl;

}

}

}

return max;

}

string output(int *p, int max, fstream &f, int const x, int const k, int const m)

{

setlocale(LC_ALL, "Russian");

f << "Длинна и ширина исходного массива: " << x << endl;

f << "Его элементы:\n";

for (int i = 0; i < x; i++) {

for (int j = 0; j < x; j++)

{

f << *(p + i * x + j);

f << ' ';

}

f << "\n";

}

max = process(p, k, m, x, max, f);

f << "Его наибольший элемент среди заштрихованной области равен: " << max;

return "См. выходной файл";

}

int main()

{

setlocale(LC_ALL, "Russian");

int i, j, x, k, m;

const int N = 20;

int *p;

int max;

fstream f;

string s;

max = 0;

cout << "Янтиков Даниил Александрович 8309\n";

cout << "Версия: 5.1.1 Дата: начало(23.10.18) конец(29.10.18)\n\n";

cout << "Формулировка задачи: Найти наибольший элемент заштрихованной области таблицы A размера N * N\n\n";

cout << "0 0 0 0 0 X 0\n";

cout << "0 0 0 0 X 0 0\n";

cout << "0 0 0 X X X X\n";

cout << "0 0 X X 0 0 0\n";

cout << "0 X 0 X 0 0 0\n";

cout << "X 0 0 X 0 0 0\n";

cout << "0 0 0 X 0 0 0\n\n";

f.open("C:\\Users\\danii\\source\\repos\\Proga 5\\Proga 5\\in.txt", ios::in);

f >> x;

f >> k;

f >> m;

if ((x < 0 || x > N) || (k < 0 || k > x) || (m < 0 || m > x))

{

cout << "Ввведены некорректные числа для задания массива\n";

exit(0);

}

int A[N][N];

p = &A[0][0];

input(x, p, f);

f.close();

f.open("C:\\Users\\danii\\source\\repos\\Proga 5\\Proga 5\\out.txt", ios::out);

s = output(p, max, f, x, k, m);

cout << s;

}

Файл in.txt:

Файл out.txt:

Примеры работы программы

  • Успешное выполнение программы:

Консоль:

Входной файл in.txt:

Файл вывода out.txt:

  • Ошибка при некорректных исходных данных:

Консоль:

Входной файл in.txt:

Вывод

Я научился работать с двумерными массивами, разбивать программу на функции и использовать полученные знания для решения задач.

Соседние файлы в папке 1 семестр Калмычков