Advertisement
daniil_mironoff

Lab 2.1 named Artemy Tarasova

May 12th, 2019
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.09 KB | None | 0 0
  1. #include <iostream> // Для ВЫВОДА (и ввода)
  2. #include <string>   // Для СТРОК
  3. #include <fstream>  // Для ФАЙЛОВ
  4. #include <ctime>    // Для ВРЕМЕНИ
  5. #include <iomanip>  // Для форматирования потока
  6. #include "stdafx.h"
  7.  
  8. using namespace std;
  9.  
  10. // Возвращает размер строки (символьного массива (строки))
  11. int size_string(char * string) {
  12.     int count = 0;
  13.    
  14.     while(string[count] != 0) {
  15.         count++;
  16.     }
  17.    
  18.     return count;
  19. }
  20.  
  21. // Меняем местами строки (текущию и next)
  22. void swap_string_bool(char ** name, char ** birthday, char ** city, int i) {
  23.     char * str = new char[1];
  24.    
  25.     str = name[i];
  26.     name[i] = name[i + 1];
  27.     name[i + 1] = str;
  28.    
  29.     str = birthday[i];
  30.     birthday[i] = birthday[i + 1];
  31.     birthday[i + 1] = str;
  32.    
  33.     str = city[i];
  34.     city[i] = city[i + 1];
  35.     city[i + 1] = str;
  36. }
  37.  
  38. // Сравнение строк
  39. bool comparison_string(char ** string, int i, int j) {
  40.     // строка_i > строка_j == true
  41.     // строка_i < строка_j == false
  42.     // строка_i = строка_j == true
  43.    
  44.     int size_i = size_string(string[i]);
  45.     int size_j = size_string(string[j]);
  46.    
  47.     int k = 0;
  48.    
  49.     while(true) {
  50.         if (string[i][k] == 0) {
  51.             return true;
  52.         } else if (string[j][k] == 0) {
  53.             return false;
  54.         }
  55.        
  56.         if (string[i][k] > string[j][k]) {
  57.             return true;
  58.         } else if (string[i][k] < string[j][k]) {
  59.             return false;
  60.         }
  61.        
  62.         k++;
  63.     }
  64.    
  65.     return 0;
  66. }
  67.  
  68. int main() {
  69.     string line;        // Хранит текущую строку (для записи в весь текст)
  70.     string text;        // Хранит весь текст файла
  71.     int count_line = 0; // Хранит кол-во строк
  72.     int timer;          // Таймер для посчета времени выполнения алгоритмов
  73.    
  74.     char ** name = new char * [30000];     // Двумерный массив для хранения ИМЕНИ
  75.     char ** birthday = new char * [30000]; // Двумерный массив для хранения ДР
  76.     char ** city = new char * [30000];     // Двумерный массив для хранения ГОРОДА
  77.    
  78.     string name_file;
  79.     cout << "Введите название файла (имя.расширение): ";
  80.     cin >> name_file;
  81.     ifstream myfile (name_file);
  82.    
  83.     //  Подсчет и запись строк
  84.     while (! myfile.eof() ) {
  85.         getline(myfile, line);  // Чтение строки
  86.         text += line + " ";     // Запись в одну переменную
  87.     }
  88.    
  89.     myfile.close(); // Закрытие файла
  90.     ofstream F (name_file, ios::out); F.close(); // Очистка файла
  91.    
  92.     //  ПАРСИНГ (операторы)
  93.     int k = 0;                          // СЧЕТЧИК для записи в массивы
  94.     char flag = 0;                      // ФЛАГ для парсинга
  95.     name[count_line] = new char [25];   // Для первой записи
  96.    
  97.     //  ПАРСИНГ (цикл)
  98.     for (int i = 0; text[i] != 0; i++) {
  99.         // Если обноружен пробел
  100.         if (text[i] == 32) {
  101.             // То устанавливаем конец значения
  102.             if (flag == 0) {
  103.                 name[count_line][k] = 0;
  104.                 birthday[count_line] = new char [16];
  105.             } else if (flag == 1) {
  106.                 birthday[count_line][k] = 0;
  107.                 city[count_line] = new char [40];
  108.             } else if (flag == 2) {
  109.                 city[count_line][k] = 0;
  110.             }
  111.            
  112.             flag++; // Меняем (увеличиваем) флаг
  113.             k = 0;  // Обнуляем счетчик для записи строки
  114.            
  115.             // Если последним значением было City
  116.             if (flag == 3) {
  117.                 count_line++;
  118.                 flag = 0;
  119.                 name[count_line] = new char [1];
  120.             }
  121.            
  122.             continue;
  123.         }
  124.        
  125.         if (flag == 0) {
  126.             name[count_line][k] = text[i];
  127.         } else if (flag == 1) {
  128.             birthday[count_line][k] = text[i];
  129.         } else if (flag == 2) {
  130.             city[count_line][k] = text[i];
  131.         }
  132.        
  133.         k++;
  134.     }
  135.    
  136.     //  Запуск таймера
  137.     timer = time(NULL);
  138.    
  139.     //  СОРТИРОВКА ПУЗЫРЬКОМ
  140.     for (int i = 0; count_line > i; i++) {
  141.         for (int j = 0; count_line - i - 1 > j; j++) {
  142.             //                                v~~~~~~~ Изменить, для другого столбца (не работает для даты рождения)
  143.             if (comparison_string(name, j, j + 1)) {
  144.                 swap_string_bool(name, birthday, city, j);
  145.             } else {
  146.                 continue;
  147.             }
  148.         }
  149.     }
  150.    
  151.     //  Остановка и выпуск таймера
  152.     cout << "Сортировка ПУЗЫРЬКОМ: " << time(NULL) - timer << "сек." << endl;
  153.    
  154.     //  ПЕРЕЗАПИСЬ массивов (операторы)
  155.     k = 0;
  156.     flag = 0;
  157.     count_line = 0;
  158.    
  159.     //  ПЕРЕЗАПИСЬ массивов (цикл)
  160.     for (int i = 0; text[i] != 0; i++) {
  161.         if (text[i] == 32) {
  162.             if (flag == 0) {
  163.                 name[count_line][k] = 0;
  164.             } else if (flag == 1) {
  165.                 birthday[count_line][k] = 0;
  166.             } else if (flag == 2) {
  167.                 city[count_line][k] = 0;
  168.             }
  169.            
  170.             flag++;
  171.             k = 0;
  172.            
  173.             if (flag == 3) {
  174.                 count_line++;
  175.                 flag = 0;
  176.             }
  177.            
  178.             continue;
  179.         }
  180.        
  181.         if (flag == 0) {
  182.             name[count_line][k] = text[i];
  183.         } else if (flag == 1) {
  184.             birthday[count_line][k] = text[i];
  185.         } else if (flag == 2) {
  186.             city[count_line][k] = text[i];
  187.         }
  188.        
  189.         k++;
  190.     }
  191.    
  192.     //  Запуск таймера
  193.     timer = time(NULL);
  194.    
  195.     //  СОРТИРОВКА ВСТАВКОЙ
  196.     for (int i = 1; count_line > i; i++) {
  197.         //            Изменить, для другого столбца ~~~~~~~v
  198.         for (int j = i; j > 0 && comparison_string(name, j - 1, j); j--) {
  199.             swap_string_bool(name, birthday, city, j - 1);
  200.         }
  201.     }
  202.    
  203.     //  Остановка и выпуск таймера
  204.     cout << "Сортировка ВСТАВКОЙ: " << time(NULL) - timer << "сек." << endl;
  205.    
  206.     //  ЗАПИСЬ в файл
  207.     ofstream out;
  208.     out.open(name_file);
  209.     for (int i = 0; count_line > i; i++) {
  210.         out << setw(14) << name[i]
  211.         << setw(14) << birthday[i]
  212.         << setw(20) << city[i] << endl;
  213.     }
  214.    
  215.     return 0;
  216. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement