1 семестр Калмычков / Отчёт Л5
.docxМинобрнауки РФ
Санкт-Петербургский государственный электротехнический университет
им. В.И. Ульянова (Ленина) «ЛЭТИ»
(СПбГЭТУ)
Факультет компьютерных технологий и информатики
Кафедра САПР
ОТЧЁТ
По лабораторной работе №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:
Вывод
Я научился работать с двумерными массивами, разбивать программу на функции и использовать полученные знания для решения задач.