第8回 2重ループ

今回おこなうこと

linux コマンド head tail more
 head 初めの10行表示
 tail 最後の10行表示
 more ゆっくり表示
C言語
 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=43以下でないのでループに入らない
(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= とかつけることで印をつける.