メディア

【問題8】繰返しと配列は相性がいい完全マスター! 組み込みC言語プログラミング(9)(2/2 ページ)

» 2014年08月21日 11時00分 公開
[横田一弘 埼玉県立新座総合技術高等学校 教諭,MONOist]
前のページへ 1|2       

問題8の解説

 それでは、lifo.cについて解説しましょう。以下にlifo.cのフローチャートを示します。

photo lifo.cのフローチャート

 プログラムは2つのループで構成されます。1つ目のループは「入力ループ」と呼べるもので、キーボードから入力された整数を配列dataに格納します。2つ目のループは「出力ループ」と呼べるもので、dataに格納された整数をディスプレイに表示します。

 「入力ループ」では入力scanfが2か所現れます。「入力ループ」の繰り返しの条件は、「負数が入力されるまで」なので、負数を入力する分1回多くscanfを実行しなければなりません。このようなプログラムでは、ループの前で1度scanf(先頭のデータ入力)し、ループの最後でscanf(次のデータ入力)するのがプログラミングの定石です。

 もしscanfを1つにしたいならば、

  1. i = 0;
  2. while (1) { /* 無限ループ */
  3. printf("数を入力してください->");
  4. scanf("%d", &n);
  5. if (n < 0) break;
  6. data[i] = n;
  7. i++;
  8. }

 とも書けますが、ループの途中でループを抜ける(break)のは、できれば避けたいものです。

 「入力ループ」を抜けた段階で、iには入力されたデータの個数が入っています。そして、例えば5個の整数が入力された場合では、data[0]に最初のデータが、data[4]に最後のデータが保持されます。「出力ループ」では最後のデータから出力しなければならないので、iを減じた後にdata[i]を表示しているのです。

ポストインクリメントとプリデクリメント

 lifo.cは、次のlifo2.cようにも書くことができます。

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. int n, i, data[100];
  5. printf("数を入力してください->");
  6. scanf("%d", &n);
  7. i = 0;
  8. while (n >= 0) {
  9. data[i++] = n;
  10. printf("数を入力してください->");
  11. scanf("%d", &n);
  12. }
  13. while (i) printf("%d\n", data[--i]);
  14. }
「lifo2.c」

 lifo.cとlifo2.cは全く同じプログラムですが、iのインクリメント演算子(++)とデクリメント演算子(--)の書き方を変えてみました。lifo.cとの違いは、++と--が文の中に入れ込まれていることです。

 「入力ループ」の

  1. data[i++] = n;

 では、添字に++が記述されています。

 ++の働きは、「演算対象(オペランド)に1加算」ですが、実はオペランドの前にも後ろにも書くことができます。

 上の例のように++がiの後ろに書かれている場合、ポストインクリメント(後置増分)と呼び、オペランドの値を取り出した後、オペランドの値を増分します。ここではdataの添字にiを指示した後iに1加えます。

 --も同じように扱うことができ、「出力ループ」の

  1. printf("%d\n", data[--i]);

 では、--がiの前に書かれているので、プリデクリメント(前置減分)と呼び、オペランドの値を減分した後、オペランドの値を取り出します。ここではiを1減じた後、dataの添字とします。

 以上のように、++と--は細かい処理が記述できます。

問題9

 それでは、次回の宿題です。

問題9:

「問題8」のプログラムを、添字の代わりにポインタを使って書いてみましょう。


⇒解答と解説は次回


鬯ッ�ゥ隰ウ�セ�ス�ス�ス�オ�ス�ス�ス�ス�ス�ス�ス�コ鬯ッ�ョ�ス�ヲ�ス�ス�ス�ョ鬮ッ�キ�ス�サ�ス�ス�ス�サ�ス�ス�ス�ス�ス�ス�ス�ソ�ス�ス�ス�ス�ス�ス�ス�ス鬯ッ�ッ�ス�ッ�ス�ス�ス�ィ�ス�ス�ス�ス�ス�ス�ス�セ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�」鬯ッ�ッ�ス�ョ�ス�ス�ス�エ鬮」雋サ�ソ�ス�ス�ス�ス�・�ス�ス�ス�ス�ス�ス�ス�ウ�ス�ス�ス�ス�ス�ス�ス�ィ�ス�ス�ス�ス�ス�ス�ス�ス鬮ッ諛カ�ス�」�ス�ス�ス�、�ス�ス�ス�ス�ス�ス�ス�ク�ス�ス�ス�ス�ス�ス�ス�イ鬯ッ�ゥ陟�瑳�ス�ス�ス�ス�ソ�ス�ス�ス�ス�ス�ス邵コ�、�つ€�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�」鬯ッ�ッ�ス�ョ�ス�ス�ス�エ鬯ッ�ゥ陝カ螢ス譯カ�ス�ス�ス�ュ鬯ョ�ョ�ス�」�ス�ス�ス�ソ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ィ鬯ョ�ッ陋ケ�コ�ス�サ郢ァ謇假スス�ス�ス�ソ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�コ鬯ョ�」陋ケ�ス�ス�ス�ス�オ鬮ォ�エ隰ォ�セ�ス�ス�ス�エ�ス�ス�ス�ス髫カ髮」�ス�」�ス螳茨ス「謇假スス�ュ髮懶ス」�ス�ス�ス�「�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ゥ鬯ッ�ゥ陝キ�「�ス�ス�ス�「鬮ォ�エ髮懶ス」�ス�ス�ス�「�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�シ鬯ッ�ゥ陝キ�「�ス�ス�ス�「鬮ォ�エ闕ウ�サ�ス�ス髫カ謐コ�サ繧托スス�ソ�ス�ス驍オ�コ�ス�、�ス縺、ツ€鬯ッ�ッ�ス�ョ�ス�ス�ス�ヲ�ス�ス�ス�ス�ス�ス�ス�ェ鬯ゥ蛹�スス�カ髣費スィ�ス�ス�ス�ス�ス�ヲ�ス�ス�ス�エ�ス�ス邵コ�、�つ€鬮ッ�キ髣鯉スィ�ス�ス�ス�キ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�サ鬯ッ�ッ�ス�ッ�ス�ス�ス�ェ�ス�ス�ス�ス�ス�ス�ス�ュ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�イ鬯ッ�ゥ隰ウ�セ�ス�ス�ス�オ�ス�ス�ス�ス�ス�ス�ス�コ鬯ョ�ッ�ス�キ�ス�ス�ス�キ�ス�ス�ス�ス�ス�ス�ス�カ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス New
前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.