Оптимизационные вопросы по коду

Делаю программу с привлечением отдельных модулей, вычисляющих конкретные задачи. Столкнулся с тем, что конструкция типа switch case довольно большая, хоть и для меня понятна. Каким образом можно элегантно подсократить объем главного файла и нужно ли вообще это? Не хотелось бы также запутаться в бесконечном потоке функций и их вызовом, и так по условию их будет достаточно. Я начинающий от слова совсем.

array.cpp

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int *get_array(int *a, int size) //функция получения
{
  a = (int*)malloc(size * sizeof(int));
  for (int i = 0; i<size; i++)
  {
    printf("a[%i] = ", i);
    scanf_s("%i", &a[i]);
  }

  return a;
}

void print_array(int *a, int size)  //функция печати
{
  for (int i = 0; i<size; i++)
  {
    printf("a[%i] = %d\n", i, a[i]);
  }
}

main.cpp

 #include <stdio.h>
    #include <conio.h>
    #include <clocale>
    #include <stdlib.h>

    int *get_array(int *a, int size);
    void print_array(int *a, int size);


    int main()
    {   //setlocale (LC_ALL,"Russian");
        setlocale (0, "");

        int deystvie;
        int deystvie1;
        int deystvie2;
        int deystvie3;
        printf ("----------Меню----------: \n");
        printf ("1 - Обработка массива.\n");
        printf ("2 - Обработка матриц.\n");
        printf ("3 - Задача с использованием геометрических данных.\n");
        printf ("Выберите действие:\n ");
        scanf("%i",&deystvie);

        switch (deystvie)
        {   case 1 :
                {   printf("-----Обработка массива-----\n ");
                    printf("Выберите нужное действие1:\n ");
                    printf("1.Ввод исходных данных с консоли1 \n ");
                    printf("2.Ввод исходных данных с файла1\n ");
                    printf("3.Задание массива случайным образом1\n ");
                    scanf("%i",&deystvie1);

                    switch(deystvie1)
                    {   
                    case 1:
                         { 
                             //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!**
                     printf("-------Введите данные с консоли-------");
                            // вызываемый прототип функции ввода и обработки данных с консоли
                      int *a;//
                      int n = 0;

                       printf("Введите размерность массива: ");
                       scanf("%i", &n);
                       a = get_array(a, n);
                       print_array(a, n);
                       free(a);     
                       break;
                            }
                         //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!**
                        case 2:
                            printf("-------Введите данные с файла, расположенного в (путь)-------");
                            // вызываемый прототип функции ввода и обработки данных с файла
                            break;
                        case 3:
                            printf("-------Массив генерируется...)-------");
                            // вызываемый прототип функции генерации и обработки данных
                            break;
                        default:
                            break;
                    }
                }
                break;

            case 2 :
                {   printf("-----Обработка матрицы-----\n ");
                    printf("Выберите нужное действие2:\n ");
                    printf("1.Ввод исходных данных с консоли2 \n ");
                    printf("2.Ввод исходных данных с файла2\n ");
                    printf("3.Задание матрицы случайным образом2\n ");
                    scanf("%i",&deystvie2);

                    switch(deystvie2)
                    {   case 1:
                            printf("-------Введите данные с консоли-------");
                            // вызываемый прототип функции ввода и обработки данных с консоли
                            break;
                        case 2:
                            printf("-------Введите данные с файла, расположенного в (путь)-------");
                            // вызываемый прототип функции ввода и обработки данных с файла
                            break;
                        case 3:
                            printf("-------Массив генерируется...)-------");
                            // вызываемый прототип функции генерации и обработки данных
                            break;
                        default:
                            break;
                    }
                }
                break;

            case 3 :
                {   printf("-----Обработка геометрического3-----\n ");
                    printf("Выберите нужное действие3:\n ");
                    printf("1.Ввод исходных данных с консоли3 \n ");
                    printf("2.Ввод исходных данных с файла3\n ");
                    printf("3.Задание массива случайным образом3\n ");
                    scanf("%i",&deystvie3);


                    {       
                        switch(deystvie3)
                            {   case 1:
                                    printf("-------Введите данные с консоли-------");
                                    // вызываемый прототип функции ввода и обработки данных с консоли
                                    break;
                                case 2:
                                    printf("-------Введите данные с файла, расположенного в (путь)-------");
                                    // вызываемый прототип функции ввода и обработки данных с файла
                                    break;
                                case 3:
                                    printf("-------Массив генерируется...)-------");
                                    // вызываемый прототип функции генерации и обработки данных
                                    break;
                                default:
                                    break;
                            }
                    }
                    break;

                default:
                    printf("Выбрано неправильное значение.\n");
                    break;
                }
        }

        getch();
        return 0;
    }

Ответы (2 шт):

Автор решения: santavital

В целом желательно чтобы уровень вложенности не превышал 6; Если по объективным причинам этого добиться нельзя, нужно сократить объем текста внутри каждого case до читабельного минимума. Проще говоря, все что внутри (каждого)case оформить в виде отдельной функции возвращающей значение (успешно/возврат назад)

→ Ссылка
Автор решения: Doonort3

Используй функцию Free()

Функция Free() функция управления памятью, предназначенная для освобождения ранее выделенной динамичной памяти, для дальнейшего выполнения программы.

→ Ссылка