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

http://www.phys.ynu.ac.jp/labs/cosmic/shibata/jisshu/
物理情報処理基礎実習II
第8回
制御構造
~continue文・break文・goto文~
+α
(原 [email protected])
柴田 [email protected]
石川 [email protected]
§制御構造
プログラムを条件によって、
処理を繰り返したり、分岐させたりする。
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% ./exercise6
Input the integer number : -1
Number -1 is not a prime number!
aplsrvky01% ./exercise6
Input the integer number : 3
Number 3 is a prime number!
aplsrvky01% ./exercise6
Input the integer number : 8
Number 8 is not a prime number!
aplsrvky01% ./exercise6
Input 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 四則算術計算ソフト
入力 a,c,b
c
真→青分岐
偽→赤分岐
変数
int a, b
char c
不一致
’+’
a+b
’ー’
a-b
’*’
a*b
’/’
b!=0
a/b
Err:Op
Err:Inp
§continue 文
繰り返し処理を途中で中断して次の繰り返しに
移りたい時に使用する。
while、do while、for文内のみで使用出来る。
while、do while文内では…
continue文が存在するループの先頭に強制的に
移行する(条件式判断に飛ぶ)。
for文では…
continue文が存在するループの処理2を実行し
た後、やはり条件式判断からループを実行する。
§break 文
繰り返し処理等を途中で中断し、終了する。
while、do while、for、switch文内でのみ使用。
break文が存在するもっとも内側の制御構造
({ }、ループ等)から強制的に抜け、
次の文に移行する。
continue
break
他の処理
他の処理
※当然、ある条件を満たした場合にのみ使わないと、
この2つの図の様にループなどに意味が無くなる。
§continue 文 & break 文
 教科書p87 ex223.c
1.
#include <stdio.h>
2.
3.
4.
5.
main()
{
int i;
6.
for (i = 0; i < 10; i++) {
if (i < 5) { ※continueもbreakもif文には関係しない!
continue; ※ i<5の時はループの最初に戻る!
} else if (i > 8) {
break; ※ i>8の場合はループから抜ける!
}
printf("%d\n", i);
}
7.
8.
9.
10.
11.
12.
13.
14.
15.
}
§goto 文 -I対応するラベルの位置へ、強制的に移行する。
制御構造が入れ子構造になっている場合
(while文やfor文等の中に、
更にwhile文やfor文を含むような場合)、
その内側から、一気に外に抜けることが出来る。
プログラムの可読性を著しく乱すため、
上記用法以外では可能な限り使うのを避ける。
文法
goto ラベル1 ;
ラベル1 :
※←「;」ではなく「:」に注意!
§goto 文 -II 教科書p89 ex224.c
1.
2.
3.
4.
#include <stdio.h>
main()
{
int i, j;
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
if (i < j) {
break;
} else if (i * j > 35) {
goto end;
}
printf("(%d, %d)", j, i);
}
printf("\n");
}
17.
18.
19.
end: ※ラベル、「:」に注意!
printf("\nend\n");
}
§ftpの使い方
anonymous ftpサーバからファイルを持ってくる。
 aplsrvky01%
・・・
 ncftp>
ncftp ftp.phys.ynu.ac.jp
※↑知能物理科のftpサーバ
cd pub/jisshu/primer
 ncftp> ls
 ncftp> get ファイル名
 ncftp> quit
・・・
 Save? (yes/no) no
※ディレクトリの移動
※ファイル一覧の表示
※ファイルのダウンロード
※ftpの終了
※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文だとかも。
来週からは柴田先生にバトンタッチ。
配列・文字列とかのお話。