オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例
Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1 (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径 ( Radius ) に対して、高さ 2.0, 4.0, 6.0, 8.0, 10.0 のときの体積を、以下に示す実行結果と同じ 形式(空白や小数点以下の桁数など)で表示するようにするこ と。また、円周率は 3.14 として計算しなさい。(ただし、青 字の部分は入力文字列を表す。) $./oom-1 Input Radius (float):
Jan. 12, 2005 情報処理技術基礎演習 II 3 オブジェクト指向言語 中間試験解説 1 半径を入力する変数を radius, 円の面積を計算した結果を代入 する変数を circle として実数型で宣言する。 決められた回数の繰り返しなので、 for 文を使う。 2,4,6,8,10 は 1*2, 2*2,3*2,4*2,5*2 と同じ。 #include int main( void ){ float radius, circle; int i; printf("Input Radius (float) :"); scanf("%f",&radius); circle = radius * radius * 3.14; for (i = 1; i <= 5; i++){ printf("%.1f - %.2f\n",(float)i*2., circle*(float)i*2.); } return 0; }
Jan. 12, 2005 情報処理技術基礎演習 II 4 オブジェクト指向言語 中間試験解説 1 printf の中で使われる % と変換文字の間に許されるもの マイナス符号 変換された文字を左づめで表示 フィールドの最小幅を指定する数字 上記マイナス符号が無ければ、変換された文字を右づめで、最小 幅を保ちつつ表示。ただし、最小であるので範囲を超える場合は そのまま表示する。 ピリオド フィールドの幅を示す数字と桁数を指定する数字の区切り 例 %-20s20 文字幅の文字列を左づめで出力 %15.3f15 文字幅の実数を小数点以下3桁 この15文字幅を省略して自動の文字幅小数点以下 3 桁とす ると、 %.3f 自動文字幅、小数点以下 3 桁 printf("%.1f - %.2f\n",(float)i*2., circle*(float)i*2.);
Jan. 12, 2005 情報処理技術基礎演習 II 5 オブジェクト指向言語 中間試験解説 2 (2) 整数型の引数1と引数2が与えられたとき、大きい方を 引数1に、小さい方を引数2に入れて戻る関数 MaxMin を作 成しなさい。なお、 main 関数としては以下を使用し ( 変更不 可 ) 、プログラムは main 関数も含めて動作するものを提出す ること。 題意から、関数 MaxMin は 2 つの引数をとることがわかる。ま た、与えられた main 関数のプロトタイプ宣言から、それらは ポインタであることもわかる。 また、戻り値が無いので関数は void 型となる。 void MaxMin(int *, int *); main 関数から呼び出すときにポインタを渡すため、 MaxMin( &in1, &in2 ); としている。
Jan. 12, 2005 情報処理技術基礎演習 II 6 オブジェクト指向言語 中間試験解説 2 仮引数として x, y を用意する。受け渡しはポインタなので、 そのよう記述する。 *x はxの指し示すポインタの内容である。 *x < *y ならば入れ替え、そうでなければそのまま。 仮の変数を tmp としてそこに入れて交換する。 void MaxMin(int *x, int *y){ int tmp; if ( *x < *y ) { tmp = *x; *x = *y; *y = tmp; } return ; }
Jan. 12, 2005 情報処理技術基礎演習 II 7 オブジェクト指向言語 中間試験解説 3 (3) 引数の1番目で示されるファイルを開き、母音 ( aiueo ) の数 を数えるプログラムを作成しなさい。ただし、1行の母音の数を数 える関数 str_cout_v を作成し、それを利用しなさい。結果は以下 に示すとおりである。(ただし、青字の部分は 入力文字列を表 す。) 課題で str_count_n を作成した。このときは、文字が ’ 0 ’ 以上かつ ’ 9 ’ 以下のときに文字数を数えるにしていた。 if (*str >=‘0’ && *str <= ‘9’) { cnt++; } 今回は、 aiueo のどれか (a または i または u または e または o) であるの で、 if (*str == ‘a’ || *str == ‘i’ || *str == ‘u’ || *str == ‘e’ || *str == ‘o’ || *str == ‘A’ || *str == ‘I’ || *str == ‘U’ || *str == ‘E’ || *str == ‘O’ ) { cnt++; }
Jan. 12, 2005 情報処理技術基礎演習 II 8 #include #define MAXLINE 1024 int str_count_v(char *); int main( int argc, char *argv[] ) { char line[MAXLINE], ch; int i, cnt=0; FILE *fp; オブジェクト指向言語 中間試験解説 3 ヘッダファイルの読み込み。 今回使用する関数 str_cnt_v のプロトタイプ宣言 引数が文字列であることがわかる。 コマンドラインからデータを取得するため、 main の引数に argc と argv を用いる。 1 行を読み込むための文字配列として line を用意する。大きさは MAXLINE とする。 ファイルを使用するため、ファイル型のポインタ fp を宣言する
Jan. 12, 2005 情報処理技術基礎演習 II 9 コマンドラインの引数の数は argc に入っているので、これが 1 以下の場合はエラーを返す。 fopen を利用して 1 番目の引数のファイルをオープンし、これ のポインタをfpに代入する。 fopen に失敗した場合は NULL が帰ってくるのでそのエラー処 理を行う。 if (argc <= 1) { printf("Error in arguments\n"); exit (EXIT_FAILURE); } if ((fp = fopen(argv[1],"r")) == NULL) { printf("Error: open file %s\n",argv[1]); exit (EXIT_FAILURE); } オブジェクト指向言語 中間試験解説 3
Jan. 12, 2005 情報処理技術基礎演習 II 10 オブジェクト指向言語 中間試験解説 3 fgets を利用して 1 行を文字配列 line に読み込む。 fgets が NULL を返したらファイルの終端に達したことになる ので、それで while のループを抜ける。 while ( fgets(line, MAXLINE, fp)){ cnt += str_count_v(line); } printf("The number of vocal in file %s is %d.\n“, argv[1], cnt); return 0; }
Jan. 12, 2005 情報処理技術基礎演習 II 11 オブジェクト指向言語 中間試験解説 3 cnt は最初 0 で初期化しておく。 文字列の最後まで str を増やしながら while 文で進める。 条件が成立したときに cnt を 1 増やす。 戻り値は cnt となる。 int str_count_v(char *str){ int cnt = 0; while (*str != '\0'){ if(*str == 'a' || *str == 'i' || *str == 'u' || *str == ‘e’ || *str == ‘o‘ || *str == ’A’ || *str == ‘I’ || *str == ‘U’ || *str == ‘E’ || *str == 'O') cnt++; str++; } return cnt; }