オブジェクト指向プログラミング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 );
}