PREVIOUS | TOP | NEXT

(第8回)言語のプログラムの流れの制御1 (選択)の復習・流れの制御2(繰り返し)

目標

今回の演習では、前回に引き続き、C言語のプログラムの流れの制御をあつか います。 まず、前回の復習として、分岐の復習をします。

それから、今回はとくに「繰り返し」 の仕方を重点的に演習しましょう。 また、このプログラミングをとおして、入出力・演算・記憶の意味を確認しましょう。 関数は、次回にあつかいます。

参考資料

基本文法のまとめ

プログラミング言語C 以降、K & Rと略記します。

関連のあるPDFの資料

プログラムの流れの制御1(選択)の復習

前回のサイコロのプログラムを、分岐のための変数を 新たにつくって、再度あつかう。 その変数をparity(偶奇性)としておく。
/* 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 の「半」

プログラムの流れの制御2(繰り返しその1, while)

  while (式) {
                文;
   }
 
式」が真であるかぎり、 「文」を繰り返す。論理値が真であるかの判定は、 「文」を実行するまえにおこな われる。 「式」はいつかは偽になるように設定しなければならない。そのためには、 「文」が「式」にふくま れる変数の状態を変化させるようになっている必要がある。そうでないと「無限ループ (どうにもとまらな い状態)」に陥ってしまう 。 そのときは、
強制終了 
(端末から) C-c
とすればよい。

例1a
以下のソースコード 「sum1.c」は、 nをキーボードからあたえたときに、 1からnの整数を加えその結果を逐次 出力するプログラムをwhileループをもちいて記述するものである。これをコン パイル・実行して、結果を確かめてください。
#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にあります。

プログラムの流れの制御2(繰り返しその2, for)

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

課題1
キーボードから自然数nをあたえる。 このとき1からnまでの2乗の和を計算して、端末に出力せよ。
$ ./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

課題2
キーボードから自然数nをあたえる。 このときn!を計算して、端末に出力せよ。
$ ./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」としておきます。

  1. 実行結果をファイルに落とす。

    ./a.out >  hoge
    
    さらに2つ目以降の実行結果をおなじファイルに入れるには、
    ./a.out >>  hoge
    
  2. cat hoge
    
    で、その時点のファイルhogeの内容を端末から確認することができる。
  3. つぎに、emacsで、ソースファイルを「名前をつけて 保存(別名で保存)」する。Cのソース コードではなく、ふつうのテキストファイル にしておく。すなわち、「file1.txt」としておく。
    C-x C-w
    
    として、下方のミニバッファにファイル名「file1.txt」を書き込む。
  4. file1.txtで、ソースコードの下に emacsでカーソルのある位置にファイルを差し込む (Insert file)には
    C-x i
    
    として、下方のミニバッファに挿入するファイル名 (ここではhoge)を入力 します。
  5. 「file1.txt」を上書きする。
    C-x C-s
    
  6. 「Fileメニュー」から「Print Buffer」 を選んで、印刷する。 名前も書いてください。

PREVIOUS | TOP | NEXT