マナビングITパスポート

擬似言語のfor文で1からmaxまでの総和を求める書き方

ITパスポート試験 令和5年度 問64 / アルゴリズムとプログラミング › アルゴリズムとプログラミング

過去問にチャレンジ

令和5年度 問64

関数sigmaは,正の整数を引数maxで受け取り,1からmaxまでの整数の総和を戻り値とする。プログラム中のaに入れる字句として,適切なものはどれか。 〔プログラム〕

○整数型:sigma(整数型:max)
 整数型:calcX ← 0
 整数型:n
 for (nを1からmaxまで1ずつ増やす)
  [a]
 endfor
 return calcX
令和5年度 問64の図
  1. ア

    calcX ← calcX × n

  2. イ

    calcX ← calcX + 1

  3. ウ

    calcX ← calcX + n

  4. エ

    calcX ← n

会話形式の解説

講師講師
今回は擬似言語のプログラムで、1からmaxまでの整数を全部足した合計(総和)を求めるには、for文の中に何を書けばよいかを選ぶ問題です。注目するのは、合計を入れる変数calcXが最初に0であることと、nが1、2、3…と1ずつ増えることです。
受験者受験者
合計を求めるのだから足し算だと思うのですが、選択肢には「1を足す」と「nを足す」の両方があって迷います。
講師講師
そこがこの問題の中心です。迷ったときは、maxを5のような小さい値にして、変数の変化を順に追ってみましょう。この方法をトレースといいます。1から5までの総和は15なので、結果が15になる選択肢が正解です。
受験者受験者
calcXにnを足す形でたどると、0+1=1、1+2=3、3+3=6、6+4=10、10+5=15です。15になりました。
講師講師
そのとおりです。ループのたびに、それまでの合計に今のnを加えてcalcXに入れ直すので、最後に総和が残ります。これが正解です。では、calcXに1を足すほうはどうなるでしょうか。
受験者受験者
毎回1ずつ増えるだけなので、5回まわると5です。15にはならないですね。
講師講師
はい。「calcX ← calcX + 1」は繰返しの回数を数える処理なので、結果はmaxそのものになります。足し合わせる処理とは区別しておきましょう。
受験者受験者
calcXにnを掛けるほうは、1×2×3×4×5のような積になるのでしょうか。
講師講師
形としては積を求める処理ですが、ここではcalcXの初期値が0です。0に何を掛けても0なので、戻り値はいつも0になります。総和にも積にもなりません。
受験者受験者
最後の「calcX ← n」は、nをそのまま入れるだけなので、前の値が消えてしまうということですか。
講師講師
そうです。単純な代入は毎回calcXを上書きするので、それまでの合計が残りません。ループが終わったときに残るのは最後のnであるmax、今の例なら5だけです。
受験者受験者
整理すると、合計用の変数を0で始めて、ループの中で「合計 ← 合計 + 値」の形にすれば総和になる、ということですね。
講師講師
よくまとまっています。補足すると、1からmaxまでの総和は max×(max+1)÷2 の公式でも求められ、max=5なら5×6÷2=15でトレースの結果と一致します。また、積を求めるときは初期値を1にする必要があります。初期値0のまま掛け算をすると結果が常に0になる点に注意しましょう。

まとめ

この問題は、擬似言語のfor文で1からmaxまでの整数の総和を求める処理を選ぶものです。合計用の変数calcXを0で初期化し、ループ内で「calcX ← calcX + n」と更新すれば、毎回の値が合計に加わり総和になります。「calcX ← calcX + 1」は回数を数えるだけで、結果はmaxになります。「calcX ← n」は上書きなので最後の値しか残らず、「calcX ← calcX × n」は初期値0のため結果が常に0です。迷ったときはmax=5などの小さい値でトレースし、15になるかで確かめると確実です。

解答・解説

正解はウです

この問題のテーマ

for文(決まった回数だけ繰り返す文)の中で、1からmaxまでの整数を順に足して合計を求める処理を、正しく書けるかを選ぶ問題です。

解き方の考え方

まず、合計を入れる変数calcXが0から始まり、ループのたびにnが1、2、…、maxと1ずつ増えることを確かめます。次に、総和は「それまでの合計に今のnを足した値」をcalcXに入れ直せば求まる、と考えます。そのうえで、max=5のような小さい値で各選択肢を実際にたどります。結果が1+2+3+4+5=15になる選択肢が、正解です。

選択肢ごとの解説

  1. ×ア  calcX ← calcX × n
    アは、calcXにnを掛ける処理です。これは総和ではなく積を求める形です。しかもcalcXの初期値は0なので、何を掛けても0のままです。したがって戻り値は常に0になり、誤りです。
  2. ×イ  calcX ← calcX + 1
    イは、calcXに1を足す処理です。これは繰返しの回数を数えるだけです。結果はmaxそのものになり、max=5なら5です。総和の15と一致しないので、誤りです。
  3. ○ウ  calcX ← calcX + n
    ウは、calcXにnを足す処理です。ループのたびに、現在のnが合計に加わります。max=5でたどると、calcXは0+1=1、1+2=3、3+3=6、6+4=10、10+5=15と変化します。結果の15は1から5までの総和と一致するので、ウが正解です。
  4. ×エ  calcX ← n
    エは、calcXにnを代入する処理です。毎回calcXをnで上書きするため、それまでの合計が残りません。ループが終わったときに残るのは最後のmaxだけなので、誤りです。

補足

1からmaxまでの総和は、公式max×(max+1)÷2でも求められます。たとえばmax=5なら5×6÷2=15となり、トレースの結果と一致します。なお、積を求める処理では初期値を1にする必要があります。アのように初期値0のまま掛け算をすると、結果は0になります。

POINT

  • 総和を求めるときは、合計用の変数を0で初期化し、ループ内で「合計 ← 合計 + 値」の形で更新します。
  • 「変数 ← 変数 + 1」は回数を数える処理であり、足し合わせる処理とは区別します。
  • 「変数 ← 値」のような単純な代入は前の値を上書きするので、累積の計算にはなりません。
  • 選択肢に迷ったら、小さい値を入れてトレース(変数の変化を順に追うこと)すると、正誤を確実に判断できます。

※出典:令和5年度 ITパスポート試験 問64(一部改変)