このスライドの使い方

  • 画面下の「▶」で再生開始、「⏸」で一時停止

  • 画面右下の「>」で次頁へ、「<」で前頁へ

  • 青字下線の部分は、まとめプリントの穴埋め

  • 作業」のところでは、ファイルをダウンロードしてコンパイル・実行

第 4 章
「プログラムの
流れの繰返し」

教科書 pp.73–113

§ 4-1「do 文」

(教 pp.74–81)

作業: List 4-1 を実行する(「もう一度?」に何度か 0 を入力してみる)

do 文

(教 p.74)

do 文1 while ( 式1 ) ; 
  • まず、文1(ループ本体と呼ばれる)を実行する
  • 1非 0(真)である限り、1 の実行を繰り返す

注: 必ず 1 回はループ本体を実行する

do 文に関する注意

  • あとで紹介する while 文や for 文に比べると、
    do 文の実際のプログラムでの使用頻度は低い
  • プログラムの実行が止まらなくなったときは、Ctrl-c で強制終了する

複合文(ブロック)内での宣言

(教 p.75

(do 文に限らず)ブロックの中で宣言された変数は、そのブロックでのみ有効である

読み込む値を制限する

(教 p.76)

List 4-2 は do 文が適している典型的なかたち

作業: List 4-2 を実行する(入力に最初 0, 1, 2 以外の数を入れてみる)

論理否定演算子とド・モルガンの法則

(教 p.77)

単項演算子の「!」は、真偽を逆にする演算子で、論理否定演算子とも言う

作業: List 4-2a を実行する(入力に最初 0, 1, 2 以外の数を入れてみる)

ド・モルガンの法則については教科書を読むこと

複数の整数値の合計と平均を求める

(教 p.78)

作業: List 4-3 を実行する(いくつかの入力を試す)

複合代入演算子

(教 p.80)

sum += t sum = sum + t とほぼ同じ意味

つまり、この代入を実行した後の sum の値は、実行する前の sum の値 に t を加えた値になる

作業: List 4-4 を実行する(いくつかの入力を試す)

*=」, 「/=」, 「%=」, 「+=」, 「-=」, など

後置増分演算子と後置減分演算子
・前置増分演算子と前置減分演算子

(教 p.81, p.88)

a++ a の値を一つだけ増やす (式全体の値は、 増やす前の値)
a-- a の値を一つだけ減らす (式全体の値は、 減らす前の値)
++a a の値を一つだけ増やす (式全体の値は、増やした後の値)
--a a の値を一つだけ減らす (式全体の値は、減らした後の値)

作業: まとめのプリント Q 4.1.1 をやってみる

§ 4-2「while 文」

(教 pp.82–93)

作業: List 4-5 を実行する(いくつかの入力を試す)

while 文

(教 p.82)

while ( 式1 ) 文1

1 0(偽)でない限り、 1 (ループ本体)の実行を繰り返す

注: ループ本体が一度も実行されないことがある。

do 文 while 文

減分演算子を用いた手短な表現
~カウントアップ

(pp.84–85)

教科書を読んでおくこと

作業: List 4-6 を実行する(いくつかの入力を試す)

作業: まとめのプリント Q 4.2.1 をやってみる

文字定数と putchar 関数

(教 p.86)

文字定数

  • 1 文字を一重引用符'」〜「'」で囲んだもの
  • \n」や「\t」などの拡張表記は 1 文字扱い

putchar 関数

  • 引数として受け取った文字を標準出力に出力

作業: List 4-8 を実行する(いくつかの入力を試す)

do 文と while 文
~整数値を逆順に表示

(教 pp.87–91)

教科書を読んでおくこと

整数値を逆順に

(まとめのプリント)

教科書 List 4-10 に類似

作業: reverse.c を実行する(いくつかの入力を試す)

作業: まとめのプリント Q 4.2.2 をやってみる

break 文

(教 p.92)

(もっとも内側の)繰返し文(do 文, while 文, for 文)を抜け出る
(外側の繰返し文を一気に抜け出ることはできない)

continue文

(教 p.93)

(もっとも内側の)繰返し文のはじめ (do 文, while 文の場合は条件式、for 文の場合は第 3 式)にもどる

break 文 continue 文

作業: List 4-11 を実行する(いくつかの入力を試す)

§ 4-3「for 文」

(教 pp.94–101)

作業: List 4-12 を実行する(いくつかの入力を試す)

for 文

(教 p.94)

for ( 式1; 式2; 式3 ) 文1
for ( 宣言12; 式3 ) 文1

: 「宣言」にはセミコロンが含まれている

  • ループに入る前にまず1 (または 宣言1 を実行
  • 2が非0(真)である間、1(ループ本体)と 3を繰返し実行
詳細:1〜式3は省略可能
2を省略したときは、1 と書くのと同じ

for 文(続き)

for 文

for 文(続き)

左の for 文は右の while 文と(ほぼ)等価

for 文 (ほぼ)等価な while 文
for (A ; B ; C) {        
   ループ本体    
}  
A ;          
while ( B ) {      
  ループ本体        
  C ;
}

では、なぜ左の書き方が好まれるか?
— 繰り返しを制御する変数に対する処理が、 一箇所にまとまっていて、一目で理解しやすい

for 文による一定回数の繰返し

(教 p.97)

for 文には、良く使う決まり文句的な形がある。

作業: List 4-13 を実行する(いくつかの入力を試す)

for (i = 0; i < n; i++) i0 から n - 1 まで n 回
for (i = 1; i <= n; i++) i1 から n まで n 回
for (i = n; i > 0; i--) in から 1 まで n 回
for (i = n - 1; i >= 0; i--) in - 1 から 0 まで n 回

作業: まとめのプリント Q 4.3.1, Q 4.3.2 をやってみる

偶数の列挙

(教 p.100)

作業: List 4-16 を実行する(いくつかの入力を試す)

約数の列挙

(教 p.100)

教科書を読んでおくこと

典型的な for 文(階乗の計算)

(まとめのプリント)

作業: fact.c を実行する(いくつかの入力を試す)

作業: まとめのプリント Q 4.3.3 をやってみる

典型的な for 文(正 n 角形の座標の出力)

(まとめのプリント)

作業: polygon.c を実行する(いくつかの入力を試す)

gcc では「gcc polygon.c -lm」でコンパイルする

式文と空文

(教 p.101)

文 (statement) に以下を追加する。

分類 一般形 補足説明
空文 ; “何もしない”文、{} と書いても同じ。

繰返し文

(教 p.101)

do 文、while 文、for 文をまとめて、繰返し文と呼ぶ

§ 4-4「多重ループ」

(教 pp.102–107)

作業: List 4-18 を実行する

2 重ループ

(教 p.102)

二重ループ — for 文や while 文などのループ本体が、また for 文や while 文などの繰返し文を含んでいること

二重・三重・⋯ ループをまとめて、多重ループという。
特別な文法や実行規則があるわけではない。

図形の描画

(教 p.104)

作業: List 4-19, List 4-20 を実行する(いくつかの入力を試す)

二重ループ(数の三角形)

(まとめのプリント)

作業: triangle.c を実行する(いくつかの入力を試す)

作業: まとめのプリント Q 4.4.1 をやってみる
解答例: ①②④…

二重ループ(ダイアモンド図形の座標の出力)

(まとめのプリント)

作業: まとめのプリント Q 4.4.2 をやってみる
解答例: ①②④…

gcc では「gcc diamond.c -lm」でコンパイルする

コンマ演算子

(教 p.233)

1, 2   

というは、12をこの順に評価し、
1 の値を捨て2 の値(と型)を持つ

注: 関数を呼び出すときに引数を区切るコンマ
(例: printf("%d %d", i, j))は コンマ演算子ではない

コンマ演算子の例

comma.c


#include <stdio.h>

int main(void) {
    int i, j;
    for (i = 0, j = 6; i < j; i++, j--) {
        printf("i = %d, j = %d\n", i, j);
    }
    return 0;
}

作業: comma.c を実行する(いくつかの入力を試す)

作業: まとめのプリント Q 4.4.3 をやってみる

多重ループ

(教 p.106)

教科書を読んでおくこと

§ 4-5「プログラムの要素と
書式」

(教 pp.108–111)

キーワード

(教 p.108)

  • ifelse など C 言語にとって特別な意味のある単語を キーワード (keyword) と呼ぶ
  • 変数名などに使用することはできない
    (ただし、変数名などの一部に使用するのは構わない)

演算子~定数と文字列リテラル

(教 pp.108–109)

教科書を読んでおくこと

自由形式

(教 p.110)

C 言語では、原則としてレイアウト(空白の数や改行)はプログラムの意味に影響を及ぼさない
空白がいくつ連続しても空白 1 文字と同じであり、改行も空白と同じである

注意すべきところ:

  • 前処理指令 (#include, #define) などの途中では、 改行できない

  • 文字列リテラル、文字定数の途中でも、改行できない

隣接した文字列リテラルの連結

(教 p.111)

教科書を読んでおくこと

インデント

(教 p.111)

字下げのことをインデント、字下げをすることをインデンテーションという

文法のまとめ

文 (statement)

分類 一般形 補足説明
do 文 do while ( ) ; (教 p.74)
while 文 while ( ) (教 p.82)
continue 文 continue ; (教 p.93)
for 文 for ( ; ; ) (教 p.94)
for 文 for ( 宣言 ; ) (教 p.94)

式 (expression)

分類 一般形 補足説明
後置演算 式 後置演算子 C の後置演算子は ++, -- のみ
(教 p.81)
コンマ演算子 , (教 p.233)

第 4 章・終