110 likes | 246 Views
オブジェクト指向言語・ オブジェクト指向言語演習. 中間試験回答例. オブジェクト指向言語 中間試験解説 1. (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ)を求めるプログラムを作成しなさい。ただし、出力結果は、入力した底面の円の半径 ( Radius ) に対して、高さ 2.0, 4.0, 6.0, 8.0, 10.0 のときの体積を、以下に示す実行結果と同じ形式(空白や小数点以下の桁数など)で表示するようにすること。また、円周率は 3.14 として計算しなさい。(ただし、青字の部分は入力文字列を表す。)
E N D
オブジェクト指向言語・オブジェクト指向言語演習オブジェクト指向言語・オブジェクト指向言語演習 中間試験回答例
オブジェクト指向言語 中間試験解説1 • (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ)を求めるプログラムを作成しなさい。ただし、出力結果は、入力した底面の円の半径 ( Radius ) に対して、高さ 2.0, 4.0, 6.0, 8.0, 10.0 のときの体積を、以下に示す実行結果と同じ形式(空白や小数点以下の桁数など)で表示するようにすること。また、円周率は 3.14 として計算しなさい。(ただし、青字の部分は入力文字列を表す。) • $ ./oom-1Input Radius (float): 3.12.0 - 60.354.0 - 120.706.0 - 181.058.0 - 241.4010.0 - 301.75 情報処理技術基礎演習II
オブジェクト指向言語 中間試験解説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 と同じ。 情報処理技術基礎演習II
オブジェクト指向言語 中間試験解説1 • printfの中で使われる%と変換文字の間に許されるもの • マイナス符号 • 変換された文字を左づめで表示 • フィールドの最小幅を指定する数字 • 上記マイナス符号が無ければ、変換された文字を右づめで、最小幅を保ちつつ表示。ただし、最小であるので範囲を超える場合はそのまま表示する。 • ピリオド • フィールドの幅を示す数字と桁数を指定する数字の区切り • 例 • %-20s 20文字幅の文字列を左づめで出力 • %15.3f 15文字幅の実数を小数点以下3桁 • この15文字幅を省略して自動の文字幅小数点以下3桁とすると、 • %.3f 自動文字幅、小数点以下3桁 printf("%.1f - %.2f\n",(float)i*2., circle*(float)i*2.); 情報処理技術基礎演習II
オブジェクト指向言語 中間試験解説2 • (2) 整数型の引数1と引数2が与えられたとき、大きい方を引数1に、小さい方を引数2に入れて戻る関数 MaxMinを作成しなさい。なお、main 関数としては以下を使用し(変更不可)、プログラムは main 関数も含めて動作するものを提出すること。 • 題意から、関数MaxMinは2つの引数をとることがわかる。また、与えられたmain関数のプロトタイプ宣言から、それらはポインタであることもわかる。 • また、戻り値が無いので関数はvoid型となる。 • void MaxMin(int *, int *); • main関数から呼び出すときにポインタを渡すため、 • MaxMin( &in1, &in2 ); としている。 情報処理技術基礎演習II
オブジェクト指向言語 中間試験解説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 ; } 情報処理技術基礎演習II
オブジェクト指向言語 中間試験解説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++;} 情報処理技術基礎演習II
オブジェクト指向言語 中間試験解説3 • ヘッダファイルの読み込み。 • 今回使用する関数str_cnt_vのプロトタイプ宣言 • 引数が文字列であることがわかる。 • コマンドラインからデータを取得するため、mainの引数にargcとargvを用いる。 • 1行を読み込むための文字配列としてlineを用意する。大きさはMAXLINEとする。 • ファイルを使用するため、ファイル型のポインタfpを宣言する #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; 情報処理技術基礎演習II
オブジェクト指向言語 中間試験解説3 • コマンドラインの引数の数は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); } 情報処理技術基礎演習II
オブジェクト指向言語 中間試験解説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; } 情報処理技術基礎演習II
オブジェクト指向言語 中間試験解説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; } 情報処理技術基礎演習II