РГЗ по информатике. РГЗ.Пояснительная записка. A. Размер этого массива 16 ячеек. Рисунок 1 структура целочисленного одномерного массива a
Скачать 342.88 Kb.
|
Задание к РГЗ: 8.Транспонировать в матрице квадрат, в правом верхнем углу которого расположен самый первый ноль. Определить, сколько всего нулей в исходной матрице, и, если их больше чем количество строк в матрице, заменить нули на это количество. Краткая теория: Массивы Массив это структура данных, представленная в виде группы ячеек одного типа, объединенных под одним единым именем. Массивы используются для обработки большого количества однотипных данных. Отдельная ячейка данных массива называется элементом массива. В зависимости от количества измерений массивы делятся на одномерные массивы, двумерные массивы, трёхмерные массивы и так далее до n-мерного массива. Одномерный массив Одномерный массив это массив, с одним параметром, характеризующим количество элементов одномерного массива. Фактически одномерный массив — это массив, у которого может быть только одна строка, и n-е количество столбцов. Столбцы в одномерном массиве — это элементы массива. На рисунке 1 показана структура целочисленного одномерного массива a. Размер этого массива — 16 ячеек. Рисунок 1 - структура целочисленного одномерного массива a. Нумерация ячеек массива всегда начинается с 0. Индекс ячейки – это целое неотрицательное число, по которому можно обращаться к каждой ячейке массива и выполнять какие-либо действия над ней (ячейкой). Двумерный массив Двумерный массив используется очень часто, например, для работы с таблицами. В таблице есть две характеристики: количество строк и количество столбцов. Также и в двумерном массиве, кроме количества элементов массива, есть такие характеристики как, количество строк и количество столбцов двумерного массива. Визуально, двумерный массив — это обычная таблица, со строками и столбцами. Фактически двумерный массив — это одномерный массив одномерных массивов. Структура двумерного массива, с именем a, размером m на n показана на рисунке 2. Рисунок 2 - структура двумерного массива a. Функции Функция (в программировании) — это фрагмент кода или алгоритм, реализованный на каком-то языке программирования, с целью выполнения определённой последовательности операций. Функции позволяют программу разделить на несколько маленьких подпрограмм (функций), которые в совокупности выполняют поставленную задачу. В С++ можно воспользоваться не только своими(созданными), но и функциями определёнными в стандартных заголовочных файлах языка программирования С++. Конструкция создания функции:
Тип данных функции. В самом начале нам нужно указать тип данных, который в конечном итоге будет передавать функция. Если мы не собираемся ничего передавать, а например, хотим просто вывести строку, то на месте <тип данных> можно указать тип void. Пример: void stroka() { cout << "Выводим строку без всяких переменных"; } Имя функции. Нам нужно задать функции имя (исключениями являются зарезервированные слова в C++, имена начинающиеся с цифр, а также имена разделенные пробелом).Задавать имя функции лучше такое, чтобы было понятно что делает эта функция. Аргументы функции. Аргумент функции — это значение, которое можно передать функции при ее вызове. Если аргумент функции не один, а их несколько, то их нужно разделять запятой. Описание всех подзадач: Заполнение матрицы случайными значениями. Для работы этой функции, нам нужно подключить библиотеку Реализация программы: #include void matrandom(float v[5][5]) { srand(time(NULL)); for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) v[i][j] = -10 + (rand() % 20); } Схема программы: Рисунок 3 – Схема функции matrandom Заполнение матрицы в ручную. Для реализации этой программы нам нужно аналогично предыдущей подзадачи идти по матрице и вводить значения, которые будут в ячейках. Реализация программы: void matzapis(float v[5][5]) { for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) cin >> v[i][j]; } Схема программы: Рисунок 4 – Схема функции matzapis Вывод матрицы. Для работы этой функции, нам нужно подключить библиотеку Реализация программы: void vivod(float v[5][5]) { for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { cout << " [" << i << "]" << "[" << j << "]" << " =" << setw(10) << setprecision(3) << v[i][j]; } cout << endl; } } Схема программы: Рисунок 5 – Схема функции vivod Транспонирование в матрице квадрат, в правом верхнем углу которого расположен самый первый ноль. Разделим эту подзадачу на части. Нахождение первого нуля и размера квадрата. Для реализации мы должны последовательно двигаться по матрице и искать первый нуль, когда мы его встретим сразу определим его индексы и найдём длину до края снизу и до левого края. Последним действием мы выравниваем значения длин по меньшей длине. Реализация программы: void transponir(float v[5][5]) { int kniz = 0, kbok = 0, e = 0, i0, j0, c; for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) if (v[i][j] == 0 && e == 0) { i0 = i; j0 = j; for (j; j > 0; j--) kbok++; for (i; i < 4; i++) kniz++; e = 1; } if (e == 0) { cout << "В матрице нет нулей" << endl; return; } if (kniz < kbok) kbok = kbok - (kbok - kniz); if (kbok < kniz) kniz = kniz - (kniz - kbok); Схема программы: Рисунок 6 – Схема нахождение первого нуля и размера квадрата. Рисунок 7 – Схема нахождение первого нуля и размера квадрата. Транспонирование квадрата и вывод транспонированного квадрата. Для реализации нам нужно переписать наш квадрат в другую матрицу, в новой матрице сделать транспонирование и вывести транспонированный квадрат Реализация программы: float Arr[5][5], transpose[5][5]; for (int i = i0, ki = 0; i <= i0 + kniz; i++, ki++) { for (int j = j0 - kbok, kj = 0; j <= j0; j++, kj++) { Arr[ki][kj] = v[i][j]; } } for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { transpose[i][j] = Arr[j][i]; } } for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { v[i][j] = transpose[i][j]; } } if (v[0][0] == 0) cout << "Невозможно сделать квадрат из исходной матрицы"; else { for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) if (v[i][j] >= -10 && v[i][j] <= 10) cout << " [" << i << "]" << "[" << j << "]" << " =" << setw(10) << setprecision(3) << v[i][j]; cout << endl; } } } Схема программы: Рисунок 8 – Схема Транспонирование квадрата и вывод транспонированного квадрата. Рисунок 9 – Схема Транспонирование квадрата и вывод транспонированного квадрата. Нахождение количества нулей. Для нахождения количества всех нулей матрицы, мы двигаемся по матрице последовательно и рассматриваем значения в ячейках, если значение = 0, то мы увеличиваем k на 1. Реализация программы: int kolvo(float v[5][5]) { int k = 0; for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) if (v[i][j] == 0) k++; return k; } Схема программы: Рисунок 10 – Схема Нахождение количества нулей. Замена нулей на количество нулей, если нулей больше чем количество строк матрицы. Если количество нулей больше количества строк, то начинаем постепенно двигаться по матрице и когда мы натыкаемся на нуль заменять его на количество строк в матрице. Реализация программы: void zamena(float v[5][5]) { int x = kolvo(v); if (x > 5) { for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) if (v[i][j] == 0) v[i][j] = x; } } Схема программы: Рисунок 11 – Схема Замены нулей на количество нулей, если нулей больше чем количество строк матрицы. Описание главной функции: В функции main описан главный интерфейс: ФИО, выполнившего работу, меню программы. Библиотеки, которые нужно подключить: #include #include #include #include #include "Header.h" Реализация программы: int main() { setlocale(0, "Rus"); float a[5][5]; int x, c = 0, b = 0; system("cls"); cout << "Расчётно-графическое задание по дисциплине «Информатика»" << endl; cout << "Выполнил: студент ФАЭС,гр.АП - 012 Носулин.М.О." << endl << endl; while (c == 0) { cout << " Menu" << endl; cout << "Каким способом будет заполняться матрица?" << endl; cout << "1.Рандом" << endl; cout << "2.В ручную" << endl; cout << ">"; cin >> x; switch (x) { case 1: system("cls"); cout << " Menu" << endl; cout << " Рандомная матрица" << endl; matrandom(a); vivod(a); c = 1; break; case 2: matzapis(a); system("cls"); cout << " Menu" << endl; cout << " Самостоятельно записанная матрица" << endl; vivod(a); c = 1; break; default: system("cls"); cout << "Вы ввели не правильный символ!!!" << endl; break; } } while (b == 0) { cout << "Какие действия будут производиться над матрицей?" << endl; cout << "1.Подсчёт количества нулей" << endl; cout << "2.Замена нулей в матрице,если их больше количества строк матрицы" << endl; cout << "3.Транспонировать в матрице квадрат, в правом верхнем углу которого расположен самый первый ноль" << endl; cout << ">"; cin >> x; switch (x) { case 1: system("cls"); cout << " Menu" << endl; cout << "Исходная матрица" << endl; vivod(a); cout << " Количество нулей:" << kolvo(a); b = 1; break; case 2: system("cls"); cout << " Menu" << endl; cout << "Исходная матрица" << endl; vivod(a); zamena(a); cout << " Изменённая матрица" << endl; vivod(a); b = 1; break; case 3: system("cls"); cout << " Menu" << endl; cout << "Исходная матрица" << endl; vivod(a); cout << " Транспоннированный квадрат" << endl; transponir(a); b = 1; break; default: system("cls"); vivod(a); cout << "Вы ввели не правильный символ!!!"< break; } } } Результаты расчетов: Рисунок 12 – Экран при запуске. Рисунок 13 – Изображение случайной матрицы и выбор действия. Рисунок 14 – Вывод количества 0. Рисунок 15 – Вывод самостоятельно-записанной матрицы и выбор действия. Рисунок 16 – Вывод исходной матрицы и матрицы с заменой нулей на их количество. Рисунок 17 – Вывод исходной матрицы и транспонированного квадрата. Рисунок 18 – Вывод исходной матрицы и оповещения о невозможности транспонировать квадрат. Вывод: В заключение хочу сказать, что за этот семестр я получил очень много знаний в языке C++ и все эти знания помогли мне выполнить эту расчётно-графическую работу. В этой работе я создал свою библиотеку и использовал её, также написал меню для пользователя. Научился транспонировать в матрице любой квадрат. Я получил от этого проекта много опыта: правильность оформления работы, создание меню, создание библиотеки, написание самой программы и объединение этого всего воедино. . |