Количество слов из 4х символов (С++)

Помечено: 

  • В этой теме 0 ответов, 1 участник, последнее обновление 2 недели назад сделано Васильев Владимир Сергеевич.
Просмотр 0 веток ответов
  • Автор
    Сообщения
    • #7108
      @admin

      Задача: в произвольно взятом предложении определить количество слов, состоящих из не более чем четырех символов.

      Анализ задания

      Строки будем задавать массивом символов (char*). Будем считать, что длина стрроки не более 255 символов.

      Словом будем считать последовательность из латинских символов в любом регистре (a-z, A-Z). Все остальные символы будем считать разделителями.

      Программа должна выполнять:

      • Пропуск пробельных символов (считывает символы пока не встретит букву).
      • Считывание символов слова.
      • Определение длины слова.
      • Изменение значения счетчика.
      • Повторение пунктов 1-4 пока не кончатся символы строки.

      Текущая позиция в строке будет задаваться индексом символа. Тогда:

      1. пропуск пробельных символов – это присваивание «текущей позиции» индекса первого непробельного символа (индекс первого символа слова);
      2. считывание слова – присваивание «текущей позиции» индекса первого пробельного символа (индекс первого символа, стоящего за словом);
      3. определение длины слова – вычисление разницы позиций.

      Решение задачи

      Исходный код программы, соответствующей приведенному алгоритму приведен ниже, в нем:

      — функция is_latin проверяет что символ является символом латинского алфавита.

      — функция skip_spaces перебирает символы строки, начиная с некоторой (заданной) позиции и для каждого символа вызывает is_latin. Если функция вернула true – значит текущий символ не является пробельным – тогда skip_spaces возвращает позицию символа. Если же все символы обработаны – она возвращает номер символа, стоящего за строкой (size+1).

      — функция skip_eng_word похожа на skip_spaces, но возвращает индекс если is_latin вернула false.

      — Функция print_word выводит на экран часть строки, расположенную между двух индексов – используется для вывода всех подходящих под условие слов (чтобы проверить корректность работы программы);

      — функция main вызывает последовательно skip_space и skip_eng_word до тех пор, пока полученный в результате работы функции индекс не окажется больше размера строки. Для каждой пары индексов – определяет длину и (если длина соответствует требованиям — изменяет значение счетчика и выводит слово).

      Исходный код решения:

      /*******************************************************
      В произвольно взятом предложении определить
      количество слов, состоящих из не более чем четырех символов.
      ********************************************************/
      #include <iostream>
      #include <cstring>
      using namespace std;
      
      bool is_latin(char c) {
        if (c >= 'a' && c <= 'z')
          return true;
        if (c >= 'A' && c <= 'Z')
          return true;
        return false;
      }
      
      int skip_spaces(char* str, int pos) {
          int n = strlen(str);
          for (int i = pos; pos < n; ++i) {
              if (is_latin(str[i]))
                  return i;
          }
          return n+1;
      }
      
      int skip_eng_word (char* str, int pos) {
          int n = strlen(str);
          for (int i = pos; pos < n; ++i) {
              if (false == is_latin(str[i]))
                  return i;
          }
          return n+1;
      }
      
      void print_word(char* str, int from, int to) {
          for (int i = from; i < to; ++i) {
              cout << str[i];
          }
      }
      
      int main() {
          char str[255];
      
          cout << "enter string: ";
          cin.getline(str, 255);
          int n = strlen(str);
      
          int i = 0, count = 0;
          while (i < n) {
              i = skip_spaces(str, i);
              if (i >= n)
                  break;
              int j = skip_eng_word(str, i);
              int word_length = j - i;
      
              if (word_length <= 4) {
                  print_word(str, i, j);
                  cout << " ";
                  count++;
              }
              i = j;
          }
      
          cout << endl << "count: " << count << endl;
      }

      Ниже приведены скриншоты работы программы:

Просмотр 0 веток ответов
  • Для ответа в этой теме необходимо авторизоваться.
×