• 検索結果がありません。

Microsoft PowerPoint - 4.pptx

N/A
N/A
Protected

Academic year: 2021

シェア "Microsoft PowerPoint - 4.pptx"

Copied!
22
0
0

読み込み中.... (全文を見る)

全文

(1)

while 文(1)

while 文(1)

• 繰り返しの必要性 hil ⽂の形式と動作 • while ⽂の形式と動作 • 繰り返しにより平⽅根を求める(演習) 繰り返しにより⽅程式の解を求める(課題) • 繰り返しにより⽅程式の解を求める(課題)

(2)

Hello.をたくさん表示しよう

Hello.を画面に3回表示するには,以下でOK. #i l d < tdi h> #include <stdio.h> int main() { printf("Hello.¥n"); printf("Hello.¥n"); printf("Hello.¥n"); p } は H ll を100回表示するにはどうしたら では,Hello.を100回表示するにはどうしたらいい? 勿論, printf("Hello ¥n"); printf( Hello.¥n ); を100個書けばいいのだが,そんな面倒なことはしたくない! これを実現するためには 繰り返しを使う 1 これを実現するためには,繰り返しを使う

(3)

while 文の形式と動作

形式

while ( 式 ) 文

動作

(1) 式を評価(計算)する.

(2) 式の値が真ならば文を実行し,(1) に戻る.

式の値が偽ならば while 文を終了する.

※ 文が複数の文から構成されるときは, if 文のときと同様に { }で囲む if 文のときと同様に,{ }で囲む.

(4)

繰り返しの際に良く使う式

変数 = 変数 + 1 ;

・・・ 変数に記憶している値を1増やす

(a)

変数 = 変数 - 1 ;

・・・ 変数に記憶している値を1減らす

(b)

ex. i=i+1; この代入文を実行すると… ① 右辺が計算される ① 右辺が計算される. 現在の i の値(i が記憶している値)に1加えた 値が右辺の値となる. ② 右辺 値を 左辺 変数 i に代入する これらの式はプログラムで非常によく使われるため 専用の表現があり ② 右辺の値を,左辺の変数 i に代入する. 結果として,この文を実行すると i の値が1増える. これらの式はプログラムで非常によく使われるため,専用の表現があり, (a)と同じ結果になるのが 変数++(たとえば i++) (b)と同じ結果になるのが 変数 (たとえば i ) 3 (b)と同じ結果になるのが 変数--(たとえば i--) この他にも,++i, --i があるが,上記との違いは参考テキストを参照.

(5)

Hello. を100回表示するプログラム(1/8)

#include <stdio h>

#include <stdio.h>

int main()

{

{

int i;

i = 0 ;

変数 i は繰り返しの実行回数を記憶

while(i < 100){

printf("Hello.¥n");

この2文を実行すると, 画面 H ll と表 され

i=i+1;

}

画面に Hello. と表示され, i の値が1増加.

}

(6)

Hello. を100回表示するプログラム(2/8)

#include <stdio h>

プログラムの実行過程

i に記憶されている値

#include <stdio.h>

int main()

{

0 i に記憶されている値

{

int i;

i = 0 ;

画面(Window)

while(i < 100){

printf("Hello.¥n");

i=i+1;

}

}

5

(7)

Hello. を100回表示するプログラム(3/8)

#include <stdio h>

プログラムの実行過程

i に記憶されている値

#include <stdio.h>

int main()

{

0 i に記憶されている値

{

int i;

i = 0 ;

画面(Window)

while(

i < 100

){

printf("Hello.¥n");

i=i+1;

}

}

i=0 ゆえ,繰り返しの条 件 i<100 は真 件 i<100 は真

(8)

Hello. を100回表示するプログラム(4/8)

#include <stdio h>

プログラムの実行過程

i に記憶されている値

#include <stdio.h>

int main()

{

1 i に記憶されている値

{

int i;

i = 0 ;

画面(Window)

while(i < 100){

printf("Hello.¥n");

Hello.

i=i+1;

}

}

7

(9)

Hello. を100回表示するプログラム(5/8)

#include <stdio h>

プログラムの実行過程

i に記憶されている値

#include <stdio.h>

int main()

{

1 i に記憶されている値

{

int i;

i = 0 ;

画面(Window)

while(

i < 100

){

printf("Hello.¥n");

Hello.

i=i+1;

}

}

i=1 ゆえ,繰り返しの条 件 i<100 は真 件 i<100 は真

(10)

Hello. を100回表示するプログラム(6/8)

#include <stdio h>

プログラムの実行過程

i に記憶されている値

#include <stdio.h>

int main()

{

2 i に記憶されている値

{

int i;

i = 0 ;

画面(Window)

while(i < 100){

printf("Hello.¥n");

Hello. Hello.

i=i+1;

}

}

9

(11)

Hello. を100回表示するプログラム(7/8)

#include <stdio h>

プログラムの実行過程

i に記憶されている値

#include <stdio.h>

int main()

{

100 i に記憶されている値

{

int i;

i = 0 ;

画面(Window) 100回実行したとき

while(i < 100){

printf("Hello.¥n");

Hello. Hello. Hello. 100回表示

i=i+1;

}

Hello. Hello.

}

(12)

Hello. を100回表示するプログラム(8/8)

#include <stdio h>

プログラムの実行過程

i に記憶されている値

#include <stdio.h>

int main()

{

100 i に記憶されている値

{

int i;

i = 0 ;

画面(Window)

while(

i < 100

){

printf("Hello.¥n");

Hello. Hello. Hello.

i=i+1;

}

Hello. Hello.

}

i=100 ゆえ,繰り返しの 条件 i<100 は偽 11 while 文終了 条件 i<100 は偽

(13)

指定数だけ Hello. と表示するプログラム

右のプログラムは,整 数を1つ読み込み,読 #include <stdio.h> int main() 数を1つ読み込み,読 み込んだ数だけ Hello.(+改行) を画面に表示するプロ int main() { int n; /* 表示回数を表わす */ int i; /* 繰り返しのカウント */ を画面に表示するプロ グラム. int i; /* 繰り返しのカウント */ /* 表示回数の入力 */ ri tf("何回表示しますか :"); printf( 何回表示しますか : ); scanf("%d",&n); / 表 / /* 表示 */ i = 0 ; while(i < n){ printf("Hello.¥n"); i=i+1; } }

(14)

演習: aの平方根を求める(1/2)

次頁の解説を参考にして,実数を1つ読み込み,この数の平方根を繰り 返しを用いて求めるプログラムを作ろう. 本演習では,繰り返しの回数は10回とし,各回で求まった平方根の近 似値を表示するようにすること. 実は,次頁で説明する方法は,ニュートン法という,方程式の数値計算 による一般的な解法を x*x-a=0 に特化したもの による 般的な解法を x*x a 0 に特化したもの. 13

(15)

演習: aの平方根を求める(2/2)

縦,横の長さがそれぞれ x, y の長方形(面積 a)を考える. • 最初は最初は,x a, y 1 であるとする.x=a y=1 であるとする • 毎回の繰り返しで,縦,横の長さを以下のように変更. このように変更すると,面積は a のままで,x, y は以前より近い値に なる(つまり 正方形に近づく) これを繰り返せば x y の値はそれ なる(つまり,正方形に近づく).これを繰り返せば,x, y の値はそれ ぞれ √a に近づく. a 面積 1

正方形 a 面積 a 正方形 面積 a

面積 a a+1 2 a

(16)

break 文,continue 文(1/2)

繰り返しの中(以下の図の の部分)で,break 文が実行されると, その時点で,while 文を強制的に終了する.

while(条件1) {

if(条件2) break;

}

[補足] continue 文 繰り返しの中(while文やfor文により繰り返し実行される文の中)で 繰り返しの中(while文やfor文により繰り返し実行される文の中)で, continue 文に出会う(continue 文を実行する)と,それ以降の文を無視 し,while 文であれば,次の繰り返しをするか否かの条件判定,for 文で あれば 次の繰り返しの準備(第6回の資料の「f 文の形式と動作」の 15 あれば,次の繰り返しの準備(第6回の資料の「for文の形式と動作」の 動作(3)のところ)に実行が移る.

(17)

break 文,continue 文(2/2)

#include <stdio.h> int main() { ex. 「2つの整数を入力し,その割 り算の答えを表示する」という { int x,y; printf("割り算をします¥n"); り算の答えを表示する」という ことを繰り返すプログラム. ただし,二つ目の数が0の場合, printf( 割り算をします¥n ); while(1){ printf("一つ目の数は:"); f("%d" & ); ただし, 目の数が の場合, 繰り返しを終了. scanf( %d ,&x); printf("二つ目の数は:"); scanf("%d",&y); { if(y==0){ printf("二つ目の数が0でしたので終わります¥n"); break; } printf("%d÷%d = %d¥n",x,y,x/y); } }

(18)

17

演習問題の修正版

break ⽂を使えば,先の演習問題を, x と y の更新の繰り返しは 100 回までで,その最中に, x-y < EPS になった場合は,繰り返しを強制終了する というようなことも可能.ただし, EPS は⼗分⼩さな正の数とする (たとえば 0 00001) (たとえば,0.00001).

(19)

繰り返しによる方程式の解法:二分法(1/3)

二分法は,ニュートン法と同様に,方程式の代表的な数値計算による 解法の一つ. 関数 f(x) が 区間 a≦x≦b で連続で,f(a) と f(b) が異符号 ならば,区間 a < x < b のどこかに f(x)=0 となる x が存在するは ず.計算の各繰り返しで,その区間幅を半分に狭めていくことにより 解を1つ求めるのが二分法 解を1つ求めるのが二分法. 今, f(a)とf(b)が異符号(つまり,f(x)=0 の解が存在する区間の下 限がa,上限が b )とする. 限 , 限 ) する a と b の中点 c(つまり,c = (a+b)/2 です)を考え,f(c)の符号に 関して次頁のように場合分けすると,解が存在する区間が狭まる(あ るいは解が見 かる) るいは解が見つかる).

(20)

繰り返しによる方程式の解法:二分法(2/3)

f(a) と f(c) が同符号 f(b) と f(c) が同符号 f(c)=0 f( ) y y y=f(x) y x a c b y=f(x) y x a c b y=f(x) y x a c b y=f(x) y y y y y x a c b x a c b y y x a c b 下限が c 上限が c 解が c a c y=f(x) a y=f(x) a c y=f(x) 下限が c 上限が c 解が c y y=f(x) f(a) と f(c) が同符号の場合でも 左図のように 区 19 x a c b f(a) と f(c) が同符号の場合でも,左図のように,区 間 a < x < c にも解がある場合があるが,解を1つも とめればいいので,この区間は考慮に入れない.

(21)

繰り返しによる方程式の解法:二分法(3/3)

以上より,区間 a<x<b における f(x)=0 の解を二分法で求めるには… 1 最初に条件として与えた区間の下限を a 上限を b に代入する 1.最初に条件として与えた区間の下限を a,上限を b に代入する. 2.f(a),f(b) の値を求め,これを変数 fa,fb に代入する. 3.区間の幅,すなわち,b-a が十分に小さくなる(一応,0.000001区間 幅,すなわち, 十分 さくなる( , 以下が十分に小さいとしよう)まで,while 文により,以下を繰 り返す. (1) と b の中点を求め に代入する また f( )の値 (1) a と b の中点を求め c に代入する.また,f(c)の値 を求めこれを変数 fc に代入する. (2) fc = = 0 ならば, ( ) ならば, break 文により while 文を終了. fa と fc が同符号ならば, a に c を代入し,fa に fc を代入する. それ以外,すなわち,fb と fc が同符号ならば, b に を代入し fb に f を代入する b に c を代入し,fb に fc を代入する.

(22)

課題 4 (二分法による方程式の解法)

二分法により, の解を区間 0 < x < 1 の範囲内で1つ求めるプログラムを作れ. f(0)=-2,f(1)=1 であり,勿論 f(x) は 0≦x≦1で連続であ るから,f(x)=0 の解は,0 と 1 の間,少なくとも一つあり, 二分法によって解の一つが求まることは保証されている ※ 二分法によって解の つが求まることは保証されている. f(a) の値を求め fa に代入するには,地道にやるならば, ※ fa=a*a*a*a-3*a*a*a+6*a*a-a-2; 本当はマクロ定義を利用して f(x) を定義し, fa=f(a); とできるが,マクロ定義については省略(参考テキスト参照). 21 x * y > 0 ならば,変数 x と y の値は同符号 ※

参照

関連したドキュメント

前章 / 節からの流れで、計算可能な関数のもつ性質を抽象的に捉えることから始めよう。話を 単純にするために、以下では次のような型のプログラム を考える。 は部分関数 (

絡み目を平面に射影し,線が交差しているところに上下 の情報をつけたものを絡み目の 図式 という..

が前スライドの (i)-(iii) を満たすとする.このとき,以下の3つの公理を 満たす整数を に対する degree ( 次数 ) といい, と書く..

※1・2 アクティブラーナー制度など により、場の有⽤性を活⽤し なくても学びを管理できる学

実際, クラス C の多様体については, ここでは 詳細には述べないが, 代数 reduction をはじめ類似のいくつかの方法を 組み合わせてその構造を組織的に研究することができる

議論を深めるための参 考値を踏まえて、参考 値を実現するための各 電源の課題が克服さ れた場合のシナリオ

づくる溶岩を丸石谷を越えて尾添尾根の方へ 延長した場合,尾添尾根の噴出物より約250

しかし , 特性関数 を使った証明には複素解析や Fourier 解析の知識が多少必要となってくるため , ここではより初等的な道 具のみで証明を実行できる Stein の方法