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

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


以下の説明を理解した上で,課題に取り組んで下さい.
  1. [リスト9.1]の
    struct roll {
    char name[32];

    ...
    char tel[20];
    } my_data;

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

    ...
    char tel[20];
    };

    と 「構造体"変数" my_data の定義」
    struct roll my_data;

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

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


(T11_1) [リスト 9.1] を入力し,コンパイル・実行せよ.その上で,上で記した注意に従ってプログラムを書き替えてコンパイル・実行せよ.

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

  1. main( ) の外部で,次のメンバを持つ構造体 struct date を宣言せよ.
  2. main( ) の内部で struct date 型の構造体変数 myday を定義せよ.
  3. 今日の日付など好きな日にあわせて,myday の各メンバ(myday.y, myday.m, myday.d)に値を代入せよ.
  4. 引数として受け取った struct date 型の構造体変数の内容を,例えば「今日は 2025年 6月24日」という形式で表示せよ.
  5. #include <stdio.h>
    
      /* ここで構造体を宣言 */
    
    int main(void)
    {
    
      /* ここで構造体変数を定義 */
    
      /* ここで構造体変数のメンバに値を代入 */
    
      /* ここで日付の表示を行う */
    
        return 0;
    }
    



続いて,struct date 型の構造体変数 hiduke を引数として受け取り,「今日は 2025年 6月24日」のように日付の表示を行う関数 void print_day( struct date hiduke ) を作成せよ.このプログラムを提出すること.

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

  1. main( ) の外部で,次のメンバを持つ struct score 型の構造体を宣言せよ.
  2. さらに,main( ) の内部で,struct score 型の構造体変数 myscore と border を定義する.
  3. myscore.eng,myscore.math はそれぞれ自身の英語,数学の点数,border.eng,border.math はそれぞれ英語,数学の合格最低点とする.以下のいずれかを表示する関数 print_pass_fail を作成せよ(関数 main では,以下のすべての表示の動作確認ができる数値を代入せよ).



(T11_4) 次の手順に沿ってテストの点数を処理するプログラムを完成せよ.

  1. main( ) の外部に,次のメンバを持つ struct student 型の構造体を宣言せよ.
  2. さらに,main( ) の内部で,struct student 型の構造体の配列 person[N] を定義し,以下の通り初期化する.
  3. 配列 person の各要素( person[i] )に対して,当該生徒の 3 教科の合計点を計算してメンバ total に代入せよ.
  4. 3 教科の合計点について,N 人の平均点を求めて表示せよ.さらに,平均点を上回った人の学生番号をすべて表示せよ.
  5. 3 教科の合計点が最大である学生の情報(学生番号,各科目の点数,3教科の合計点数)を表示せよ.
    まず,最大値を与える配列の添字を求めればよい.



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

以下のプログラムを作成せよ(注: 本問は typedef について学ぶこと目的としており,構造体は扱わない).

  1. 試験の点数を扱うための変数の型として score_t 型を宣言せよ.その実体は unsigned int 型であるとする.
    教科書 pp. 340〜341 に記される通り,typedefで作る型名は *_t とすることが一般的)
  2. score_t 型の変数 a を定義せよ.
  3. キーボードから整数を入力させ,a に代入する.ただし,0 以上 100 以下の整数が入力されるまで,繰り返しキーボードからの入力を促すこと.
  4. 最後に,点数に応じて「合格です」「再試験です」「不合格です」などの文字を表示せよ.条件は自分で与えてよい.
レポートで,unsigned int 型とはどのような型であるか,説明せよ.教科書3.1.3項に説明がある.


(T11_6) 前問で見た通り,typedef により,ユーザは新たに型名を定義できる.

typedef struct{
	int y;
	int m;
	int d;
} date_t;

のようにすると,宣言 y, m, d をメンバとする構造体の新しい型名 date_t が与えられます(「キックオフC言語」第10章も参照). (T11_2) で提出したプログラムを上のように書き換えることで,その内容と意味を理解せよ. また,それに従って,他の箇所も適切に書き換えた上で,コンパイル・実行せよ.