おさえておきたいプログラミングの基本
この問題を解くためには…
以下のプログラムを実行すると結果は実行結果1のようになる。
probex6-1:main.c#include <stdio.h>
typedef struct{
float x;
float y;
}Vector2D;
int main(int argc, char** argv){
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));
return 0;
}
実行結果1
このプログラムの一部を改造し、次の実行結果2のようになるようにプログラムを変えなさい。ただし、変えてよい部分は、ポインタ変数pへの操作の部分のみとする。
実行結果2以下のプログラムは、学生を管理するプログラムでる。一人の学生の、①名前(name)、②学生番号(id)、③性別(sex)、④学年(grade)をそれぞれ管理している。これら①~④のパラメータを、1つの構造体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]; // 学年
int main(int argc, char** argv){
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]);
}
return 0;
}
実行結果
次のプログラムは、時・分・秒で設定した時間(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*);
int main(int argc, char** argv){
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);
return 0;
}
// 時間の設定
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つの時間の違いを、秒で計算して返す。
}
期待される実行結果
以下の表は、あるクラスのテストの成績を示す表である。この生徒情報を構造体として作成し、それぞれの科目の平均点を構造体のポインタを用いて求めなさい。
学生番号 | 国語 | 算数 | 理科 | 社会 | 英語 |
---|---|---|---|---|---|
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:学生の番号と、点数のデータを保存する構造体typdef struct{
int id; // 学生番号
int kokugo; // 国語の点数
int sansu; // 算数の点数
int rika; // 理科の点数
int shakai; // 社会の点数
int eigo; // 英語の点数
}student_data;
期待される実行結果
probex6-4の表をもとに、学生の科目ごとの得点の合計点を求め、 以下のように合計点順に画面表示するプログラムを作成しなさい。データを格納する構造体も、probex6-4の、student_dataを用いること。また、合計を計算する関数として、以下のものを作成し、利用すること。
合計の計算をする関数関数名 | 処理内容 |
---|---|
int sum(student_type* data) | ポインタとして与えられた、dataの各教科の合計点数を戻り値として返す。 |
probex6-5の表を、合計点の高い順に並べ替えて表示しなさい。
期待される実行結果以下の表は、ある家庭の家計簿である。この表を基に構造体を用いて、以下に指示する処理を行いなさい。
月 | 住居費 | 食費 | 被服費 | 教養費 | 医療費 | その他 |
---|---|---|---|---|---|---|
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 |
一週間でわかるC言語・C++言語がオンライン講座になりました!動画と音声によってさらにわかりやすくなりました!! 1講座で2つの言語を学ぶことができる上に、練習問題の回答もダウンロードできます。
Read →本講座が「1週間でC言語の基礎が学べる本」として書籍化されました!サイトの内容プラスアルファでより学習しやすくなっています!Impressより発売中です!!
Read →