問題6:構造体

この問題を解くためには…
 → 発展編第5日目参照

probex6-1.(難易度:★)

以下のプログラムを実行すると結果は実行結果1のようになる。

probex6-1:main.c
#include <stdio.h>
 
typedef struct{
	float x;
	float y;
}Vector2D;

void main(){
	Vector2D v1,v2;
	printf("v1.x=");
	scanf("%f",&(v1.x));
	printf("v1.y=");
	scanf("%f",&(v1.y));
	printf("v2.x=");
	scanf("%f",&(v2.x));
	printf("v2.y=");
	scanf("%f",&(v2.y));
	printf("(%f,%f) + (%f,%f)=(%f,%f)¥n",v1.x,v1.y,v2.x,v2.y,(v1.x + v2.x),(v1.y + v2.y));
}

実行結果1
v1.x=1.0 ← キーボードから入力
v1.y=1.0 ← キーボードから入力
v2.x=2.0
v2.y=3.0
(1.000000,1.000000)+(2.000000,3.000000)=(3.000000,4.000000)

このプログラムの一部を改造し、実行結果2のようになるようにプログラムを変えなさい。

実行結果2
v1.x=1.0 ← キーボードから入力
v1.y=1.0 ← キーボードから入力
v2.x=2.0
v2.y=3.0
(1.000000,1.000000)+(2.000000,3.000000)=(3.000000,4.000000)
(1.000000,1.000000)-(2.000000,3.000000)=(-1.000000,-2.000000)

probex6-2.(難易度:★)

以下のプログラムは、学生を管理するプログラムでる。一人の学生の、①名前(name)、②学生番号(id)、③性別(sex)、④学年(grade)をそれぞれ管理している。これら①~④のパラメータを、一つの構造体student_dataにまとめて、以下のプログラムを書き直しなさい。

probex6-2:main.c
#include <stdio.h>
#include <string.h>
 
#define STUDENT_NUM	(5)

char name[STUDENT_NUM][256];	//	学生の名前
int id[STUDENT_NUM];		//	学生番号
int sex[STUDENT_NUM];		//	性別(性別 0:男 1:女)
int grade[STUDENT_NUM];		//	学年

void main(){
	int i;
	//	名前の設定
	strcpy(name[0],"青木一");
	strcpy(name[1],"遠藤京子");
	strcpy(name[2],"加藤悟");
	strcpy(name[3],"佐々木八重子");
	strcpy(name[4],"田中徹");
	//	学生番号の設定
	id[0] = 1001;
	id[1] = 1002;
	id[2] = 1003;
	id[3] = 1004;
	id[4] = 1005;
	//	性別の設定
	sex[0] = 0;
	sex[1] = 1;
	sex[2] = 0;
	sex[3] = 1;
	sex[4] = 0;
	//	学年
	grade[0] = 1;
	grade[1] = 1;
	grade[2] = 1;
	grade[3] = 1;
	grade[4] = 1;
	//	学生のデータの表示
	for(i = 0; i < STUDENT_NUM; i++){
		printf("名前:%s\n",name[i]);
		printf("性別:");
		if(sex[i] == 0){
			printf("男\n");
		}else{
			printf("女\n");
		}
		printf("学生番号:%d\n",id[i]);
		printf("学年:%d\n\n",grade[i]);
	}
}
実行結果
名前:青木一
性別:男
学生番号:1001
学年:1

名前:遠藤京子
性別:女
学生番号:1002
学年:1

名前:加藤悟
性別:男
学生番号:1003
学年:1

名前:佐々木八重子
性別:女
学生番号:1004
学年:1

名前:田中徹
性別:男
学生番号:1005
学年:1

probex6-3(難易度:★)

次のプログラムは、時・分・秒で設定した時間(Time構造体で表現)の、差を秒で表示するものである。期待される実行例にならい、関数getDiffMinuteを記述して、プログラムを完成させなさい。

probex6-3:main.c
#include <stdio.h>

typedef struct{
	int hour;	//	時間(0~23時)
	int minute;	//	分(0~59分)
	int second;	//	秒(0~59秒)
}Time;

//	時間の設定
void setTime(Time*,int,int,int);
//	時間の差を秒で取得
int getDiffMinute(Time*,Time*);

void main(){
	Time start,end;	//	開始時間と終了時間
	int diff;
	start.hour = 1;	
	start.minute = 10;
	start.second = 13;	//	開始時間は、1時10分13秒
	end.hour = 2;
	end.minute = 20;
	end.second = 42;	//	終了時間は、2時20分42秒
	diff = getDiffMinute(&start,&end);	//	2つの時間の差を秒で計算
	printf("%d:%d:%dと、%d:%d:%dの違いは、%d秒です。¥n"
		,start.hour,start.minute,start.second,end.hour,end.minute,end.second,diff);

}

//	時間の設定
void setTime(Time* time,int hour,int minute,int second){
	time->hour = hour;
	time->minute = minute;
	time->second = second;
}

//	時間の差を秒で取得
int getDiffMinute(Time* start,Time* end)
{
	//	ここで、2つの時間の違いを、秒で計算して返す。
	
}
期待される実行結果
1:10:13と、2:20:42の違いは、4229秒です。

probex6-4(難易度:★★)

以下の表は、あるクラスのテストの成績を示す票である。この生徒情報を構造体として作成し、それぞれの科目の平均点を構造体のポインタを用いて求めなさい。

学生番号国語算数理科社会英語
10018243538445
10029283887999
10034332534566
10047273716859
10059972829194

この時、以下の構造体を作成し、利用すること。

student_data:学生の番号と、点数のデータを保存する構造体
typdef struct{
	int id;			//	学生番号
	int kokugo;		//	国語の点数
	int sansu;		//	算数の点数
	int shakai;		//	社会の点数
	int eigo;		//	英語の点数
}student_data;
期待される実行結果
国語 平均 = 77.60
数学 平均 = 60.60
理科 平均 = 69.40
社会 平均 = 73.40
英語 平均 = 72.80

probex6-5(難易度:★★)

probex6-4の表をもとに、学生の科目ごとの得点の合計点を求め、 以下のように合計点順に画面表示するプログラムを作成しなさい。データを格納する構造体も、probex6-4の、student_dataを用いること。また、合計を計算する関数として、以下のものを作成し、利用すること。

合計の計算をする関数
関数名処理内容
int sum(student_type* data)ポインタとして与えられた、dataの各教科の合計点数を戻り値として返す。

期待される実行結果
番号      国語    数学    理科    社会    英語    合計
1001      82      43      53      84      45      307
1002      92      83      88      79      99      441
1003      43      32      53      45      66      239
1004      72      73      71      68      59      343
1005      99      72      82      91      94      438

probex6-5(難易度:★★★)

probex6-5の表を、合計点の高い順に並べ替えて表示しなさい。

期待される実行結果
番号      国語    数学    理科    社会    英語    合計
1002      92      83      88      79      99      441
1005      99      72      82      91      94      438
1004      72      73      71      68      59      343
1001      82      43      53      84      45      307
1003      43      32      53      45      66      239

probex6-6(難易度:★★)

以下の表は、ある家庭の家計簿である。この表を基に、構造体を用いて、以下の計算を行いなさい。

住居費食費被服費教養費医療費その他
1月8600047000300020000950066000
2月86000430003000015000043000
3月860003860050006500050076000
4月8600039500012000075000
5月8600038600280007000520063500
6月860003750030005000067000
期待される実行結果

(1) 構造体kakeiを定義し、月、住居費、食費、被服費、教養費、医療費、その他の金額を代入できるようにしなさい。
(2) 表のデータを、kakei構造体の配列を作成し、初期値として入れなさい。
(3) kakeiのポインタを引数として、費用の合計を求める関数、goukeiを作成し、各月の費用の合計を出力しなさい。
(4) 医療費の最も少ない月を探し出し、表示しなさい。
(5) 食費の最も多い月と、その金額を表示しなさい。

各月の出費の合計
---------------------
1月 231500
2月 217000
3月 271100
4月 212500
5月 228300
6月 198500

医療費の最も多い月:1月
食費の最も多い月と金額:6月、37500