Advertisement
Usow_Maxim

Для андрюхи 7-мя лаба с коментами

Mar 16th, 2018
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.47 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <windows.h>
  3.  
  4. int Write_int() //Функция безопасного ввода цифр
  5. {
  6.     char arr[10];
  7.     int value = 0;
  8.     while(true)
  9.     {
  10.         scanf("%s", arr);
  11.         if(atoi(arr)) //данная функция возвращает число от 0 до нужного нам числа, то есть если функции не удалось преобразовать строку в число, то она возвращает 0
  12.         {
  13.             value = atoi(arr);
  14.             break;
  15.         }
  16.         else
  17.             printf("Введите значение n > 0: ");
  18.     }
  19.     return value;
  20. }
  21.  
  22. char** FileRead(int &Size)
  23. {
  24.     char** str = NULL; //Основной массив для хранения данных
  25.     char** copyStr = NULL; //Для расширения основного
  26.     Size = 0;
  27.     printf("Введите название файла: ");
  28.     char fileName[100];
  29.     scanf("%s", fileName);
  30.     FILE* f = fopen(fileName, "r"); //Создаём указатель на область памяти, где будут лежать данные с файла и загружаем файл в область памяти
  31.     if(f != NULL)
  32.     {
  33.         printf("Чтение:\n");
  34.         char buf[1000]; //Данный буфер может содержать до 1000 символов в строке, если в файле будет больше 1000 символов, то я не знаю что будет))) скорее всего краш...
  35.         while(!feof(f)) //Цикл работает пока файл не пуст
  36.         {
  37.             if(fscanf(f, "%[^\n]\n", buf)) //Читаем по строчно из файла и сохраняем в буфер, если считать не удалось, значит где-то касяк)
  38.             {
  39.                 char** copyStr = new char*[Size + 1]; //Типичное расширение массива
  40.                 for(int i = 0; i < Size; i++)
  41.                 {
  42.                     copyStr[i] = new char[strlen(str[i])];
  43.                     strcpy(copyStr[i], str[i]);
  44.                     delete[] str[i];
  45.                 }
  46.                 delete[] str;
  47.                 str = new char*[Size + 1];
  48.                 for(int i = 0; i < Size; i++)
  49.                 {
  50.                     str[i] = new char[strlen(copyStr[i])];
  51.                     strcpy(str[i], copyStr[i]);
  52.                     delete[] copyStr[i];
  53.                 }
  54.                 delete[] copyStr;
  55.                 str[Size] = new char[strlen(buf)]; //В конце расширенного массива добовляем в массив считанную строку из буфера
  56.                 strcpy(str[Size], buf);
  57.                 printf("%s\n", str[Size]);
  58.                 Size++;
  59.             }
  60.         }
  61.     }
  62.     else
  63.     {
  64.         printf("Ошибка чтения!\n");
  65.     }
  66.     fclose(f); //Закрыть файл!!!
  67.     return str;
  68. }
  69.  
  70. void Obrab(char**str, int Size)
  71. {
  72.  
  73.     char** copyStr = new char*[Size]; //Этот массив будет использован для изменения строк, чтобы не затронуть основной массив
  74.     char** tokStr = new char*[Size];
  75.  
  76.     //Удаление первого слова в строке
  77.     for(int i = 0; i < Size; i++)
  78.     {
  79.         copyStr[i] = new char[strlen(str[i])];
  80.         strcpy(copyStr[i], str[i]);
  81.         tokStr[i] = strchr(copyStr[i], ' '); //strchr - Удаляет все символы до нужного нам символа и возращает изменённую строку
  82.     }
  83.     //Сортировка по алфавиту.
  84.     int cur = 0;
  85.     int* index = new int[Size];
  86.     for(int i = 0; i < Size; i++)
  87.         index[i] = i;
  88.     for(int i = 0; i < Size; i++)
  89.         for(int j = i + 1; j < Size; j++)
  90.             if(strcmp(tokStr[i], tokStr[j]) > 0)
  91.             {
  92.                 cur = index[i];
  93.                 index[i] = index[j];
  94.                 index[j] = cur;
  95.             }
  96.  
  97.     //Вывод
  98.     printf("Сортировка:\n");
  99.     for(int i = 0; i < Size; i++)
  100.     {
  101.         printf("%s\n", str[index[i]]);
  102.         delete[] copyStr[i];
  103.         delete[] tokStr[i];
  104.     }
  105.     delete[] copyStr;
  106.     delete[] tokStr;
  107.     printf("\n");
  108. }
  109.  
  110. /////////////////
  111. //Вывод массива//
  112. /////////////////
  113. void Output(char** str, int Size)
  114. {
  115.     printf("Вывод:\n");
  116.     for(int i = 0; i < Size; i++)
  117.     {
  118.         printf("%s\n", str[i]);
  119.     }
  120.     printf("\n");
  121. }
  122.  
  123. int main()
  124. {
  125.     SetConsoleCP(1251);
  126.     SetConsoleOutputCP(1251);
  127.  
  128.     int Size = 0;
  129.     char** str = NULL;
  130.  
  131.     bool Exit = false;
  132.     while(!Exit)
  133.     {
  134.         printf("---------------\n1.Загрузка из файла\n2.Обработка данных\n3.Вывод результата на экран.\n4.Выход\n---------------\nВыбор: ");
  135.         switch(Write_int())
  136.         {
  137.             case 1:
  138.                 str = FileRead(Size);
  139.                 break;
  140.             case 2:
  141.                 Obrab(str, Size);
  142.                 break;
  143.             case 3:
  144.                 Output(str, Size);
  145.                 break;
  146.             case 4:
  147.                 Exit = true;
  148.                 break;
  149.             default:
  150.                 break;
  151.         }
  152.     }
  153.  
  154.     //Чистка данных
  155.     for(int i = 0; i < Size; i++)
  156.         delete[] str[i];
  157.     delete[] str;
  158.  
  159.     return 0;
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement