問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 }
解答群
被乗数が“234”,乗数が“56”で計算を行った場合,29 行目は 回実行される。
ア 0 イ 1 ウ 2 エ 3
オ 4 カ 5
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