ページ 1 / 1
配列を用いた点数ごとのランクわけ(?)について
Posted: 2013年5月16日(木) 23:10
by KINDEЯ
こんばんは。
専門学校の課題で分からない問題があり困っています。
以下の問題です。
点数を10点幅をランクに分け、その幅に何人いるかをカウントするプログラムを作成しなさい。
Ctrl+Zを入力することでキーボード入力を終了させる。
以下の配列を使用すること。
int count[11]; //点数カウントエリア
<実行結果>
点数を入力して下さい
25
56
65
80
73
66
^Z ←Ctrl+Zを入力すると左のようになる。
*******点数別分布表*******
0 : 0
10 : 0
20 : 1
30 : 0
40 : 0
50 : 1
60 : 2
70 : 1
80 : 1
90 : 0
100: 0
Ctrl+Zを判定する方法が分かりません・・。
現在のソースコードです。
コード:
#include "stdio.h"
int main(void)
{
int count[11] = {0};
puts("点数を入力して下さい");
while(count[i] != '^Z'){
scanf("%d", &count[i]);
i++;
}
return 0;
}
Re: 配列を用いた点数ごとのランクわけ(?)について
Posted: 2013年5月16日(木) 23:34
by box
もしかすると、EOF かどうかを判断するとうまくいくのではないか、
と勝手に想像しています。
Re: 配列を用いた点数ごとのランクわけ(?)について
Posted: 2013年5月16日(木) 23:44
by KINDEЯ
解答ありがとうございます!
コード:
while(scanf("%d", &count[i]) != EOF) i++;
としてみたのですが、Ctrl+Zで処理も止まり、数字を入力した場合はループが回るのですが、
文字列を入力すると固まってしまいます・・。
何が原因なのでしょうか・・。
Re: 配列を用いた点数ごとのランクわけ(?)について
Posted: 2013年5月17日(金) 04:23
by little
KINDEЯ さんが書きました:
コード:
while(scanf("%d", &count[i]) != EOF) i++;
"%d"で文字を入力すると、無限ループします。
► スポイラーを表示
コード:
#include "stdio.h"
#define CMAX 10
#define RMAX 11
void AddCount(int *rank, int cnt)
{
if (cnt >= 0 && cnt < 10) rank[0]++;
else if (cnt < 20) rank[1]++;
else if (cnt < 30) rank[2]++;
else if (cnt < 40) rank[3]++;
else if (cnt < 50) rank[4]++;
else if (cnt < 60) rank[5]++;
else if (cnt < 70) rank[6]++;
else if (cnt < 80) rank[7]++;
else if (cnt < 90) rank[8]++;
else if (cnt < 100) rank[9]++;
else if (cnt == 100) rank[10]++;
}
int main(void)
{
// 初期化
int i = 0;
int cnt[CMAX] = {0};
int rank[RMAX] = {0};
// 入力
puts("■ 点数を入力して下さい");
// i < CMAX-1が入っている為、無限ループはしません
// Ctrl+Z以外でも終了版
/* while ( scanf("%d", &cnt[i]) != 0 && i < CMAX-1 ){
i++;
}*/
// Ctrl+Zで終了版
while ( scanf("%d", &cnt[i]) != EOF && i < CMAX-1 ){
i++;
}
// デバッグ用(文字を入力した際、iの数値がほぼ入力回数以上になっていると思います)
puts("■ デバッグ");
printf("%d\n", i);
// 計算
for ( ; i>0; i-- ){
AddCount(rank, cnt[i-1]);
}
// 出力
puts("■ 点数別分布表");
for ( i=0; i<RMAX; i++ ){
printf("%3d:%2d\n", i*10, rank[i]);
}
return 0;
}
テストコードを書いてみたので良かったらどうぞ(´・ω・`)
Re: 配列を用いた点数ごとのランクわけ(?)について
Posted: 2013年5月17日(金) 08:47
by non
KINDEЯ さんが書きました:解答ありがとうございます!
コード:
while(scanf("%d", &count[i]) != EOF) i++;
としてみたのですが、Ctrl+Zで処理も止まり、数字を入力した場合はループが回るのですが、
文字列を入力すると固まってしまいます・・。
何が原因なのでしょうか・・。
数字以外の文字列が入力されることも考慮が必要という事でしょうか。
もしそうなら、一旦文字列として取り込み、数値に変換するようにします。
Re: 配列を用いた点数ごとのランクわけ(?)について
Posted: 2013年5月17日(金) 13:33
by かずま
コード:
#include <stdio.h>
#define N 5
int main(void)
{
int i, n, data[N + 1];
for (n = 0; n <= N; n++)
if (scanf("%d", &data[n]) != 1)
break;
if (n > N)
printf("データが多すぎる\n");
else if (n == N)
for (i = 0; i < n; i++)
printf("%d\n", data[i]);
else if (feof(stdin))
printf("データが足りない\n");
else
printf("数字ではない\n");
return 0;
}
このプログラムで、入力データが 5個の場合、
6個の場合、4個の場合、数字でないものがある、
というテストをしてみるとどうなりますか?