■probex6-1.(難易度:★)
以下のプログラムを実行すると結果は実行結果1のようになる。probex6-1:main.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | #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(難易度:★★)
以下の表は、あるクラスのテストの成績を示す票である。この生徒情報を構造体として作成し、それぞれの科目の平均点を構造体のポインタを用いて求めなさい。
学生番号 | 国語 | 算数 | 理科 | 社会 | 英語 |
---|---|---|---|---|---|
1001 | 82 | 43 | 53 | 84 | 45 |
1002 | 92 | 83 | 88 | 79 | 99 |
1003 | 43 | 32 | 53 | 45 | 66 |
1004 | 72 | 73 | 71 | 68 | 59 |
1005 | 99 | 72 | 82 | 91 | 94 |
この時、以下の構造体を作成し、利用すること。student_data:学生の番号と、点数のデータを保存する構造体
1 2 3 4 5 6 7 8 | typdef struct{ int id; // 学生番号 int kokugo; // 国語の点数 int sansu; // 算数の点数 int rika; // 理科の点数 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-6(難易度:★★★)
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-7(難易度:★★)
以下の表は、ある家庭の家計簿である。この表を基に、構造体を用いて、以下の計算を行いなさい。
月 | 住居費 | 食費 | 被服費 | 教養費 | 医療費 | その他 |
---|---|---|---|---|---|---|
1月 | 86000 | 47000 | 3000 | 20000 | 9500 | 66000 |
2月 | 86000 | 43000 | 30000 | 15000 | 0 | 43000 |
3月 | 86000 | 38600 | 5000 | 65000 | 500 | 76000 |
4月 | 86000 | 39500 | 0 | 12000 | 0 | 75000 |
5月 | 86000 | 38600 | 28000 | 7000 | 5200 | 63500 |
6月 | 86000 | 37500 | 3000 | 5000 | 0 | 67000 |
(1) 構造体kakeiを定義し、月、住居費、食費、被服費、教養費、医療費、その他の金額を代入できるようにしなさい。
(2) 表のデータを、kakei構造体の配列を作成し、初期値として入れなさい。
(3) kakeiのポインタを引数として、費用の合計を求める関数、goukeiを作成し、各月の費用の合計を出力しなさい。
(4) 医療費の最も少ない月を探し出し、表示しなさい。
(5) 食費の最も多い月と、その金額を表示しなさい。
期待される実行結果
各月の出費の合計
———————
1月 231500
2月 217000
3月 271100
4月 212500
5月 228300
6月 198500 医療費の最も多い月:1月
食費の最も多い月と金額:1月、47000