Считать строку текста и напечатать по ней сводку - 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 для приостановки выполнения программы до нажатия клавиши.