@taipi148903 (大貴 田島)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

アルゴリズムの問題

解決したいこと

どなたかこの問題のaにはどの選択肢が入るのかを教えてください。

問題

「タブ文字を展開するプログラム」
副プログラム TabSpc は、タブ文字を展開するプログラムである。
1. TabSpc は、引数で指定された文字型配列 Src[] を先頭から調べ、 Src[]
中のすべてのタブ文字をそれぞれ一つ以上の間隔文字(スペース)に変換して、
引数で指定された文字型配列 Dst[] に格納する。
2. 文字型配列の各要素には、文字を 1 文字ずつ順に格納し、最後の文字の次の
要素にはシステム定数である EOS を格納する。なお、配列の添字は 1 から始
まり、添字の値を文字位置と呼ぶ。
3. Src[] 中にタブ文字が出現した場合、次の文字が最も近い右のタブ位置に格納
されるように、タブ文字を一つ以上の間隔文字に置換して、 Dst[] (要素数は十
分に大きいとする)に格納する。ここで、タブ位置とは、整数型の引数 TabGap で
渡されるタブ間隔(≧ 2)を用いて、次の式で計算される文字位置である。
タブ位置 = タブ間隔 × n + 1 ( n は 1 以上の整数)
4. タブ間隔が 4 のときの実行例を図に示す。 “j” を Dst[] のタブ位置である文
字位置 13 ( = 4 × 3 + 1 )に格納したのでは、タブ文字が間隔文字に置き換
わらないので、最も近い右のタブ位置である文字位置 17 ( = 4 × 4 + 1 )に
格納する。

[プログラム]
○TabSpc(文字型:Src[], 文字型:Dst[], 整数型:TabGap)
○整数型:Sidx, Didx, N, TabPos
・Sidx ← 1
・Didx ← 1
■ Src[Sidx] ≠ EOS /* EOS:文字列の終わりを表すシステム定数 /
| ▲ Src[Sidx] = TAB /
TAB:タブ文字を表すシステム定数 /
| | ・N ← ( a ) ÷ TabGap
| | ・TabPos ← TabGap × N + 1
| | ■ Didx < TabPos
| | | ・Dst[Didx] ← SPC /
SPC:間隔文字を表すシステム定数 */
| | | ・ b
| | ■
| +---
| | ・ c
| | ・Didx ← Didx + 1
| ▼
| ・Sidx ← Sidx + 1

・Dst[Didx] ← EOS

設問 プログラム中のに入れる正しい答えを、解答群の中から選べ。
a に関する解答群
ア Didx + 1
イ Didx – 1
ウ Didx + TabGap + 1
エ Didx + TabGap – 1

自分で試したこと

私としてはエが正解と思っていたのですが、今日授業で講師に不正解だと言われて腑に落ちていません。どなたか正解を教えてください。

0 likes

2Answer

取り敢えずの解決

「タブ間隔が 4 のときの実行例を示す図表」を見ると、
TabGap = 4のとき、
DidxTabPosの関係は、
35
89
1317
となっています。

| | ・N ← ( a ) ÷ TabGap
| | ・TabPos ← TabGap × N + 1

の部分で、この3例の関係を成立させることができるaが正解ですね。

| | ・N ← ( Didx + 1 ) ÷ TabGap
| | ・TabPos ← TabGap × N + 1

| | ・N ← ( Didx – 1 ) ÷ TabGap
| | ・TabPos ← TabGap × N + 1

| | ・N ← ( Didx + TabGap + 1 ) ÷ TabGap
| | ・TabPos ← TabGap × N + 1

| | ・N ← ( Didx + TabGap – 1 ) ÷ TabGap
| | ・TabPos ← TabGap × N + 1

値を当てはめてみると、3例とも成立するのはエであることが解ります。

式の意味

問題の式では、
( a )TabGapで除して(剰余を捨て)、その結果にTabGapを乗じています。
( a )0~3ならTabPos14~7なら58~11なら9、…となります。
これは、( a ) + 1の位置の前のタブ位置を示していますね。
従って、現在位置(Didx)の次のタブ位置を得るには、DidxTabGapを加えた上で1減じて「次のタブ間」へ進めたものを( a )とすれば良いですね。

0Like

解答ありがとうございました。
丁寧に考え方まで記載していただき参考になりました。
感謝いたします。

0Like

Your answer might help someone💌