Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream> // Для ВЫВОДА (и ввода)
- #include <string> // Для СТРОК
- #include <fstream> // Для ФАЙЛОВ
- #include <iomanip> // Для форматирования потока
- #include "stdafx.h" // Библиотека для MVS
- using namespace std; // Пространство имен std
- // Возвращает первое слово (Фамилию) строки
- char * insert_name(char * arr) {
- char * word = new char[16];
- // Записывает символы до пробоела (до даты)
- for (int j = 0; arr[j] != 32; j++) {
- word[j] = arr[j];
- // Если это последний символ слова (фамилии)
- // то записать в конец 0 символ (окончание)
- if (arr[j + 1] == 32) {
- word[j + 1] = 0;
- }
- }
- return word;
- }
- // Возвращает результат сравнения строк (фамилий)
- char string_comparison(char * str1, char * str2) {
- // [0] str1 == str2
- // [1] str1 > str2
- // [2] str1 < str2
- // Посимвольное сравнение
- for (int i = 0; true; i++) {
- if (str1[i] > str2[i]) {
- return 1;
- } else if (str1[i] < str2[i]) {
- return 2;
- } else if (str1[i] == 0) {
- return 0;
- }
- }
- return 228;
- }
- int main() {
- string name_file; // Название файла
- string line; // Для работы с файлом
- char ** arr = new char * [10000]; // Хранит строки файла
- int size = 0; // Хранит кол-во строк файла
- char * value = new char[1]; // Хранит искомое
- // Открытие введенного файла
- cout << "Введите название файла (имя.расширение): ";
- cin >> name_file;
- ifstream myfile (name_file); // Открытие файла
- // Подсчет и запись строк
- while (! myfile.eof() ) { // Цилк, пока есть строки в файле
- arr[size] = new char [64]; // Создание новой строки в массиве
- getline(myfile, line); // Чтение строки
- // Посимвольная запись строки в (строку) массив(а)
- for (int i = 0; line.length() > i; i++) {
- arr[size][i] = line[i];
- }
- size++; // Счетчик строк в массиве
- }
- myfile.close(); // Закрытие файла
- // Ввод искомого значения (фамилии)
- cout << "Введите искомую фамилию: ";
- scanf("%s", value);
- cout << endl;
- cout << "[ПОСЛЕДОВАТЕЛЬНЫЙ ПОИСК]" << endl;
- for (int i = 0; size > i; i++) {
- // Запись (для сравнения) текущего значения (фамилии)
- char * name = new char[32];
- name = insert_name(arr[i]);
- if (string_comparison(name, value) == 0) {
- // Если значения совпадают
- printf("Искомое найдено под индексом %d\nИскомое: %s\n", i, arr[i]); break;
- } else if (string_comparison(name, value) == 1 || size == i + 1) {
- // Если текущее значение больше искомого* ИЛИ это последние значение
- // * - т.е. нету смысла рассматривать следующее,
- // т.к. они все не подойдут
- cout << "Искомое не найдено" << endl; break;
- }
- }
- cout << endl;
- cout << "[БИНАРНЫЙ ПОИСК]" << endl;
- int left = 0; // Левая граница (size - правая)
- while (true) {
- int midd = (left + size) / 2; // Индекс текущего элемента (фамилии)
- // Запись (для сравнения) текущего значения (фамилии)
- char * name = new char[32];
- name = insert_name(arr[midd]);
- if (string_comparison(name, value) == 1) {
- // Если текущее значение больше искомого
- size = midd - 1;
- } else if (string_comparison(name, value) == 2) {
- // Если текущее значение меньше искомого
- left = midd + 1;
- } else {
- // Если найдено искомое
- printf("Искомое найдено под индексом %d\nИскомое: %s\n", midd, arr[midd]); break;
- }
- if (left > size) {
- // Если не найдено искомое
- cout << "Искомое не найдено" << endl; break;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement