今回の演習では、前回に引き続き、C言語のプログラムの流れの制御をあつか います。 まず、前回の復習として、分岐の復習をします。
それから、今回はとくに「繰り返し」 の仕方を重点的に演習しましょう。 また、このプログラミングをとおして、入出力・演算・記憶の意味を確認しましょう。 関数は、次回にあつかいます。
プログラミング言語C
以降、K & Rと略記します。
/* saikoro1a.c */ /* 丁か半か? */ #include分岐のための指標となる変数は、いまの場合 、ほかの変数に依っている。 しかし、問題によっては、他の変数とは関係なく、 標準入力等によって 初期化することもできることはあきらかである。int main() { int a, b, c; int parity; printf("サイコロの目をふたつ(a, b)、空白を置いて、入力してください。\n"); scanf("%d %d", &a, &b); c = a + b; /* サイコロの目の数の和 */ parity = c % 2; if (parity == 0) /* 目の数の和が偶数のとき*/ { printf("%d, %d の「丁」\n", a, b); } else /* 目の数の和が奇数のとき*/ { printf("%d, %d の「半」\n", a, b); } return 0; }
$ ./a.out サイコロの目をふたつ(a, b)、空白を置いて、入力してください。 2 6 2, 6 の「丁」 $ ./a.out サイコロの目をふたつ(a, b)、空白を置いて、入力してください。 3 4 3, 4 の「半」
while (式) { 文; }式」が真であるかぎり、 「文」を繰り返す。論理値が真であるかの判定は、 「文」を実行するまえにおこな われる。 「式」はいつかは偽になるように設定しなければならない。そのためには、 「文」が「式」にふくま れる変数の状態を変化させるようになっている必要がある。そうでないと「無限ループ (どうにもとまらな い状態)」に陥ってしまう 。 そのときは、
強制終了 (端末から) C-cとすればよい。
#include <stdio.h> int main() { int i, n; /* i: 添字(カウンタ)、n: 最終項の添字 */ int sum = 0; /* 部分和。初期値は零。 */ printf("1 から n までの整数の和をもとめます。\n"); printf("整数nを入力してください。"); scanf("%d", &n); /* キーボードから10進整数として、nを読み込む。 */ i = 1; /* 始めにiを1と初期化する。 */ while (i <= n) /* i <= nの条件のもとで 、以下のループをくりかえす */ { sum = sum + i; printf("1から %d までの和 = %d\n", i, sum); /* 画面への出力(標準出力) */ i = i + 1; /* 一周ごとに、カウンタiの値をひとつふやす。 */ } return 0; }出力例は、
$ ./a.out 1 から n までの整数の和をもとめます。 整数nを入力してください。3 1から 1 までの和 = 1 1から 2 までの和 = 3 1から 3 までの和 = 6 $ ./a.out 1 から n までの整数の和をもとめます。 整数nを入力してください。5 1から 1 までの和 = 1 1から 2 までの和 = 3 1から 3 までの和 = 6 1から 4 までの和 = 10 1から 5 までの和 = 15プログラムのくわしい説明は、 PDFテキスト3 の pp 13--15にあります。
for (式 1; 式 2; 式 3) { 文; }
これは、つぎのwhileをつかったもの と等価です。
式 1; while (式 2) { 文; 式 3; }
forループはwhileループと似ています。
前者では初期化、条件の判定、
ループカウンターの更新を一行に書くことができるので、
プログラムがひじょうにわかりやすくなります。
つぎに、おなじ問題をforループをつかって
解くと、以下の「sum2.c」ようになります。
ただし、今回は最終値のみ出力することにしています。
結果を確認してください。
例1b
#include <stdio.h> int main() { int i, n; /* i: 添字(カウンタ)、n: 最終項の添字 */ int sum = 0; /* 部分和。初期値は零。 */ printf("1 から n までの整数の和をもとめます。\n"); printf("整数nを入力してください。"); scanf("%d", &n); /* キーボードから10進整数として、nを読み込む。 */ for (i = 1; i <= n; i++) { /* 始めにiを1と初期化する。 */ /* i <= nの条件のもとで 、以下のループをくりかえす。 */ /* 一周ごとに、iの値をひとつふやす。 */ /* i++; は i = I + 1;とおなじ。 */ sum = sum + i; } printf("1から %d までの和 = %d\n", n, sum); /* n とsumをそれぞれ、 %dの位置に10進整数として(画面へ)の出力する。 */ return 0; }実行結果は、
$ ./a.out 1 から n までの整数の和をもとめます。 整数nを入力してください。5 1から 5 までの和 = 15 $ ./a.out 1 から n までの整数の和をもとめます。 整数nを入力してください。100 1から 100 までの和 = 5050
$ ./a.out 1 から n までの2乗の和をもとめます。 整数nを入力してください。3 1から 3 までの和 = 14 $ ./a.out 1 から n までの2乗の和をもとめます。 整数nを入力してください。5 1から 5 までの和 = 55 $ ./a.out 1 から n までの2乗の和をもとめます。 整数nを入力してください。20 1から 20 までの和 = 2870
$ ./a.out n!をもとめます。 整数nを入力してください。3 3! = 6 $ ./a.out n!をもとめます。 整数nを入力してください。5 5! = 120 $ ./a.out n!をもとめます。 整数nを入力してください。10 10! = 3628800
上記の課題1と2の中を解く。 そのソースコードと出力結果を印刷して提出すること。 UNIXのリダイレクションを利用して、つぎのようにしてもよいでしょう。 いま、例として、ソースファイルを「file1.c」としておきます。
実行結果をファイルに落とす。
./a.out > hogeさらに2つ目以降の実行結果をおなじファイルに入れるには、
./a.out >> hoge
cat hogeで、その時点のファイルhogeの内容を端末から確認することができる。
C-x C-wとして、下方のミニバッファにファイル名「file1.txt」を書き込む。
C-x iとして、下方のミニバッファに挿入するファイル名 (ここではhoge)を入力 します。
C-x C-s