Advertisement
-Peer-

Контрольная по ударениям

Sep 8th, 2019
2,011
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.91 KB | None | 0 0
  1. //    КОНТРОЛЬНАЯ   ПО   УДАРЕНИЯМ
  2. /*
  3. Учительница задала Пете домашнее задание — в заданном тексте расставить
  4. ударения в словах, после чего поручила Васе проверить это домашнее задание.
  5. Вася очень плохо знаком с данной темой, поэтому он нашел словарь, в котором
  6. указано, как ставятся ударения в словах. К сожалению, в этом словаре
  7. присутствуют не все слова. Вася решил, что в словах, которых нет в словаре,
  8. он будет считать, что Петя поставил ударения правильно, если в этом слове
  9. Петей поставлено ровно одно ударение.
  10.  
  11. Оказалось, что в некоторых словах ударение может быть поставлено больше,
  12. чем одним способом. Вася решил, что в этом случае если то, как Петя
  13. поставил ударение, соответствует одному из приведенных в словаре вариантов,
  14. он будет засчитывать это как правильную расстановку ударения, а если не
  15. соответствует, то как ошибку.
  16.  
  17. Вам дан словарь, которым пользовался Вася и домашнее задание, сданное Петей.
  18. Ваша задача — определить количество ошибок, которое в этом задании
  19. насчитает Вася
  20. */
  21.  
  22. #include <iostream>
  23. #include <string>
  24. #include <map>
  25. #include <set>
  26.  
  27. using namespace std;
  28.  
  29. int main ()
  30. {
  31.     int n, score = 0; // score — счёт ошибок
  32.     cin >> n;
  33. /*
  34. ЗДЕСЬ НЕ ТРЕБУЕТСЯ ПРОВЕРЯТЬ n < 1
  35.  
  36. ДАЖЕ ПРИ ПУСТОМ СЛОВАРЕ ВАСЯ ОБЯЗАН ПРОВЕРИТЬ КОЛИЧЕСТВО УДАРЕНИЙ ПОСТАВЛЕННЫХ ПЕТЕЙ!!!
  37. */
  38.     map <string, set <string>> thesa; //словарь с образцом и омографами
  39.  
  40. //Заполняем словарь
  41.     string term, sample; // слово и его приведённый образец
  42.     for (; n > 0; --n) // n больше не используется, можно пожертвовать!
  43.         {
  44.             cin >> term;
  45.             sample = "";
  46.             for (auto c : term) // формируется образец слова
  47.                 sample += (char)(c | 32);
  48.             thesa [sample].insert (term);// добавить образец и его омограф
  49.         }
  50.  
  51. //Обрабатываем упражнение Пети
  52.  
  53.     while (cin >> term)
  54.         {
  55. // приведение слова в его образец и подсчёт количества ударений, поставленных Петей
  56.             int accents = 0; // счётчик ударений
  57.             sample = "";
  58.             for (auto c : term)
  59.                 {// каждая заглавная буква прибавляет к счётчику единицу
  60.                     accents += (c < 'A' || c > 'Z' ? 0 : 1);
  61.                     sample += (char)(c | 32);
  62.                 }
  63.             // объединённое условие ошибки Пети:
  64.             if (thesa.find (sample) != thesa.end () ? thesa [sample].find (term) == thesa [sample].end () : accents != 1)
  65.                 score++;
  66.         }
  67. // Выводим количество ошибок:
  68.     cout << score;
  69.     return 0;
  70. }
  71.  
  72. /*
  73.      П Р И М Е Ч А Н И Е
  74.  
  75. ✓ ОМОГРАФЫ — слова отличающиеся только ударением
  76.  
  77. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement