このスライドの使い方

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

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

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

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

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

教科書 pp.73–113

§ 4-1「do 文」(教 pp.74–81)

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

do 〜 while 文 (教 p.74

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

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

do 〜 while 文に関する注意

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

複合文(ブロック)内での宣言
(教 p.75

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

読み込む値を制限する(教 p.76

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

作業: 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 文 while 文

減分演算子を用いた手短な表現
~カウントアップ(pp.84–85)

教科書を読んでおくこと

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

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

文字定数(教 p.86

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

putchar 関数(教 p.87

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

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

do 文と while 文
~整数値を逆順に表示
(87–91 ページ)

教科書を読んでおくこと

break 文 (教 p.92

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

continue文(参考)(教 p.93

(もっとも内側の)繰返し文のはじめ(do 〜 while文、 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 文は右の while 文と(ほぼ)等価

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

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

一定回数の繰返し(教 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.1.3, Q 4.1.4 をやってみる

偶数の列挙(教 p.100)

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

約数の列挙(教 p.100)

教科書を読んでおくこと

空文(教 p.101

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

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

繰返し文(教 p.101)

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

整数値を逆順に (reverse.c)
(まとめのプリント・章末)

教科書 List 4-10 に類似

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

作業: まとめのプリント Q 4.2.1, 4.2.2 をやってみる no の初期値が 0 のときも試してみる)

典型的な for 文(階乗の計算)(fact.c)
(まとめのプリント・章末)

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

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

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

(まとめのプリント・章末)

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

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

§ 4-4「多重ループ」
(教 pp.102–107)

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

多重ループ(教 p.102

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

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

図形の描画(教 p.104

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

コンマ演算子(教 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.1.5 をやってみる

多重ループ(教 p.106)

教科書を読んでおくこと

二重ループ(数の三角形)(triangle.c)
(まとめのプリント・章末)

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

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

二重ループ
(ダイアモンド図形の座標の出力)(diamond.c)
(まとめのプリント・章末)

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

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

§ 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 〜 while 文 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 章・終