Advertisement
Guest User

Untitled

a guest
Dec 17th, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 22.93 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <ctime>
  4. bool allocate(float ***&p, const int n, const int m, bool &notAllocated, int &count); // Функция выделения памяти под динамический массив
  5. bool fillrandomly(float ***p, const int n, const int m, const int k); // Функция заполнения массива рандомно
  6. bool printTable(float ***p, const int n, const int m, const int k); // Функция вывода значений текущей таблицы
  7. bool MaxExtremumCnt(float ***p, const int n, const int m, const int k, int &row); // Функция поиска максимального числа подряд идущих локальных экстремумов
  8. void chooseTable(int **sizes, int &k, int count, int &n1, int &m1); // Функция выбора текущей таблицы
  9. bool fillKeyboard(float ***p, const int n, const int m, const int k); // Функция считывания и записи элементов массива с клавиатуры
  10. bool fillFile(float ***&p, int **&sizes, int &count); // Функция считывания и записи элементов массива из файла
  11. bool saveInFile(float ***p, const int n, const int m, const int k); // Функция сохранения массива в файл
  12. void exitProgram(); // Подпрограмма завершения программы, потому что нет памяти для выделения на хранение адресов двумерных динамических массивов
  13. int main(){
  14.     srand(time(NULL));
  15.     float ***p = (float***)malloc(sizeof(float**)); // Храним адреса "столбцов", элементы которого указывают на "строки"
  16.     if(p == NULL){
  17.        free(p);
  18.        exitProgram();
  19.     }
  20.     else{
  21.        p[0] = (float**)malloc(sizeof(float*));
  22.        if(p[0] == NULL){
  23.           free(p[0]);
  24.           exitProgram();
  25.        }
  26.        else{
  27.           p[0][0] = (float*)malloc(sizeof(float));
  28.           if(p[0][0] == NULL){
  29.              free(p[0][0]);
  30.              exitProgram();
  31.           }
  32.        }
  33.     }
  34.     int **sizes = (int**)malloc(sizeof(int*)); // Храним размеры двумерных динамических массивов
  35.     if(sizes == NULL){
  36.        free(sizes);
  37.        exitProgram();
  38.     }
  39.     else{
  40.        sizes[0] = (int*)malloc(sizeof(int) * 2);
  41.        if(sizes[0] == NULL){
  42.           free(sizes[0]);
  43.           exitProgram();
  44.        }
  45.     }
  46.     int n, m, n1, m1, count = 0, e = -1, k = -1;
  47.     bool d = false, *f = (bool*)malloc(sizeof(bool));
  48.     if(f == NULL){
  49.        free(f);
  50.        exitProgram();
  51.     }
  52.     else f[0] = false;
  53.     while(e != 8){
  54.        printf("1. Create a table\n");
  55.        printf("2. Fill the table randomly\n");
  56.        printf("3. Fill the table with the keyboard\n");
  57.        printf("4. Create and fill the table from file\n");
  58.        printf("5. Print result\n");
  59.        printf("6. Print table\n");
  60.        printf("7. Save table in file\n");
  61.        printf("8. Exit\n");
  62.        printf("\nChoose your option: ");
  63.        while(!scanf("%d", &e) || !(e >= 1 && e <= 8)){
  64.          printf("Choose your option: ");
  65.          fflush(stdin);
  66.        }
  67.        if(e == 1){
  68.           printf("Enter your n, m: ");
  69.           while(!scanf("%d", &n) || !scanf("%d", &m) || !(n > 0 && m > 0)){
  70.              printf("Enter your n, m: ");
  71.              fflush(stdin);
  72.           }
  73.           bool notAllocated = false;
  74.           bool result = allocate(p, n, m, notAllocated, count);
  75.           if(result){
  76.              if(notAllocated) printf("Error. Could not allocate memory for array!");
  77.              else{
  78.                 d = true;
  79.                 if(count >= 2){
  80.                    sizes = (int**)realloc(sizes, sizeof(int*) * count);
  81.                    f = (bool*)realloc(f, sizeof(bool) * count);
  82.                    if(sizes == NULL || f == NULL) notAllocated = true;
  83.                    else{
  84.                       sizes[count - 1] = (int*)malloc(sizeof(int) * 2);
  85.                       f[count - 1] = false;
  86.                       if(sizes[count - 1] == NULL) notAllocated = true;
  87.                    }
  88.                 }
  89.                 if(!notAllocated){
  90.                    sizes[count - 1][0] = n;
  91.                    sizes[count - 1][1] = m;
  92.                    printf("Table created successfully!");
  93.                 }
  94.                 else printf("Error. Could not allocate memory for array!");
  95.              }
  96.           }
  97.           else printf("Error. Check your parameters.");
  98.        }
  99.        if(e == 2){
  100.           if(d){
  101.              printf("\n");
  102.              chooseTable(sizes, k, count, n1, m1);
  103.              bool result = fillrandomly(p, n1, m1, k);
  104.              if(result){
  105.                 if(count >= 2) f = (bool*)realloc(f, sizeof(bool) * count);
  106.                 printf("Table successfully filled out!");
  107.                 f[k - 1] = true;
  108.              }
  109.              else printf("Error. Check your parameters.");
  110.           }
  111.           else printf("Error. Please, create a table!");
  112.        }
  113.        if(e == 3){
  114.           if(d){
  115.              printf("\n");
  116.              chooseTable(sizes, k, count, n1, m1);
  117.              bool result = fillKeyboard(p, n1, m1, k);
  118.              if(result){
  119.                 if(count >= 2) f = (bool*)realloc(f, sizeof(bool) * count);
  120.                 printf("Table successfully filled out!");
  121.                 f[k - 1] = true;
  122.              }
  123.              else printf("Error. Check your parameters.");
  124.           }
  125.           else printf("Error. Please, create a table!");
  126.        }
  127.        if(e == 4){
  128.            bool result = fillFile(p, sizes, count);
  129.            if(result){
  130.               d = true;
  131.               if(count >= 2) f = (bool*)realloc(f, sizeof(bool) * count);
  132.               f[count - 1] = true;
  133.            }
  134.            else printf("Error. Check your parameters.");
  135.        }
  136.        if(e == 5){
  137.           if(d){
  138.              printf("\n");
  139.              int row = 0;
  140.              chooseTable(sizes, k, count, n1, m1);
  141.              if(f[k - 1]){
  142.                bool result = MaxExtremumCnt(p, n1, m1, k, row);
  143.                if(result){
  144.                 if(row == 0) printf("Not found");
  145.                 else printf("Ans = %d", row);
  146.                }
  147.                else printf("Error. Check your parameters.");
  148.              }
  149.              else printf("Please, fill the table #%d!", k);
  150.           }
  151.           else printf("Error. Please, create a table!");
  152.        }
  153.        if(e == 6){
  154.           if(d){
  155.              printf("\n");
  156.              chooseTable(sizes, k, count, n1, m1);
  157.              if(f[k - 1]){
  158.                bool result = printTable(p, n1, m1, k);
  159.                if(!result) printf("Error. Check your parameters.");
  160.              }
  161.              else printf("Please, fill the table #%d!", k);
  162.           }
  163.           else printf("Error. Please, create a table!");
  164.        }
  165.        if(e == 7){
  166.           if(d){
  167.              printf("\n");
  168.              chooseTable(sizes, k, count, n1, m1);
  169.              if(f[k - 1]){
  170.                bool result = saveInFile(p, n1, m1, k);
  171.                if(!result) printf("Error. Check your parameters.");
  172.              }
  173.              else printf("Please, fill the table #%d!", k);
  174.           }
  175.           else printf("Please, create a table!");
  176.        }
  177.        if(e == 8){
  178.           if(d){
  179.              for(int i = 0; i < count; ++i){
  180.                 char c = '\0';
  181.                 if(f[i]){
  182.                   while(!scanf("%c", &c) || c != 'y' && c != 'n'){
  183.                    printf("Do you want save a table #%d? [y / n]: ", i + 1);
  184.                    fflush(stdin);
  185.                   }
  186.                   if(c == 'y'){
  187.                    bool result = saveInFile(p, sizes[i][0], sizes[i][1], i + 1);
  188.                    printf(" ");
  189.                    if(!result) printf("Could not save table #%d.\nCheck your parameters.", i + 1);
  190.                   }
  191.                 }
  192.                 for(int j = 0; j < sizes[i][0]; ++j) free(p[i][j]);
  193.                 free(p[i]);
  194.                 free(sizes[i]);
  195.              }
  196.              free(sizes);
  197.              free(f);
  198.           }
  199.           printf("Goodbye!");
  200.        }
  201.        k = -1;
  202.        printf("\n\n");
  203.     }
  204.     system("pause");
  205.     return 0;
  206. }
  207. bool allocate(float ***&p, const int n, const int m, bool &notAllocated, int &count){
  208.     // Функция создает двумерный динамический массив заданных пользователем размеров
  209.     // На входе:
  210.     // p - храним адреса "столбцов", элементы которого указывают на "строки"
  211.     // n - Число строк двумерного динамического массива (Вводится пользователем)
  212.     // m - Число столбцов двумерного динамического массива (Вводится пользователем)
  213.     // notAllocated - булева переменная, которая отслеживает -- выделилась ли память под массив или нет
  214.     // count - счетчик для записи в массив p, где мы храним адреса "столбцов", элементы которого указывают на "строки"
  215.     // На выходе:
  216.     // Код завершения с проверкой на успех выделения памяти под двумерный динамический массив
  217.     bool result = true;
  218.     if(n > 0 && m > 0){
  219.         notAllocated = false;
  220.         float **a = (float**)malloc(sizeof(float*) * n);
  221.         if(a == NULL){
  222.            notAllocated = true;
  223.            free(a);
  224.         }
  225.         else{
  226.            for(int i = 0; i < n && !notAllocated; ++i){
  227.               a[i] = (float*)malloc(sizeof(float) * m);
  228.               if(a[i] == NULL) notAllocated = true;
  229.            }
  230.            if(notAllocated){
  231.               for(int i = 0; i < n; ++i) free(a[i]);
  232.               free(a);
  233.            }
  234.            else{
  235.               if(count >= 1){
  236.                  p = (float***)realloc(p, sizeof(float**) * (count + 1));
  237.                  if(p == NULL){
  238.                     notAllocated = true;
  239.                     free(p);
  240.                  }
  241.               }
  242.               if(!notAllocated){
  243.                  p[count] = a;
  244.                  ++count;
  245.               }
  246.            }
  247.         }
  248.     }
  249.     else result = false;
  250.     return result;
  251. }
  252. bool fillrandomly(float ***p, const int n, const int m, const int k){
  253.     // Функция заполнения текущего двумерного динамического массива случайными числами
  254.     // На входе:
  255.     // p - храним адреса "столбцов", элементы которого указывают на "строки"
  256.     // n - Число строк двумерного динамического массива (Вводится пользователем)
  257.     // m - Число столбцов двумерного динамического массива (Вводится пользователем)
  258.     // k - Индекс таблицы. К p обращаемся в виде p[tabIndex][i][j], где tabIndex -- одна из count таблиц
  259.     // На выходе:
  260.     // Код завершения с заполнением двумерного динамического массива
  261.     bool result = true;
  262.     if(n > 0 && m > 0 && k >= 1){
  263.       for(int i = 0; i < n; ++i)
  264.           for(int j = 0; j < m; ++j)
  265.              p[k - 1][i][j] = rand() % 10 - 5;
  266.     }
  267.     else result = false;
  268.     return result;
  269. }
  270. bool fillKeyboard(float ***p, const int n, const int m, const int k){
  271.     // Функция заполнения текущего двумерного динамического массива с клавиатуры
  272.     // На входе:
  273.     // p - храним адреса "столбцов", элементы которого указывают на "строки"
  274.     // n - Число строк двумерного динамического массива (Вводится пользователем)
  275.     // m - Число столбцов двумерного динамического массива (Вводится пользователем)
  276.     // k - Индекс таблицы. К p обращаемся в виде p[tabIndex][i][j], где tabIndex -- одна из count таблиц
  277.     // На выходе:
  278.     // Код завершения с заполнением двумерного динамического массива
  279.     bool result = true;
  280.     if(n > 0 && m > 0 && k >= 1){
  281.         printf("Enter your values:\n");
  282.         for(int i = 0; i < n; ++i){
  283.            for(int j = 0; j < m; ++j){
  284.               while(!scanf("%f", &p[k - 1][i][j])){
  285.                  printf("Enter your correct value:\n");
  286.                  fflush(stdin);
  287.               }
  288.            }
  289.         }
  290.     }
  291.     else result = false;
  292.     return result;
  293. }
  294. bool fillFile(float ***&p, int **&sizes, int &count){
  295.     // Функция заполнения текущего двумерного динамического массива из файла
  296.     // На входе:
  297.     // p - храним адреса "столбцов", элементы которого указывают на "строки"
  298.     // sizes - Размерность каждого выделенного двумерного динамического массива
  299.     // count - Число текущих успешно выделенных двумерных динамических массивов
  300.     // На выходе:
  301.     // Код завершения с заполнением двумерного динамического массива
  302.     bool result = true;
  303.     if(count >= 0){
  304.        char filename[80];
  305.        printf("Enter your filename: ");
  306.        scanf("%s", &filename);
  307.        FILE *file = fopen(filename, "r");
  308.        if(file == NULL) printf("Could not open file");
  309.        else{
  310.           int cnt = 0, rowsFile, colsFile;
  311.           bool error = false;
  312.           if(!fscanf(file, "%d", &rowsFile) || !fscanf(file, "%d", &colsFile)) error = true;
  313.           else cnt += 2;
  314.           if(error) printf("Error. Check your sizes in file.");
  315.           else{
  316.              bool notAllocated = false;
  317.              bool result = allocate(p, rowsFile, colsFile, notAllocated, count);
  318.              if(result){
  319.                if(!notAllocated){
  320.                  if(count >= 2) sizes = (int**)realloc(sizes, sizeof(int*) * count);
  321.                  if(sizes == NULL){
  322.                     notAllocated = true;
  323.                     printf("Error. Could not allocate memory for an array!");
  324.                     free(sizes);
  325.                  }
  326.                  else sizes[count - 1] = (int*)malloc(sizeof(int) * 2);
  327.                  if(sizes[count - 1] == NULL){
  328.                     notAllocated = true;
  329.                     printf("Error. Could not allocate memory for an array!");
  330.                     free(sizes[count - 1]);
  331.                  }
  332.                  else{
  333.                     float current = 0.0;
  334.                     for(int i = 0; i < rowsFile && !error; ++i){
  335.                       for(int j = 0; j < colsFile && !error; ++j){
  336.                         if(!fscanf(file, "%f", &p[count - 1][i][j])) error = true;
  337.                         else ++cnt;
  338.                       }
  339.                     }
  340.                     if(error || cnt < (rowsFile * colsFile + 2)){
  341.                        sizes = (int**)realloc(sizes, sizeof(int*) * (count - 1));
  342.                        free(sizes[count - 1]);
  343.                        printf("Error. Check your file.");
  344.                     }
  345.                     else{
  346.                        sizes[count - 1][0] = rowsFile;
  347.                        sizes[count - 1][1] = colsFile;
  348.                        printf("Table successfully filled out!");
  349.                     }
  350.                  }
  351.                }
  352.                else printf("Error. Could not allocate memory for an array!");
  353.              }
  354.              else printf("Error. Check your parameters");
  355.           }
  356.        }
  357.        fclose(file);
  358.     }
  359.     else result = false;
  360.     return result;
  361. }
  362. bool saveInFile(float ***p, const int n, const int m, const int k){
  363.     // Функция сохранения в файл выбранного двумерного динамического массива
  364.     // На входе:
  365.     // p - храним адреса "столбцов", элементы которого указывают на "строки"
  366.     // n - Число строк двумерного динамического массива (Вводится пользователем)
  367.     // m - Число столбцов двумерного динамического массива (Вводится пользователем)
  368.     // k - Индекс таблицы. К p обращаемся в виде p[tabIndex][i][j], где tabIndex -- одна из count таблиц
  369.     // На выходе:
  370.     // Код завершения с сохранением двумерного динамического массива в файл, который спрашивается у пользователя
  371.     bool result = true;
  372.     if(n > 0 && m > 0 && k >= 1){
  373.         char filename[80];
  374.         printf("Enter your filename: ");
  375.         scanf("%s", &filename);
  376.         FILE *file = fopen(filename, "w+");
  377.         if(file == NULL) printf("Could not open file.");
  378.         else{
  379.            fprintf(file, "%d %d %c", n, m, '\n');
  380.            for(int i = 0; i < n; ++i){
  381.               for(int j = 0; j < m; ++j)
  382.                  fprintf(file, "%6.2f ", p[k - 1][i][j]);
  383.               fprintf(file, "%c", '\n');
  384.            }
  385.            printf("Table successfully saved!");
  386.         }
  387.         fclose(file);
  388.     }
  389.     else result = false;
  390.     return result;
  391. }
  392. bool printTable(float ***p, const int n, const int m, const int k){
  393.     // Функция вывода текущей таблицы
  394.     // На входе:
  395.     // p - храним адреса "столбцов", элементы которого указывают на "строки"
  396.     // n - Число строк двумерного динамического массива (Вводится пользователем)
  397.     // m - Число столбцов двумерного динамического массива (Вводится пользователем)
  398.     // k - Индекс таблицы. К p обращаемся в виде p[tabIndex][i][j], где tabIndex -- одна из count таблиц
  399.     // На выходе:
  400.     // Код завершения с выводом текущей таблицы
  401.     bool result = true;
  402.     if(n > 0 && m > 0 && k >= 1){
  403.        printf("\n");
  404.        for(int i = 0; i < n; ++i){
  405.           for(int j = 0; j < m; ++j)
  406.              printf("%6.2f ", p[k - 1][i][j]);
  407.           printf("\n");
  408.        }
  409.     }
  410.     else result = false;
  411.     return result;
  412. }
  413. bool MaxExtremumCnt(float ***p, const int n, const int m, int k, int &row){
  414.     // Функция поиска строки, в которой максимальное число подряд идущих строгих локальных экстремумов
  415.     // На входе:
  416.     // p - храним адреса "столбцов", элементы которого указывают на "строки"
  417.     // n - Число строк двумерного динамического массива (Вводится пользователем)
  418.     // m - Число столбцов двумерного динамического массива (Вводится пользователем)
  419.     // k - Индекс таблицы. К p обращаемся в виде p[tabIndex][i][j], где tabIndex -- одна из count таблиц
  420.     // row - результирующая строка, в которой максимальное число подряд идущих строгих локальных экстремумов
  421.     // На выходе:
  422.     // Код завершения и результирующая строка, в которой максимальное число подряд идущих строгих локальных экстремумов
  423.     bool result = true;
  424.     if(n > 0 && m > 0 && k >= 1){
  425.        float current = 0.0f, prev = 0.0f, next = 0.0f;
  426.        int count = 0, r = 0;
  427.        for(int i = 0; i < n; ++i){
  428.           for(int j = 1; j < m - 1; ++j){
  429.              prev = p[k - 1][i][j - 1];
  430.              current = p[k - 1][i][j];
  431.              next = p[k - 1][i][j + 1];
  432.              if((current > prev && current > next) || (current < prev && current < next)) ++count;
  433.              else{
  434.                 if(r < count){
  435.                    row = i + 1;
  436.                    r = count;
  437.                    count = 0;
  438.                 }
  439.              }
  440.           }
  441.           if(r < count){
  442.              row = i + 1;
  443.              r = count;
  444.           }
  445.           count = 0;
  446.        }
  447.     }
  448.     else result = false;
  449.     return result;
  450. }
  451. void chooseTable(int **sizes, int &k, int count, int &n1, int &m1){
  452.     // Подпрограмма выбора таблицы из всех возможных-созданных
  453.     // На входе:
  454.     // p - храним адреса "столбцов", элементы которого указывают на "строки"
  455.     // sizes - Размерность каждого выделенного двумерного динамического массива
  456.     // count - Число текущих успешно выделенных двумерных динамических массивов
  457.     // n1, m1 - переменные, для передачи значений числа строк и столбцов у выбранной таблицы (соответственно)
  458.     // k - номер выбранной таблицы
  459.     // На выходе:
  460.     // Значения для n1, m1 - число строк и стобцов исходной таблицы
  461.     while(k == -1){
  462.        for(int i = 0; i < count; ++i)
  463.           printf("%d. Table #%d\n", i + 1, i + 1);
  464.           printf("Choose your table: ");
  465.        while(!scanf("%d", &k) || !(k >= 1 && k <= count)){
  466.           printf("Choose your table: ");
  467.           fflush(stdin);
  468.        }
  469.     }
  470.     n1 = sizes[k - 1][0];
  471.     m1 = sizes[k - 1][1];
  472. }
  473. void exitProgram(){
  474.     // Подпрограмма выхода из программы в случае, если нет памяти на выделение главной части программы, работа без которой невозможна.
  475.     // На входе: ничего
  476.     // На выходе: Уведомление о недостаточности памяти для выделения основных частей программы.
  477.     printf("Error. Could not allocate memory for create an main array!\n");
  478.     getchar();
  479.     exit(0);
  480. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement