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