2016-02-10 2 views
-1

Я пытаюсь решить 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 вывод вообще, и я работаю над этой проблемой в течение трех дней.

Что я не вижу, что мешает моему коду создавать желаемый результат?

+0

'делать {...}, а (а> 11)' 'должны быть для (а = 1; a <= 10; a ++) ', но обратите внимание, что массив должен быть объявлен как' int y [11] ', так что действительные индексы в массиве от 0 до 10. И вам нужно полностью инициализировать массив перед использованием. Кроме того, убедитесь, что перед обновлением массива длина слова '<= 10'. Многие слова длиннее 10 букв. – user3386109

+0

Цикл должен печатать хотя бы один раз, но останавливается при первом запуске 'while (a> 11)'. Вы уверены, что это не должно быть чем-то вроде 'a <11' вместо этого? (Операторы печати зависят от 'if' - видимо, вы никогда туда не попадаете.) – usr2564301

+1

Вам не хватает' {braces} 'в вашем первом блоке' else'? То, что у вас есть, 'b' будет сбрасываться до' 0' в любом случае. И почему вы следите за устаревшим учебником, который имеет 'main()', а не 'int main (void)'? –

ответ

1

В этом цикле

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); 

вам нужно проверить while (a < 11) вместо while (a > 11)

И, (как указал @WeatherVane):

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; 

выглядит подозрительным, вы забыли скобки вокруг второго блока?

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; 
} 
1

два основных вопроса:

Во-первых, как уже упоминалось ранее, ваш do..while цикл должен быть проверка a < 11 вместо a > 11.

Вторая проблема заключается в первом for цикле:

for(y[a] = 0; (c = getchar()) != EOF;){  
    if(c != ' ' && c != '\n' && c != '\t') 
     ++b;         
    else          
     ++a;         
     b = 0;        
} 

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

Вы должны инициализировать элементы массива 0, то вам нужно увеличивать y[b] вместо a:

for (d=0;d<10;d++) { 
    y[d] = 0; 
} 
while ((c = getchar()) != EOF) { 
    if(c != ' ' && c != '\n' && c != '\t') { 
     ++b;         
    } else { 
     ++y[b]; 
     b = 0;  
    }       
} 

 Смежные вопросы

  • Нет связанных вопросов^_^