Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования
«Вятский государственный университет»
Факультет прикладной математики и телекоммуникаций
Кафедра РЭС
Отчет по практической работе
«Двумерные массивы»
Дисциплина «Информатика»
Вариант 57
Выполнил: |
студент группы ИНБ-11 |
|
|
|
Лобастов Е.В. |
|
|
|
|
|
|
Проверил: |
старший преподаватель |
|
|
|
Кононова В.Ю. |
|
кафедры РЭС |
|
|
|
|
Работа защищена с оценкой «_____________» «__»_______ 2011 г.
Киров 2011
1 Текст задания
1) Уплотнить заданную матрицу, удаляя из нее строки и столбцы, заполненные нулями.
2) Найти номер первой из строк, содержащих положительный элемент.
Входные данные:
Выходные данные:
1) Преобразованная матрица
2) Первый положительный элемент находится в 1 строке.
2 Спецификация программы
При запуске программы в консольном окне отображается интерактивное меню (рисунок 24). Меню состоит из четырёх пунктов: 1) ввод данных в программу; 2) решение; 3) о программе; 4) выход из программы. Для продолжения работы пользователю необходимо выбрать один из четырёх пунктов. В ответ на запрос: «Введите номер пункта меню:» - пользователь вводит номер выбранного пункта с клавиатуры (рисунки 24,25 ) и нажимает клавишу Enter.
При выборе первого пункта меню пользователь переходит в подпрограмму ввода данных. Входными данными является целочисленная матрица размером MN. В ответ на запрос «Введите количество M:» - пользователь вводит количество строк матрицы с клавиатуры (рисунок 26) и нажимает клавишу Enter. Затем аналогичным образом в программу вводится количество строк матрицы - N. После ввода размера матрицы необходимо заполнить её элементами. В программе предусмотрено два режима заполнения матрицы элементами: 1) пользователь последовательно вводит все элементы матрицы с клавиатуры (рисунок 26); 2) матрица заполняется автоматически случайными числами Для продолжения работы пользователю необходимо выбирать один из двух режимов. В ответ на запрос: «Ваш выбор:» - пользователь вводит номер выбранного режима с клавиатуры (рисунок 26) и нажимает клавишу Enter. При выборе первого режима пользователь последовательно вводит с клавиатуры элементы первой строки матрицы, затем второй, третьей и т.д. (рисунок 26). В случае выбора второго режима пользователю не нужно ничего вводить: программа заполнит двумерный массив автоматически. По завершению заполнения матрица выводится на экран (рисунок 26). Работа текущей подпрограммы окончена, для возврата в главное меню пользователю необходимо нажать клавишу Enter.
При выборе второго пункта меню пользователь переходит в подпрограмму решения задачи. Работа текущей подпрограммы возможна только в том случае, если имеются входные данные, иначе в консольное окно выводится предупреждающее сообщение «Введите исходные данные в пункте 1» (рисунок 25). Если пользователь получил такое предупреждение, то он должен перейти в главное меню и выбрать первый пункт. В случае наличия входных данных программа выводит на экран исходную матрицу, над которой будут произведены операции. Далее программа в соответствии с текстом задания уплотняет исходную матрицу, удаляя из нее строки и столбцы, заполненные нулями, затем находит номер первой из строк, содержащих положительный элемент. По завершении решения программа выдает ответ: 1) преобразованную (уплотнённую матрицу) и 2) номер первой из строк, содержащих положительный элемент (рисунок 27). Работа текущей подпрограммы окончена, для возврата в меню пользователю необходимо нажать клавишу Enter.
При выборе третьего пункта меню в консольное окно выводится информация о программе: 1) имя и фамилия автора программы; 2) номер варианта задания и 3) текст задания (рисунок 28). Работа текущей подпрограммы окончена, для возврата в меню пользователю необходимо нажать клавишу Enter.
При выборе четвёртого пункта консольное окно закрывается. Работа с программой «Двумерный массив» завершена.
В случае, если пользователь осуществил некорректный ввод, программа выдаёт предупреждающее сообщение «Такого пункта в меню нет» (рисунок 25). Для продолжения работы и возврата в меню пользователю необходимо нажать клавишу Enter.
Программа позволяет осуществить решения для любого количества матриц без перезапуска путём последовательного выполнения пунктов 1 и 2.
Конструктивно программа выполнена в виде основной функции _tmain(), которая осуществляет управление вызываемыми функциями и поддерживает диалог с пользователем. Вызываемые пользовательские функции и их назначение приведены в таблице 1.
Таблица 1 - Вызываемые пользовательские функции и их назначение
Тип_функции Имя_функции (список_параметров) |
Назначение |
void text(void) |
функция вывода текста (ФИО автора, условия задачи) |
int input(char c, int *a) |
функция ввода количества строк (столбцов) |
int **memory(int M, int N) |
функция выделения памяти для матрицы |
int rnd( int range_min, int range_max ) |
функция для генерации случайных элементов |
void input_elements(int **A, int M, int N) |
функция ввода элементов матрицы |
void output(int **A, int M, int N) |
функция вывода элементов матрицы |
void task_1(int **A, int M, int N) |
функция преобразования матрицы |
void task_2(int **A, int M, int N) |
функция поиска строки с положительным элементом |
Схема алгоритма функции _tmain() представлена на рисунках 1-7. Входные данные для основной функции _tmain() приведены в таблице 2. Выходных данных для основной функции _tmain() нет. Вспомогательные переменные для основной функции _tmain() приведены в таблице 3.
Таблица 2 – Входные данные для основной функции _tmain()
Тип |
Идентификатор |
Диапазон |
Назначение |
int |
N |
–2 147 483 638 до 2 147 483 647 |
Количество строк матрицы |
int |
M |
–2 147 483 638 до 2 147 483 647 |
Количество столбцов матрицы |
int |
**A |
–2 147 483 638 до 2 147 483 647 |
Указатель на область памяти, в которой хранятся элементы двумерного массива |
Таблица 3 – Вспомогательные переменные для основной функции _tmain()
Тип |
Идентификатор |
Диапазон |
Назначение |
int |
m |
–2 147 483 638 до 2 147 483 647 |
Переменная для управления меню |
bool |
flag |
true false |
Сигнал наличия входных данных в программе для последующего решения задачи |
Схема алгоритма функции void text(void) представлена на рисунке 8. У функции void text(void) нет входных/выходных данных и вспомогательных переменных.
Схема алгоритма функции int input(char c, int *a) представлена на рисунке 9. Входные данные для функции int input(char c, int *a) приведены в таблице 4. Выходные данные для функции int input(char c, int *a) приведены в таблице 5. Вспомогательных переменных для функции int input(char c, int *a) нет.
Таблица 4 – Входные данные для функции int input(char c, int *a)
Тип |
Идентификатор |
Диапазон |
Назначение |
int |
*a |
–2 147 483 638 до 2 147 483 647 |
Указатель на количество строк (столбцов) |
char |
c |
0 до 255 |
Символ |
Таблица 5 – Выходные данные для функции int input(char c, int *a)
Тип |
Идентификатор |
Диапазон |
Назначение |
int |
*a |
–2 147 483 638 до 2 147 483 647 |
Количество строк/столбцов в матрице |
Схема алгоритма функции int **memory(int N, int M) представлена на рисунке 10. Входные данные для функции int **memory(int N, int M) приведены в таблице 6. Выходные данные для функции int **memory(int N, int M) приведены в таблице 7. Вспомогательные переменные для функции int **memory(int N, int M) приведены в таблице 8.
Таблица 6 – Входные данные для функции int **memory(int N, int M)
Тип |
Идентификатор |
Диапазон |
Назначение |
int |
N |
–2 147 483 638 до 2 147 483 647 |
Количество строк матрицы |
int |
M |
–2 147 483 638 до 2 147 483 647 |
Количество столбцов матрицы |
Таблица 7 – Выходные данные для функции int **memory(int N, int M)
Тип |
Идентификатор |
Диапазон |
Назначение |
int |
**A |
–2 147 483 638 до 2 147 483 647 |
Указатель на область памяти, в которой хранятся элементы двумерного массива |
Таблица 8 – Вспомогательные переменные для функции int **memory(int N, int M)
Тип |
Идентификатор |
Диапазон |
Назначение |
int |
i |
–2 147 483 638 до 2 147 483 647 |
Счётчик цикла по строкам |
Схема алгоритма int rnd( int range_min, int range_max )представлена на рисунке 16. Входные данные для функции int rnd( int range_min, int range_max ) приведены в таблице 9. Выходные данные для int rnd( int range_min, int range_max ) приведены в таблице 10. Вспомогательных переменных для функции int rnd( int range_min, int range_max ) нет.
Таблица 9 – Входные данные для функции int rnd( int range_min, int range_max )
Тип |
Идентификатор |
Диапазон |
Назначение |
int |
range_min |
–2 147 483 638 до 2 147 483 647 |
Нижняя граница диапазона значений |
int |
range_max |
–2 147 483 638 до 2 147 483 647 |
Верхняя граница диапазона значений |
Таблица 10 – Выходные данные для функции int rnd( int range_min, int range_max )
Тип |
Идентификатор |
Диапазон |
Назначение |
int |
– |
–2 147 483 638 до 2 147 483 647 |
Случайное число (RAND_MAX + 1) * (range_max - range_min) + range_min
|
Схема алгоритма функции void input_elements(int **A, int N, int M) представлена на рисунке 11-15. Входные данные для функции void input_elements(int **A, int N, int M) приведены в таблице 11. Выходных данных для функции void input_elements(int **A, int N, int M) нет. Вспомогательные переменные для функции void input_elements(int **A, int N, int M) приведены в таблице 12.
Таблица 11 – Входные данные для функции void input_elements(int **A, int N, int M)
Тип |
Идентификатор |
Диапазон |
Назначение |
int |
N |
–2 147 483 638 до 2 147 483 647 |
Количество строк матрицы |
int |
M |
–2 147 483 638 до 2 147 483 647 |
Количество столбцов матрицы |
int |
**A |
–2 147 483 638 до 2 147 483 647 |
Указатель на область памяти, в которой хранятся элементы двумерного массива |
Таблица 12 – Вспомогательные переменные для функции void input_elements (int **A, int N, int M)
Тип |
Идентификатор |
Диапазон |
Назначение |
int |
i |
–2 147 483 638 до 2 147 483 647 |
Переменная цикла |
int |
j |
–2 147 483 638 до 2 147 483 647 |
Переменная цикла |
int |
v |
–2 147 483 638 до 2 147 483 647 |
Переменная выбора ручного или автоматического ввода матрицы |
int |
t |
–2 147 483 638 до 2 147 483 647 |
Переменная для ввода совпадающих строки и столбца в случайно-заданной матрице |
Схема алгоритма функции void output(int **A, int N, int M) представлена на рисунке 17. Входные данные для функции void output(int **A, int N, int M) приведены в таблице 13. Выходные данные для функции void output(int **A, int N, int M) приведены в таблице 14. Вспомогательные переменные для функции void output(int **A, int N, int M) приведены в таблице 15.
Таблица 13 – Входные данные для функции void output(int **A, int N, int M)
Тип |
Идентификатор |
Диапазон |
Назначение |
int |
N |
–2 147 483 638 до 2 147 483 647 |
Количество строк матрицы |
int |
M |
–2 147 483 638 до 2 147 483 647 |
Количество столбцов матрицы |
int |
**A |
–2 147 483 638 до 2 147 483 647 |
Указатель на область памяти, в которой хранятся элементы двумерного массива |
Таблица 14 – Выходные данные для функции void output(int **A, int N, int M)
Тип |
Идентификатор |
Диапазон |
Назначение |
int |
A[i][j] |
–2 147 483 638 до 2 147 483 647 |
Элементы матрицы |
Таблица 15 – Вспомогательные переменные для функции void output(int **A, int N, int M)
Тип |
Идентификатор |
Диапазон |
Назначение |
int |
i |
–2 147 483 638 до 2 147 483 647 |
Переменная цикла |
int |
j |
–2 147 483 638 до 2 147 483 647 |
Переменная цикла |
Схема алгоритма функции void task_1(int **A, int M, int N) представлена на рисунках 18-22. Входные данные для функции void task_1(int **A, int M, int N) приведены в таблице 16. Выходные данные для функции функции void task_1(int **A, int M, int N) приведены в таблице 17. Вспомогательные переменные для функции void task_1(int **A, int M, int N) приведены в таблице 18.
Таблица 16 – Входные данные для основной функции void task_1(int **A, int M, int N)
Тип |
Идентификатор |
Диапазон |
Назначение |
int |
M |
–2 147 483 638 до 2 147 483 647 |
Количеством строк матрицы |
int |
N |
–2 147 483 638 до 2 147 483 647 |
Количеством столбцов матрицы |
int |
**A |
–2 147 483 638 до 2 147 483 647 |
Указатель на область памяти, в которой хранятся элементы двумерного массива |
Таблица 17 – Выходные данные для основной функции void task_1(int **A, int M, int N)
Тип |
Идентификатор |
Диапазон |
Назначение |
int |
A[i][j] |
–2 147 483 638 до 2 147 483 647 |
Вывод преобразованной матрицы |
Таблица 18 – Вспомогательные переменные для основной функции void task_1(int **A, int M, int N)
Тип |
Идентификатор |
Диапазон |
Назначение |
int |
i |
–2 147 483 638 до 2 147 483 647 |
Количество строк |
int |
j |
–2 147 483 638 до 2 147 483 647 |
Количество столбцов |
int |
flag |
–2 147 483 638 до 2 147 483 647 |
Нахождение нулевых строк (столбцов) |
int |
k |
–2 147 483 638 до 2 147 483 647 |
Преобразование массива |
Схема алгоритма функции void task_2(int **A, int M, int N) представлена на рисунках 23. Входные данные для функции void task_2(int **A, int M, int N) приведены в таблице 19. Выходные данные для функции void task_2(int **A, int M, int N) приведены в таблице 20. Вспомогательные переменные для void task_2(int **A, int M, int N) приведены в таблице 21.
Таблица 19– Входные данные для основной функции void task_2(int **A, int M, int N)
Тип |
Идентификатор |
Диапазон |
Назначение |
int |
M |
–2 147 483 638 до 2 147 483 647 |
Количеством строк матрицы |
int |
N |
–2 147 483 638 до 2 147 483 647 |
Количеством столбцов матрицы |
int |
**A |
–2 147 483 638 до 2 147 483 647 |
Указатель на область памяти, в которой хранятся элементы двумерного массива |
Таблица 20 – Выходные данные для основной функции void task_2(int **A, int M, int N)
Тип |
Идентификатор |
Диапазон |
Назначение |
int |
tmp |
–2 147 483 638 до 2 147 483 647 |
Номер строки с первым положительным элементом |
Таблица 21 – Вспомогательные переменные для основной функции void task_2(int **A, int M, int N)
Тип |
Идентификатор |
Диапазон |
Назначение |
int |
i |
–2 147 483 638 до 2 147 483 647 |
Количество строк |
int |
j |
–2 147 483 638 до 2 147 483 647 |
Количество столбцов |