November 7, 2020

Лабораторная работа №4

15 Вариант | Кожухарь Александр | FCIM SI-202

Задание:

Для заданного двумерного массива из n строк и m столбцов вывести на экран следующее меню операций:

  1. Динамическое выделение памяти для двумерного массива
  2. Ввод элементов массива с клавиатуры
  3. Заполнение массива случайными числами
  4. Сортировка элементов массива ("Отсортировать строки массива по возрастанию с помощью метода линейного выбора")
  5. Вывод элементов массива на экран
  6. Освобождение памяти, выделенной для массива
  7. Окончание работы программы

Ход работы

Подключим необходимые библиотеки

#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