Advertisement
Guest User

Untitled

a guest
May 26th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. void print_word(Word wrd) { //Функция печати отдельного слова из словаря
  2.  
  3. if (wrd.tr[strlen(wrd.tr) - 1] == '\n') { //проверяем, есть ли у перевода слова на *длина-1* месте, т.е. в конце, символ переонса строки
  4. printf("%10s || %s", wrd.word, wrd.tr); //если есть, то выводим без него
  5. }
  6. else printf("%10s || %s\n", wrd.word, wrd.tr); //если нет, то добавляем символ переноса строки
  7. }
  8. void cpf(Thesaurus thes) { //Функция, копирующая словарь в файл
  9. FILE* f;
  10. char file_name[] = "ThesOut.txt"; //Имя файла
  11. if ((f = fopen(file_name, "w")) == NULL) printf("\nError opening file\n"); //Открытие файла в режиме записи
  12. for (auto it = thes.eng.begin(); it != thes.eng.end(); ++it) { //Цикл. Итератор устанавливается в начало вектора, пока итератор не указывает на конец вектора
  13. fprint_word(*it, f); //Вызываем функцию печати одного слова в файл
  14. }
  15. for (auto it = thes.rus.begin(); it != thes.rus.end(); ++it) { //аналогично для рус-англ
  16. fprint_word(*it, f);
  17. }
  18. fclose(f); //Закрытие файла
  19. printf("Your thesaurus was copied to ThesOut.txt!\n");
  20. }
  21. void fprint_word(Word wrd, FILE* f) {//Функция, копирующая слово в файл
  22. fprintf(f, "%s|%s\n", wrd.word, wrd.tr);//Записываем в файл f слово и его перевод
  23. }
  24. void tr(Thesaurus& thes) {//Функция, переводящая слово
  25. char* word = (char*)malloc(sizeof(char) * 256);//Динамическое выделение памяти под слово
  26. printf("Enter the word you want to see translation for\n");
  27. (void)scanf("%s", word);//Ввод слова пользователем
  28. word = (char*)realloc(word, sizeof(char) * (strlen(word) + 1));//Освобождение памяти
  29.  
  30. if (word[0] > 'A' && word[0] < 'z') {//Если английский язык
  31. for (auto it = thes.eng.begin(); it != thes.eng.end(); ++it) {//Цикл. Итератор указывает на начало вектора, пока итератор не будет указывать на конец вектора
  32. if (strcmp((*it).word, word) == 0) { //Если искомое слово есть в словаре
  33. printf("%10s - %s\n", word, (*it).tr); //Выводим слово и его перевод на экран
  34. break;
  35. }
  36. else {
  37. printf("No such word in Thesaurus. Sorry.");
  38. return;
  39. }
  40. }
  41. }
  42. else {//Если русский
  43. for (auto it = thes.rus.begin(); it != thes.rus.end(); ++it) {
  44. if (strcmp((*it).word, word) == 0) {
  45. printf("%10s - %s\n", word, (*it).tr);
  46. break;
  47. }
  48. else {
  49. printf("No such word in Thesaurus. Sorry.");
  50. break;
  51. }
  52. }
  53. }
  54.  
  55. free(word);//Освобождаем память
  56. }
  57. void addt(Thesaurus& thes) {//Функция, добавляющая перевод
  58. char* _word = (char*)malloc(sizeof(char) * 256); //Динамическое выделение памяти под слово
  59. char* _tr = (char*)malloc(sizeof(char) * 256);//Динамическое выделение памяти под его перевод
  60. printf("Which word would you like to add translation for?\n");
  61. (void)scanf("%s", _word); //Пользователь вводит слово, к которому будет добавлен перевод
  62. printf("Enter your translation: ");
  63. (void)scanf("%s", _tr); //Пользоватаель вводит перевод
  64.  
  65. if (_word[0] > 'A' && _word[0] < 'z') { //Если слово английское
  66. for (auto it = thes.eng.begin(); it != thes.eng.end(); ++it) {//Цикл. Итератор указывает на начало вектора, пока итератор не указывает на конец вектора
  67. if (strcmp((*it).word, _word) == 0) {//Если слово, к которому добавляют перевод есть в словаре
  68. if (isSubInStr((*it).tr, _tr)) { //Если новый перевод уже добавблен в словарь
  69. printf("\nThis translation is already there.\n");
  70. return;
  71. }
  72. Word tmp = Word(_tr, (*it).word);//Во временную переменную записывается новый перевод и слово
  73. thes.rus.push_back(tmp); //Временная переменная записывается в конец вектора
  74. (*it).tr = (char*)realloc((*it).tr, sizeof(char) * (strlen((*it).tr) + strlen(_tr) + 3));//Очищение памяти //А еще не уверена почему (*it) в начале
  75. (*it).tr = strcat((*it).tr, "; ");//Соединяем в цепочку "старый" перевод и '; '
  76. (*it).tr = strcat((*it).tr, _tr);//Соединяем в цепочку "старый" перевод и "новый" перевод
  77. }
  78. }
  79. }
  80. else {//Если русский язык
  81. for (auto it = thes.rus.begin(); it != thes.rus.end(); ++it) {
  82. if (strcmp((*it).word, _word) == 0) {
  83. if (isSubInStr((*it).tr, _tr)) {
  84. printf("\nThis translation is already there.\n");
  85. return;
  86. }
  87. Word tmp = Word(_tr, (*it).word);
  88. thes.eng.push_back(tmp);
  89. (*it).tr = (char*)realloc((*it).tr, sizeof(char) * (strlen((*it).tr) + strlen(_tr) + 3));
  90. (*it).tr = strcat((*it).tr, "; ");
  91. (*it).tr = strcat((*it).tr, _tr);
  92. }
  93. }
  94. }
  95. }
  96. bool isSubInStr(const char * str, const char * fnd) { //Проверяет есть ли в строке данная подсрока
  97. bool bExist = false;
  98. if (str && fnd) //По сути проверка, что ни одна из строк не NULL
  99. bExist = strstr(str, fnd) != 0; //strstr вернет NULL, если подстроки в строке нет, место на начало совпадения в противном случае
  100. return bExist;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement