PREVIOUS | TOP | NEXT

(第9回)プログラムの流れの制御3(分岐、 繰り返しの複合)

目標

  1. プログラムの流れの制御の繰り返しを復習する。
  2. プログラムの流れの制御の方法(連続・選択・繰り返し) の複合したプログラムをつくる。 以上のふたつは、いずれも、後に必要な事項です。

    参考資料

    基本文法のまとめ

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

    関連のあるPDFの資料

    プログラムの流れの制御2(繰り返し)の復習

    まず、もういちど『繰り返し(ループ)』 の構文をみておきましょう。この構文は、今後、頻繁につかいます。
    これにかんして、 PDFテキスト3 の p 14にある例を採りあげます。 (これは、前回とおなじものです。)

    復習1

    1からnまでの整数の和をループ(ここではforループを挙げて) をつかって解くと、以下の「sum2.c」ようになります。 ただし、和は最終値のみ出力することにしています。 結果を確認してください。
    #include <stdio.h>
    
    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の値をひとつふやす。 */
           sum = sum + i; /* sumにiを足して、  新たなsumの中味とする。*/
    
       }
       printf("1から %d までの和 = %d\n", n, sum);     /*  n とsumをそれぞれ、%dの位置に10進整数として(画面へ)の出力する。 */
    }
    
    実行結果は、
    $ ./a.out
    1 から n までの整数の和をもとめます。
    整数nを入力してください。5
    1から 5 までの和 = 15
    $ ./a.out
    1 から n までの整数の和をもとめます。
    整数nを入力してください。100
    1から 100 までの和 = 5050
    

    プログラムの流れの制御3(分岐、繰り返しの複合)

    連続・分岐・繰り返しの複合したソースコードの場合、 一般的な場合のプログラム全体の流れは以下のように なります。

    (0) まず、プログラムは、主関数から始まる。 その後の流れは、つぎの (i)∼(iv) に依る。

    (i) 基本的には上から下へ進む。

    (ii) 選択や繰り返しに当った場合、より外側のブロック(先に遭遇したブロック)の指示に したがう。

    (iii) つぎに、そのブロックの内でより外側のブロック(先に遭遇したブロック)の指示にしたがう。

    (iv) 内側のブロックのコードが終われば、ひとつ外側のブロックに戻る。
    例1

    /*   diag3.c   */
    /* 星印を端末に3角形に印字する。*/
    /* 2重ループをつかう。まず、下方向(i-方向)の動きに外側のループを
    もちいる。そのiの各値にたいして、横方向(j-方向)の変数の
    ループを設定する。この2重ループのなかで、各行において、
    対角線上に当たるまで、星印を印字する。
    そこで、改行して、i-ループ1周分は終わり。iをひとつふやして、
    つぎのi-ループに入る。これを、n回くりかえせばよい。*/
    
    #include <stdio.h>
    
    int main() {
       int i, j, n;
       
       printf("Let us print asterisks in the shape of a triangle.\n");
       printf("Enter n: ");
       scanf("%d", &n);
         
       for (i = 1; i <= n; i++)     {
          for (j = 1; j <= i; j++)        {
             printf("*");    
          }
          printf("\n");  
        }          
        
         return 0;
    }
    
    実行例
    
    $ ./a.out
    We'll print a cluster of asterisks shaped
    in the form of a triangle. The asterisks
    are so arranged that they respond to an integer n
    you'll enter.
    Enter n: 8
    *
    **
    ***
    ****
    *****
    ******
    *******
    ********
    
    例2
    /*   diag1.c   */
    /* 1からnまでの整数を端末に対角的に印字する。*/
    /* 2重ループをつかう。まず、下方向(i-方向)の動きに外側のループを
    もちいる。そのiの各値にたいして、横方向(j-方向)の変数の
    ループを設定する。この2重ループのなかで、印字場所が対角線上にない場合は、
    空白を印字して、横に一歩すすむ。対角線上(iとjが等しい)にあるときは、
    そのi値を印字する。これで、j-ループ1周分は終わり。
    i-ループにもどる。ここで、改行して、i-ループ1周分は終わり。iをひとつふやして、
    つぎのi-ループに入る。これを、n回くりかえせばよい。*/
    
    #include <stdio.h>
    
    int main() {
       int i, j, n;
       
       printf("Let us print 1 through n diagonally.\n");
       printf("Enter n: ");
       scanf("%d", &n);
    
         
       for (i = 1; i <= n; i++)    {  /*   i-方向(下方、「行」方向)に進む   */
            for (j = 1; j <= i; j++)  { /*   j-方向(右、「列」方向)に進む   */
                   if (j == i)         /*  対角線上にあるとき   */ {
                printf("%d", j);    /*  j = iを印字する   */
             }
             else     {             /*  非対角なとき   */
                     printf(" ");     /*  「空白」を1文字印字する   */
             }
          }
          printf("\n");             /*  つぎの行に移る   */
       }
       
        return 0;
    }
    
    実行例
    $ ./a.out
    1からnまでの整数を対角的に印字します。
    nをあたえてください。:5
    1
     2
      3
       4
        5
    
    例1を利用して解くこともできる。

    課題1

    上記のプログラムを参考にして、 星印を上三角に印字してください。

    [matsu@localhost Cbox]$ ./a.out
    星形(*)を上三角に印字します。
    1行目の星の数はn個です。
    nをあたえてください。:8
    ********
     *******
      ******
       *****
        ****
         ***
          **
           *
    
    課題2

    自然数nをあたえて、 nの約数をすべて書き出し、その和σをもとめよ。 また、その総数も記せ。

    ・n = 5のとき、1, 5の2個。
    σ = 6。
    ・n = 6のとき、1, 2, 3, 6の4個。
    σ= 12。
    

    今日の提出課題

    課題1で作成したプログラムと実行結果を印刷して提出してください。 余裕のあるひとは課題2にも挑戦してみてください。 いま、例として、ソースファイルを「file1.c」としておきます。
    1. 実行結果をファイルに落とす。
      ./a.out >  hoge
      
    2. さらに実行結果をおなじファイルに追加して入れるには、
      ./a.out >>  hoge
      
    3. つぎに、ソースファイルを「名前をつけて 保存(別名で保存)」する。Cのソース コードではなく、ふつうのテキストファイル にしておく。すなわち、「file1.txt」としておく。
      C-x C-w
      
      として、下方のミニバッファにファイル名「file1.txt」を書き込む。
    4. file.txtで、ソースコードの下に emacsでカーソルのある位置にファイルを差し込む (Insert file)には
      C-x i
      
      として、下方のミニバッファに挿入するファイル名を入力 します。
    5. ファイルを書き加えたら、もちろん、その都度、(上書き)「保存」する。
      C-x C-s
      
    6. その後
      File → 「Print Buffer」
      
      で印刷する。クラス、学籍番号、名前は自筆大きく分かりやすくで書き加えてください。

    PREVIOUS |TOP |NEXT