無題

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ユーリ

無題

#1

投稿記事 by ユーリ » 16年前

学校の課題です。
0~99の整数を10個入力する。
0~9、10~19・・・90~99がそれぞれ何回ずつ入力されたかを数値とヒストグラムで表示する
プログラムを作成しなさい。
カウント数は配列に格納しなさい。
という問題なのですが
ヒントをくれませんか
まったくちんぷんかんぷんです

ユーリ

Re:無題

#2

投稿記事 by ユーリ » 16年前

 #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:無題

#3

投稿記事 by ユーリ » 16年前

  #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:無題

#4

投稿記事 by ねこ » 16年前

読みずらいのでPreタグ使って下さいorz

printfの使い方が根本的に間違ってます。教科書を引き直して下さい・・・。

1.10回ループして10個の数字を「取得」する
2.取得した0~9,10~19のどの範囲になるか「判定」してその範囲の数字の個数を1「加算」する。
3.範囲の個数に対応した*なり☆なりを表示する。

こんな大分類で少しずつ考えてみてください。

やっくん

Re:無題

#5

投稿記事 by やっくん » 16年前

昨日も言いましたが、きちんとインデントをしてソースを<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:無題

#6

投稿記事 by やっくん » 16年前

ごめんなさい、「ヒントを」って書いてるのに答え?を書いちゃいましたorz
たぶん自分のでも不十分かもしれないので参考程度にしてください。

夢夢

Re:無題

#7

投稿記事 by 夢夢 » 16年前

すんごい単純ですけど、参考になれば。
※数字以外を入れるとおかしくなります。
#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;
}

non

Re:無題

#8

投稿記事 by non » 16年前

やっくんさんにしても夢夢さんにしても、カウントするのになんでそんな面倒なことしてるのかなぁ?
data[a/10]++;
でいいんじゃないの?もしかして、わざと?

それにしても、みんなやさしいねぇ。

やっくん

Re:無題

#9

投稿記事 by やっくん » 16年前

わざとじゃなく自分はまだあまり多く経験つんでないので回りくどい処理書いたりしますね。
カウントを一つ一つばらしてるのはわかり易くするためですが。
お恥ずかしい(^^;

non

Re:無題

#10

投稿記事 by non » 16年前

やっくんさんへ
それは、失礼しました。

それなら、アドバイス
>int counter[10] = {0,0,0,0,0,0,0,0,0,0};
0で初期化する場合は
int counter[10]={0};
でOKです。

やっくん

Re:無題

#11

投稿記事 by やっくん » 16年前

>nonさん
そうすると、手間が省ける&ミスが少なくなりますね。
ありがとうございます(^^)

ユーリ

Re:無題

#12

投稿記事 by ユーリ » 16年前

みなさんありがとうございます。
大変勉強になります。
それと投稿の際は気をつけます。
みなさん本当にありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る