物理情報処理基礎実習 ii 第8回

16
物物物物物物物物物物 II 物物物物 continue 物break 物got o物α /www.phys.ynu.ac.jp/labs/cosmic/shibata/jisshu/ [email protected] c.jp 物物 [email protected] p 物物 [email protected] t.ac.jp

Upload: ibtesam-javed

Post on 30-Dec-2015

29 views

Category:

Documents


0 download

DESCRIPTION

http://www.phys.ynu.ac.jp/labs/cosmic/shibata/jisshu/. 物理情報処理基礎実習 II 第8回. 制御構造 ~ continue 文・ break 文・ goto 文~ + α. (原 [email protected] ) 柴田 [email protected] 石川 [email protected]. § 制御構造. プログラムを条件によって、 処理を繰り返したり、分岐させたりする。 while (繰り返し) if (分岐) for (繰り返し) - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 物理情報処理基礎実習 II 第8回

物理情報処理基礎実習 II第8回制御構造

~ continue 文・ break 文・ goto文~+ α

http://www.phys.ynu.ac.jp/labs/cosmic/shibata/jisshu/

(原 [email protected] )柴田 [email protected]

石川 [email protected]

Page 2: 物理情報処理基礎実習 II 第8回

§制御構造プログラムを条件によって、

処理を繰り返したり、分岐させたりする。 while (繰り返し) if (分岐) for (繰り返し) do while (繰り返し) switch (分岐) goto (分岐)

※ continue と、 break は、上記と併せて使用。

Page 3: 物理情報処理基礎実習 II 第8回

§ 課題6 解答例 –プログラム–aplsrvky01% cat exercise6.c#include <stdio.h>main(){  int i, n, count; printf("Input the integer number : "); scanf("%d",&n); if(n<2){ /* 2 より小さければ素数ではない。 */ printf(" Number %d is not a prime number!\n",n); }else{ count = 0; for(i=2;i<n;i++){ if(n%i == 0){ /* 余り 0なら約数あり,すなわち素数ではない。 */ count ++; /* if(n%i==0) count++; と書いても同じ */ } } if(count == 0){ printf(" Number %d is a prime number!\n",n); }else{ printf(" Number %d is not a prime number!\n",n); } }}

Page 4: 物理情報処理基礎実習 II 第8回

§ 課題6 解答例 –実行–aplsrvky01% cc exercise6.c -o exercise6 aplsrvky01% ./exercise6Input the integer number : -1 Number -1 is not a prime number!aplsrvky01% ./exercise6Input the integer number : 3 Number 3 is a prime number!aplsrvky01% ./exercise6Input the integer number : 8 Number 8 is not a prime number!aplsrvky01% ./exercise6Input the integer number : 65537 Number 65537 is a prime number!

Page 5: 物理情報処理基礎実習 II 第8回

§ 課題6 別解 –プログラム1–aplsrvky01% cat exercise6.c#include <stdio.h>main(){  int i, n, count; printf("Input the integer number : "); scanf("%d",&n); if(n==2){ /* 2 は素数である。 */ printf(" Number %d is not a prime number!\n",n); }else if(n<2 || n%2==0){ /* 偶数は素数ではない。 */ printf(" Number %d is not a prime number!\n",n); }else{ for(i=3,count=0;i<n;i+=2){ if(n%i==0) count++; /* 余り 0なら約数あり,すなわち素数ではない。 */ } if(count == 0){ printf(" Number %d is a prime number!\n",n); }else{ printf(" Number %d is not a prime number!\n",n); } }}※奇数のみを調べることで計算数を減らしている。

Page 6: 物理情報処理基礎実習 II 第8回

§ 課題6 別解 –プログラム2–aplsrvky01% cat exercise6another.c#include <stdio.h>main(){  int i, n; printf("Input the integer number : "); scanf("%d",&n); if(n==2){ /* 2 は素数である。 */ printf(" Number %d is not a prime number!\n",n); }else if(n<2 || n%2==0){ /* 偶数は素数ではない。 */ printf(" Number %d is not a prime number!\n",n); }else{ for(i=3;n%i!=0;i+=2){ /* 余りが 0( 約数あり )ならばループ終了 */ ; /* ; のみは何もしないという実行文 */ } if(i<n){ printf(" Number %d is not a prime number!\n",n); }else{ printf(" Number %d is a prime number!\n",n); } }}

※条件式を剰余計算にしてしまうことで計算数を減らしている。

Page 7: 物理情報処理基礎実習 II 第8回

§ 課題7 フローチャート課題7 四則算術計算ソフト

c

a- ba+ b a* b Err:Op’ +’

入力 a,c,b

Err:Inp

’ ー’ ’ *’ ’ /’不一致

b!=0

a/ b

真→青分岐偽→赤分岐

変数  int a, b  char c

Page 8: 物理情報処理基礎実習 II 第8回

§continue 文繰り返し処理を途中で中断して次の繰り返し

に移りたい時に使用する。while 、 do while 、 for 文内のみで使用出来

る。while 、 do while 文内では…

continue 文が存在するループの先頭に強制的に移行する(条件式判断に飛ぶ)。

for 文では…continue 文が存在するループの処理2を実行した後、やはり条件式判断からループを実行する。

Page 9: 物理情報処理基礎実習 II 第8回

§break 文繰り返し処理等を途中で中断し、終了する。while 、 do while 、 for 、 switch 文内でのみ使用。break 文が存在するもっとも内側の制御構造

( { } 、ループ等)から強制的に抜け、次の文に移行する。

※当然、ある条件を満たした場合にのみ使わないと、  この2つの図の様にループなどに意味が無くなる。

continue

他の処理

break

他の処理

Page 10: 物理情報処理基礎実習 II 第8回

§continue 文 & break 文 教科書 p87 ex223.c

1. #include <stdio.h>2.  3. main()4. {5. int i;6.  7. for (i = 0; i < 10; i++) {8. if (i < 5) {  ※ continue も break も if 文には関係しない!9. continue;  ※ i<5 の時はループの最初に戻る!10. } else if (i > 8) {11. break;  ※ i>8 の場合はループから抜ける!12. }13. printf("%d\n", i);14. }15. }

Page 11: 物理情報処理基礎実習 II 第8回

§goto 文 -I-対応するラベルの位置へ、強制的に移行する。制御構造が入れ子構造になっている場合

( while 文や for 文等の中に、 更に while 文や for 文を含むような場合)、その内側から、一気に外に抜けることが出来る。

プログラムの可読性を著しく乱すため、上記用法以外では可能な限り使うのを避ける。

文法goto ラベル1 ;

ラベル1 :   ※←「 ; 」ではなく「 : 」に注意!

Page 12: 物理情報処理基礎実習 II 第8回

§goto 文 -II- 教科書 p89 ex224.c

1. #include <stdio.h>  2. main()

3. {

4. int i, j;

5.  6. for (i = 0; i < 10; i++) {

7. for (j = 0; j < 10; j++) {

8. if (i < j) {

9. break;

10. } else if (i * j > 35) {

11. goto end;

12. }

13. printf("(%d, %d)", j, i);

14. }

15. printf("\n");

16. }

17. end:  ※ラベル、「:」に注意!18. printf("\nend\n");

19. }

Page 13: 物理情報処理基礎実習 II 第8回

§ftp の使い方anonymous ftp サーバからファイルを持ってく

る。aplsrvky01% ncftp ftp.phys.ynu.ac.jp  

・・・         ※↑知能物理科のftpサーバ

ncftp> cd pub/jisshu/primer ※ ディレクトリの移動ncftp> ls           ※ファイル一覧の表示ncftp> get ファイル名    ※ファイルのダウンロードncftp> quit          ※ ftp の終了

・・・Save? (yes/no) no       ※ bookmark 保存(してもいいけ

ど)

※試しに ex224.c を持ってくる!

Page 14: 物理情報処理基礎実習 II 第8回

§ 課題8 方程式の根X2ーsin(x)=0の解(x=0以外)が0.1≦x≦1.0の間にある。この区間内の関数f(x)=X2ーsin(x)の端点での値を調べて誤差10ー6以内で解を求めたい。端点のひとつと端点の中点の区間で解の存在範囲を調べる。誤差が10ー6より大きければ、区間を半分にせばめ解の存在範囲を繰り返し調べる。収束後(誤差が10ー6以内)の反復回数と、端点・中点および関数の値を表示するプログラムを作成し、実行せよ。ただし、端点(0.1、1.0)および誤差10ー6は入力とし、反復の最大回数は10000と限定する。また、レポートには簡単なフローチャートも添付すること。

※出力書式はprintf(“x1=%15.10lf¥n”、x1);を参考にせよ。 

Page 15: 物理情報処理基礎実習 II 第8回

f(x)=x2

- sin(x)

Page 16: 物理情報処理基礎実習 II 第8回

おまけ課題のヒント

「X1<x<xm(中点)<x2でf(x1)*f(xm)<0なら、解はどこの範囲、f(x1)*f(xm)>0ならどこに」という話。

収束判定は、絶対値関数      if(fabs(f(x))<eps) break;などを使うとよい。 #include   <math.h> をつけて。

12月6日(火)は試験! scanf とか、 printf とか、%5dだとか、 %20.10lfだとか、覚えた?制御(繰り返しや分岐)のwhile文、for文やif文、

switcht文だとかも。来週からは柴田先生にバトンタッチ。配列・文字列とかのお話。