Guest User

Untitled

a guest
Jan 13th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.89 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <windows.h>
  6. #include <conio.h>
  7.  
  8. using namespace std;
  9.  
  10. int strings_n = 0, // количетво строк
  11. words_n = 0; // количество слов
  12.  
  13. // рассчитывает хеш-функцию
  14. // (ASCII коды всех букв суммируются, и берётся остаток от деления на 100)
  15. int hashFunction(char *string)
  16. {
  17. int summa = 0;
  18. for (int i = 0; i < (int)strlen(string); i++)
  19. summa += (int)(string[i]);
  20.  
  21. return summa % 100;
  22. }
  23.  
  24. // создает массив слов на основе файла
  25. char **wordsFromFile(char *f_name)
  26. {
  27. // открываем файл, проверяем его наличие и заодно эти хрени с "con" и т.д.
  28. FILE *text_f = fopen(f_name, "r");
  29. if ((text_f == NULL) || !strcmp(f_name, "con") || !strcmp(f_name, "nul")
  30. || !strcmp(f_name, "prn") || !strcmp(f_name, "aux"))
  31. {
  32. cout << "File not found!\n";
  33. exit(1);
  34. }
  35.  
  36. char f_str[256]; // для считывания строки из файла
  37. char *new_word; // новое вычленяемое слово
  38.  
  39. // считаем количество слов в тектовом файле
  40. // и заодно - количетво строк
  41. for ( ; fgets(f_str, 256, text_f) != NULL; strings_n++)
  42. {
  43. // считаем слова в каждой новой строке и суммируем
  44. new_word = strtok(f_str, " .,;:-?!()/<>@\n");
  45. for ( ; new_word != NULL; words_n++)
  46. new_word = strtok(NULL, " .,;:-?!()/<>@\n");
  47. }
  48.  
  49. // открываем заново файл
  50. fclose(text_f);
  51. text_f = fopen(f_name, "r");
  52.  
  53. int k = 0;
  54. char **words = new char*[words_n]; // создаём массив слов
  55. // цикл по строкам
  56. for (int i = 0; i < strings_n; i++)
  57. {
  58. fgets(f_str, 256, text_f);
  59.  
  60. // цикл по словам: по очереди записываем слова из текущей строки
  61. new_word = strtok(f_str, " .,;:-?!()/<>@\n");
  62. for ( ; new_word != NULL; k++)
  63. {
  64. words[k] = new char[strlen(new_word) + 1];
  65. strncpy(words[k], new_word, strlen(new_word));
  66. words[k][strlen(new_word)] = '\0';
  67.  
  68. new_word = strtok(NULL, " .,;:-?!()/<>@\n");
  69. }
  70. }
  71.  
  72. // закрываем файл, возвращаем указатель на полученный массив слов
  73. fclose(text_f);
  74. return words;
  75. }
  76.  
  77. void main(int argc, _TCHAR* argv[])
  78. {
  79. // вводим имя файла в строку
  80. char f_name[256];
  81. cout << "Input file: ";
  82. gets(f_name);
  83.  
  84. // заполняем массив слов из файла (см. wordsFromFile), создаем массив хешей
  85. char **words = wordsFromFile(f_name);
  86. int *hashes = new int[words_n];
  87.  
  88. // считаем хеш-функцию от каждого слова и выводим данные на экран
  89. cout << "\n";
  90. for (int i = 0; i < words_n; i++)
  91. {
  92. hashes[i] = hashFunction(words[i]);
  93. printf("%-*s<hash: %*d>\n", 15, words[i], 2, hashes[i]);
  94. }
  95.  
  96. // вводим строку с двумя словами для поиска
  97. char request[256];
  98. cout << "\nEnter two words for search: ";
  99. gets(request);
  100.  
  101. // вычленяем из строки ровно два слова (без указанных знаков препинания)
  102. char *s_word1 = strtok(request, " .,;:-?!()/<>@\n");
  103. char *s_word2 = strtok(NULL, " .,;:-?!()/<>@\n");
  104.  
  105. // если введено меньше двух корректых слов - ошибка
  106. if ((s_word1 == NULL) || (s_word2 == NULL))
  107. {
  108. cout << "Two words not entered!\n";
  109. exit(1);
  110. }
  111.  
  112. cout << "\n";
  113.  
  114. // считаем хеш-функцию для каждого из двух слов для поиска
  115. int s_hash1 = hashFunction(s_word1);
  116. int s_hash2 = hashFunction(s_word2);
  117.  
  118. // осуществляем поиск: сначала проверяется совпадение двух хешей подряд, затем
  119. // если они совпали, проверяется совпадение самих двух слов подряд
  120. bool found = 0;
  121. for (int i = 0; i < words_n-1; i++)
  122. if ((s_hash1 == hashes[i]) && (s_hash2 == hashes[i+1]) &&
  123. !strcmp(s_word1, words[i]) && !strcmp(s_word2, words[i+1]))
  124. {
  125. // выводим найденные слова с хешами и их позицию (порядковый номер первого слова)
  126. cout << "Found: '" << words[i] << " <hash: " << hashes[i] << "> " <<
  127. words[i+1] << " <hash: " << hashes[i+1] << ">' at position " << i << "\n";
  128.  
  129. found = 1;
  130. }
  131.  
  132. // если ничего не найдено, так и говорим
  133. if (!found)
  134. cout << "Not Found\n";
  135.  
  136. // освобождаем память
  137. for (int i = 0; i < words_n; i++)
  138. delete [] words[i];
  139.  
  140. delete [] words;
  141. delete [] hashes;
  142.  
  143. cout << "\n";
  144. }
Add Comment
Please, Sign In to add comment