Structured programming

Slides:



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

プログラミング Ⅱ 第2回 第1回(プログラミングⅠの復 習) の解説. プログラムの作り方 いきなり完全版を作るのではなく,だんだ んふくらませていきます. TicTa cToe1.
オブジェクト指向 言語 論 知能情報学部 新田直也. 講義概要  私の研究室: 13 号館 2 階 (13-206)  講義資料について :  参考図書 : 河西朝雄 : 「原理がわかる プログラムの法則」,
7/10 if 文課題 力作が多くて感心! 演習1:キーボードから2つの整数を入力し、小さい方の数字を 表示せよ。
C言語によるプログラミングスタイル 制御システム工学科 山北 昌毅.
ループで実行する文が一つならこれでもOK
4章 制御の流れ-3.
情報理論2 注意!! 11月26日(火)は休講 (小林が学会出張のため) 湘南工科大学情報工学科 准教授 小林 学 湘南工科大学
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
VBA H106077 寺沢友宏.
多重ループ 繰り返し構造:補足事項 第8回目 [6月8日、H.16(‘04)] 本日のメニュー 1)前回の課題について
多重ループ 繰り返し構造:補足事項 第8回目 [6月12日、H.15(‘03)] 本日のメニュー 1)前回の課題について
第2回ネットワークプログラミング 中村 修.
プログラミング序論演習.
プログラムの正当性(2) 正当性証明の基本原理
§3.3 プログラミング 第10回 今日の目標 高級言語のプログラムを実行するまでの過程を示せる インタープリタの仕組みを説明できる
Semantics with Applications
言語処理系(9) 金子敬一.
オブジェクト指向 プログラミング 第一回 知能情報学部 新田直也.
プログラミング入門2 第2回 複合文、繰り返し 情報工学科 篠埜 功.
第7回 条件による繰り返し.
§3.3 プログラミング 第10回 今日の目標 高級言語のプログラムを実行するまでの過程を示せる インタープリタの仕組みを説明できる
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
情報処理Ⅱ 第2回 2007年10月15日(月).
繰り返し計算 while文, for文.
最適化の方法 中田育男著 コンパイラの構成と最適化 朝倉書店, 1999年 第11章.
電気・機械・情報概論 VBAプログラミング 第2回 2018年7月2日
地域情報学演習 VBAプログラミング 第3回 2017年10月24日
アルゴリズムとプログラミング (Algorithms and Programming)
コンピュータに計算させる命令を確かめよう!
04: 式・条件分岐 (if) C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと
第7回 条件による繰り返し.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
データ構造とアルゴリズム論 第1章 アルゴリズムの表現-流れ図
プログラミング言語論 第4回 文の翻訳 C言語の文 表明 Hoare論理
高度プログラミング演習 (05).
プログラムの制御構造 配列・繰り返し.
プログラミング言語論 第四回 理工学部 情報システム工学科 新田直也.
PADのテンプレート 処理、連接 x0 ← x x ← x0+ u(x0) err ← |x - x0| 判断(選択) x2 ← x3
PADのテンプレート 処理、連接 x0 ← x x ← x0+ u(x0) err ← |x - x0| 判断(選択) x2 ← x3
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
プログラムの正当性(2) 正当性証明の基本原理
プログラミング言語論 第7回 文の翻訳 C言語の文 表明 Hoare論理
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
復習 一定回数を繰り返す反復処理の考え方 「ループ」と呼ぶ false i < 3 true i をループ変数あるいはカウンタと呼ぶ
プログラムの基本構造と 構造化チャート(PAD)
実践ロボットプログラミング LEGO Mindstorms NXT で目指せロボコン! WEB: 著者:藤吉弘亘,藤井隆司,鈴木裕利,石井成郎
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
プログラミングⅡ 第2回.
復習 Cにおけるループからの脱出と制御 break ループを強制終了する.if文と組み合わせて利用するのが一般的. continue
C#プログラミング実習 第2回.
復習 if ~ 選択制御文(条件分岐) カッコが必要 true 条件 false 真(true)なら この中が aを2倍する 実行される
プログラミング言語論 第4回 文の翻訳 C言語の文 表明 Hoare論理
プログラミング言語論 第4回 文の翻訳 C言語の文 表明 Hoare論理
プログラミング基礎演習 第4回.
pf-2. 条件分岐 (Python プログラミング基礎を演習で学ぶシリーズ)
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
オブジェクト指向言語論 第一回 知能情報学部 新田直也.
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
プログラミング序論演習.
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
PADのテンプレート 処理、連接 x0 ← x x ← x0+ u(x0) err ← |x - x0| 判断(選択) x2 ← x3
知能情報工学演習I 第11回(後半第5回) 課題の回答
復習 いろいろな変数型(2) char 1バイト → 英数字1文字を入れるのにぴったり アスキーコード → 付録 int
情報処理Ⅱ 第3回 2004年10月19日(火).
情報処理Ⅱ 2006年10月20日(金).
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
アルゴリズム ~すべてのプログラムの基礎~.
= 55 課題6-1 #define _CRT_SECURE_NO_WARNINGS
プログラミング 2 静的変数.
Presentation transcript:

Structured programming 2 ソフトウェア工学 Software Engineering 構造化プログラミング Structured programming

GO TO 文 GO TO 文:機械語の分岐命令に対応した制御文 (flowchart) ■2 の N 乗を計算する流れ図 START (初期の頃の) BASIC言語のプログラム READ N X←1 10 READ N 20 LET X=1 30 IF N=0 THEN GOTO 70 40 LET X=2*X 50 LET N=N-1 60 GOTO 30 70 PRINT X 80 END N=0 true false X ← 2*X N ← N-1 PRINT X END

スパゲティ・プログラム (spaghetii program) スパゲティ・プログラム GO TO 文を不規則に用い,流れ図の線が交差し, プログラムの全体を把握しにくいプログラム START END

GO TO 文有害説 (ダイクストラ, 1968) E. Dijkstra: Go To Statement Considered Harmful, Communications of the ACM, vol. 11, no. 3, pp.147-148, 1968.

Structured programming 構造化定理 どんな流れ図も, 3つの基本構造  順次 (sequence)  選択 (selection)  反復 (iteration) の組合せにより,等価な   構造化流れ図 (structured flowchart) に変換できる. GO TO 文の使用制限 ○ 流れ図の線の交差なし ○ 出入り口が1カ所 構造化プログラミング Structured programming

3つの基本構造 順次 (sequence) 選択 (selection) 反復 (iteration) C S1 S2 true false S1 S2 If C then S1 else S2 S C true false while C do S S1 S2 S1; S2 構造化プログラミング言語

構造化流れ図 S, S1, S2自体に,基本構造を入れ子的に埋め込んだ流れ図 S1 S2 順次 C S1 S2 流れが合流 選択 S C 反復 出口が1つ false false true true 出入口はそれぞれ1カ所 流れを表す線が交差しない (数学的に証明できる)

構造化流れ図の例 S1 順次(の第2ブロック)に反復を埋め込み C1 false C2 S2 S3 true 反復(の本体)に選択を埋め込み

構造化プログラムへの変換 ループの途中に出口 ループの最初に出口 true true false false BODY END? INPUT while .. do … true true false false

やや複雑な変換 Use a flag while .. do .. if .. then .. else .. A C1 or Flag Flag←false B Flag←true Flag D Use a flag while .. do .. C1 true true false false false A D true C2 true if .. then .. else .. true false false B 必ずしもわかりやすくなるわけではない

現実には後判定反復も許す 前判定反復 後判定反復 C S S C repeat S until C while C do S false true S true false while C do S あるいは do S while !C Sは0回以上実行される Sは1回以上実行される

現実には return文も許す return 文: 関数の出口に飛ぶ特別な GO TO 文 S1 S1; if C then return; true END false S2 if 文の枝分かれが合流せず 出口が2カ所以上となるが 制御構造はあまり複雑化しない

break文も許す break 文: ループの出口に飛ぶ特別な GO TO 文 while C1 do C1 S1; if C2 then break; S2; false true S1 C2 true ループからの出口が2カ所以上になるが 制御構造はあまり複雑化しない false S2

構造の視覚的表現(1/6) NSチャート BASIC によるプログラム input m,n while m≠n m←m-n n←n-m プログラムの構造をビジュアルにわかりやすくする 【例】最大公約数を求めるプログラム NSチャート (Nassi-Shneiderman diagram) BASIC によるプログラム input m,n while m≠n m←m-n n←n-m print m input m,n while m<>n if m>n then let m=m-n else let n=n-m end if end while print m m > n yes no 積み木のような表現

木構造により表現 (日本人が考案し世界標準化) 構造の視覚的表現(2/6) PAD (Problem Analysis Diagram) Pascal によるプログラム read(m,n) read(m,n); while m<>n do if m>n then m=m-n else n=n-m; print(m); m=m-n m ≠ n m>n n=n-m print(m) 木構造により表現 (日本人が考案し世界標準化)

構造の視覚的表現(3/6) 字下げ C 言語によるプログラム int main(void){ scanf(”%d %d”, &m, &n); (indentation) 細かな流儀がいろいろ。一貫して使うこと。 C 言語によるプログラム int main(void){ scanf(”%d %d”, &m, &n); while(m!=n){ if(m>n){ m=m-n; } else{ n=n-m; printf(”%d\n”, m); 良い例

構造の視覚的表現(4/6) C 言語によるプログラム int main(void){ scanf(”%d %d”, &m, &n); while(m!=n){ if(m>n){ m=m-n; } else{ n=n-m; printf(”%d\n”, m); 悪い例

構造の視覚的表現(5/6) 字下げが意味を持つプログラミング言語もあるので注意! Python によるプログラム while m!=n: if m>n: m=m-n else: n=n-m print m while m!=n: if m>n: m=m-n else: n=n-m print m print m 実行のタイミング while文の終了後 if文のelse部

構造の視覚的表現(6/6) 小学生などのプログラミング教育用 (GUIで積み木を組み立てる) Scratch

演習問題 2 つぎのCプログラムの構造を NSチャート PAD 字下げ により,それぞれ表示しなさい。 int print_id(char line[ ], int start){ while((start < strlen(line)) && !alpha(line[start])) start++; if(start >= strlen(line)) return -1; else {printf("%c", line[start]); start++; while((start < strlen(line)) && (alpha(line[start])||num(line[start]))){ printf("%c", line[start]); start++;} printf("\n"); return start; }}