Считать строку текста и напечатать по ней сводку - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Подскажите код программы, считывающей строку текста и печатающую сводку о количестве слов в строке из одной буквы, двух букв, трех букв и т.д., пожалуйста. Думаю, это делается посредством двумерного массива, но вообще ни одной идеи нет

Решение задачи: «Считать строку текста и напечатать по ней сводку»

textual
Листинг программы
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <locale>
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    
    char mystring[256];
        
    printf("Введите строку: ");
    gets_s(mystring);
    
    bool ok = true;
    int number_word = 0, i = 0;
    for (i = 0; i < strlen(mystring); i++)
    {
        if (mystring[i] >= 'a' && mystring[i] <= 'z' || mystring[i] >= 'A' && mystring[i] <= 'Z')// если данный элемент буква то меняем переменную на истино
        {
            ok = true;
        }
 
        if (!(mystring[i] >= 'a' && mystring[i] <= 'z' || mystring[i] >= 'A' && mystring[i] <= 'Z') && ok == true)//если данный элемент не буква, значит слово кончилось, и к примеру если пользователь введет несколько пробелов то в условии ok не пустит его в цикл
        {
            number_word++;
            ok = false;//есил не буква то ложь
        }
    }
 
    if ((mystring[strlen(mystring) - 1] >= 'a' && mystring[strlen(mystring) - 1] <= 'z' || mystring[strlen(mystring) - 1] >= 'A' && mystring[strlen(mystring) - 1] <= 'Z'))
    {
        number_word++;
    }
 
    char **mass;//для того чтобы нашу строку раскидать по словам (т.е. одна строка одно слово)
    
    mass = (char**)malloc(number_word * sizeof(char));//количество строчек
 
    int k = 0;
    int j = 0;
    int l = 0;
    for (int i = 0; i < strlen(mystring); i++)//выделение памяти под каждую строку определенное количество столбцов
    {
        if (mystring[i] >= 'a' && mystring[i] <= 'z' || mystring[i] >= 'A' && mystring[i] <= 'Z')// если буква, то увеличиваем длину строки
        {
            k++;
            ok = true;
        }
    
        if (!(mystring[i] >= 'a' && mystring[i] <= 'z' || mystring[i] >= 'A' && mystring[i] <= 'Z') && ok == true)// если не буква значит слово кончилось
        {
            mass[j] = (char*)malloc(k * sizeof(char));// и выделяем под длину слова, память
            j++;//переходим на следующую строку
            k = 0;//обнуляем длину слова, т.к. нужно определить длину следующего слова после символов ! . , ? "пробел" и т.д.
            ok = false;
        }
    }
    /*т.к. алогритм выше не учитывает что пользователь может не поставить точку в конце предложения, и он тупо пропускает это слово, а из-за этого слово не будет учавствовать в нашем "соревнование" длины. P.S.(не знал как объяснить)*/
    if ((mystring[strlen(mystring) - 1] >= 'a' && mystring[strlen(mystring) - 1] <= 'z' || mystring[strlen(mystring) - 1] >= 'A' && mystring[strlen(mystring) - 1] <= 'Z'))
    {
        mass[j] = (char*)malloc(k * sizeof(char));
    }
 
    j = 0;//для передвижения по строкам массива mass
    k = 0;//для передвижения по столбцам массива mass
 
    for (int i = 0; i < strlen(mystring); i++)
    {
        if (mystring[i] >= 'a' && mystring[i] <= 'z' || mystring[i] >= 'A' && mystring[i] <= 'Z')//аналогично выше описано
        {
            mass[j][k] = mystring[i];//копируем по символьно из строчки в массив. (в итоге получится что каждое слово на своей строчке)
            mass[j][k + 1] = '\0';//заканчиваем строку симолов конца строки
            k++;//движемся по столбцу
            ok = true;
        }
 
        if (!(mystring[i] >= 'a' && mystring[i] <= 'z' || mystring[i] >= 'A' && mystring[i] <= 'Z') && ok == true)
        {
            j++;//по строкам
            k = 0;// обнуляем чтобы начать писать с начала строки, а не с середины или вообще с конца
            ok = false;
        }
    }
 
    for (int i = 0; i < number_word; i++)
    {
        printf("%s\n", mass[i]);//вывод массива строк
    }
 
 
    int max = strlen(mass[0]);//пусть длина первого слова максимальна
    
    for (int i = 1; i < number_word; i++)
    {
        if (max < strlen(mass[i]))//если следующая строка длинее чем перавя, то
        {
            max = strlen(mass[i]);//присваиваем max самой длинной строки
        }
    }
    
    int count = 0;// отвечает за количество строк i ой длины
 
    printf("\nдлина слова\tколичество слов с такой длиной\n");
 
    for (int i = 1; i <= max; i++)//проходимся по всем длинам 
    {
        for (int j = 0; j < number_word; j++)//ищем по всем строкам, слово iой длины
        {
            if (strlen(mass[j]) == i)//если длина строки совпадает с iой длиной то
            {
                count++;//увеличиваем количество слов такой длины
                ok = true;//если есть слово iой длины то
            }
        }
        if (ok == true)//запускаем его на печать
        {
            printf("%d\t\t%d\n", i, count);
            ok = false;
        }
        count = 0;//обнуляем количество слов iой длины
    }
    _getch();
}

Объяснение кода листинга программы

  1. В начале кода подключаются необходимые библиотеки: iostream, conio, stdlib, string.h и locale.
  2. Далее устанавливается локаль на Русский с помощью функции setlocale.
  3. Создается массив mystring типа char с размером 256 для хранения введенной строки.
  4. С помощью функции printf пользователю предлагается ввести строку.
  5. Функция gets_s используется для чтения строки и сохранения ее в массиве mystring.
  6. Объявляются следующие переменные:
    • ok: булевая переменная, используемая для определения, является ли текущий символ буквой или нет.
    • number_word: переменная для хранения количества слов в введенной строке.
    • i, j, k: индексы для перемещения по массивам.
  7. В цикле while происходит анализ каждого символа введенной строке:
    • Если символ является буквой, то переменная ok устанавливается в true.
    • Если символ не является буквой и переменная ok равна true, то увеличивается значение number_word и переменная ok устанавливается в false.
  8. Если последний символ введенной строке является буквой, то число number_word увеличивается.
  9. Создается динамический массив mass типа char** для хранения выделенных слов.
  10. В цикле while происходит выделение памяти под каждое слово в массиве mass.
  11. Каждое слово в массиве mass представляется в виде отдельной строки.
  12. Длина каждого слова в массиве mass определяется с помощью функции strlen.
  13. Для определения длины самого длинного слова создается переменная max.
  14. В цикле while происходит подсчет количества слов с определенной длиной.
  15. С помощью функции printf выводится сводка по количеству слов определенной длины.
  16. В конце программы используется функция _getch для приостановки выполнения программы до нажатия клавиши.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.833 из 5
Похожие ответы