ページ 1 / 1
無題
Posted: 2009年6月17日(水) 10:40
by ユーリ
学校の課題です。
0~99の整数を10個入力する。
0~9、10~19・・・90~99がそれぞれ何回ずつ入力されたかを数値とヒストグラムで表示する
プログラムを作成しなさい。
カウント数は配列に格納しなさい。
という問題なのですが
ヒントをくれませんか
まったくちんぷんかんぷんです
Re:無題
Posted: 2009年6月17日(水) 11:22
by ユーリ
#include <stdio.h>
main()
{
int data[10];
int a,b,i,h;
for(i=0;i<10;i++){
printf("値を入力してください",i+1);
scanf("%d",a);
if(a==0||a<=99){
printf("もう一回入力しようよ");
}
}
ここまで作ってみたのですがこの後どのようにしたらいいですかね?
Re:無題
Posted: 2009年6月17日(水) 11:55
by ユーリ
#include <stdio.h>
main()
{
int data[10];
int a,b,i,h,j;
for(i=0;i<=10;i++){
printf("値を入力してください",i+1);
scanf("%d",a);
if(a==0||a<=99){
printf("もう一回入力しようよ");
}
}
for(h=0;h<=10;h++){
b=a%10;
for(j=1;j<=10;j++){
printf("*",b);
switch(h)
{
case 0:
printf("*",b);
break;
case 1:
printf("*",b);
break;
case 2:
printf("*",b);
break;
case 3:
printf("*",b);
break;
case 4:
printf("*",b);
break;
case 5:
printf("*",b);
break;
case 6:
printf("*",b);
break;
case 7:
printf("*",b);
break;
case 8:
printf("*",b);
break;
case 9:
printf("*",b);
break;
}
}
}
return 0;
}
作ってみたのですがうまくいきませんなぜでしょう
Re:無題
Posted: 2009年6月17日(水) 18:40
by ねこ
読みずらいのでPreタグ使って下さいorz
printfの使い方が根本的に間違ってます。教科書を引き直して下さい・・・。
1.10回ループして10個の数字を「取得」する
2.取得した0~9,10~19のどの範囲になるか「判定」してその範囲の数字の個数を1「加算」する。
3.範囲の個数に対応した*なり☆なりを表示する。
こんな大分類で少しずつ考えてみてください。
Re:無題
Posted: 2009年6月17日(水) 18:52
by やっくん
昨日も言いましたが、きちんとインデントをしてソースを<Pre> </Pre>で囲んで投稿しなきゃ見にくいですよ。
ユーリさんのソースで細かな点の指摘をさせてもらいます。
・scanfで入力した数値を入れたい変数には&を付けてください。
・if(a==0||a<=99)とありますが、これだと「aが0」または「aが99以下」の時となります。
・b=a%10ここは何をしたいのかわかりませんが、
「aを10で割った余りをbに入れる」って操作になっているのでこの課題では関係ないかと思います。
・一番大きなミスなのは、printf("*",b)のように書いてる部分ですね。
多分、ユーリさんは「*をb回表示させる。」といった意味で使ったのでしょうが、
printfで変数を扱う場合は
printf("%d",b);
のように変数がint型なら%dを書かなければなりません。この%dと書いたところにbの値が入ります。
ただ、bの値が入るだけなので仮にb=3とすると,
printf("%d×*", b);
のように記述しても、「3×*」と出力されるだけです。
%dのようなものを書式指定子といってC言語では重要なので復習してみてはどうでしょうか?
ちなみに以下が課題の答え?になると思います。
#include <stdio.h>
int main(void) {
int data[10]; //入力保存用(0-99)
//0-9,10-19,・・・,90-99のカウント用(カウンターなので初期値0)
int counter[10] = {0,0,0,0,0,0,0,0,0,0};
int i = 0,j;//ループで使う。
printf("値を入力してください\n"); //入力を促す
do{
printf("%d:", i + 1);
scanf("%d",&data);
if(data < 0 || data > 99){
printf("0-99までの値を入れてください\n");
continue; //もし入力値が0-99に含まれて居ないなら、while(i<10)に飛ぶ。
}
i++;
} while(i < 10);
for(i = 0; i < 10; i++){
if(data >= 0 && data <= 9) counter[0]++; //dataが 0- 9なら+1
else if(data >= 10 && data <= 19) counter[1]++; //dataが10-19なら+1
else if(data >= 20 && data[i] <= 29) counter[2]++; //data[i]が20-29なら+1
else if(data[i] >= 30 && data[i] <= 39) counter[3]++; //data[i]が30-39なら+1
else if(data[i] >= 40 && data[i] <= 49) counter[4]++; //data[i]が40-49なら+1
else if(data[i] >= 50 && data[i] <= 59) counter[5]++; //data[i]が50-59なら+1
else if(data[i] >= 60 && data[i] <= 69) counter[6]++; //data[i]が60-69なら+1
else if(data[i] >= 70 && data[i] <= 79) counter[7]++; //data[i]が70-79なら+1
else if(data[i] >= 80 && data[i] <= 89) counter[8]++; //data[i]が80-89なら+1
else if(data[i] >= 90 && data[i] <= 99) counter[9]++; //data[i]が90-99なら+1
}
//0-9 → 10-19 → ・・・ → 90-99の順に*の数を表示
for(i = 0;i < 10; i++){
printf("%2d - %2d:", i * 10, (i+1)*10-1);
for(j = 1; j <= counter[i];j++) printf("*");
printf("\n");
}
return 0;
}
Re:無題
Posted: 2009年6月17日(水) 18:54
by やっくん
ごめんなさい、「ヒントを」って書いてるのに答え?を書いちゃいましたorz
たぶん自分のでも不十分かもしれないので参考程度にしてください。
Re:無題
Posted: 2009年6月17日(水) 19:54
by 夢夢
すんごい単純ですけど、参考になれば。
※数字以外を入れるとおかしくなります。
#include <stdio.h>
#include <windows.h>//Sleep関数のみ
int main(void)
{
int a=0;
int i=0;
int ii=0;
int data[10]={0};
while(i<10){
printf("0~99を入力しろ。 %d回目",i+1);
scanf("%d",&a);
if(a>=0&&a<=99){
//ちゃんと入力した
for(ii=0;ii<10;ii++){
if(a>=ii*10&&a<=ii*10+9){
i++;
data[ii]++;
break;
}
}
}
}
//結果表示
for(i=0;i<10;i++){
printf("%d~%d:%d回\t",i*10,i*10+9,data);
for(ii=0;ii<10;ii++){
if(data>ii) printf("☆");
}
printf("\n");
}
Sleep(10000);
return 0;
}
Re:無題
Posted: 2009年6月17日(水) 21:26
by non
やっくんさんにしても夢夢さんにしても、カウントするのになんでそんな面倒なことしてるのかなぁ?
data[a/10]++;
でいいんじゃないの?もしかして、わざと?
それにしても、みんなやさしいねぇ。
Re:無題
Posted: 2009年6月17日(水) 21:48
by やっくん
わざとじゃなく自分はまだあまり多く経験つんでないので回りくどい処理書いたりしますね。
カウントを一つ一つばらしてるのはわかり易くするためですが。
お恥ずかしい(^^;
Re:無題
Posted: 2009年6月17日(水) 21:56
by non
やっくんさんへ
それは、失礼しました。
それなら、アドバイス
>int counter[10] = {0,0,0,0,0,0,0,0,0,0};
0で初期化する場合は
int counter[10]={0};
でOKです。
Re:無題
Posted: 2009年6月17日(水) 22:00
by やっくん
>nonさん
そうすると、手間が省ける&ミスが少なくなりますね。
ありがとうございます(^^)
Re:無題
Posted: 2009年6月17日(水) 23:43
by ユーリ
みなさんありがとうございます。
大変勉強になります。
それと投稿の際は気をつけます。
みなさん本当にありがとうございました。