Advertisement
daniil_mironoff

Lab 2.3 named Artemy Tarasova

May 14th, 2019
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.10 KB | None | 0 0
  1. #include <iostream> // Для ВЫВОДА (и ввода)
  2. #include <string>   // Для СТРОК
  3. #include <fstream>  // Для ФАЙЛОВ
  4. #include <iomanip>  // Для форматирования потока
  5. #include "stdafx.h" // Библиотека для MVS
  6.  
  7. using namespace std;    // Пространство имен std
  8.  
  9. // Возвращает первое слово (Фамилию) строки
  10. char * insert_name(char * arr) {
  11.     char * word = new char[16];
  12.    
  13.     // Записывает символы до пробоела (до даты)
  14.     for (int j = 0; arr[j] != 32; j++) {
  15.         word[j] = arr[j];
  16.        
  17.         // Если это последний символ слова (фамилии)
  18.         // то записать в конец 0 символ (окончание)
  19.         if (arr[j + 1] == 32) {
  20.             word[j + 1] = 0;
  21.         }
  22.     }
  23.    
  24.     return word;
  25. }
  26.  
  27. // Возвращает результат сравнения строк (фамилий)
  28. char string_comparison(char * str1, char * str2) {
  29.     // [0] str1 == str2
  30.     // [1] str1 > str2
  31.     // [2] str1 < str2
  32.    
  33.     // Посимвольное сравнение
  34.     for (int i = 0; true; i++) {
  35.         if (str1[i] > str2[i]) {
  36.             return 1;
  37.         } else if (str1[i] < str2[i]) {
  38.             return 2;
  39.         } else if (str1[i] == 0) {
  40.             return 0;
  41.         }
  42.     }
  43.    
  44.     return 228;
  45. }
  46.  
  47. int main() {
  48.     string name_file;                 // Название файла
  49.     string line;                      // Для работы с файлом
  50.     char ** arr = new char * [10000]; // Хранит строки файла
  51.     int size = 0;                     // Хранит кол-во строк файла
  52.     char * value = new char[1];       // Хранит искомое
  53.    
  54.     // Открытие введенного файла
  55.     cout << "Введите название файла (имя.расширение): ";
  56.     cin >> name_file;
  57.     ifstream myfile (name_file); // Открытие файла
  58.    
  59.     //  Подсчет и запись строк
  60.     while (! myfile.eof() ) {      // Цилк, пока есть строки в файле
  61.         arr[size] = new char [64]; // Создание новой строки в массиве
  62.         getline(myfile, line);     // Чтение строки
  63.        
  64.         // Посимвольная запись строки в (строку) массив(а)
  65.         for (int i = 0; line.length() > i; i++) {
  66.             arr[size][i] = line[i];
  67.         }
  68.        
  69.         size++;     // Счетчик строк в массиве
  70.     }
  71.    
  72.     myfile.close(); // Закрытие файла
  73.    
  74.     // Ввод искомого значения (фамилии)
  75.     cout << "Введите искомую фамилию: ";
  76.     scanf("%s", value);
  77.    
  78.     cout << endl;
  79.    
  80.     cout << "[ПОСЛЕДОВАТЕЛЬНЫЙ ПОИСК]" << endl;
  81.     for (int i = 0; size > i; i++) {
  82.         // Запись (для сравнения) текущего значения (фамилии)
  83.         char * name = new char[32];
  84.         name = insert_name(arr[i]);
  85.        
  86.         if (string_comparison(name, value) == 0) {
  87.             // Если значения совпадают
  88.             printf("Искомое найдено под индексом %d\nИскомое: %s\n", i, arr[i]); break;
  89.         } else if (string_comparison(name, value) == 1 || size == i + 1) {
  90.             // Если текущее значение больше искомого* ИЛИ это последние значение
  91.             // * - т.е. нету смысла рассматривать следующее,
  92.             //     т.к. они все не подойдут
  93.             cout << "Искомое не найдено" << endl; break;
  94.         }
  95.     }
  96.    
  97.     cout << endl;
  98.    
  99.     cout << "[БИНАРНЫЙ ПОИСК]" << endl;
  100.     int left = 0; // Левая граница (size - правая)
  101.     while (true) {
  102.         int midd = (left + size) / 2; // Индекс текущего элемента (фамилии)
  103.        
  104.         // Запись (для сравнения) текущего значения (фамилии)
  105.         char * name = new char[32];
  106.         name = insert_name(arr[midd]);
  107.        
  108.         if (string_comparison(name, value) == 1) {
  109.             // Если текущее значение больше искомого
  110.             size = midd - 1;
  111.         } else if (string_comparison(name, value) == 2) {
  112.             // Если текущее значение меньше искомого
  113.             left = midd + 1;
  114.         } else {
  115.             // Если найдено искомое
  116.             printf("Искомое найдено под индексом %d\nИскомое: %s\n", midd, arr[midd]); break;
  117.         }
  118.        
  119.         if (left > size) {
  120.             // Если не найдено искомое
  121.             cout << "Искомое не найдено" << endl; break;
  122.         }
  123.     }
  124.    
  125.     return 0;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement