2012-03-26 13 views
1

私は入力の単語の長さの水平ヒストグラムを印刷するプログラムを作っています。だから、whileを1に変更したので、1つ以上の入力を受け入れるようになりました。しかし、今回は何が問題なのですか?グラフは印刷されません。水平ヒストグラムは最初の入力の後に入力を受け付けません(編集済み、印刷入力はありません)

右そこにあなたの問題です
/*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

それでは今は動作していますか?私には明らかな発見がなくなっているからです。 –

+0

いいえ..入力した後にCtrl + Zを入力した後、続行するには任意のキーを押してください。 – latenightcode

+0

あなたのコードが3番目の部分にあれば。これは新しい行で30回だけ印刷します。 -------の代わりに-------(単語の長さは30ではなく)@r_ahlskog – latenightcode

答えて

1

while(state==IN) 
    a++; 

これは基本的に無限ループで、それがループ永遠a

編集インクリメントします: [OK]を、パート2を。

まず、aでやっていることは、あなたがしているとは思わない。

あなたは単語の長さを数えるのにそれを使用していると思いますが、各単語の後に0にリセットしないので、実際に見つかった文字の数をカウントし続けます。ヒストグラムには数字が増えます。

第2に、印刷ループでは、両方のループでiを使用しています。何らかの種類のおいしさにつながります。

編集:パート3

私はちょうどあなたがこれはおそらく仕事に行くされていない条件付き

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

に入力ループ内のヒストグラムを印刷していることを発見し、私は移動することをお勧めwhileループの外側に印刷して条件を削除します。

while ((c=getchar())!=EOF) 
{ 
    ... 
} 
for(i=0;i<MAX;i++) 
{ 
    for(k=0;k<=word[i];k++) 
     putchar('-'); 
    putchar('\n'); 
} 

あなたはその結果、プログラムが外部のすべてのあるインデックス30-59にワード長を割り当てること、それをゼロに設定することなく、配列のインデックスとしてiを再利用しているパート4

:入力

編集を取って終了アレイがクラッシュしないのは純粋な運だけです。入力ループを入力する前にi = 0を設定すると、プログラムが機能します。

これで、単語の長さが長すぎるのがなぜ読まれるのか、考えてみましょう。 ヒント:比較演算子と関係があります

+0

感謝の男!私はコードと質問を更新しました!しかし今はグラフを印刷しません。印刷コードに何が問題なのですか? – latenightcode

+0

ああ!私はそのコードにその部分をタイプするのを忘れました、私は前のコードでそれをしましたが、そのコードは、その代わりにwhileの入力原因を受け入れませんでした。私はこれを作ったときにその部分を忘れてしまった。これを変更した: 'if(state == OUT) { word [i] = a; i ++; a = 0;} ' – latenightcode

+0

今私は変数kを持っている理由を覚えています。それは印刷用ですので、私はIDEで再度試しました。 'のための(K = 0; K <=ワード[i]は、++ K) \t \t \t \t { \t \t \t \t \tのputcharを( ' - ')。 \t \t \t \t} \t \t \t \tのputchar(「\ n」)で; 'それはまだ仕事を文句を言わない..私はC – latenightcode

関連する問題