プログラミング実習II (2026) 課題
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をよく読んで下さい.
main 関数の外部で行うことが一般的です.例えば,プログラム内のいずれの関数においても「roll 型」の構造体を使用するためには,これが必要となります.
main 関数の内部で行うこととします(main 関数の外部で定義することも考えられますが,これはグローバル変数として扱われます).
//構造体 roll 型の宣言
struct roll {
char name[32];
...
char tel[20];
};
int main( void ){
// roll 型の構造体変数 my_data の定義
struct roll my_data;
}
int 型にたとえれば,main 関数の外部で行う「構造体宣言」は "int 型は何たるか" を宣言しているようなもので,関数の内部で行う「構造体変数の宣言」は int a; と書くことに相当します.
[リスト 9.1] を入力し,コンパイル・実行せよ.その上で,前述の注意に従ってプログラムを書き替えて(構造体宣言を main 外へ移動して)コンパイル・実行せよ.
次の手順に沿ってプログラムを完成せよ.
main() の外部で,int y, int m, int d をメンバを持つ date 型の構造体を宣言せよ.main() の内部で date 型の構造体変数 myday を定義せよ.myday のメンバである myday.y, myday.m, myday.d に適当な日の日付を年,月,日の順に代入せよ(キーボード入力でなくてよい).#include <stdio.h>
/* date 型の構造体を宣言 */
int main(void)
{
/* date 型の構造体変数 myday を定義 */
/* 構造体変数のメンバに値を代入 */
/* 構造体変数のメンバを表示 */
return 0;
}
次の手順に沿ってテストの点数から判定を行うプログラムを完成せよ.
main() の外部で,int eng と int math をメンバとして持つ score 型の構造体を宣言せよ.これらはそれぞれ英語と数学の点数を表すこととする.main() の内部で,score 型の構造体変数 myscore を定義する.myscore のメンバに代入する(scanf("%d", &myscore.eng);
).以下に解答せよ(注: 本問は typedef について学ぶこと目的としており,構造体は扱わない).
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;
}
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) で提出したプログラムを上のように書き換えてみよ. また,型名の変更に従って,他の箇所も適切に書き換えた上で,コンパイル・実行せよ.
キックオフC言語 10章のソースコード 10.1 を入力し,実行することで,その内容を理解せよ.それに続いて,ソースコード 10.2 および 10.3 についても同様のことを行え.提出は,ソースコード 10.3 のプログラムとする.既に入力済のソースコードに修正・追加を行ってよい.