Я пытаюсь решить K & R C упражнение 1-13, создавая горизонтально ориентированную гистограмму, которая измеряет частоту слов разной длины на входе пользователя. Вот мой код:Сводка гистограмм счетчика слов не возвращается
#include <stdio.h>
main(){
int a, b, c, d; //array_position, word_length, getchar(), word_count
int y[10]; //array representing word lengths from 1-10 letters
b = 0; //word_length initializes with a zero value
a = 1; //array_position initializes with a value of one (no words contain zero characters)
for(y[a] = 0; (c = getchar()) != EOF;){ //current array position initializes with a zero value, and c initializes as the current input character
if(c != ' ' && c != '\n' && c != '\t') //if c is anything other than a blank, newline or tab
++b; //increment the word_length by one
else //otherwise
++a; //increment the array_position by one
b = 0; //and reset the word_length to zero
}
a = 1; //reset the array_position to one
do{
if(y[a] > 0){ //if current array_position holds a value greater than 0
printf("%i",a); //print the name of the array_position (1,2,3...)
for(d = 0; d < y[a]; ++d){ //reset the word_length--if the word_length is less than the value contained in the current array position, increment the word length by one
putchar('-'); //print a dash and re-evaluate the condition
}
if(d == y[a]){ //when the word_length is equal to the value contained in the current array position
putchar('-'); //print a final dash
putchar('\n'); //and a newline
}
}
++a; //increment the array position by one
}while(a > 11); //repeat until the current array position is 11
}
код предназначен для создания очень простой диаграммы, которая будет выглядеть примерно так, сортировка слов длиной от 1-10 символов:
1---
2----------
3-----
4--
и так далее. Он также опускает любые длины, которые не представлены одним или несколькими словами из ввода. Однако код, как он отображается выше, возвращает no вывод вообще, и я работаю над этой проблемой в течение трех дней.
Что я не вижу, что мешает моему коду создавать желаемый результат?
'делать {...}, а (а> 11)' 'должны быть для (а = 1; a <= 10; a ++) ', но обратите внимание, что массив должен быть объявлен как' int y [11] ', так что действительные индексы в массиве от 0 до 10. И вам нужно полностью инициализировать массив перед использованием. Кроме того, убедитесь, что перед обновлением массива длина слова '<= 10'. Многие слова длиннее 10 букв. – user3386109
Цикл должен печатать хотя бы один раз, но останавливается при первом запуске 'while (a> 11)'. Вы уверены, что это не должно быть чем-то вроде 'a <11' вместо этого? (Операторы печати зависят от 'if' - видимо, вы никогда туда не попадаете.) – usr2564301
Вам не хватает' {braces} 'в вашем первом блоке' else'? То, что у вас есть, 'b' будет сбрасываться до' 0' в любом случае. И почему вы следите за устаревшим учебником, который имеет 'main()', а не 'int main (void)'? –