Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <iostream>
- #include <stdio.h>
- #include <string.h>
- #include <windows.h>
- #include <conio.h>
- using namespace std;
- int strings_n = 0, // количетво строк
- words_n = 0; // количество слов
- // рассчитывает хеш-функцию
- // (ASCII коды всех букв суммируются, и берётся остаток от деления на 100)
- int hashFunction(char *string)
- {
- int summa = 0;
- for (int i = 0; i < (int)strlen(string); i++)
- summa += (int)(string[i]);
- return summa % 100;
- }
- // создает массив слов на основе файла
- char **wordsFromFile(char *f_name)
- {
- // открываем файл, проверяем его наличие и заодно эти хрени с "con" и т.д.
- FILE *text_f = fopen(f_name, "r");
- if ((text_f == NULL) || !strcmp(f_name, "con") || !strcmp(f_name, "nul")
- || !strcmp(f_name, "prn") || !strcmp(f_name, "aux"))
- {
- cout << "File not found!\n";
- exit(1);
- }
- char f_str[256]; // для считывания строки из файла
- char *new_word; // новое вычленяемое слово
- // считаем количество слов в тектовом файле
- // и заодно - количетво строк
- for ( ; fgets(f_str, 256, text_f) != NULL; strings_n++)
- {
- // считаем слова в каждой новой строке и суммируем
- new_word = strtok(f_str, " .,;:-?!()/<>@\n");
- for ( ; new_word != NULL; words_n++)
- new_word = strtok(NULL, " .,;:-?!()/<>@\n");
- }
- // открываем заново файл
- fclose(text_f);
- text_f = fopen(f_name, "r");
- int k = 0;
- char **words = new char*[words_n]; // создаём массив слов
- // цикл по строкам
- for (int i = 0; i < strings_n; i++)
- {
- fgets(f_str, 256, text_f);
- // цикл по словам: по очереди записываем слова из текущей строки
- new_word = strtok(f_str, " .,;:-?!()/<>@\n");
- for ( ; new_word != NULL; k++)
- {
- words[k] = new char[strlen(new_word) + 1];
- strncpy(words[k], new_word, strlen(new_word));
- words[k][strlen(new_word)] = '\0';
- new_word = strtok(NULL, " .,;:-?!()/<>@\n");
- }
- }
- // закрываем файл, возвращаем указатель на полученный массив слов
- fclose(text_f);
- return words;
- }
- void main(int argc, _TCHAR* argv[])
- {
- // вводим имя файла в строку
- char f_name[256];
- cout << "Input file: ";
- gets(f_name);
- // заполняем массив слов из файла (см. wordsFromFile), создаем массив хешей
- char **words = wordsFromFile(f_name);
- int *hashes = new int[words_n];
- // считаем хеш-функцию от каждого слова и выводим данные на экран
- cout << "\n";
- for (int i = 0; i < words_n; i++)
- {
- hashes[i] = hashFunction(words[i]);
- printf("%-*s<hash: %*d>\n", 15, words[i], 2, hashes[i]);
- }
- // вводим строку с двумя словами для поиска
- char request[256];
- cout << "\nEnter two words for search: ";
- gets(request);
- // вычленяем из строки ровно два слова (без указанных знаков препинания)
- char *s_word1 = strtok(request, " .,;:-?!()/<>@\n");
- char *s_word2 = strtok(NULL, " .,;:-?!()/<>@\n");
- // если введено меньше двух корректых слов - ошибка
- if ((s_word1 == NULL) || (s_word2 == NULL))
- {
- cout << "Two words not entered!\n";
- exit(1);
- }
- cout << "\n";
- // считаем хеш-функцию для каждого из двух слов для поиска
- int s_hash1 = hashFunction(s_word1);
- int s_hash2 = hashFunction(s_word2);
- // осуществляем поиск: сначала проверяется совпадение двух хешей подряд, затем
- // если они совпали, проверяется совпадение самих двух слов подряд
- bool found = 0;
- for (int i = 0; i < words_n-1; i++)
- if ((s_hash1 == hashes[i]) && (s_hash2 == hashes[i+1]) &&
- !strcmp(s_word1, words[i]) && !strcmp(s_word2, words[i+1]))
- {
- // выводим найденные слова с хешами и их позицию (порядковый номер первого слова)
- cout << "Found: '" << words[i] << " <hash: " << hashes[i] << "> " <<
- words[i+1] << " <hash: " << hashes[i+1] << ">' at position " << i << "\n";
- found = 1;
- }
- // если ничего не найдено, так и говорим
- if (!found)
- cout << "Not Found\n";
- // освобождаем память
- for (int i = 0; i < words_n; i++)
- delete [] words[i];
- delete [] words;
- delete [] hashes;
- cout << "\n";
- }
Add Comment
Please, Sign In to add comment