東京理科大学 infoserv[更新日]2000.5.1


次の問11から問14までの4問については,この中から1問を選択し,
答案用紙の選択欄の [ 選 ] をマークして解答してください。
 なお,2問以上選択した場合には,はじめの1問について採点します。

問11 次の C プログラムの説明及びプログラムを読んで, 設問 1 〜 3 に答えよ。

〔プログラムの説明〕

関数 decmult は,文字列で与えられた二つの 10 進数を乗算する。

(1) 関数 decmult の引数は,被乗数を表す文字型の配列 decA[ ], 乗数を表す文字型の配列 decB[ ],及び乗算結果を格納する文字型の配列 decC[ ] である。

(2) decA[0] と decB[0] には,符号を示す“+”又は“-”の文字が格納されることがある。

(3) 関数 decmult は,筆算と同様なアルゴリズムで計算する。

例:

〔プログラム〕

(行番号)

01 #include <string.h>
02 #define  STRMAX  128
03 
04 void decmult(char decA[], char decB[], char decC[])
05 {
06     char decT[STRMAX], sign='+';
07     int ai, bi, ci=0, ti=0, al=0, bl=0, am, bm, tm;
08     int carry=0, shift=0, wk;
09
10     memset(decT, '\0', STRMAX);  /* decT[]を '\0'で初期化する */
11     am = strlen(decA);
12     bm = strlen(decB);
13
14     /*** 符号の検査 ***/
15     if (decA[0] == '+' || decA[0] == '-')       al = 1;
16     if (decB[0] == '+' || decB[0] == '-')       bl = 1;
17     if ((decA[0] == '-' && decB[0] != '-') ||
18         (decA[0] != '-' && decB[0] == '-'))     sign = '-';
19
20     /*** 乗算 ***/
21     for (bi = bm - 1; bi >= bl; bi--) {
22         for (ai = am - 1; ai >= al; ai--, ti++) {
23             wk = (decA[ai] - '0') * (decB[bi] - '0') + carry;
24             carry = wk / 10;
25             wk %= 10;
26             if (decT[ti] != '\0') {  /* 前の演算結果があるか? */
27                 wk += (decT[ti] - '0');
28                 if (wk > 9) {
29                     carry++;
30                     wk %= 10;
31                 }
32             }
33             decT[ti] = wk + '0';
34         }
35         if (carry > 0) {
36             decT[ti] = carry + '0';
37             carry = 0;
38         }
39         shift++;
40         ti = shift;
41     }
42
43     /*** decC[] に格納 ***/
44     if (sign == '-') {
45         decC[0] = sign;
46         ci++;
47     }
48     tm = strlen(decT);
49     for (ti = tm - 1; ti > 0; ti--)
50         if (decT[ti] != '0')
51             break;
52     for ( ; ti >= 0; ti--, ci++)
53         decC[ci] = decT[ti];
54     decC[ci] = '\0';
55 }
設問1   次の の計算を行ったとき, 結果の組合せとして正しい答えを,解答群の中から選べ。 ここで,“△”は空白文字を示す。

 
decA-123+123
decB-4 -04

解答群

 
△492 -0492
△492-492
492 -0492
492 -492
+492-0492
+492-492

設問2   次の記述中の に入れる正しい答えを,解答群の中から選べ。

被乗数が“234”,乗数が“56”で計算を行った場合,29 行目は 回実行される。

解答群

ア 0    イ 1    ウ 2    エ 3

オ 4    カ 5

設問3   小数の乗算ができるように,プログラムを修正する。 修正内容を示す次の表中の に入れる正しい答えを,解答群の中から選べ。

例:

表 修正内容
  位置   処理   文  
 9 行目の直前   追加   int ap, bp, tp; 
11 行目 と 12 行目  置換 
 am = ap = strlen(decA);
 bm = bp = strlen(decB);

22 行目

の直前

 追加 
    if (decB[bi] == '.') {
        bp = bi + 1;
        ;
    }

23 行目

の直前

 追加 
     if (decA[ai] == '.') {
         ap = ai + 1;
         ;
      }

49 〜 54

行目

 置換 
tp = ; 
for (ti = tm - 1; ; ti--)
    if (decT[ti] != '0')
        break;
for ( ; ti >= 0; ti--, ci++) {
    if (ti == tp)
        decC[ci++] = '.';
    decC[ci] = decT[ti];
}   
decC[ci] = '\0';

a,b に関する解答群

ア ai++    イ ai--    ウ am++    エ am--

オ bi++    カ bi--    キ bm++    ク bm-- 

c に関する解答群

ア (am - ap) + (bm - bp)    イ (am - ap) + (bm - bp) + 1

ウ (am - ap) + (bm - bp) - 1    エ ap + bp

オ ap + bp + 1    カ ap + bp - 1

d に関する解答群

ア ti > 0    イ ti > tp    ウ ti > tp + 1 

エ ti >= 0    オ ti >= tp    カ ti >= tp - 1


東京理科大学 infoserv 戻る 次頁:問12