C言語の繰り返し処理 for文と while文と do文 臼杵 潤 0) 準備 変数の加減算 int a, b=10; // a= a = 0; a = a+1; // a= a += 1; // a= // a= a ++; a = a + b; // a= a += b; // a= // a= a --; 下を1行ずつ実行すると それぞれ aの値はどう変わるか 0 1 2 3 13 23 22 += ++ -などの使い方 わかりましたね +や 以外に * / % でも使える 1
1) 繰り返し処理 : 概念 1の内容 2の内容 for 文 for( A ) なし while 文 while( B ) なし do 文 do while( C ) ; 1 { // ここから A, B, C の部分には条件などを書く 1 と 2 の書き方を 3 種類覚えましょう 2 // ここまでの処理を繰り返したい! 2) 繰り返し処理 : 基本 1の内容 2の内容 for 文 for( A ) なし while 文 while( B ) なし do 文 do while( C ) ; 忘れずに for( n=0; n<10 A ; n++ ) { // ここから // ここまで A, B, C の部分には条件などを書く A の部分 for( 初期値設定 ; 繰返条件 ; 更新処理 ) 例 ) 繰り返す回数を10 回 ( カウントする ) 初期値 : n = 0 繰返条件 : n < 10 更新処理 : n ++ の場合 for( n = 0 ; n < 10 ; n++ ) 2
for文の練習クイズ 括弧内を繰り返し実行する N=5とすると 何回繰り返す for (i=0; i<n; i++) { 文; for (i=0; i<n; i+=1) { 文; for (i=10; i>n; i ) { 文; for (i=10; i>n; i =2) { 文; ①の内容 2) 繰り返し処理 基本 for文 for( A ) while文 while( B ) n=0; do文 do ②の内容 なし なし while( C ) ; A, B, C の部分には条件などを書く while( n B < 10)) { //ここから while( n++; //ここまで Bの部分 while( 繰返条件 ) 例 繰り返す回数を10回(カウントする) 初期値 n = 0 繰返条件 n < 10 更新処理 n ++ の場合 while( n < 10 ) 3
2) 繰り返し処理 : 基本 1の内容 2の内容 for 文 for( A ) なし while 文 while( B ) なし n=0; do { // ここから n++; while( n < C 10 )); ; // ここまで do 文 do while( C ) ; A, B, C の部分には条件などを書く C の部分 while( 繰返条件 ); 例 ) 繰り返す回数を10 回 ( カウントする ) 初期値 : n = 0 繰返条件 : n < 10 更新処理 : n ++ の場合 while( n < 10 ) ; ; を忘れずに!(do 文だけ必要 ) いずれも処理 A の部分を繰り返すプログラム for 文 for( 初期値設定 ; 繰返条件 ; 更新処理 ){ 処理 A; while 文 while( 繰返条件 ){ 処理 A; do 文 (do-while 文 ) do{ 処理 A; while( 繰返条件 ); do { 処理 A ; printf( やめる場合 :0 n ); printf( 繰り返す場合 :1 n ); scanf( %d, &n); while( n!= 0 ); while 文と do 文が 繰返条件 だけなのは何故? 初期値設定更新処理が不要な例 こんなプログラムも書ける 4
while文とdo文の違いは while文 while( 繰返条件 ){ 処理A; do文(do-while文) do{ 処理A; while( 繰返条件 ); printf( 実行しない 0 n ); printf( 実行する 1 n ); scanf( %d, &n); while( n!= 0 ) { 処理A ; 繰り返すとn=0になる式 ; 例えば カウントダウンする 繰返条件 が 処理Aより前 にあるか 処理Aより後 にあるか どんな違いがある do { 処理A ; printf( やめる 0 n ); printf( 繰り返す 1 n ); scanf( %d, &n); while( n!= 0 ); とにかく1度は 処理A; を 必ず実行したい なら n--; C言語でよく使われる変数名の例 変数名 no, num sum ave 使われ方 番号 数 や 量 合計 平均 備考 No. や number の略 summation の略 average の略 cnt ans, result i, j, k, x, y, z n, a, b, c, カウント count の略 計算結果 answer の略 繰返のカウント 座標 x, y, z は空間表現用 通常の値 これらはよく使われる変数の名前です スペルミスしないように覚えたり 意味を知っておくと 使いやすいです 5
繰り返し処理 ループ文 のプログラム作成の考え方 ループ文作成の考え方の例 for文を例に書いてみる 例題1 キーボードから整数値を読み込んで その値から2倍の値までの整数値を すべて合計するプログラムを作成しなさい まずこれを書く 問題文を細かく分割する step.2 #include <stdio.h> その値 ② step.1 その値 ② 2倍の値 ③ 2倍の値 ③ その値 その値 から から 2倍の値 2倍の値 までの整数値 ④ までの整数値 ④ for文のどこに① ⑤を書く for( 初期値設定; 繰返条件; 更新処理 ){ 処理A; 6
ループ文作成の考え方の例 for文を例に書いてみる for( 初期値設定; 繰返条件; 更新処理 ){ 処理A; その値 ② その値 読み込んだ値 ② 2倍の値 ③ 2倍の値 読み込んだ値の2倍 ③ step.3 その値 その値 から から 2倍の値 2倍の値 までの整数値 ④ までの整数値 ④ とりあえず 書いてみる for( ; ; ){ ①; ②; ③; ④; ⑤; このままプログラムを書いてみると for( 未記入; 未記入; 未記入 ){ ① キーボードから整数値を読み込む ② その値 読み込んだ値を a とする ③ 2倍の値 aの2倍 2*a ④ a から 2*a までの 整数値 それぞれnとする ⑤ nの合計 未記入 部分に書くべきものはどれ ④どこから どこまで は未記入部に書く for( aから; 2*aまで; 整数値 ) step.4 for( n=a; n<=2*a; n++ ) //未記入部に④を書けた ③も書けた ループ文作成の考え方の例 for文を例に書いてみる for( 初期値設定; 繰返条件; 更新処理 ){ 処理A; その値 ② その値 読み込んだ値 ② 2倍の値 ③ 2倍の値 読み込んだ値の2倍 ③ こうなった その値 その値 から から 2倍の値 2倍の値 までの整数値 ④ までの整数値 ④ ①; 残った①②⑤はどこに書くべき step.5 ②; ⑤; ① キーボードから整数値を読み込む ② その値 読み込んだ値を a とする ⑤ nの合計 ②はfor文の前に書かないと for文の中で a を使えない ①ってscanf文だから ②と一緒に書けそう 7
ループ文作成の考え方の例 for文を例に書いてみる for( 初期値設定; 繰返条件; 更新処理 ){ 処理A; その値 ② その値 読み込んだ値 ② 2倍の値 ③ 2倍の値 読み込んだ値の2倍 ③ こうなった その値 その値 から から 2倍の値 2倍の値 までの整数値 ④ までの整数値 ④ ①② キーボードからaに整数値を読み込む プログラムで書くと ⑤ nの合計 scanf( %d, &a); ⑤nの合計; step.6 ⑤は定番の書き方を覚えておこう sum = sum + n; ( sum+=n;でもok ) ただし sumはfor文より前で sum=0 にしておく ループ文作成の考え方の例 for文を例に書いてみる for( 初期値設定; 繰返条件; 更新処理 ){ 処理A; その値 ② その値 読み込んだ値 ② 2倍の値 ③ 2倍の値 読み込んだ値の2倍 ③ こうなった その値 その値 から から 2倍の値 2倍の値 までの整数値 ④ までの整数値 ④ scanf( %d, &a); 各変数の宣言を忘れずに int a, n, sum; sum = 0; step.7 これでOK (#includeとか忘れずに) sum = sum + n; int a, n, sum; これでもOK int a, n, sum=0; scanf( %d, &a); sum += n ; scanf( %d, &a); sum = 0; sum = sum + n ; 8
多重ループ 3) 繰り返し処理 応用 2重ループ(九九表: multiplication table) 九九表を int y, x; 表示する printf("y * x を計算します n n"); プログラム例 ポ O ① あとで工夫 イ x 1行目 ン ト 2行目 ② あとで工夫 y コンピュータでは yは下向き for (y = 1; y <= 9; y++) { //縦方向に9回繰り返す ③ あとで工夫 for (x = 1; x <= 9; x++) { //横方向に9回に繰り返す printf("%3d", y*x); printf(" n"); 9
3) 繰り返し処理 応用 2重ループ(九九表: multiplication table) int y, x; 九九表を 見やすく表示する例 printf("y * x を計算します n n"); printf(" "); ① for (x = 1; x <= 9; x++) { //横9回 printf("%3d", x); ② for (y = 1; y <= 9; y++) { printf(" n"); ③ printf("%2d ", y); printf("--- "); for (x = 1; x <= 9; x++) { for (x = 1; x <= 9; x++) { //横9回 printf("%3d", y*x); printf("---"); printf(" n"); printf(" n"); 多重ループの動きを目で見て確認 1) multiplication_table_0.c を動かして確かめる 2) 同プログラムのコメント部分をアンコメントして動かして みる 3) multiplication_table_1.c はそのまま動かすと 2) と全く 同じもの ここで プログラム内のNo.1から順にNo.5の前 半までアンコメントし動かしてみる 4) 3)のプログラムのNo.5後半もアンコメントする ただし 後半の printf( %3d, y*x); の1行だけコメントアウトす る 何度か実行し yとxの関係から2重ループを理解する 10
二重ループ : 九九の演算表を作る手順! printf("_ _ 1_ 2_ 3_ 4_ 5_ 6_ 7_ 8_ 9 n"); printf( _ _ 2_ 4_ 6_ 7_10_12_14_16_18 n"); _ _ 1_ 2_ 3_ 4_ 5_ 6_ 7_ 8_ 9 [ 注意 ] 最大何桁の数字を表示するか? 2 桁ならば %2d 9 回繰り返し for 文を使ってみましょう for( i=1; i<=9; i++) { printf("_ 1"); ただし これだと _ 1_ 1_ 1_ 1_ 1_ 1_ 1_ 1_ 1 そこで i を使ってみよう for( i=1; i<=9; i++) { printf("_ %d", i ); 2 行目 :for( i=1; i<=9; i++) { printf("_ %d", i*2 ); 3 行目 :for( i=1; i<=9; i++) { printf("_ %d", i*3 ); for( j=1; j<=9; j++) { i*1 と書ける j を使おう for( i=1; i<=9; i++) { printf("_ %d", i*j ); あとは ここに _ を表示するプログラムを書く & どこかで改行 n を入れよう! よく考えると 二重ループ : 数字のピラミッドを書く! 段数 N = 6 の場合 1 21 321 4321 54321 654321 1 段目だけを考える スペース 5 個 + 数字 1 個 for 文で (N-1 回 ) スペースを表示する 1 を表示してみる ( とりあえず ) 2 段目を考える ここまでプログラミング! スペース 4 個 + 数字 2 個 for 文で (N-2 回 ) スペースを表示する 2 と 1 を表示してみる i 段目は? スペース N-i 個 + 数字 i 個 for 文で (N-i 回 ) スペースを表示する i から 1 まで表示する 11
二重ループ : 数字のピラミッドを書く! 1 段目 for( j=1; j<=n-1; j++){ スペース表示 ; 1 を表示 ; 2 段目 for( j=1; j<=n-2; j++){ スペース表示 ; 2, 1 を表示 ; i 段目 for( j=1; j<=n-i; j++){ スペース表示 ; i, 2, 1 を表示 ; 段数 N = 6 の場合 1 段目だけを考える スペース 5 個 + 数字 1 個 for 文で (N-1 回 ) スペースを表示する 1 を表示してみる ( とりあえず ) 2 段目を考える ここまでプログラミング! スペース 4 個 + 数字 2 個 for 文で (N-2 回 ) スペースを表示する 2 と 1 を表示してみる i 段目は? スペース N-i 個 + 数字 i 個 for 文で (N-i 回 ) スペースを表示する i から 1 まで表示する 二重ループ : 数字のピラミッドを書く! i 段目 for( j=1; j<=n-i; j++){ スペース表示 ; i, 2, 1 を表示 ; 段数 N = 6 の場合 i 段目は? スペース N-i 個 + 数字 i 個 for 文で (N-i 回 ) スペースを表示する i から 1 まで表示する i 段目 for( j=1; j<=n-i; j++){ スペース表示 ; for( j=i ; j>=1; j--){ j を表示 ; for( i=1; i<=n; i++) { for( j=1; j<=n-i; j++) { printf(" "); for( j=i ; j>=1; j--) { printf("%d", j ); 12