第7回 条件による繰り返し.

Slides:



Advertisements
Similar presentations
山元進.  for 文  while 文  do ~ while 文  文のネスト  break 文  continue 文.
Advertisements

1 第5回 配列. 2 今回の目標 マクロ定義の効果を理解する。 1次元配列を理解する。 2次元配列を理解する。 ☆2 × 2の行列の行列式を求めるプログラ ムを作成する.
7/10 if 文課題 力作が多くて感心! 演習1:キーボードから2つの整数を入力し、小さい方の数字を 表示せよ。
第6回条件による分岐.
ループで実行する文が一つならこれでもOK
プログラミング演習(1組) 第7回
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第4回 配列(2) 情報・知能工学系 山本一公
4章 制御の流れ-3.
第12回新しい型と構造体.
第13回構造体.
ファーストイヤー・セミナーⅡ 第8回 データの入力.
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
第12回構造体.
解析的には解が得られない 方程式を数値的に求める。 例:3次方程式
第2回ネットワークプログラミング 中村 修.
第10回関数2 (関数の利用と変数のスコープ).
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
第6章 2重ループ&配列 2重ループと配列をやります.
プログラミング入門2 第3回 繰り返し文 芝浦工業大学情報工学科 青木 義満
精密工学科プログラミング基礎Ⅱ 第3回資料 今回の授業で習得してほしいこと: 2次元配列の使い方 (前回の1次元配列の復習もします.)
第7回 条件による繰り返し.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
プログラミング演習 バージョン1 担当教員:綴木 馴.
プログラムの制御構造 選択・繰り返し.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
第9回関数と記憶クラス.
繰り返し計算 while文, for文.
関数の定義.
第4回簡単な計算・プリプロセッサ.
第10回関数 Ⅱ (ローカル変数とスコープ).
アルゴリズムとプログラミング (Algorithms and Programming)
高度プログラミング演習 (03).
第9回関数Ⅰ (簡単な関数の定義と利用) 戻り値.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
プログラムの制御構造 配列・繰り返し.
プログラミング言語論 第四回 理工学部 情報システム工学科 新田直也.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
情報基礎Ⅱ (第5回) 月曜4限 担当:北川 晃.
復習 一定回数を繰り返す反復処理の考え方 「ループ」と呼ぶ false i < 3 true i をループ変数あるいはカウンタと呼ぶ
疑似乱数, モンテカルロ法によるシミュレーション
プログラムの基本構造と 構造化チャート(PAD)
C言語ファミリー C# 高級言語(抽象的) Java オブジェクト指向 C++ C 機械語(原始的)
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
プログラミングⅡ 第2回.
復習 Cにおけるループからの脱出と制御 break ループを強制終了する.if文と組み合わせて利用するのが一般的. continue
復習 if ~ 選択制御文(条件分岐) カッコが必要 true 条件 false 真(true)なら この中が aを2倍する 実行される
第5章 まだまだ続く反復処理!! ~繰り返しその2 for~
ニュートン法による 非線型方程式の解.
プログラミング基礎演習 第4回.
ループだよ!難しいよ! 第5章 while(ループ);.
Cプログラミング演習 ニュートン法による方程式の求解.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
関数と再帰 教科書13章 電子1(木曜クラス) 2005/06/22(Thu.).
第3回簡単なデータの入出力.
第10回 関数と再帰.
プログラミング1 プログラミング演習I 第2回.
プログラミング入門2 第5回 配列 変数宣言、初期化について
第4回 配列.
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
復習 いろいろな変数型(2) char 1バイト → 英数字1文字を入れるのにぴったり アスキーコード → 付録 int
情報処理Ⅱ 第3回 2004年10月19日(火).
情報処理Ⅱ 2006年10月20日(金).
C言語講座 四則演算  if ,  switch 制御文.
分岐(If-Else, Else if, Switch) ループ(While, For, Do-while)
第5回 配列.
知能情報工学演習I 第10回( C言語第4回) 課題の回答
プログラミング演習I 補講用課題
= 55 課題6-1 #define _CRT_SECURE_NO_WARNINGS
Presentation transcript:

第7回 条件による繰り返し

今回の目標 アルゴリズムの基本となる制御構造(順次、分岐、反復構造)を理解する。 繰り返し(反復構造、ループ)を理解する。 ループからの様々な終了の方法を理解する。 繰り返しを用いたアルゴリズムに慣れる。 ☆ニュートン法を用いた平方根の計算プログラムを作成する。

ニュートン法 の解 を数値計算で求める方法

ニュートン法による平方根の計算 は の解なので、

プログラムの制御構造 順次構造 選択構造 反復構造 (分岐構造) (連接構造) (繰り返し構造) A B B’ C C B A A 条件 の順序で実行される (反復回数は条件で制御) の順序で実行される の順序で実行される 基本的な制御構造は、この3種類だけ

繰り返し 条件(論理式)が真の間繰り返す。 主に、while文を用いると良い。 回数を指定して繰り返す。 主に、for文を用いると良い。(第8回で詳しく扱う。) C言語では、主にこの2つの文を用いて繰り返しを 記述する。

while文 式(論理式)が真である間、命令を繰り返し実行する。 式:反復を続ける条件 を表す論理式 書式 while(式) { 反復実行部分 } while文のフローチャート1 while文前 while(式) { while文 式の値が 真のとき 繰り返す 式:反復を続ける条件   を表す論理式 反復実行部分 } while文後

whileループのフローチャート 繰り返し文をループと呼ぶ事もある。 while文のフローチャート1 while文のフローチャート2 { 式 偽 真 反復実行部分 反復実行部分 } while文後 while文後

練習1 /*while 文実験1 while_test.c コメント省略 */ #include<stdio.h> int main() { int a; a=1; /* 最初の一回を必ず実行するため真値を代入*/ printf("実験開始 \n"); while(a) printf("aの値は0以外(真)です。\n"); printf("1(真)か0(偽)を入力して下さい。\n"); scanf("%d",&a); } printf("aの値が0(偽)になりました。\n”); printf("実験終了\n"); return 0;

繰り返しを回数で決めるには(while文) ループカウンタを用いるとよい。 1.ループカウンタを整数型で 用意する(宣言する)。 2.while文直前でループカウンタを 0に初期化する。 3.while文の論理式を ループカウンタ < 望む回数 とする。 4.while文の反復実行部分最後   (右中括弧の直前)で、 ループカウンタをインクリメントする (1増やす)。

典型的な書き方 #define LOOPMAX 100 ・ int main() { int i; /*ループカウンタ*/ i=0; /* ループカウンタの初期化*/ while( i < LOOPMAX) /*条件判断*/ i++; /*ループカウンタのインクリメント*/ }

無限ループとその停止 終わらないプログラムの代表として、無限ループがある。 いろいろなプログラムを作る上で、 無限ループを知っていなければならない。 無限ループの書き方 while(1) { } プログラムが終わらないときには、 それでも 終わらないときは、 教員に相談 プログラムを実行しているkterm上で、 コントロールキーを押しながら、cキーを 押す。(C-c)

練習2 /* infty_loop.c 無限ループ実験(コメント省略) */ #include<stdio.h> int main() { printf("無限ループ実験開始 \n"); while(1) printf("*\n"); printf("**\n"); printf("***\n"); printf("****\n"); printf("*****\n"); printf("******\n"); } printf("常に実行されない。\n"); return 0;

break文 反復実行部分内で用い、breakに出会うと繰り返し文が 終了する。(次の実行は、ループを閉じる右中括弧直後から) 書式 while( 式) { 反復実行部分内のどこか (break;) } ループ前 式 反復実行部分 break; ループ後

break文の典型的な使い方 ループ前 典型的な使い方 式1 while( 式1) { 真 反復実行部分1 if(式2) break; } 反復実行部分2 真 反復実行部分1 式2 真 偽 break; 反復実行部分2 2つの条件(式)でループが終了 するので注意して使うこと。 ループ後

continue文 反復実行部分内で用い、continue文に出会うと 次の繰り返しを実行する。(for文の場合、式3は実行される。) 書式 ループ前 while(式) { 反復実行部分内のどこか (continue;) } 式 反復実行部分 continue; ループ後

continue文の典型的な使い方 典型的な使い方 ループ前 while(式1) { 式1 反復実行部分1 if(式2) 真 } 反復実行部分2 式1 真 反復実行部分1 continue; 式2 偽 真 反復実行部分2 ループ中に反復実行文2を 実行するか選択できる。 ループ後

continue文とbreak文 ループ前 ループ前 反復実行部分 反復実行部分 break; continue; ループ後 ループ後

return文 main関数で、return文を実行すると、 プログラムが終了する。 (詳しくは、第9回の関数で説明。) ****.c プログラムを終了して OSに処理を戻す。 return 0; 最後でなくても、プログラムを終了させられる。 (エラーチェック等で使うと良い。)

平方根を求めるプログラム /* 作成日:yyyy/mm/dd 作成者:本荘太郎 学籍番号:B0zB0xx ソースファイル:mysqrt.c 説明:ニュートン法を用いて平方根を求めるプログラム。 近似値の階差の絶対値がEPS(1.0e-5)より小さいときに 終了する。(繰り返し回数がLOOPMAX(1000)回に達しとき にも終了する。) 数学関数を用いるので、-lmのコンパイルオプションが必要。 入力:標準入力から1つの実数を入力する。(正、0、負いずれも可) 出力:入力の平方根が実数の範囲で存在するとき、          標準出力にその平方根を出力する。 入力の平方根が実数でないとき、          標準出力にエラーメッセージを出力する。 */ /* 次のページに続く */

#include <stdio.h> #include<math.h> /*マクロ定義*/ #define EPS (1.0e-5) /*微小量、収束条件 */ #define LOOPMAX 1000   /* 繰り返しの上限値*/ int main() { /* 変数宣言 */ double input; /* 入力される実数,ニュートン法の初期値*/ double old_x; /* 漸化式の右辺で用いるx*/ double new_x; /* 漸化式の左辺で用いる変数x*/ double sa; /* 階差の絶対値*/ int kaisuu; /*繰り返し回数*/ /* 次ページへ続く */

/* 入力処理*/ printf("平方根を求めます。\n"); printf("正の実数を入力して下さい。\n"); scanf("%lf",&input); /*入力値チェック*/ if(input ==0.0) { /*input=0.0のときは、明らかに0が平方根*/ printf("%6.2f の平方根は%6.2fです。\n”,input,0.0); return 0; } else if(input<0.0) { /*inputが負のとき*/ printf("負の数なので、実数の平方根はありません。\n"); return -1; /* これ以降では、inputは正の実数*/ /*次のページに続く*/

/*ニュートン法の初期設定*/ old_x=input; /*ニュートン法の初期値をinputに設定*/ new_x=0.0; sa=fabs(new_x-old_x); kaisuu=0; /*繰り返し処理*/ while(sa > EPS)/*階差がEPSより大きい間繰り返す*/ { printf("x%d = %15.8f \n",kaisuu,old_x);/*途中表示*/ new_x=(old_x+input/old_x)/2.0; /*漸化式*/ sa=fabs(new_x-old_x); /*階差の絶対値*/ /* 次の繰り返しのための処理 */ old_x=new_x; kaisuu++; if(kaisuu>=LOOPMAX) { /*繰り返し回数の上限を超えたので終了する*/ break; } /*次のページに続く*/

/* 続き */ /*出力処理/ printf("%6.2f の平方根は%15.8fです。\n”,input,new_x); return 0; }

実行例1 $./mysqrt 平方根を求めます。 正の実数を入力して下さい。 2.0 x0= 2.00000000 2.00の平方根は 1.41421356です。 $

実行例2 実行例3 $./mysqrt 平方根を求めます。 正の実数を入力して下さい。 0.0 0.00の平方根は 0.00です。 $ 0.00の平方根は 0.00です。 $ 実行例3 $./mysqrt 平方根を求めます。 正の実数を入力して下さい。 -1.0 負の数なので、実数の平方根はありません。 $