プログラミング論Ⅰ

オブジェクト指向言語・
オブジェクト指向言語演習
中間試験回答例
オブジェクト指向言語
中間試験解説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