Определить длину самого короткого и длинного слова. Не работает счетчик - C (СИ)
Формулировка задачи:
Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Определить длину самого короткого и длинного слова.
При запуске программы, не вычисляет наибольший и наименьший размеры слова. Проблема в счетчике, подскажите где не так.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int i,k=0, max=0, min=30;
char S[30];
gets(S);
for (i=0; S[i]!='\0';i++)
{
if (S[i] !=' ')
k++;
else
if(k>max)
max=k;
if(k<min)
min=k;
k=0;
if(S[i-1]=' ')
continue;
}
printf("Longest=%d\n Shortest=%d\n",max,min);
system("PAUSE");
return 0;
}Решение задачи: «Определить длину самого короткого и длинного слова. Не работает счетчик»
textual
Листинг программы
#include <stdio.h>
/*программа выводит количество символов в самом длинном и самом коротком слове*/
#define IN 1 /*внутри слова*/
#define OUT 0/*вне слова*/
#define MAXWORDS 80 /*максимальное количество слов 80*/
int main()
{
int i, c, state; /*i-индекс массива слов, с - вводимый символ,
state - состояние переменной с ( IN - внутри слова, OUT - вне слова) */
int lenword [MAXWORDS], nextword, maxlen, minlen;/*счетчик массива слов,следующее слово,самое
длинное слово, самое короткое слово*/
nextword = maxlen = 0;
minlen = 30;
for (i = 0; i < MAXWORDS; ++i)
lenword [i] = 0;
state = OUT;
while ((c = getchar())!= EOF && nextword < MAXWORDS) {
if ( c == ' ' || c == '\n' || c == '\t'){
if (state == IN){
if (lenword [nextword] > maxlen)
maxlen = lenword [nextword];
if (lenword [nextword] < minlen)
minlen = lenword [nextword];
++nextword; state = OUT; }
}
else {
if (state == OUT)
state = IN;
++lenword [nextword];
}
}
printf("Samoe dlinnoe = %d Samoe korotkoe = %d\n", maxlen, minlen);
return 0;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы с консолью и объявляем переменные.
- Программа выводит количество символов в самом длинном и самом коротком слове.
- Определяем некоторые константы для удобства работы с кодом.
- В функции main() объявляем переменные для хранения индекса слова, текущего символа, состояния переменной с ( IN - внутри слова, OUT - вне слова) и переменные для хранения длины слова, следующего слова, максимальной и минимальной длины слова.
- Инициализируем переменные следующим образом: nextword = maxlen = 0; minlen = 30;
- Инициализируем массив lenword[], который будет хранить длину каждого слова, значением 0.
- Перемещаем состояние переменной state в OUT.
- В цикле while считываем каждый символ из стандартного ввода до тех пор, пока не достигнем конца файла или не заполним все слова в массиве.
- Если считанный символ является пробелом, переносом строки или табуляцией, то проверяем текущее состояние переменной state. Если оно равно IN, то обновляем значения maxlen и minlen, используя текущую длину слова, а затем увеличиваем значение nextword и переводим state в OUT.
- Если считанный символ не является пробелом, переносом строки или табуляцией, то проверяем текущее состояние переменной state. Если оно равно OUT, то переводим его в IN, увеличиваем значение lenword[nextword] на 1 и обновляем значение nextword, если текущий символ является буквой.
- После окончания цикла while выводим значения maxlen и minlen.
- Возвращаем 0, чтобы указать, что программа успешно завершилась.