一週間で身につくC言語の基本

おさえておきたいプログラミングの基本

【応用問題3】 構造体


問題4:ポインタとアドレス

この問題を解くためには…

応用編第5日目参照

probex6-1.(難易度:★)

以下のプログラムを実行すると結果は実行結果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
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のようになるようにプログラムを変えなさい。ただし、変えてよい部分は、ポインタ変数pへの操作の部分のみとする。

実行結果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)をそれぞれ管理している。これら①~④のパラメータを、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;
}
実行結果
名前:青木一 性別:男 学生番号: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*);

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つの時間の違いを、秒で計算して返す。
    
}
期待される実行結果
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 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月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月 食費の最も多い月と金額:1月、47000

一週間で学べるコースの一覧
Udemy
...
2024/10/01

Udemyでも学びましょう!

一週間でわかるC言語・C++言語がオンライン講座になりました!動画音声によってさらにわかりやすくなりました!! 1講座で2つの言語を学ぶことができる上に、練習問題の回答もダウンロードできます。

Read →
Impress一週間シリーズ
1週間でC言語の基礎が学べる本
2024/10/01

書籍化された一週間シリーズ

本講座が「1週間でC言語の基礎が学べる本」として書籍化されました!サイトの内容プラスアルファでより学習しやすくなっています!Impressより発売中です!!

Read →
Impress一週間シリーズ
...
2024/10/01

書籍化された一週間シリーズ

一週間シリーズは書籍化されています。こちらもどうぞ!

Read →
プログラマーなら欲しいグッズ
プログラミンググッズ

プログラミンググッズ

快適なプログラミング環境を構築したい人々にぜひとも揃えてほしいグッズです。

Read →
制作・管理
シフトシステム株式会社

シフトシステム株式会社

このサイトはシフトシステム株式会社によって制作・管理がなされています。

Read →