Лабораторная работа №4
15 Вариант | Кожухарь Александр | FCIM SI-202
Задание:
Для заданного двумерного массива из n строк и m столбцов вывести на экран следующее меню операций:
- Динамическое выделение памяти для двумерного массива
- Ввод элементов массива с клавиатуры
- Заполнение массива случайными числами
- Сортировка элементов массива ("Отсортировать строки массива по возрастанию с помощью метода линейного выбора")
- Вывод элементов массива на экран
- Освобождение памяти, выделенной для массива
- Окончание работы программы
Ход работы
Подключим необходимые библиотеки
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <time.h>
Опишем функции для обработки массива и его значений
int randInt(int Min, int Max) { return (rand() % (Max + 1 - Min)) + Min; } void printArray(int *arr, int rows, int cols) { for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) printf("%i\t", *(arr + i * cols + j)); printf("\n"); } }
randInt() — функция для генерации случайных значений
printArray() — функция, выводящая массив на экран
Введем базовую функцию main() c локальными переменными
int main() { srand(time(NULL)); int *dynarr, actionsNum = 0, option, rows, cols, rMin, rMax, n = 0, auxn = 0; bool empty[2] = {true, true}; ...
dynarr - переменная, хранящая динамический массив
actionsNum - количество успешно проведенных операций
option - выбранная позиция меню
rows, cols - параметры динамического массива
rMin, rMax - параметры диапазона для генерации ряда случайных чисел
n, auxn - вспомогательные переменные для сортировки
empty - массив-маркер для получения текущего состояния массива на момент вызова
Инициализируем цикл для интерфейса меню
while (option != 7) { printf("\nMenu \n1. Allocate memory dynamically for a 2D-array.\n2. Fill array manually.\n3. Fill array using random nums generator.\n4. Sort array elements using `bubble-sort` method.\n5. Display array elements.\n6. Free up array-allocated memory.\n7. Quit program.\n"); printf("\nSelect option [1-7]: "); scanf("%i", &option); ...
Добавляем логику меню
Оператор switch необходим для определения действия в зависимости от выбора пользователя
Позиция "1" — Динамическое выделение памяти для двумерного массива
switch (option) { ... case 1: if (empty[0]) { printf("Cols number: "); scanf("%i", &cols); printf("Rows number: "); scanf("%i", &rows); dynarr = (int *)malloc(rows * cols * sizeof(int)); empty[0] = false; printf("\nMemory allocation performed successfully.\n"); actionsNum++; } else printf("\nMemory allocation is already performed.\n"); break; ...
Позиция "2" — Ввод элементов массива с клавиатуры
case 2: if (!empty[0]) { for (int i = 0; i < rows; i++) for (int j = 0; j < cols; j++) { printf("Element indexed at [%i][%i]: ", i, j); scanf("%i", (dynarr + i * cols + j)); } empty[1] = false; printf("\nArray is filled successfully.\n"); actionsNum++; } else { printf("\nMemory is not allocated yet. Choose `1` to create dynamic array.\n"); } break;
Позиция "3" — Заполнение массива случайными числами
case 3: if (!empty[0]) { printf("Range minimum: "); scanf("%i", &rMin); printf("Range maximum: "); scanf("%i", &rMax); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) *(dynarr + i * cols + j) = randInt(rMin, rMax); } empty[1] = false; printf("\nMemory is filled successfully.\n"); actionsNum++; } else { printf("\nNothing to fill in: memory is not allocated yet. Choose `1` to create dynamic array.\n"); } break; ...
Позиция "4" — Сортировка элементов массива
case 4: if (!empty[0] && !empty[1]) { int tmp[rows * cols]; for (int i = 0; i < rows; i++) for (int j = 0; j < cols; j++) tmp[n++] = *(dynarr + i * cols + j); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) if (tmp[j] > tmp[j + 1]) { tmp[j] += tmp[j + 1]; tmp[j + 1] = tmp[j] - tmp[j + 1]; tmp[j] -= tmp[j + 1]; } } for (int i = 0; i < rows; i++) for (int j = 0; j < cols; j++) *(dynarr + i * cols + j) = tmp[auxn++]; auxn = n = 0; printf("\nArray sorted successfully.\n"); actionsNum++; } else if (!empty[0] && empty[1]) printf("\nNothing to sort: array is empty. Choose `2` or `3` to fill array with elements.\n"); else printf("\nNothing to sort: memory is not allocated yet. Choose `1` to create dynamic array.\n"); break; ...
Позиция "5" — Вывод элементов массива на экран
case 5: if (!empty[0] && !empty[1]) { printArray(dynarr, rows, cols); actionsNum++; } else if (!empty[0] && empty[1]) printf("\nNothing to display: array is empty. Choose `2` or `3` to fill array with elements.\n"); else printf("\nNothing to display: memory is not allocated yet. Choose `1` to create dynamic array.\n"); break; ...
Позиция "6" — Освобождение памяти, выделенной для массива
case 6: if (!empty[0]) { free(dynarr); empty[0] = empty[1] = true; printf("\nMemory is now free.\n"); actionsNum++; } else printf("\nNothing to destroy: memory is not allocated yet. Choose `1` to create dynamic array.\n"); break; ...
Дефолтная инструкция (в случае необработанного значения)
default: if (option != 7) printf("\nWrong input, use numbers 1 to 7 to select option\n"); else continue; ...
Окончание работы программы
При получении "7" программа выходит из цикла и выводит краткую статистику, после чего завершает работу.
printf("\nTotal actions performed: %i.\nSee you!", actionsNum); return 0;
Полный код программы
https://gitlab.com/karkarych/PC/-/blob/972da844ae4f1069bb8a697360fdcf42e7478e44/Lab_4/Lab_4_S15.c
Кожухарь Александр
FCIM SI-202