Считать строку текста и напечатать по ней сводку - 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(); }
Объяснение кода листинга программы
- В начале кода подключаются необходимые библиотеки: iostream, conio, stdlib, string.h и locale.
- Далее устанавливается локаль на
Русский
с помощью функции setlocale. - Создается массив mystring типа char с размером 256 для хранения введенной строки.
- С помощью функции printf пользователю предлагается ввести строку.
- Функция gets_s используется для чтения строки и сохранения ее в массиве mystring.
- Объявляются следующие переменные:
- ok: булевая переменная, используемая для определения, является ли текущий символ буквой или нет.
- number_word: переменная для хранения количества слов в введенной строке.
- i, j, k: индексы для перемещения по массивам.
- В цикле while происходит анализ каждого символа введенной строке:
- Если символ является буквой, то переменная ok устанавливается в true.
- Если символ не является буквой и переменная ok равна true, то увеличивается значение number_word и переменная ok устанавливается в false.
- Если последний символ введенной строке является буквой, то число number_word увеличивается.
- Создается динамический массив mass типа char** для хранения выделенных слов.
- В цикле while происходит выделение памяти под каждое слово в массиве mass.
- Каждое слово в массиве mass представляется в виде отдельной строки.
- Длина каждого слова в массиве mass определяется с помощью функции strlen.
- Для определения длины самого длинного слова создается переменная max.
- В цикле while происходит подсчет количества слов с определенной длиной.
- С помощью функции printf выводится сводка по количеству слов определенной длины.
- В конце программы используется функция _getch для приостановки выполнения программы до нажатия клавиши.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д