5教科の合計値が正しく表示されない

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

5教科の合計値が正しく表示されない

#1

投稿記事 by jetlee » 5年前

「C言語入門 第10回 構造体とC言語総復習」


上記のYoutube動画でデモとして紹介されていた、
構造体を利用して、ユーザー情報(クラス・出席番号・名前)と、5教科の合計値を画面に表示するプログラムです。動画の説明通り書いたコードを書いたつもりですが、下記2つの問題が解決できずにいます。ご教示いただけたら幸いです。

1.名前の最後に"P"が付与される。※例:名前をtanakaにしたらtanaka"P"と出力される
2.各科目の点数に何の数字を入れても、5教科の合計値が「-858993060」と出る


OS:Windows10
開発環境:Visual C++ 2010 Express

コード:

#include<stdio.h>

char getHyouka(int);//関数プロトタイプの宣言
char* getKamoku(int);//関数プロトタイプの宣言

struct seiseki {//成績を表示する構造体
	char cls;//クラス名(文字)
	int no;//出席番号
	char *name;//名前
	int tokuten[6];//国語、数学、理科、社会、英語、合計を格納
	char rank;//評価 400点以上 A 300点以上 B 200点以上 C100点以上 D 100点未満 E
};

int main(int argc, const char * argv[])
{
	struct seiseki takepon;
	printf("クラスを入力して下さい\t");
	scanf("%c",&takepon.cls);
	printf("出席番号を入力して下さい\t");
	scanf("%d",&takepon.no);
	printf("名前を入力して下さい\t");
	scanf("%s",&takepon.name);
	for(int i=0;i<5;i++){
		char *kamoku=getKamoku(i);
		printf("%sの点数を入力して下さい\t",kamoku);
		scanf("%d",&takepon.tokuten[i]);
		takepon.tokuten[5]+=takepon.tokuten[i];
	}
	printf("クラス:%c\t出席番号:%d\t名前:%s\n",takepon.cls,takepon.no,&takepon.name);
	for(int i=0;i<5;i++){
		char *kamoku=getKamoku(i);
		printf("%s:%d\t",kamoku,takepon.tokuten[i]);
	}
	printf("合計:%d\t",takepon.tokuten[5]);
	printf("評価:%c\n",getHyouka(takepon.tokuten[5]));
	return 0;
}

//科目名を返す関数
char* getKamoku(int i){
	char *kamoku;
	switch(i){
		case 0:
			kamoku="国語";
			break;
		case 1:
			kamoku="数学";
			break;
		case 2:
			kamoku="理科";
			break;
		case 3:
			kamoku="社会";
			break;
		case 4:
			kamoku="英語";
			break;
		default:
			break;
 }
	return kamoku;
}

//評価を返す関数
char getHyouka(int tokuten){
	char rank;
	if(tokuten >= 400){
		rank ='A';
	}else if(tokuten >= 300){
		rank ='B';
	}else if(tokuten >= 200){
		rank ='C';
	}else if(tokuten >= 100){
		rank ='D';
	}else{
		rank ='E';
	}
	return rank;
}

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

Re: 5教科の合計値が正しく表示されない

#2

投稿記事 by box » 5年前

1.名前の最後に"P"が付与される。※例:名前をtanakaにしたらtanaka"P"と出力される
ポインター変数ではなく、適切なサイズを持つ配列にする必要がありそうです。
つまり

コード:

    char *name;
ではなく

コード:

    char name[40]; // この40は、最長の名前が格納できる大きさにしてください。ここでは仮に40としています。
ということです。
2.各科目の点数に何の数字を入れても、5教科の合計値が「-858993060」と出る
+=演算子を使ってインクリメントする変数は、必ず、0で初期化しておきましょう。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

jetlee2

Re: 5教科の合計値が正しく表示されない

#3

投稿記事 by jetlee2 » 5年前

早々のコメントを頂きありがとうございます。
教えて頂いたやり方で、名前と合計値の問題クリアできました。構造体の配列の初期化で、少し試行錯誤しましたが、最終的に以下のコードに落ち着き、本来のお題通り動くようになりました。

コード:

#include<stdio.h>

char getHyouka(int);//関数プロトタイプの宣言
char* getKamoku(int);//関数プロトタイプの宣言


//構造体の型を宣言
struct seiseki {//成績を表示する構造体
	char cls;//クラス名(文字)
	int no;//出席番号
	char name[10];//名前
	int tokuten[6];//国語、数学、理科、社会、英語、合計を格納
	char rank;//評価 400点以上 A 300点以上 B 200点以上 C100点以上 D 100点未満 E
};

int main(int argc, const char * argv[])
{
	struct seiseki takepon;//構造体の宣言(これで使えるようになる)
	takepon.tokuten[5]=0;
	printf("クラスを入力して下さい\t");
	scanf("%c",&takepon.cls);
	printf("出席番号を入力して下さい\t");
	scanf("%d",&takepon.no);
	printf("名前を入力して下さい\t");
	scanf("%s",&takepon.name);

	for(int i=0;i<5;i++){
		char *kamoku=getKamoku(i);
		printf("%sの点数を入力して下さい\t",kamoku);
		scanf("%d",&takepon.tokuten[i]);
		takepon.tokuten[5]+=takepon.tokuten[i];
	}
	printf("クラス:%c\t出席番号:%d\t名前:%s\n",takepon.cls,takepon.no,&takepon.name);
	for(int i=0;i<5;i++){
		char *kamoku=getKamoku(i);
		printf("%s:%d\t",kamoku,takepon.tokuten[i]);
	}
	printf("合計:%d\t",takepon.tokuten[5]);
	printf("評価:%c\n",getHyouka(takepon.tokuten[5]));
	return 0;
}

//科目名を返す関数
char* getKamoku(int i){
	char *kamoku;
	switch(i){
		case 0:
			kamoku="国語";
			break;
		case 1:
			kamoku="数学";
			break;
		case 2:
			kamoku="理科";
			break;
		case 3:
			kamoku="社会";
			break;
		case 4:
			kamoku="英語";
			break;
		default:
			break;
 }
	return kamoku;
}

//評価を返す関数
char getHyouka(int tokuten){
	char rank;
	if(tokuten >= 400){
		rank ='A';
	}else if(tokuten >= 300){
		rank ='B';
	}else if(tokuten >= 200){
		rank ='C';
	}else if(tokuten >= 100){
		rank ='D';
	}else{
		rank ='E';
	}
	return rank;
}

中学生の時に、分からなかった数学の問題が解けたときの快感を思い出しました。大人になってまたこの感覚を得られるのはうれしいです。親切に教えて頂きありがとうございました。

返信

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