プログラミング実習II (2026) 課題

[T11] 第9章 構造体とユーザ定義型

以下の説明を理解した上で,課題に取り組んで下さい.
  1. 教科書 [リスト9.1] の構造体宣言と構造体変数の定義を main 関数の内部で同時に行う方法を確認してください(pp. 314~318). [リスト9.1]の
    struct roll {
    char name[32];

    ...
    char tel[20];
    } my_data;
    は,「(roll 型の構造体に関する)構造体宣言」
    struct roll {
    char name[32];

    ...
    char tel[20];
    };
    と 「(roll 型の)構造体"変数" my_data の定義」
    struct roll my_data;
    
    同時に main 関数の内部で行っています.教科書 pp. 314~318をよく読んで下さい.
  2. 一方,「構造体宣言」は main 関数の外部で行うことが一般的です.例えば,プログラム内のいずれの関数においても「roll 型」の構造体を使用するためには,これが必要となります.
  3. 「構造体変数の定義」は,main 関数の内部で行うこととします(main 関数の外部で定義することも考えられますが,これはグローバル変数として扱われます).
    //構造体 roll 型の宣言
    struct roll {
    char name[32];

    ...
    char tel[20];
    }; int main( void ){ // roll 型の構造体変数 my_data の定義 struct roll my_data; }
  4. int 型にたとえれば,main 関数の外部で行う「構造体宣言」は "int 型は何たるか" を宣言しているようなもので,関数の内部で行う「構造体変数の宣言」は int a; と書くことに相当します.
(T11_1)

[リスト 9.1] を入力し,コンパイル・実行せよ.その上で,前述の注意に従ってプログラムを書き替えて(構造体宣言を main 外へ移動して)コンパイル・実行せよ.

(T11_2)

次の手順に沿ってプログラムを完成せよ.

  1. main() の外部で,int y, int m, int d をメンバを持つ date 型の構造体を宣言せよ.
  2. main() の内部で date 型の構造体変数 myday を定義せよ.
  3. 構造体変数 myday のメンバである myday.y, myday.m, myday.d に適当な日の日付を年,月,日の順に代入せよ(キーボード入力でなくてよい).
  4. 引数として受け取った構造体変数の内容を「2026年 4月11日」のような形式で表示せよ.
#include <stdio.h>

/* date 型の構造体を宣言 */

int main(void)
{

    /* date 型の構造体変数 myday を定義 */


    /* 構造体変数のメンバに値を代入 */


    /* 構造体変数のメンバを表示 */

    return 0;
}
(T11_3)

次の手順に沿ってテストの点数から判定を行うプログラムを完成せよ.

  1. main() の外部で,int engint math をメンバとして持つ score 型の構造体を宣言せよ.これらはそれぞれ英語と数学の点数を表すこととする.
  2. main() の内部で,score 型の構造体変数 myscore を定義する.
  3. キーボードから 2 個の整数を受け取り,それぞれ,myscore のメンバに代入する(scanf("%d", &myscore.eng); ).
  4. 英語と数学の点数の和を計算して表示せよ.
  5. 各科目の合格状況を表示せよ.各科目につき 60 点以上を合格とする.以下のいずれかを表示すればよい.
    「英数ともに合格」,「英語のみ合格」,「数学のみ合格」,「両方不合格」
(T11_4)

以下に解答せよ(注: 本問は typedef について学ぶこと目的としており,構造体は扱わない).

教科書 9.5.1項,およびキックオフC言語 10.1 節で説明されている typedef により,既存のデータ型(int など)に 対して別名をつけることができる.
例えば,
typedef unsigned int score_t;
とすることで,ユーザは score_t という新しい型を定義することができる.その実体は unsigned int 型である. 実際,
score_t a;
とすることで,score_t 型の変数 a が定義されるが,これは実質的には
unsigned int a;
とすることと変わらない.
ただし,score_t 型と別名をつけることで,a が単なる非負の整数ではなく,試験の点数を表す変数であることが意識しやすくなる.このように,typedef はコードの可読性や保守性を向上する目的で使用される場合や,構造体の型に別名をつける場合にもよく用いられる.

次のプログラムをよく読んだ上で実行せよ.その上で,boolean という型を宣言する利点をレポートに記せ.

#include <stdio.h>

typedef int boolean;     // int に boolean という別名をつける
#define TRUE  1
#define FALSE 0

boolean is_even(int n) {
	if (n % 2 == 0) {  return TRUE;  }
	else{  return FALSE;  }
}

int main(void) {
	int x;

	printf("整数を入力してください: ");	scanf("%d", &x);

	boolean result = is_even(x);

	if(result == TRUE){  printf("%d は偶数です。\n", x);  }
	else{  printf("%d は奇数です。\n", x);  }

	return 0;
}
(T11_5) 前問で見た通り,typedef により,ユーザは新たに型名を定義できる
typedef struct{
	int y;
	int m;
	int d;
} date_t;
のように宣言すると, y, m, d をメンバとする構造体の新しい型名 date_t が与えられる(「キックオフC言語」第10章も参照,C言語によるプログラミング pp. 340~341,キックオフC言語 p. 164 に記される通り,typedefで作る型名は *_t とすることが一般的です).

(T11_2) で提出したプログラムを上のように書き換えてみよ. また,型名の変更に従って,他の箇所も適切に書き換えた上で,コンパイル・実行せよ.

(T11_6)

キックオフC言語 10章のソースコード 10.1 を入力し,実行することで,その内容を理解せよ.それに続いて,ソースコード 10.2 および 10.3 についても同様のことを行え.提出は,ソースコード 10.3 のプログラムとする.既に入力済のソースコードに修正・追加を行ってよい.