物理情報処理基礎実習 ii 第8回
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 PresentationTRANSCRIPT
物理情報処理基礎実習 II第8回制御構造
~ continue 文・ break 文・ goto文~+ α
http://www.phys.ynu.ac.jp/labs/cosmic/shibata/jisshu/
§制御構造プログラムを条件によって、
処理を繰り返したり、分岐させたりする。 while (繰り返し) if (分岐) for (繰り返し) do while (繰り返し) switch (分岐) goto (分岐)
※ continue と、 break は、上記と併せて使用。
§ 課題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); } }}
§ 課題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!
§ 課題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); } }}※奇数のみを調べることで計算数を減らしている。
§ 課題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); } }}
※条件式を剰余計算にしてしまうことで計算数を減らしている。
§ 課題7 フローチャート課題7 四則算術計算ソフト
c
a- ba+ b a* b Err:Op’ +’
入力 a,c,b
Err:Inp
’ ー’ ’ *’ ’ /’不一致
b!=0
a/ b
真→青分岐偽→赤分岐
変数 int a, b char c
§continue 文繰り返し処理を途中で中断して次の繰り返し
に移りたい時に使用する。while 、 do while 、 for 文内のみで使用出来
る。while 、 do while 文内では…
continue 文が存在するループの先頭に強制的に移行する(条件式判断に飛ぶ)。
for 文では…continue 文が存在するループの処理2を実行した後、やはり条件式判断からループを実行する。
§break 文繰り返し処理等を途中で中断し、終了する。while 、 do while 、 for 、 switch 文内でのみ使用。break 文が存在するもっとも内側の制御構造
( { } 、ループ等)から強制的に抜け、次の文に移行する。
※当然、ある条件を満たした場合にのみ使わないと、 この2つの図の様にループなどに意味が無くなる。
continue
他の処理
break
他の処理
§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. }
§goto 文 -I-対応するラベルの位置へ、強制的に移行する。制御構造が入れ子構造になっている場合
( while 文や for 文等の中に、 更に while 文や for 文を含むような場合)、その内側から、一気に外に抜けることが出来る。
プログラムの可読性を著しく乱すため、上記用法以外では可能な限り使うのを避ける。
文法goto ラベル1 ;
ラベル1 : ※←「 ; 」ではなく「 : 」に注意!
§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. }
§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 を持ってくる!
§ 課題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);を参考にせよ。
f(x)=x2
- sin(x)
おまけ課題のヒント
「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文だとかも。来週からは柴田先生にバトンタッチ。配列・文字列とかのお話。