第8回 2重ループ
前回までの復習
- 前々回
whileループとリダイレクト
- 前回
grepとパイプ
- 復習
いつものところにtest8_1.cと保存.
cygwin上で移動,
#include <stdio.h> #include <math.h> int main(){ int i; i=0; while(i<=10000){ printf("i=%d, i*i=",i,i*i); i=i+1; } return 0; }
gcc test8_1.c -o test8_1.out
./test8_1.out
while文
while(条件){
繰り返し内容
}
条件をみたすときに繰り返す.
i=i+1で1をカウントしてるのがポイント
偶数刻みならi=i+2;
リダイレクト(ファイルに書き出す)
./test8_1.out > tmp.txt
パイプ 1342の2乗を表示
./test8_1.out | grep 1342
パイプ 134の2乗を表示
./test8_1.out | grep i=134,
本日のコマンド (head tail more)
- head
- 基本 (ファイルのはじめの10行を表示)
例1:
head mos.txt
例2:
head test8_1.c
-
- オプション機能を使えば最初10行でなく何行でも表示させられませす
head -n はじめのn行を表示
例1(はじめの30行を表示):
head -n 30 mos.txt
例2(はじめの5行を表示):
head -n 5 test8_1.c
-
- headはリダイレクトと組み合わせでよく使う
最初のほうが流れてみれない!
./test8_1.out
最初10行
./test8_1.out | head
最初100行
./test8_1.out | head -100
- tail
- 基本 (ファイルの最後の10行を表示)
例1:
tail mos.txt
例2:
tail test8_1.c
-
- 応用 最後のほうを表示
tail -n 最後のn行を表示
例1(最後の30行を表示):
tail -n 30 mos.txt
例2(最後の5行を表示):
tail -n 5 test8_1.c
-
- リダイレクトとの組み合わせでよく使う
プログラムの最後のほうだけ表示したい
./test8_1.out
最後の10行
./test8_1.out | tail
最後100行
./test8_1.out | tail -100
- more
- 基本 (ファイルの内容をゆっくり表示)
例1:
more mos.txt
例2:
more test8_1.c
-
- リダイレクト組み合わせでも使う
プログラムの最後のほうだけ表示したい
./test8_1.out
最後の10行
./test8_1.out | more
-
- 実はmoreと似たコマンドのlessが高機能なので推奨,しかし,微妙に複雑なので割愛.
C言語
- 二重ループ
#include <stdio.h> #include <math.h> int main(){ int i,j; i=1; j=1; while(i<=3){ printf("i change: i=%d j=%d\n",i,j); while(j<=4){ printf("i=%d j=%d\n",i,j); j=j+1; } j=1; //jをリセット printf("j loop is over\n"); i=i+1; //iに1を加える } printf("owari\n"); return 0; }
i change i=1 j=1
i=1 j=1
i=1 j=2
i=1 j=3
i=1 j=4
j loop is over
i=change i=2 j=1
i=2 j=1
i=2 j=2
i=2 j=3
i=2 j=4
j loop is over
i change i=3 j=1
i=3 j=1
i=3 j=2
i=3 j=3
i=3 j=4
owari;
解説:
(1)i=1 ->iに1を代入 (2)j=1 ->jに1を代入 (3)while(i<=3){ ->一つ目のループに入る.i=1でi<=3 を満たすので実行 (4) printf("i change: i=%d j=%d\n",i,j); ->iは1, jは1なので i=1, j=1と表示. (5)while(j<=3){ ->j=1でj<=4を満たすので実行 (6) printf("i=%d j=%d\n",i,j); ->i=1 j=1 と表示. (7)j=j+1; ->j=1+1=2 (8) printf("i=%d j=%d\n",i,j); ->i=1 j=2 と表示. (9)j=j+1; ->j=2+1=3 (10) printf("i=%d j=%d\n",i,j); ->i=1 j=3 と表示. (11)j=j+1; (12) printf("i=%d j=%d\n",i,j); ->i=1 j=4 と表示. (13)j=j+1 ->j=4+1=5 (16)j=5なのでj<=4を満たさないのでjに関するループ脱出. (17)j=1; //jをリセット ->j=1にする. (18)printf("j loop is over\n"); ->j loop is over と表示 (19) i=i+1; i=1+1=2 (20) while(i<=3) ->iは3以下なのでループに入る. (21) printf("i change: i=%d j=%d\n",i,j); ->i change: i=2 j=1 と表示. (22) while(j<=4) -> j=2なのでループに入る (23)2つ目のループに入る j=1でj<=4を満たすので実行 (24) printf("i=%d j=%d\n",i,j); ->i=2 j=1 と表示. (25)j=1+1; ->j=1+1=2 (26) printf("i=%d j=%d\n",i,j); ->i=2 j=2 と表示. (27)j=j+1; ->j=2+1=3 (28) printf("i=%d j=%d\n",i,j); ->i=2 j=3 と表示. (29)j=j+1; (30) printf("i=%d j=%d\n",i,j); ->i=2 j=4 と表示. (31)j=j+1 ->j=4+1=5 (32)j=5なのでj<=4を満たさないのでjに関するループ脱出. (17)j=1; //jをリセット ->j=1にする. (18)printf("j loop is over\n"); ->j loop is over と表示 (19) i=i+1; ->i=1+2=3 (20) while(i<=3) ->iは3以下なのでループに入る. (21) printf("i change: i=%d j=%d\n",i,j); ->i change: i=3 j=1 と表示. (22) while(j<=4) -> j=2なのでループに入る (23)2つ目のループに入る j=1でj<=4を満たすので実行 (24) printf("i=%d j=%d\n",i,j); ->i=3 j=1 と表示. (25)j=1+1; ->j=1+1=2 (26) printf("i=%d j=%d\n",i,j); ->i=3 j=2 と表示. (27)j=j+1; ->j=2+1=3 (28) printf("i=%d j=%d\n",i,j); ->i=3 j=3 と表示. (29)j=j+1; (30) printf("i=%d j=%d\n",i,j); ->i=3 j=4 と表示. (31)j=j+1 ->j=4+1=5 (32)j=5なのでj<=4を満たさないのでjに関するループ脱出. (33)j=1; //jをリセット ->j=1にする. (34)printf("j loop is over\n"); ->j loop is over と表示 (35) i=i+1; ->i=3+1=4 (36) while(i<=3) ->i=4で3以下でないのでループに入らない (37) printf("owari\n"); ->owari と表示
- 三重ループ
#include<stdio.h> int main(){ int i; int j; int k; while(i<=3){ while(j<=3){ while(k<=3){ printf("%d %d %d\n",i,j,k); k=k+1; } k=1; j=j+1; } j=1; i=i+1; } return 0; }
#書き方がポイント ブロックごとに書いていく
step1
while(){
}
step 2
while(){ while(){ } }
step 3
while(){ while(){ while(){ } } }
step 3
while(i<=3){ while(j<=3){ while(k<=3){ printf("%d %d %d\n",i,j,k); k=k+1; } k=1; j=j+1; } j=1; i=i+1; }
課題:
2ケタのピタゴラス数を求めよ
(1)ピタゴラス数とは?
(2)i,j,kについてそれぞれ1から100までいかのように表示されるプログラムを作れ
>|sh|
1 1 1
1 1 2
1 1 3
...
2 1 1
2 1 2
...
100 100 98
100 100 99
100 100 100
|
(3) i*i j*j k*k が(2)のように表示されるプログラムを作れ
(4) i*i j*j k*k i*i+j*j-k*k が(3)のように表示されるプログラムを作れ
(5) grep を使って,上記のプログラムを改造し,grepを使って選択することでピタゴラス数を求めよ
-ヒント (3)のプログラムの4列目が0になるものがピタゴラス数
-4列目に diff= とかつけることで印をつける.