2012-03-26 7 views
1

Also mache ich ein Programm, das ein horizontales Histogramm der Länge der Wörter in seiner Eingabe drucken soll. Also änderte ich die while in wenn es jetzt mehr als 1 Eingabe akzeptiert. Aber was stimmt diesmal nicht? Es wird das Diagramm nicht gedruckt.Horizontales Histogramm akzeptiert keine Eingabe nach der ersten Eingabe (bearbeitet, wird nicht gedruckt)

/*Write a program to print a histogram of the lengths of words in its input. 
It is easy to draw the histogram with the bars horizontal*/ 
#include <stdio.h> 
#define MAX 30 
#define IN 1 
#define OUT 0 
int main() 
{ 
int a,c,i,k,state,word[MAX]; 
a=0; 
k=0; 
state=OUT; 
for(i=0;i<MAX;i++) 
    word[i]=0; 
while((c=getchar())!=EOF) 
{ 
    if(c==' '||c=='\t'||c=='\n') 
     state=OUT; 
    else 
     state=IN; 
    if(state==IN) 
     a++; 

    if(state==OUT) 
     { 
     word[i]=a; 
     i++; 
     a=0; 
     } 



} 
/*This part is pissing me off, I don't know how to print X multiple times!*/ 
for(i=0;i<MAX;i++) 
    if(word[i]>0) 
     { 
      for(k=0;k<=word[i];k++) 
      putchar('-'); 
      putchar('\n'); 
     } 


} 
+0

So funktioniert es jetzt? Weil mir die offensichtlichen Ergebnisse ausgehen. –

+0

Nein .. nachdem ich eingegeben habe dann Eingabe ctrl + z, es sagt nur drücken Sie eine beliebige Taste, um fortzufahren .. dann schließt. – latenightcode

+0

Wenn ich deinen Code in deinem 3. Teil habe. Es druckt einfach - in neuer Zeile 30 mal. anstelle von ------- (mit nicht 30, sondern nur die Länge des Wortes) @ r_ahlskog – latenightcode

Antwort

1

Das ist richtig es ist Ihr Problem

while(state==IN) 
    a++; 

Dies ist im Grunde eine Endlosschleife, wird es für immer Schleife Inkrementieren a

Edit: Ok, Teil zwei dann.

Zunächst einmal, was Sie mit a tun, ist nicht, was Sie denken, dass Sie tun.

Ich denke, Sie denken, dass Sie es verwenden, um die Wortlänge zu zählen, aber Sie werden es nicht auf 0 nach jedem Wort zurückgesetzt, so dass es in der Tat die Zahl der gefundenen Zeichen weiter zählen wird. Ihr Histogramm zeigt nur wachsende Zahlen.

Zweitens, in Ihrer Druckschleife verwenden Sie i in beiden Schleifen, die zu einem köstlichen Durcheinander irgendeiner Art führen.

Edit: Teil drei

entdeckte ich nur, dass Sie das Histogramm in der Eingangsschleife den Druck auf die bedingte

if((c==getchar())&&c==EOF) 

Dies wird wahrscheinlich nicht zur Arbeit gehen, schlage ich zu bewegen das Drucken außerhalb der While-Schleife und entfernen Sie die Bedingung

dann wird es ausgeführt werden, nachdem Sie sind fertig Eingang unter

Edit: Teil vier

Sie haben i als Index in das Array wieder verwendet, ohne sie auf Null gesetzt wird, ist die Folge, dass das Programm Wortlängen auf Indizes 30-59 weist die alle draußen sind das Array, dass es nicht abstürzt ist einfach pures Glück. Durch Setzen von vor dem Eingeben der Eingangsschleife wird das Programm ausgeführt.

Jetzt müssen Sie nur darüber nachdenken, warum es Wortlängen zu lange druckt, ich belasse das als Übung für den Leser. Hinweis: Es hat mit Vergleichsoperatoren zu tun

+0

danke mann! Ich habe den Code und die Frage aktualisiert! Aber jetzt wird das Diagramm nicht gedruckt. Was stimmt nicht mit dem Druckcode? – latenightcode

+0

Oh!Ich habe vergessen, diesen Teil in diesem Code zu schreiben, ich habe es in meinem vorherigen Code getan, aber dieser Code akzeptiert keine Eingabe wegen der while anstelle von if. Ich habe diesen Teil vergessen, als ich diesen gemacht habe. Ich habe das geändert: 'if (state == OUT) { word [i] = a; i ++; a = 0;} ' – latenightcode

+0

Jetzt erinnere ich mich, warum ich eine Variable k habe, es ist für das Drucken, also habe ich es wieder in meiner IDE versucht. 'Für (k = 0; k <= word [i]; k ++) \t \t \t \t { \t \t \t \t \t putchar ('-'); \t \t \t \t} \t \t \t \t putchar ('\ n'); 'Es ist immer noch nicht funktionieren .. sorry, wenn ich ein noob bei C – latenightcode

Verwandte Themen