配列について その2

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

配列について その2

#1

投稿記事 by NKS » 11年前

再度投稿させていただきます。
前回完成したプログラムに加えて、*で分布グラフを作るプログラムを追加したのですが、
プログラムの動作の途中で動作が止まってしまい失敗してしまいます。
どの部分を修正したらいいか教えてください。
グラフはこんなかんじです。
 |*
 |***
 |*****
 |**
 |
 |
 |*
 |

コード:

#include<stdio.h>

#define NUM 100

int main(void)
{
	int i,j,tmp;
	int sum = 0;
	int ten[NUM];
	int yu,ryo,ka,hu;
	int bunpu[10] = {0};
	
	printf("成績処理を行います。終了するときは999を入力してください。\n");
	yu = 0;									//初期値の設定
	ryo = 0;
	ka = 0;
	hu = 0;
	i=0;
	while(i<NUM){
		printf("No.%d: ",i+1);
		scanf("%d",&ten[i]);
		if(ten[i] == 999){  //999が入力されたら終了
			break;
		}else if(ten[i] >= 0 && ten[i] <= 100){ //もし0~100点が入力されたら加算
			sum += ten[i];
			i++;       //次の人の点数
		}else{
			printf("正しい数値を入力してください。\n");
			continue; //今回のループの処理を打ち切りループのブロックの最終行の次の処理へ
		}
		
	  if(ten[i-1] < 60){
		hu++;		//60点未満なら不可にカウント
	
	  }else if(ten[i-1]<=69){
		ka++;		//69点以下なら可にカウント
		
	  }else if(ten[i-1]<=79){
		ryo++;		//79点以下なら良にカウント
		
	  }else{
		yu++;		//それ以上は優にカウント
	}
	
	bunpu[ten[i]/10]++;

	}
	puts("グラフ");
	printf(" |");
	for(j = 0;j<bunpu[i];j++)
		putchar('*');
	putchar('\n');
	
	for(i = 8;i>= 0;i++){
		printf(" |");
		for(j = 0; j < bunpu[i];j++)
		putchar('*');
	putchar('\n');		
	}
	
	printf("%d人の処理結果\n",i);
	printf("合計点:%d\n",sum);
	printf("平均点:%.2f\n",(double)sum/i);
	printf("「優」の数%d人\n",yu);
	printf("「良」の数%d人\n",ryo);
	printf("「可」の数%d人\n",ka);
	printf("「不可」の数%d人\n",hu);
	
	return 0;
}
何度も投稿すみませんが、よろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 配列について その2

#2

投稿記事 by みけCAT » 11年前

・45行目で不定の値を参照してしまっているので、tenをten[i-1]にしてください。
・それを修正しても100点の人がいると45行目で配列の確保された領域の外にアクセスしてしまうので、11行目の配列bunpuの要素数を11にしてください。
・49行目~52行目がムダで、しかも10人以上入力した時に配列の確保された領域の外へのアクセスが発生するので、削除してください。
・54行目でかなりの回数ループを回しています。 for(i = 7;i>= 0;i--) としてください。(初期化と更新を修正)
・61行目と63行目で参照しているiの値は常に-1になるはずなので、54行目の直前にtmp = i;を挿入し、59行目の直後にi = tmp;を挿入してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

NKS

Re: 配列について その2

#3

投稿記事 by NKS » 11年前

動作しました。
ありがとうございます!!

もしよろしければ解説お願いしてもよろしいでしょうか?

コード:

#include<stdio.h>

#define NUM 100

int main(void)
{
	int i,j,tmp;
	int sum = 0;
	int ten[NUM];
	int yu,ryo,ka,hu;
	int bunpu[11] = {0};
	
	printf("成績処理を行います。終了するときは999を入力してください。\n");
	yu = 0;									//初期値の設定
	ryo = 0;
	ka = 0;
	hu = 0;
	i=0;
	while(i<NUM){
		printf("No.%d: ",i+1);
		scanf("%d",&ten[i]);
		if(ten[i] == 999){  //999が入力されたら終了
			break;
		}else if(ten[i] >= 0 && ten[i] <= 100){ //もし0~100点が入力されたら加算
			sum += ten[i];
			i++;       //次の人の点数
		}else{
			printf("正しい数値を入力してください。\n");
			continue; //今回のループの処理を打ち切りループのブロックの最終行の次の処理へ
		}
		
	  if(ten[i-1] < 60){
		hu++;		//60点未満なら不可にカウント
	
	  }else if(ten[i-1]<=69){
		ka++;		//69点以下なら可にカウント
		
	  }else if(ten[i-1]<=79){
		ryo++;		//79点以下なら良にカウント
		
	  }else{
		yu++;		//それ以上は優にカウント
	}
	
	bunpu[ten[i-1]/10]++;

	}
	puts("グラフ");
	
	tmp = i;
	
	for(i = 9;i>= 0;i--){
		printf(" |");
		for(j = 0; j < bunpu[i];j++)
		putchar('*');
	putchar('\n');		
	}
	i = tmp;

	
	printf("%d人の処理結果\n",i);
	printf("合計点:%d\n",sum);
	printf("平均点:%.2f\n",(double)sum/i);
	printf("「優」の数%d人\n",yu);
	printf("「良」の数%d人\n",ryo);
	printf("「可」の数%d人\n",ka);
	printf("「不可」の数%d人\n",hu);
	
	return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 配列について その2

#4

投稿記事 by みけCAT » 11年前

NKS さんが書きました:もしよろしければ解説お願いしてもよろしいでしょうか?
簡単な解説はNo: 2に書きましたが、何がわからないのでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

NKS

Re: 配列について その2

#5

投稿記事 by NKS » 11年前

45行目から58行目の処理でなぜグラフができるのかが分からないので解説お願いします。

box
記事: 2002
登録日時: 14年前

Re: 配列について その2

#6

投稿記事 by box » 11年前

NKS さんが書きました:45行目から58行目の処理でなぜグラフができるのかが分からないので解説お願いします。
指摘により修正が入ったとはいえ、もともとは質問者さんが
「自分で」書いたコードですよね。
なぜわからないのかがわかりません。

それはさておき、書いたコードのとおりに、自分がコンピューターになったつもりで
1行ずつトレースしてみましょう。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

NKS

Re: 配列について その2

#7

投稿記事 by NKS » 11年前

すみません、よく見たら理解できました。

ありがとうございました。配列について1からまた勉強しなおしてみようと思います。

閉鎖

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