オブジェクト指向プログラミングa 2012年度定期試験類似問題解説 |
問題1: const定数
【解説】参考:プリント「C言語のおさらい」8ページ
初期値付きの変数宣言の前にというキーワードを付けると,その変数の値は
指定された初期値に固定されて変更できなくなる。これを,const定数と呼ぶ。
この問題では,円周率π(パイ,3.141592....)を pi という分かり易い名前
で使えるようにconst定数を宣言している。
【使用例】
const double pi = 3.141592; … 中略 … printf( "半径2.0の円の面積は%g\n", pi * 2.0 * 2.0 );
const double pi = 3.141592;
問題1: 列挙型と列挙定数
【解説】参考:プリント「C言語のおさらい」8〜9ページ
世の中では,「整数値・通し番号・記号の列」などを使って「何か」を表す事がよくある。
これは主に「管理がしやすく」するためである。
例えば
・学籍番号 … 「情報太郎」君は「E12000ab」 ・出席番号 … 「環境花子」さんは出席番号「9」番 ・車のナンバープレート … 「情報太郎所有の自動車」は「千葉553 と 8888」 ・日本で出版されている本の出版コード … 「新版 明解C言語 入門編」は「ISBN978-4797327922」(いわゆるISBNコード) ・商品コード … 「eneloop-ニッケル水素電池-1本パック」は「HR-1UTG-1BP」 ・郵便番号 … 「千葉県千葉市若葉区御成台」は「265-0077」 ・国が定める都道府県コード … 「北海道」は「01」,「青森県」は「02」,… ,「千葉県」は「12」,… ,「沖縄県」は「47」 |
などなど。
このように,「整数値・通し番号・記号の列」などを使って「何か」を表す
ことを,「コード化」と呼ぶ。
プログラムでも,「整数」を使って「コード化」を行うことがよくある。
例えば
・文字コード(工業規格で決められてます) (1) ASCIIコード … 文字「5」は整数値「53」で表す,文字「A」は整数値「65」で表す,…,文字「z」は整数値「122」で表す。 (2) SHIFT-JISコード … 文字「あ」は整数値「33440」で表す,文字「情」は整数値「36846」で表す。 ・性別コード … 「男性」を「0」で表す,「女性」を「1」で表す。 ・ゲームの敵味方の識別コード … 「味方である事」を「0」,「敵である事」を「1」で表す。 |
など。
こういった,「整数」を使った「コード化」は,const定数を使っても行うこと
が出来る。
例えば,性別をコード化する場合は,
/* 参考)maleは男性,femaleは女性,genderは性別という意味の英単語。 */ /* 定数名の最初の一文字の k は,定数を表すドイツ語 konstant の頭文字で, その名前が定数名で有る事を表したいときに付けることが多い。 */ const int kMale = 0; /* 男性を表す定数kMale (値は整数値0) */ const int kFemale = 1; /* 女性を表す定数kFemale (値は整数値1) */ … int yourGender = kMale; … if( yourGender == kMale ) { /* 男性の場合の処理をここで行う */ printf( "あなたは男性です。\n" ); } else if( yourGender == kFemale ){ /* 女性の場合の処理をここで行う */ printf( "あなたは女性です。\n" ); } else { printf( "性別が正しく設定されていません。\n" ); }
というように書けないことは無い。しかし,この性別の例のように2種類ならまだ
簡単だが,数十種類以上になってくると const定数でコード化を行うことは大変に
なってくる。
そこで,C言語には「整数」を使った「コード化」に便利な,列挙型と列挙定数が
用意されている。列挙定数は,「定数を列べ挙げていく」形で定数を定義できる。
列挙定数の基礎
列挙型と列挙定数を使って,さきほどの性別の例を書き換えると以下の様になる。
enum Gender { kMale, /* 男性を表す定数kMale (値は整数値0) */ kFemale /* 女性を表す定数kFemale (値は整数値1) */ }; … enum Gender yourGender = kMale; … if( yourGender == kMale ) { /* 男性の場合の処理をここで行う */ printf( "あなたは男性です。\n" ); } else if( yourGender == kFemale ){ /* 女性の場合の処理をここで行う */ printf( "あなたは女性です。\n" ); } else { printf( "性別が正しく設定されていません。\n" ); }
enum Country { kJapan, kUSA, kUK };または
enum Country { kJapan = 0, kUSA = 1, kUK = 2 };
問題3:
【問題に対する正解】
enum Country myCountry = kJapan;
問題4:
【問題に対する正解】
struct Person { int age; enum Country country; double weight; double height; };
問題5:
【問題に対する正解】
typedef struct Person Person;
問題6:
【問題に対する正解】
Person taro, mary;もちろん,以下のように別々に宣言しても良い。
Person taro; Person mary;
問題7:
【問題に対する正解】
taro.age = 20; taro.country = kJapan; taro.weight = 65.4; taro.height = 175.1; mary.age = 18; mary.country = kUSA; mary.weight = 55.5; mary.height = 162.3;
問題8:
【問題に対する正解】
int * ip = &x;
問題9:
【問題に対する正解】
*ip = 100;もちろん,次の様に,ポインタがNULLでないかどうかのチェックを入れても良い。
if( ip != NULL ) { *ip = 100; }
問題10:
【解説】
セルc2のnextポインタはセルc3を指し,セルc3のnextポインタはセルc1を指し,セルc1のnextポインタはNULL(空ポインタ)となっている。
【問題に対する正解】
以下の様に3行にわたって表示される。
20 30 10
問題11:
【問題に対する正解】
/* Point2D.h */ struct Point2D { double x; double y; }; typedef struct Point2D Point2D; void displayPoint2DXY( Point2D p );
/* Point2D.c */ #include <stdio.h> #include "Point2D.h" void displayPoint2DXY( Point2D p ) { printf( "(%g, %g)\n", p.x, p.y ); }