2.処理の繰り返し

Copyright(C) 13Jan2003 coskx

このページでは「処理の繰り返し」の記述方法を解説する。
ここで修得して欲しい内容は次の通りである。
1.forループの基本的な制御構造がわかりプログラムを追跡できる。
2.forループにおけるカウンタ変数の役割が理解できる。(ループを抜け出したときのカウンタ変数の値もわかる)
3.2重のforループを追跡できる。
4.forループを用いた連続加算プログラムが書ける。
5.whileループを追跡できる。
6.do-whileループを追跡できる
7.ループ中の合計計算,変数順送り操作が追跡できる。
8.ループのプログラムが書ける。
9.定回数二重ループプログラムが書ける。
10.内側ループ回数が外側ループ回に応じて変わる二重ループプログラムが書ける


  2.1 forループ

同じような処理を何度も繰り返す場合には繰り返しの記述が使われる。
特にプログラミング時に何回繰り返すのかわかっている場合にはforループで記述されることが多い。

まずは復習から。
次のプログラムでは,1行の英文メッセージを表示している。

List 2.1.1 1行の英文メッセージの表示
#include <stdio.h>

int main()
{
    printf("A child says, ");
    printf("\"The king is naked.\"\n");
    return 0;
}
実行結果
A child says, "The king is naked."

次のプログラムでは,同じ英文メッセージを5回表示している。

List 2.1.2 1行の英文メッセージの5回表示
#include <stdio.h>

int main()
{
    printf("A child says, ");
    printf("\"The king is naked.\"\n");
    printf("A child says, ");
    printf("\"The king is naked.\"\n");
    printf("A child says, ");
    printf("\"The king is naked.\"\n");
    printf("A child says, ");
    printf("\"The king is naked.\"\n");
    printf("A child says, ");
    printf("\"The king is naked.\"\n");
    return 0;
}
実行結果
A child says, "The king is naked."
A child says, "The king is naked."
A child says, "The king is naked."
A child says, "The king is naked."
A child says, "The king is naked."

List 2.1.2と同じことをforループを使って表してみよう。

通常の日本語表現では,

「~~~~」を5回表示しなさい。

となるが,プログラムでは,次のような表現になる。

次のことを5回行いなさい。{
  「~~~~」を1回表示しなさい。

この表現に変換してから,プログラムを作成することになる。
次のプログラムはList 2.1.2をforループを用いて書き直したものである。

List 2.1.3 forループ

#include <stdio.h>

int main()
{
    int i;
    for (i=0; i<5; i++) {
        printf("A child says, ");
        printf("\"The king is naked.\"\n");
    }
    return 0;
}

実行結果
A child says, "The king is naked."
A child says, "The king is naked."
A child says, "The king is naked."
A child says, "The king is naked."
A child says, "The king is naked."
補足

for (i=0; i<5 ;i++)
における「5」が5回繰り返せの意味になる。
裸の王様より,「王様は裸だ」

printf("\"The king is naked.\"\n");の\"」は「"」を表示する

5」以外の部分「
for (i=0; i< ; i++)」の説明はList 2.1.4で行なう。

通常の日本語とC言語の表現との対応は次のように考えられる。

日本語での表現の例 C言語風表現の例 C言語のキーワードを用いた表現の例
運動場を5周廻りなさい。

次のことを5回行ないなさい{
  運動場を1周廻りなさい。

int i;
for (i=0; i<5; i++) {
  運動場を1周廻りなさい;
}

「王様は裸だ」と5回表示しなさい。

次のことを5回行ないなさい{
  「王様は裸だ」と表示しなさい。

int i;
for (i=0; i<5; i++) {
  printf("王様は裸だ\n");
}

練習2.1

「List 2.1.3」の繰り返し回数「5」を他の値にして繰り返し数が変化することを確かめなさい。
特に,「0」や「-1」にしたらどうなるか試しなさい。


次の「List 2.1.4」は繰り返し処理中で繰り返しを制御する変数「i」の値を表示させたものである。
字下げの深さ(8スペース)が,これまでと違うことに気を付けよう。

List 2.1.4 forループ

#include <stdio.h>

int main()
{
    int i;
    for (i=0; i<5; i++) {
        printf("(%d) ", i);
        printf("A child says, ");
        printf("\"The king is naked.\"\n");
    }
    return 0;
}

実行結果
(0) A child says, "The king is naked."
(1) A child says, "The king is naked."
(2) A child says, "The king is naked."
(3) A child says, "The king is naked."
(4) A child says, "The king is naked."
補足

1.「i++」の意味
「i++」とは「i=i+1」と同じ意味であり,「i++」が
実行されるとiの値が1だけ増加する。
「i++」の記述はfor文以外のところでも使われる。

2.繰り返し処理の仕組み
    for (i=0; i<5; i++ ) {
        printf("(%d) ", i);
        printf("A child says, ");
        printf("\"The king is naked.\"\n");
    }

forループ部分の制御の流れは次の順番で行なわれる。

    for ((1);→ (2); ←(4) ) {
        (3);←←    ↑
         : ;      
        (3);→→→→→→
    }

(1)初期化「i=0」を実行する
(2)継続条件チェック,「i<5」が偽の場合はループの外へ
(3)処理
(4)後処理「i++」でiの値を1だけ増加させ(2)へ戻る

3.繰り返し処理のイメージ

4.記述上の注意
  カッコの位置,セミコロンの数に気をつけよう

  カッコ     カッコ
    ↓  セミコロン ↓ 中カッコ始まり
  ↓ ↓  ↓  ↓ ↓
for (i=0 ; i<5 ; i++ )  {  ←セミコロンなし

} ←中カッコ終わり セミコロンなし

補足その2
ループ回数を数えるカウンタの役割を果たす変数名はなんでも良い。

#include <stdio.h>

int main()
{
    int arere;
    for (arere=0; arere<5; arere++) {
        printf("(%d) ", arere);
        printf("A child says, ");
        printf("\"The king is naked.\"\n");
    }
    return 0;
}

for文を導入する考え方 (この考え方は,自分でプログラムを書く際に大事)

ループ回数の指定の仕方 どのような指示方法でも困らないようにしよう。


次の3つのプログラムとその実行結果から,ループの制御範囲とプログラムの関係を確認しよう。
printfがループ内に書かれているのか,ループ外に書かれているのかで,実行結果は異なる。

#include <stdio.h>

int main()
{
    int i;
    printf("Hello.\n");
    for (i=0; i<5; i++) {
        printf("(%d) ", i);
        printf("A child says, ");
        printf("\"The king is naked.\"\n");
    }
    printf("That's all.\n");
    return 0;
}
Hello.
(0) A child says, "The king is naked."
(1) A child says, "The king is naked."
(2) A child says, "The king is naked."
(3) A child says, "The king is naked."
(4) A child says, "The king is naked."
That's all.
#include <stdio.h>

int main()
{
    int i;
    for (i=0; i<5; i++) {
        printf("Hello.\n");
        printf("(%d) ", i);
        printf("A child says, ");
        printf("\"The king is naked.\"\n");
    }
    printf("That's all.\n");
    return 0;
}
Hello.
(0) A child says, "The king is naked."
Hello.
(1) A child says, "The king is naked."
Hello.
(2) A child says, "The king is naked."
Hello.
(3) A child says, "The king is naked."
Hello.
(4) A child says, "The king is naked."
That's all.
#include <stdio.h>

int main()
{
    int i;
    for (i=0; i<5; i++) {
        printf("Hello.\n");
        printf("(%d) ", i);
        printf("A child says, ");
        printf("\"The king is naked.\"\n");
        printf("That's all.\n");
    }
    return 0;
}

Hello.
(0) A child says, "The king is naked."
That's all.
Hello.
(1) A child says, "The king is naked."
That's all.
Hello.
(2) A child says, "The king is naked."
That's all.
Hello.
(3) A child says, "The king is naked."
That's all.
Hello.
(4) A child says, "The king is naked."
That's all.

Cプログラミングスタイル  (字下げ,インデント)


字下げ(インデント)のルール
(1) 中かっこ始まり「{」があったら次の行から字下げする。
(2) 中かっこ終わり「}」があったら次の行から字下げを戻す。
(3) 中かっこ終わり「}」の字下げ高さは,対応する中かっこ始まり「{」のあった行の字下げ高さと等しい。



練習2.2

次のプログラムの実行結果を予想しなさい。

List 2.1.5 forループのプログラム

#include <stdio.h>

int main()
{
    int i;
    for (i=0;i<=5;i++) {
        printf("(%d) ", i);
        printf("A child says, ");
        printf("\"The king is naked.\"\n");
    }
    return 0;
}

実行結果の予想1 実行結果の予想2 実行結果の予想3
(0) A child says, "The king is naked."
(1) A child says, "The king is naked."
(2) A child says, "The king is naked."
(3) A child says, "The king is naked."
(4) A child says, "The king is naked."
(0) A child says, "The king is naked."
(1) A child says, "The king is naked."
(2) A child says, "The king is naked."
(3) A child says, "The king is naked."
(4) A child says, "The king is naked."
(5) A child says, "The king is naked."
0 A child says, "The king is naked."
1 A child says, "The king is naked."
2 A child says, "The king is naked."
3 A child says, "The king is naked."
4 A child says, "The king is naked."
5 A child says, "The king is naked."

追加説明 「i<=5」は数学では「i≦5」である。「i=<5」の表現は許されない。
条件の記述について

練習2.3

次のプログラムの実行結果を予想しなさい。
List 2.1.6 forループのプログラム

#include <stdio.h>

int main()
{
    int i;
    for (i=0;i<5;i++) {
        printf("(%d) ", i);
        printf("A child says, ");
        printf("\"The king is naked.\"\n");
    }
    printf("just after the loop i=%d\n", i);
    return 0;
}

実行結果の予想1 実行結果の予想2 実行結果の予想3
(0) A child says, "The king is naked."
(1) A child says, "The king is naked."
(2) A child says, "The king is naked."
(3) A child says, "The king is naked."
(4) A child says, "The king is naked."
just after the loop i=4
(0) A child says, "The king is naked."
(1) A child says, "The king is naked."
(2) A child says, "The king is naked."
(3) A child says, "The king is naked."
(4) A child says, "The king is naked."
just after the loop i=5
(0) A child says, "The king is naked."
(1) A child says, "The king is naked."
(2) A child says, "The king is naked."
(3) A child says, "The king is naked."
(4) A child says, "The king is naked."
just after the loop i=0

間違えた場合は,「List 2.1.4」の forループ の動作をもう一度確認し,ループ脱出のところを丁寧に追いかける必要がある。


コンピュータは,プログラム全体の意味を理解して動いているわけではなく,現在実行しているプログラム行の命令と,変数に格納された値しか理解していない。

直前の命令が何だったのか,次の命令は何なのかは知らずに
現在実行しているプログラム行の命令を行っている

ループ中の命令を実行しているのか,ループの外の命令を実行しているのかも知らずに
現在実行しているプログラム行の命令を行っている


 課題2 その1

(1)以下に示すx,x2,x3の表を1≦x≦100で出力するプログラムを作りなさい。 (p02ex01.c)
変数xをカウンタとする
forを使ったプログラムとし,変数はx,x2(x2の格納用),x3(x3の格納用)の3つだけを用いなさい。x2,x3はxをもとにして作りなさい。
またprintf文はforループの前に1つ,forループの中に1つだけ使いなさい。
forループ中のprintf文は「printf("%3d %5d %7d\n", x, x2, x3);」にすること。

  x  x^2     x^3
  1    1       1
  2    4       8
  3    9      27
  4   16      64
  5   25     125
  :    :       :

(2)以下に示すx,y(y= 5x),y2,y3,y4の表を1≦x≦100で出力するプログラムを作りなさい。(p02ex02.c)
変数xをカウンタとするforを使ったプログラムとし,変数はx,y,y2(y2の格納用),y3(y3の格納用),y4(y4の格納用)の5つだけを用いなさい。yはxから算出し,y
2,y3,y4はyをもとにして算出しなさい。
またprintf文はforループの前に1つ,forループの中に1つだけ使いなさい。
forループ中のprintf文は「printf("%3d %3d %6d %9d %12d\n", x, y, y2, y3, y4);」にすること。
実行結果をよく見ると変なことに気づくかもしれない。
どうして変になるのか友人と話し合い考察しなさい。
(ヒント int型整数で扱うことのできる値には限りがある)

  x     y      y^2        y^3          y^4
  1     5       25        125          625
  2    10      100       1000        10000
  3    15      225       3375        50625
  4    20      400       8000       160000
  5    25      625      15625       390625
  6    30      900      27000       810000
  7    35     1225      42875      1500625
  :     :        :          :            :


(3)int型変数xをループカウンタとしてforを使ったプログラムで,ループ中でxをもとにして,y1,y2,y3,y4を計算し,以 下に示す表を作りなさい。printf文はforループの前に1つ,forループの中に1つだけ使いなさい。forループ中のprintf文は 「printf("%4d %4d %4d %4d %6d\n", x, y1, y2, y3, y4);」にすること。
(p02ex03.c)
ただし,xの範囲は1≦x≦100としなさい。
ヒント y4の計算ではxの値を1,2,3,4・・・と変化させると5*x*xの値はどのように変化するか考えなさい。

  x     y1      y2        y3          y4
  1    100       3         1           5
  2     99       6         5          20
  3     98       9         9          45
  4     97      12        13          80
  5     96      15        17         125
  6     95      18        21         180
  7     94      21        25         245
  :      :       :         :           :

(4)int型変数xをループカウンタとしてforを使ったプログラムで,ループ中でxをもとにして,y1,y2,y3を計算し,以下の表を作りなさい。printf文はforループの前に1つ,forループの中に1つだけ使いなさい。(p02ex04.c)
ただし,xの範囲は0≦x≦100としなさい。
ヒント xの値を1,2,3,4・・・と変化させると「x%3」と「x%4」の値はどのように変化するか考えなさい。

x    y1    y2    y3
0     0     0     0
1     1     1     1
2     0     2     2
3     1     0     3
4     0     1     0
5     1     2     1
6     0     0     2
7     1     1     3
8     0     2     0
9     1     0     1

(5)int型変数xをループカウンタとしてforを使ったプログラムで,ループ中にy1,y2,y3を作り,以下の表を作りなさい。y1は2回,y2 は3回,y3は4回同じ値を繰り返している。printf文はforループの前に1つ,forループの中に1つだけ使いなさい。(p02ex05.c)
ただし,xの範囲は0≦x≦100としなさい。
ヒント xの値を1,2,3,4・・・と変化させると「x/3」と「x/4」の値はどのように変化するか考えなさい。

x    y1    y2    y3
0     0     0     0
1     0     0     0
2     1     0     0
3     1     1     0
4     2     1     1
5     2     1     1
6     3     2     1
7     3     2     1
8     4     2     2
9     4     3     2

  2.2 二重forループ

まずは,画面上に

**********
**********
**********
**********
**********

を表示してみよう。
**********(改行)」を5回書くのだから,

printf("**********\n");   ←「**********」を表示して改行しなさい
printf("**********\n");   ←「**********」を表示して改行しなさい
printf("**********\n");   ←「**********」を表示して改行しなさい
printf("**********\n");   ←「**********」を表示して改行しなさい
printf("**********\n");   ←「**********」を表示して改行しなさい

とすれば,良いのだが,行数をあとで変更できるように,for文に書き直してみよう。

for (i=0; i<5; i++) {          ← 次のことを5回繰り返しなさい
    printf("**********\n");    ←「**********」を表示して改行しなさい .....(A)
}

のようになる。5行のプログラムが3行になった。
ここで,1行に表示する「*」の個数をあとで変更できるように,

printf("**********\n");    ←「**********」を表示して改行しなさい .....(A)

をfor文で書き直してみよう。

for (j=0; j<10; j++) {     ← 次のことを10回繰り返しなさい
    printf("*");           ←「*」を(1つ)表示しなさい
}
printf("\n");              改行しなさい

1行だった命令が4行になったが,プログラムの柔軟性(あとで変更することができる)のため,必要なことである。
上記の内容を,言葉でまとめると次のようになるであろう。
次の青字の部分を5回繰り返しなさい {
    次のことを10回繰り返しなさい {
        「*」を(1つ)表示しなさい
    }
    改行しなさい

}
上記の言葉でまとめたプログラムは,ループの中にループを持っている。
このようなループは2重ループと呼ばれる。「List 2.2.1」は上記のことをプログラムにしたものである。

List 2.2.1 「10この「*」を書いて改行する」という作業を5回行うプログラム

#include <stdio.h>

int main()
{
    int i,j;
    for (i=0;i<5;i++) {
        for (j=0;j<10;j++) {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}

実行結果
**********
**********
**********
**********
**********
カッコの対応を確認しよう。
各行の先頭がどこから始まっているのか,その規則をみつけなさい。
「字下げ,インデント(行の先頭に空白を挿入して,行の記述を右にずらすこと)」の規則

#include <stdio.h>

int main()
{
    int i,j;
    for (i=0; i<5; i++) {

for (j=0; j<10; j++) {
    printf("*");
}
printf("\n");

    }
    return 0;
}

二重ループの通常の言葉による言い回しとの変換は次のように考えられる。

言葉による言い回しでの表現の例 C言語風表現の例 C言語のキーワードを用いた表現の例
運動場を5周廻りなさい。
その際,運動場を1周廻るたびに
「私は無敵だ」と3回唱えなさい。
(結局「私は無敵だ」は15回唱え
ることになる)

次のことを5回行ないなさい{
  運動場を1周廻りなさい
  次のことを3回行ないなさい{
    「私は無敵だ」と唱えなさい。
  }  

int i,j;
for (i=0; i<5; i++) {
  運動場を1周廻りなさい;
  for (j=0; j<3; j++) {
    「私は無敵だ」と唱えなさい。
  }
}

『「*」を10個書き,改行する』
という作業を5回行ないなさい。
(結局,*を50個書くことになる)

次のことを5回行ないなさい{
  次のことを10回行ないなさい{
    「*」を書きなさい
  }
  改行しなさい。

int i,j;
for (i=0; i<5; i++) {
    for (j=0; j<10; j++) {
        printf("*");
    }
    printf("\n");
}


練習2.4

 次のプログラムの実行結果を予想しなさい。
 むずかしいと感じた時は自分がコンピュータになったつもりで1行1行実行し,
 各変数がどうなったか,継続条件判断は真か偽かを絶えず,判断しながら読み
 進むこと。

List 2.2.2

#include <stdio.h>

int main()
{
    int i,j;
    for (i=0; i<5; i++) {
        for (j=0; j<i+1; j++) {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}

実行結果の予想1 実行結果の予想2 実行結果の予想3
*
**
***
****
*****
**
***
****
*****
******
**********
**********
**********
**********
**********

練習2.5

次のプログラムの実行結果を予想しなさい。

List 2.2.3

#include <stdio.h>

int main()
{
    int i,j;
    for (i=0; i<5; i++) {
        for (j=0; j<i; j++) {
            printf("/");
        }
        for (j=0; j<5-i; j++) {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}

実行結果の予想1 実行結果の予想2 実行結果の予想3
/****
//***
///**
////*
/////
*****
/
****
//
***
///
**
////
*
*****
/****
//***
///**
////*

上の2つのプログラムはどのようにして出来たのか考えてみよう。
自分でこれらのプログラムを考えるときに必要となる考え方である。
 自分で二重ループのプログラムを作る時の考え方  26May2003,23May2016追加

Cプログラミングスタイル  字下げ(インデント)


字下げ(インデント)のルール
(1) 中かっこ始まり「{」があったら次の行から字下げする。
(2) 中かっこ終わり「}」があったら次の行から字下げを戻す。
(3) 中かっこ終わり「}」の字下げ高さは,対応する中かっこ始まり「{」のあった行の字下げ高さと等しい。



 課題2 その2

(6)正整数nをキーボードから入力し,nに応じて「*」で以下の模様を描くプログラムを作成しなさい。nは少なくとも79まで対応しなさい。(p02ex06.c)
検証はn=1,2,3,4,5,79で行ないなさい。

n=1

n=2

n=3

n=4

n=5

*

**
**

***
***
***

****
****
****
****

*****
*****
*****
*****
*****

ヒント プログラム側からすると,「人間から正整数値をもらって,整数型変数nに保存する」というのが最初に行うべき作業となる。
模様を書き始めてからnの値を確定するということはありえない。
「人間から正整数値をもらって,整数型変数nに保存する」はscanfを使う。

(7)正整数nを入力し,nに応じて「*」で以下の模様を描くプログラムを作成しなさい。nは79まで対応しなさい。(p02ex07.c)
検証はn=1,2,3,4,5,79で行ないなさい。  ヒント

n=1

n=2

n=3

n=4

n=5

*

**
*

***
**
*

****
***
**
*

*****
****
***
**
*


(8)2つの正整数rowとcolumnをキーボードから読み込み,「*」を用いて縦row個,横column個の長方形を描くプログラムを作りなさい。(p02ex08.c)
検証は以下の2例を行ないなさい。キーボードから読み込む2つの数は,実行例のようにスペースで区切って入力すること。 ヒント

<<実行例1>>
row,column= 3 5
*****
*****
*****

<<実行例2>>
row,column= 6 7
*******
*******
*******
*******
*******
*******

(9)奇数(正整数で2で割ったあまりが1のもの)nを入力し,nに応じて「*」「-」で以下の模様を描くプログラムを作りなさい。
nは79まで対応しなさい。(p02ex09.c)
検証はn=1,3,5,7,9,79で行ないなさい。 ヒント

n=1

n=3

n=5

n=7

n=9

*

-*-
***

--*--
-***-
*****

---*---
--***--
-*****-
*******

----*----
---***---
--*****--
-*******-
*********

(10)奇数(正整数で2で割ったあまりが1のもの)nを入力し,nに応じて「*」「-」で以下の模様を描くプログラムを作りなさい。nは79まで対応しなさい。 (p02ex10.c)
検証はn=1,3,5,7,9,79で行ないなさい。

n=1

n=3

n=5

n=7

n=9

*

-*-
***
-*-

--*--
-***-
*****

-***-
--*--

---*---
--***--
-*****-
*******

-*****-
--***--
---*---

----*----
---***---
--*****--
-*******-
*********

-*******-
--*****--
---***---
----*----

(11)二重ループを用いて,九九の表を作りなさい。適当に空白を入れて乱れ(ずれ)がないようにして見やすくしなさい。
ただし,1行目と1列目はかける数,かけられる数を表示する。二重ループを用いること。
(p02ex11.c)
   1  2  3  4 ..
1  1  2  3  4 ..
2  2  4  6  8 ..
3  3  6  9 12 ..
4  4  8 12 16 ..
:  :  :  :  :

   ヒント

(12)英国には12進法の影響で九・九ではなく十二・十二までの掛算表がある。(11)を改造して,これを作りなさい。
適当に空白を入れて表示に乱れがないようにして見やすくしなさい。二重ループを用いること。(p02ex12.c)

 

 2.3 forループを用いた連続加算


「List 2.3.1」は1+2+3+...+100と12+22+32+...+1002を求める計算である。

List 2.3.1

/*1から100までの単純和と1から100までの平方和*/
#include <stdio.h>

int main()
{
    int i,sum,sum2;
    sum=0;  /*単純和*/
    sum2=0; /*平方和*/
    for (i=1;i<=100;i++) {
        sum=sum+i;
        sum2=sum2+i*i;
        printf("i,sum,sum2=%d %d %d\n", i, sum, sum2);
    }
    printf("1から100までの単純和と平方和=%d %d\n", sum, sum2);
    return 0;
}

実行結果

i,sum,sum2=1 1 1
i,sum,sum2=2 3 5
i,sum,sum2=3 6 14
i,sum,sum2=4 10 30
  :
途中省略
  :
i,sum,sum2=97 4753 308945
i,sum,sum2=98 4851 318549
i,sum,sum2=99 4950 328350
i,sum,sum2=100 5050 338350
1から100までの単純和と平方和=5050 338350

変数の初期化を忘れた失敗の例 27June2003追加

forループに関する補足(疑問点と誤りの例) 14May2003追加

 課題2 その3

(13)キーボードから10この正整数値をscanfで読み込み,合計値を表示するプログラムを作りなさい。
ただし,キーボードから読み込んだ値はint型変数xにしまわれるものとし,変数はこのxと回数を数えるint型変数countと合計値をしまうint型変数 sumのみを用いることとする。(p02ex13.c)
レポートの実行結果には次の3つの例を示しなさい。
(1)1,2,3,4,.. ..8,9,10を入力して合計値55になるかどうか検証しなさい。
(2)11,12,13,14,.. ..18,19,20を入力して合計値155になるかどうか検証しなさい。。
(3)123,321,234,432,345,543,456,654,567,765を入力して合計値4440になるかどうか検証しなさい。

  ヒント

(14)キーボードから10この正整数値をscanfで読み込み,合計値と平均値(小数第1位まで)を表示するプログラムを作りなさい。(p02ex14.c)
レポートの実行結果には次の3つの例を示しなさい。
(1)1,2,3,4,.. ..,8,9,10を入力して合計値55,平均値5.5になるかどうか検証しなさい。
(2)11,12,13,14,.. ..,18,19,20を入力して合計値155,平均値15.5になるかどうか検証しなさい。

(3)123,321,234,432,345,543,456,654,567,765を入力して合計値4440,平均値444.0になるかどうか検証しなさい。

  ヒント

 

 2.4 whileループ

キーボードから読み込んだ正整数値を2で繰り返し割って,割り切れる回数を求めるプログラムを考えよう。
例えば正整数値12は(12→6→3)2回,2で割り切ることが出来る。16は(16→8→4→2→1)4回,9は0回である。
2で割る動作は繰り返されるが,何回繰り返されるかは,プログラミング時には決めることが出来ないため,for文では
書くことができない。
ある条件が満たされている間,特定の処理を繰り返すという表現は,次のようなwhile文になる。

while (継続条件) {
    繰り返し処理ブロック

人間なら,2通りのやり方があるだろう。
(1)1つは2での割り算を紙に書いていき,割り切れなくなったときに,それまで何回割り算を行なったかを数えればよい。
(2)もう1つは割り算を行ないながら,現在何回目の割り算かを数え,覚えておく。割り切れなくなった時,覚えていた回数が答えである。

コンピュータでこの作業を行なうときは,(2)のやり方が適している。人間が割り算回数を覚えておくことに対応させて,現在何回目の割り算かを覚えておく変数を導入し,最初に0を与え,割り算が可能だった時に1を加えればよい。
回数を数える用途に使われる変数はカウンタと呼ばれ,プログラミングでは大変重要な役割を果たす。

割り切れたかどうかは,割り算のあまりを出す演算を用いて,あまりが0であるかどうかを確かめるとよい。

   むずかしいと感じた時は自分がコンピュータになったつもりで1行1行実行し,
   各変数がどうなったか,継続条件判断は真か偽かを絶えず,判断しながら読み
   進むこと。

List 2.4.1 numberは2で割ることが何回出来るか

/*numberは2で割ることが何回出来るか*/
#include <stdio.h>

int main()
{
    int number,n,counter;
    printf("正整数を入力してください ");
    scanf("%d", &number);
    n=number;
    counter=0;             /*2で割り切れた回数を覚えている変数を0にする*/
    printf("number=%d counter=%d\n", number, counter);
    while (n%2==0) {       /*2で割った余りが0なら(2で割り切れたら)中に入る*/
        n=n/2;             /*割り切れることがわかっているので,実際に割り算する*/
        counter++;         /*割り切れたので回数を覚えている変数の値を1増やす*/
        printf("n=%d counter=%d\n", n, counter);
    }
    printf("%dは%d回,2で割ることが出来ました\n", number, counter);
    return 0;
}

実行結果 (実行例を3つ示している)

正整数を入力してください 120
number=120 counter=0
n=60 counter=1
n=30 counter=2
n=15 counter=3
120は3回,2で割ることが出来ました

正整数を入力してください 1024
number=1024 counter=0
n=512 counter=1
n=256 counter=2
n=128 counter=3
n=64 counter=4
n=32 counter=5
n=16 counter=6
n=8 counter=7
n=4 counter=8
n=2 counter=9
n=1 counter=10
1024は10回,2で割ることが出来ました

正整数を入力してください 1237
number=1237 counter=0
1237は0回,2で割ることが出来ました

説明

1.「(n%2==0)」はnを2で割ったあまりが0だったらの意味
  「=」は「右辺の計算結果を左辺の変数に代入せよ」の意味なので
  「左辺=右辺」という条件を表す時は「左辺==右辺」と書く。
  
条件の記述について

2.繰り返し処理の仕組み
    while (n%2==0) {
       
n=n/2;
        counter++;
        printf("n=%d counter=%d\n", n, counter);

    }

  この部分の制御の流れは次の順番で行なわれる。
    while  (    (1)    ) {
        (2);←← 
         : ;   

        (2);
→→→→
    }

(1)終端チェック,「n%2==0」が偽の場合はループから脱出
(2)処理
(3)(1)へ戻る



3.カウンタ変数
  プログラミングでは何かの回数を数えることが必要になる場合が多い。
  そのような場合にはカウンタ変数と呼ばれる変数を用いる。このプログラム中では
  counterという変数である。この変数はnを2で割ることが出来た場合に1増加する。

************* 余談1 *************
人間が何かを数える時には頭の中にカウンタ変数を無意識に作る。
「時そば」とい落語があるが,そば屋の主人がおつりを1,2,3と勘定している
時に客から「今なんどきだい?」と時刻を聞かれ,時刻を答えた時に勘定を間違え
るという噺である。人間の頭の中にあるカウンタ変数は外乱によって変調をきたす
が,コンピュータ内のカウンタ変数はカウントアップする条件を間違えなければ,
正常に働くはずである。

************* 余談2 *************
お酒の飲み方とwhileループ
日本語での表現の例 C言語風表現の例 C言語のキーワードを用いた表現の例

次の1杯を飲む時は限界に
達しているかどうか良く考
えよう

まだ酔っていないと思ったら{
  次の1杯を飲む
  判断するところに戻る

while (まだ酔っていないと思う) {
  次の1杯を飲む;
}

このプログラムはどのようにして出来たのか考えてみよう。自分でこのプログラムを考える時,
あるいは課題の作業中に行き詰まった時は ここ を見なさい。 26May2003追加

練習2.6

 次のプログラムの実行結果を予想しなさい。
 むずかしいと感じた時は自分がコンピュータになったつもりで1行1行実行し,
 各変数がどうなったか,継続条件判断は真か偽かを絶えず,判断しながら読み
 進むこと。

List 2.4.2

/*1000以下のフィボナッチ数列*/
/*1,1,2,3,5,8,13,21....の数列*/
/*1+1=2,1+2=3,2+3=5,3+5=8,5+8=13,8+13=21,...*/
#include <stdio.h>

int main()
{
    int fa=1,fb=1,fc;
    int counter=3;
    fc=fa+fb;
    printf("1:%d\n2:%d\n", fa, fb);
    while (fc<=1000) {
        printf("%d:%d\n", counter, fc);
        counter++;
        fa=fb;
        fb=fc;
        fc=fa+fc;
    }
    return 0;
}

実行結果の予想1 実行結果の予想2 実行結果の予想3
1:1
2:1
3:2
4:3
5:5
6:8
7:13
8:21
9:34
10:55
11:89
12:144
13:233
14:377
15:610
16:987

1:1
2:1
3:2
4:2
5:2
6:8
7:13
8:21
9:34
10:55
11:89
12:144
13:233
 :
途中省略
 :
1000:221547

1:1
2:1
3:2
4:3
5:5
6:8
7:13
8:21
9:34
10:55
11:89
12:144
13:233
14:377
15:610
16:987
17:1597

フィボナッチ数列とは次のような数列のことです

第1項と第2項の値が1で,第3項以降の項がそれ以前の2つの項の和である数列

a1 = 1, a2 = 1, an = an-1 + an-2


練習2.7

 次のプログラムの実行結果を予想しなさい。
 むずかしいと感じた時は自分がコンピュータになったつもりで1行1行実行し,
 各変数がどうなったか,継続条件判断は真か偽かを絶えず,判断しながら読み
 進むこと。

List 2.4.3

#include <stdio.h>

int main()
{
    int x,y;
    x=10;
    y=0;
    while(y<30) {
        y=y+x;
        x=x+3;
    }
    printf("x=%d y=%d\n",x,y);
    return 0;
}

実行結果の予想1 実行結果の予想2 実行結果の予想3
x=19 y=39

x=16 y=39

x=16 y=23



   Cプログラミング学習者の1/4が最初にハマるwhileループのトラップ
  - 自分が1/4側にはいっているかどうかチェックしよう -


次のプログラムの実行結果を予想しなさい。
「x=10 y=10」になると思ったら,1/4側である!

#include <stdio.h>

int main()
{
    int x,y;
    x=10;
    y=0;
    while(y<5) {
        y=y+x;
        x=x+10;
    }
    printf("x=%d y=%d\n",x,y);
    return 0;
}

誤った解釈



正しい解釈



もう一度流れ図でwhileループの部分を見てみよう。


継続条件が真であったら必ず,「y=y+x;」「x=x+10;」は実行される。誤った解釈にはならないはずである。

どうして誤った解釈が生ずるのか?
人間は,脱出条件を覚えてしまう。「y=y+x;」のところで,yが10になった瞬間に覚えていた脱出条件を適用して脱出するといった誤った解釈が生ずる。
コンピュータは,現在行っている1行のことだけに専念している。自分が現在実行中の行が,ループ内であるとかループ外であるとかは考慮することはできない。継続判断する行に行ったときだけ,判断して脱出することが出来る。

ここで自分が1/4側だったと自覚できた学習者は,「2.1 forループ」の練習2.3に戻って,forループでも同じ誤解をしていないか確認しよう,


 2.5 do-whileループ

「2.4.1」の例で,「正整数を入力してください」としているが,人間が誤って負の整数を入力しても,再入力を強制するような仕組みを考えよう。
人間は再入力を強制されても,何回も負の整数を入力するかもしれないので,粘り強く再入力を強制する仕組みにしよう。
 このように,何か作業があって,その結果もう一回繰り返すかどうか判断する形式の繰り返し構造ではdo-while文を使う。

List 2.5.1

/*numberは何回2で割ることが出来るか*/
#include <stdio.h>

int main()
{
    int number,n,counter;
    do {
        printf("正整数を入力してください ");
        scanf("%d", &number);
    } while (number<=0);
    n=number;
    counter=0;
    printf("number=%d counter=%d\n", number, counter);
    while (n%2==0) {
        n=n/2;
        counter++;
        printf("n=%d counter=%d\n", n, counter);
    }
    printf("%dは%d回,2で割ることが出来ました\n", number, counter);
    return 0;
}

実行結果

正整数を入力してください -120
正整数を入力してください -120
正整数を入力してください 120
number=120 counter=0
n=60 counter=1
n=30 counter=2
n=15 counter=3
120は3回,2で割ることが出来ました

説明

繰り返し処理の仕組み
    do {
       
printf("正整数を入力してください ");
        scanf("%d", &number);

    } while (number<=0);

この部分の制御の流れは次の順番で行なわれる。
    do {
        (1);←←

         : ;   ↑
        (1);
↓  ↑
    } while (   (2)  );

(1)処理
(2)終端チェック,「number<=0」が偽の場合はループから脱出
(3)(1)へ戻る

注意 while(...)の直後に「;」が必要
    do {
        printf("正整数を入力してください ");
        scanf("%d", &number);
    } while (number<=0);

************* 余談 *************
お酒の飲み方とdo-whileループ
日本語での表現の例 C言語風表現の例 C言語のキーワードを用いた表現の例

まず1杯飲んで次の1杯を飲
む時は限界に達しているか
どうか良く考てから飲もう


  1杯を飲む
}まだ酔っていないと思ったら先頭に戻る

 do {
  次の1杯を飲む;
} while (まだ酔っていないと思う);

do-whileでお酒を飲むと,すでに出来上がっている人の場合は泥酔してしまいます。
お酒を飲む時はwhileループで飲みましょう。(成人に達してからです。)

練習2.8

次のプログラムの実行結果を予想しなさい。

List 2.5.2

#include <stdio.h>

int main()
{
    int x,y;
    x=1;
    y=0;
    do {
        y=x+10;
        x++;
    } while (y<15);
    printf("x=%d y=%d\n", x, y);
    return 0;
}

実行結果の予想1 実行結果の予想2 実行結果の予想3
x=6 y=15 x=5 y=14 x=15 y=24

 2.6 「処理の繰り返し」のまとめ

各ループの記述の特徴は次のとおりである。

ループの記述の種類 ループ回数 1回目の処理
forループ プログラミングあるいはループ起動の時点で既知 1度も処理を行なわないこともある
whileループ プログラミングあるいはループ起動の時点では未定 1度も処理を行なわないこともある
do-whileループ プログラミングあるいはループ起動の時点では未定 少なくとも1回は処理を行なう


特に,whileループとdo-whileループの違いを次の2つの例で示す。

例 List 2.5.1 より

do {
    printf("正整数を入力してください ");
    scanf("%d", &number);
} while (number<=0);
この例では,必ず1回は処理を行なうはずなのでdo-whileループが使われる


例 List 2.4.1 より

while (n%2==0) {
    n=n/2;
    counter++;
    printf("n=%d counter=%d\n", n, counter);
}
この例では,1回も処理が行なわれない可能性があるのでwhileループが使われる
(対象が奇数だと1度も2で割リきることが出来ない)


繰返し処理記述の時の考え方 ここを読んでください

 2.7 追加説明

ループに関する内容で説明してなかった内容を追加説明する。

 

内容

1.forループ

次のようなfor文がある
for (i=0,sum=0,sum2=0; i<100; i++)
i=0,sum=0,sum2=0 この3つがループに入る前の事前処理である。この3つの処理の間はカンマで区切る。

for (i=0,j=100,k=0; i<100; i++,j--,k=k+10)
i=0,j=100,k=0 この3つがループに入る前の事前処理である。
i++,j--,k=k+10 
この3つが終端処理である。終端処理を全部終えてから判断処理に入る。この3つの処理の間はカンマで区切る。

2.forループとwhileループ

次の2つのループは同じ意味となるが,この場合は繰り返し回数指定ループなので,
読み手のことを考えると
forループを推奨する。

for (i=0; i<10; i++) {
    :
}

i=0;
while (i<10) {
    :
    i++;
}

3.whileループとforループ

次の2つのループは同じ意味となるがこの場合は条件ループなので,
読み手のことを考えるとwhileループを推奨する。

while (a<b) {
    :
}

for ( ; a<b; ) {
    :
}

4.do-whileループとwhileループ

次の2つのループは同じ意味となるがこの場合は後ろ判断ループなので,
読み手のことを考えるとdo-whileループを推奨する。

do {
    処理A
} while (a<b);


処理A
while (a<b) {
    処理A
}

5.無限ループ

条件記述の部分で,C言語の文法では,
 0は偽(条件が成り立っていない)
 非0は真(条件が成り立っている) (1も非0なので当然真)
を意味することになっている。そこで無限ループは次のように記述できる。
(無限ループは制御プログラムでよく使われる。制御では電源が切れるまで繰り返しをとめるわけには行かない)

while(1) {
    処理
    処理
    処理
}

次の例も無限ループになるが,while利用の記述の方が明確と思われる

for(; 1; ) {
    処理
    処理
    処理
    処理
}

6.ループと緊急脱出

嫌われ者の「breakによる中途脱出」

繰り返し処理中に,ある条件が生じたら緊急に繰り返しから抜け出さなければならないことがある。
このような場合には

プログラムA

while(1) {
    処理A;
    if (脱出条件) break;
    処理B:
}

のように直感的に書くが,これは

プログラムB

処理A;
while(継続条件) {
    処理B;
    処理A;
}

と同じである。繰り返し処理の出口はループの先頭か最後であるスタイルが読みやすい。

どうしてもプログラムAの表現を使う場合には,コメントをつけて次のように目立たせるのがよい。
この例ではプログラムが短いので,ご利益がわからないが,長いプログラムでは,
どこで抜け出しているのかわかりにくいので,出口を表すコメントの必要性がわかるであろう。

while(1) { /*★ループ脱出は途中に1か所★*/
    処理A;
    /*★ループ脱出★*/ if (脱出条件) break;
    処理B:
}

なお

while(1) {
    if (脱出条件) break;
    処理B:
}

ならば,ループに入った直後の脱出なので

while(継続条件) {
    処理B;
}

と書くべきであるし,また

while(1) {
    処理A;
    if (脱出条件) break;
}

ならば,ループの終端における脱出なので

do {
    処理A;
} while (継続条件);

と書くべきである。

いずれにせよ,if (xxxx) break; の形は使わなくてもプログラムを書くことができる。

if (xxxx) break; は嫌われものである。

ループへの入口は上端一箇所,出口も上端または下端に一箇所にするとプログラムが読みやすくなる。

グループでプログラム開発をするときなどでは,
if (xxxx) break; を使わないというローカルルールになっていることもある。他人の作ったプログラムでは,ループの途中の出口は見つけにくく,デバッグの妨げになるからである。


 課題2 その4

(15)キーボードから複数個の正整数値を読み込み,合計値と平均値(小数第1位まで)を表示するプログラムを作りなさい。
ただし入力数値の個数はプログラミング時には決定していない。(すなわちforループは使わない)
負整数が入力されたら入力値はもうなくなったと判断することとし,負の数は計算には使用しないこととする。
またデータは少なくとも1つは入力されるものとする。(p02ex15.c)

検証は1から10までの数字すべてを与え,合計値55,平均値5.5が表示されることを確かめること。
(「1,2,3,4,5,6,7,8,9,10,-1」(-1はデータ終わりの合図)を入力して確かめなさい。)
また,1から5までの数字すべてを与え,合計値15,平均値3が表示されることを確かめること。
(「1,2,3,4,5,-1」(-1はデータ終わりの合図)を入力して確かめなさい。)
レポートの実行結果には上記2つの例を示しなさい。

  つぎの1~3のヒントは考え方は異なりますが,同じ結末にたどり着きます。
  ヒント1 「2.7 追加説明」のすぐ上の行の「繰返し処理記述の時の考え方 ここを読んでください」の中の「例2」が簡潔な説明です。
  ヒント2 ループを意識せず,やりたいことを羅列するところから考える。そしてループの考え方に到達する。拡張性が高く,自然な考え方である。
  ヒント3 ループになることを意識して無限ループ+途中脱出型ループを作る。その後「同じ意味変換」して自然なループに変更していく。
  ヒント4 整数型と実数型の変数の混合演算については B.演算子 の「B.1 C言語における算術演算子」の「整数と実数の混合演算」を読むと良い。

(16)正整数を入力して,その正整数が何桁か求めるプログラムを作りなさい。ただし正整数は10億以下とする。また,プログラム1回の起動でこの 作業を何回も繰返し行なえるようにし,負の値が入力されたら直ちにプログラムが止まるようにしなさい。負の値入力後は直ちに繰り返し作業から抜け出すこと (ループ回数はプログラミング時には決まっていないので,forループは使わない)(p02ex16.c)
(ヒント10で何回割れるか考える)
検証は,1桁の数,2桁の数,..,8桁の数で行ない,次のような結果になるようにしなさい。

key in an integer : 5
5 : 1 (digits)
key in an integer : 66
66 : 2 (digits)
key in an integer : 777
777 : 3 (digits)
key in an integer : 1111
1111 : 4 (digits)
key in an integer : 22334
22334 : 5 (digits)
key in an integer : 112233
112233 : 6 (digits)
key in an integer : 5556667
5556667 : 7 (digits)
key in an integer : 99990000
99990000 : 8 (digits)
key in an integer : -1

Pushing any key leads the exit.

 ヒント

(17)2つの正整数の最大公約数を求める算法(アルゴリズム)として有名なユークリッドの互除法により,最大公約数を求めるプログラムを作りなさい。プログラムでは2つの正整数はキーボードから入力するものとする。(p02ex17.c)
検証は2つの例(72と42,256と72)について行ないなさい。

ユークリッドの互除法は次のアルゴリズムとなる。
例えば2つの正整数が72と42の場合
72%42=30 → 42%30=12 → 30%12=612%6=0.....0になった時の割る数6が最大公約数である。
最初の置き方が逆でもOKである。すなわち
42%72=4272%42=3042%30=1230%12=612%6=0.....0になった時の割る数6が最大公約数である。
例えば2つの正整数が256と72の場合
256%72=4072%40=3240%32=832%8=0....0になった時の割る数8が最大公約数である。
最初の置き方が逆でもOKである。すなわち
72%256=72256%72=4072%40=3240%32=832%8=0....0になった時の割る数8が最大公約数である。
一般に2つの正整数がaとbの場合
a%b=cb%c=dc%d=e → ・・・ → x%y=0になった時の割る数yが最大公約数である。
このアルゴリズムの表現方法はフィボナッチ数列に似ており,不要になった変数の使いまわしをする。

ヒント 上記の作業を変数を使って一般化し,ループの表現とする。

第1段階 まず作業をループのことなど考えずに書き出してみる。
p,qにそれぞれ値が入っているものとする。作業をやめたとき,qが最大公約数となる。

r=p%q
途中経過を表示するため,p,q,rを表示する
rが0だったらqが最大公約数なので作業やめ
pの値はもう使わないのでqの値をpに移動(p=q;)
qの値はもう使わないのでrの値をqに移動(q=r;)
r=p%q;
途中経過を表示するため,p,q,rを表示する
rが0だったらqが最大公約数なので作業やめ
pの値はもう使わないのでqの値をpに移動(p=q;)
qの値はもう使わないのでrの値をqに移動(q=r;)
r=p%q;
途中経過を表示するため,p,q,rを表示する
rが0だったらqが最大公約数なので作業やめ
pの値はもう使わないのでqの値をpに移動(p=q;)
qの値はもう使わないのでrの値をqに移動(q=r;)
r=p%q;
途中経過を表示するため,p,q,rを表示する
rが0だったらqが最大公約数なので作業やめ
pの値はもう使わないのでqの値をpに移動(p=q;)
qの値はもう使わないのでrの値をqに移動(q=r;)
   :

第2段階 「判断してループから脱出する」ところで区切り,繰り返し作業の単位を見極める

r=p%q
途中経過を表示するため,p,q,rを表示する

rが0だったらqが最大公約数なので作業やめ
pの値はもう使わないのでqの値をpに移動(p=q;)
qの値はもう使わないのでrの値をqに移動(q=r;)
r=p%q;
途中経過を表示するため,p,q,rを表示する

rが0だったらqが最大公約数なので作業やめ
pの値はもう使わないのでqの値をpに移動(p=q;)
qの値はもう使わないのでrの値をqに移動(q=r;)
r=p%q;
途中経過を表示するため,p,q,rを表示する

rが0だったらqが最大公約数なので作業やめ
pの値はもう使わないのでqの値をpに移動(p=q;)
qの値はもう使わないのでrの値をqに移動(q=r;)
r=p%q;
途中経過を表示するため,p,q,rを表示する

   :

「rが0だったらqが最大公約数なので作業やめ」から「途中経過を表示するため,p,q,rを表示する」
までが繰り返し作業の単位であることがわかる。
ただし,最初の2行は仲間はずれになる。

第3段階 繰り返し作業の単位でループを作る,このループから抜け出したとき,qが最大公約数となる。
「rが0だったらqが最大公約数なので作業やめ」を「rが0でなかったら作業継続」と変更している。

r=p%q;
printf("p%%q=r  %d%%%d=%d\n", p, q, r); /*途中経過を表示するため*/
while (r!=0) {
    p=q;
    q=r;
    r=p%q;
    printf("p%%q=r  %d%%%d=%d\n", p, q, r); /*途中経過を表示するため*/
}





(文章課題a)次の内容をまとめてレポートにしなさい。 ただし,初めの2行(ファイル名,ID,出席番号,氏名)は,これまでのプログラムと同様な書式で書くこと。 (p02a.txt)
(説明するとは,友人や後輩にわかるように説明するという意味)
1)forループの記述方法と,実行がどのように行われるか,例を示して説明しなさい。
  ただし,for文の3つの要素A,B,Cについて,その役割と実行されるタイミングについての説明を含むようにしなさい。
  for ( 要素A ; 要素B ; 要素C )
2)whileループの記述方法と,実行がどのように行われるか,例を示して説明しなさい。
3)do-whileループの記述方法と,実行がどのように行われるか,例を示して説明しなさい。
4)whileループとdo-whileループの違いを説明しなさい。
5)字下げのルールについて,中かっことの関係で説明しなさい。


(文章課題b)次の内容をまとめてレポートにしなさい。 ただし,初めの2行(ファイル名,ID,出席番号,氏名)は,これまでのプログラムと同様な書式で書くこと。 (p02b.txt)
1)プログラム
        int i;
        for (i=0; i<20; i++) {
            printf("Hello, No.%d san.\n",i);
        }
        printf("bye %d",i);

において,最後の表示は
        bye 20
となる。forループから脱出するときの動作を示して,どうしてそうなるのか説明しなさい。
「Hello, No.19 san.」を表示したところ以降だけ,実行経過通りに説明しなさい。
説明文の最初は,
「Hello, No.19 san.」が表示された時点で変数iの値は19である。・・・・ 
で始めなさい。
また「i++」という表現を説明内に含むようにしなさい。

2)プログラム
        int k=5;
        int s=0;
        while(s<10) {
            s=s+k;
            k++;
        }
        printf("k=%d s=%d\n",k,s);

において,最後の表示は
        k=7 s=11
となる。プログラムの動作を1行ずつ実行経過通りに,プログラム起動時から順に説明しなさい。
同じ場所を何回か通過するが,その時変数に保持されている値が異なるので,実行経過通りに説明することが求められる。
説明文の最初は,
「kに5が代入され,次にsに0が代入された。
while(s<10) は条件が成立しているため,ループ内に入る。
s=s+kによってsは5になる。
k++によってkは6になる。・・・・ 」
で始めなさい。