sot06v2 最近の更新履歴 城西国際大学_経営情報学部_組織情報論2017

22 

Loading....

Loading....

Loading....

Loading....

Loading....

全文

(1)

組織情報論

6

回 アルゴリズムとデータ構造

2

フローチャートとプログラムの基本 続き

1

講師 佐枝三郎

https://sites.google.com/site/jiusaedasoshikiron2017/

フローチャート

(2)

3

(3)

処理の構造 ①順次構造

Python

の例

例:( 100 + 200) / 10 を計算し、すべての変数の内

容を表示する

① x = 100 # xに100を代入

② y = 200 # yに200を代入

③ z = ( x + y ) / 10 # zに(x+y)/10を計算し代入

④ print x,y,z # x,y,zを表示

処理1

処理2

処理3

処理4

開始

終了

5

処理の構造 ②選択構造(分岐構造)

Python

の例

例:0から1の間の乱数を発生させ、その値が 0.5未満の場合はyをxの10倍、0.5以上の

場合はyをxの10分の1にし、表示する

① x = random.random() #乱数発生

if x < 0.5: # xが0.5未満

② y = x * 10

print x,y # x,yを表示

else: # xが0.5以上

③ y = x / 10

print x,y # x,yを表示

処理3

処理2

条件

Yes

No

開始

終了 処理1

(4)

処理の構造 ③多岐選択構造

(case)

Python

の例

例:0から80までの数を発生させ、その値16未満は

子供、16-65は大人、65以上は高齢者と、年齢

と共に表示する

① x = random.random() * 80 #乱数で年齢を発生

if x < 16: # xが16未満

② print x, ‘歳 子供です’

if x < 65: # xが65未満

③ print x, ‘歳 大人です’

else: # xが65以上

④ print x, ‘歳 高齢者です’

処理2

条件1

条件

処理3 処理4

条件2

条件3

開始

終了 処理1

7

処理の構造 ④繰返し構造

(while)

Python

の例

○whileはループに入る最初で、定義された条件が

真であるかを評価し、真の場合のみ処理を行う

例: 1から10までの数を加算し、合計を計算する

① sum = 0 #集計用変数を初期化

i = 0 #カウント用変数を初期化

while i < 10: #10未満の間、処理を行う

i = i + 1 # i に1を加える

sum = sum + i # sum にiを加える

print i,sum # 中間結果表示

③ print ‘合計値は’, sum # 集計値表示

処理2 ..

処理1

条件

Yes No

開始

終了 処理3

(5)

処理の構造 ④繰返し構造

(until)

プログラム例

○untilはループから出る最後に、定義された条件

が真であるかを評価し、真の場合にループを抜け 出し、偽の場合は処理を行う

○Pythonには、untilループは定義されていないが、

whileとifとbreakを使ってuntilを記述できる

例:1から10までの数を加算し、合計を計算する

① sum = 0

i = 0

while True:

② i = i + 1

sum = sum + i print i,sum

if i >= 10: break

③ print ‘合計値は’, sum

処理2 ..

処理1

条件

Yes No

開始

終了 処理3

9

変数と配列の関係

変数

– Pythonなどの言語では、コンピュータのメモリ

上のある番地の領域に名前をつけて、その 名前でその領域の内容を参照する、あるい は値の書き込みをする

– この領域のことを変数と呼ぶ。

– 変数の内容は、数値、文字列、あるいは別の

変数が格納されている領域の番地でもよい

• 配列

– 配列は複数の変数の順序づけられた集合で

ある

– 中身の参照や書き込みは、順序の番号(添

字という)で行う

• x[1] = 100 y = x[5]

– 配列は複数の次元を設定できる

• 1次元の場合はベクトルという(EXCELの一列) • 2次元の場合はマトリックスという(ECXELの表)

– 原理的にはn次元まで定義できる

– 配列の内容は、数値、文字列、あるいは別の

変数が格納されている領域の番地でもよい

– Pythonの配列はリストで表現されている

1 2 3 4 5

1次元配列(ベクトル)

1 2 3 4 5

2次元配列(マトリックス)

1 2 3

(6)

ファイルの入出力とメモリー

データの操作手順

データは外部から、コンピュータのメモリーに読み込まれる。入

力する方法は次の通り

• キーボードやタッチパネルから人間が入力 • ファイルなどの外部記憶媒体から入力

• ネットワークを通じて、他のシステムやセンサーなどから入力

外部ファイルには

2

種類ある

• レコードという複数データをまとめた単位を、順番に読むシークエン

シャルファイル

• レコードという複数データをまとめた単位を、ほしいデータの場所を指

定して読むランダムファイル

記憶領域に投入されたデータをコンピュータが計算し、計算結

果が記憶領域に格納される

• 変数や配列は記憶領域の中に定義される

計算結果は、外部の媒体に出力される

• ディスプレーの画面などに表示される

• 用紙に表などの形で印刷され、印刷結果を人間が利用する

• ネットワークを通じて、他のシステムなどに送信される 11

ファイルの入出力とメモリー

12

1100 荒木一郎 57 72 90

1101 新井二郎 95 85 67

1102 麻生三郎 35 56 15

1103 青山四郎 91 95 90

1104 浅沼五郎 45 68 76

1105 相生六郎 85 68 72

1106 赤坂七郎 58 68 42

1107 天沼八郎 82 93 65

1108 淡路九郎 86 90 94

1109 飯田茂 46 64 71

1110 生田与一 54 68 70

1111 池澤春樹 36 18 29

1112 池尻勉 67 56 73

1113 飯塚富雄 78 91 83

1114 石鍋良吉 71 69 57

1115 石塚信二 90 92 84

外部のシークエンシャルファイル (試験の採点結果データ)

1100 荒木一郎 57 72 90

1101 新井二郎 95 85 67

1学年 平均点 78.5 62.4 65.9

計算などの処理

(7)

フローチャートの例題 ①順次探索

キーとデータの組み合わせのテーブルがあり、そこから探

索するキーに対応するデータを取り出す。

例えば学籍番号と氏名、住所、電話番号の配列があるとす

る。

キーは順番に並んでいないものとする。

学籍番号(Key) 氏名(Name) 電話番号(Tel)

BG2011-001 山田太郎 043-23-1240

BG2010-540 西田勉 043-23-4430

BG2011-080 今田聡 043-23-5362

BG2010-090 上杉幹夫 043-23-3241

BG2011-510 木村俊樹 043-23-4701

BG2010-410 新藤進 043-23-5288

13

フローチャートの例 ②順次探索 フロー図

開始

終了

学籍番号を 入力

Key(i)に対応する 氏名、電話番号

Name(i),Tel(i) を出力

i ← 1

i > n

Key(i) = 学籍番号

i ← i + 1

Yes No

配列にはないこと を出力

nはテーブルの最大の行数 iは、作業用の変数

(8)

順次探索の

Python

プログラム

key = ['BG2011-001','BG2010-540','BG2011-080','BG2010-090','BG2011-510','BG2010-410']

name = ['山田太郎','西田勉','今田聡','上杉幹夫','木村俊樹','新藤進']

tel = ['043-23-1240','043-23-4430','043-23-5362','043-23-3241','043-23-4701','043-23-5288']

num = input('学籍番号を入れなさい')

print ' ' n=6 i=0

while i<n:

print key[i],name[i],tel[i] if key[i] == num:

print '氏名',name[i],'電話番号',tel[i] break

i=i+1 if i==n:

print '¥nこの学籍番号はありません' 15

フローチャートの例題 ②試験の採点

ある講義科目の試験受験者の成績表がある。表には学籍番号、氏名、出席

回数、成績が並んでいる (但し受験者はN人とする)

試験を受けなかった学生は、成績(test)の欄が「-」と表示されている。 単位合格の条件は、試験を受験し、試験受験者の平均点以上で、かつ欠席

回数が3回以下となっている (但し講義回数は15回)

この表の合格欄(success)に、「合格」あるいは「不合格」を書き込む(設定す

る)プログラムのフローチャートを作りなさい。

変数としては、以下を用いる。

受験者数の集計値:number 成績点数の集計値:sum 平均値の結果:avg 配列の番号(添え字):i

表の各項目は英語タイトルで表現する

1番目の学生の成績を、変数xに入れる場合は x ← test(1) 2番目の学生を合格とする場合は success(2) ← 「合格」

(9)

試験の成績表

NO 学籍番号

(Key)

氏名

(name)

出席回数

(count)

成績 (test)

合格

(success)

1 BG2014-601 芦田太郎 10 64

2 BG2014-701 今田聡 7 -

3 BG2015-602 西田勉 15 41

: ・・ ・・ ・・ ・・

84 BG2016-710 木村俊樹 12 86

85 BG2016-840 広田利一 14 92

86 BG2017-604 浅沼弘樹 9 -

87 BG2017-612 内田俊夫 13 75

88 BG2017-703 新藤進 14 51

この欄に「合格」、あるいは 「不合格」の文字を入れる

例えば

不合格 不合格 不合格

合格 合格

合格 不合格

不合格

17

フローチャート作成の考え方

大きく、二つの作業がある

最初に試験受験者の平均点を求める必要がある

そのためには、以下の作業が必要

– 試験受験者の人数を数える

– 試験受験者の成績を集計する

– 平均点の計算をする

試験受験者であることは、どうしたら分かるか?

次に各学生の合格、不合格を判定する必要がある

合否の判定条件は何か?

各学生の合格欄に値を設定するためには、どうしたらよい

か?

(10)

まず、全体を大きな処理に分ける

19

試験受験者の成績合 計と人数を計算する

試験受験者の平均点 を計算する

履修者の出席状況と 試験結果を評価し合

格判定をする

試験受験者の成績合計と人数を計算する

まず、成績を集計する変数と受験した人数を集計する

変数を決め、初期化する

順番に成績表を調べるためのインデックスを決め初

期化する

成績表を調べる

表の最後を超しているか

• 越していれば、この処理は終わり • 越していなければ、次の作業を行う

試験を受験しているか

• 受験していれば、成績と人数(1)を集計する変数に加える • 受験していなければ、何もしない

次の行の学生に進む

• インデックスに1を加える

(11)

21

開始

sum ← 0 number ← 0

test(i) = “-” i ← i + 1

Yes No i ← 0

sum ← sum + test(i) number ← number + 1

i > N

Yes

No

sum:成績の集計用変数

number:人数の集計用変数

i:成績表の行を数えるインデックス

N:成績表の人数

test(i):成績表の点数 未受験者

は「-」

終了

試験受験者の平均点を計算する

成績の集計結果と受験した学生の人数でじぇ

けん者の平均点を計算する

(12)

23

開始

avg ← sum / number sum:成績の集計用変数

number:人数の集計用変数

avg:試験受験者の平均点

終了

履修者の出席状況と試験結果を評価し

合格判定をする

順番に成績表を調べるためのインデックスを決

め初期化する

成績表を調べる

表の最後を超しているか

越していれば、この処理は終わり

越していなければ、次の作業を行う

次の行の学生に進む

インデックスに1を加える

単位合格の条件を満たしているか

• 試験を受験し、試験受験者の平均点以上で、かつ欠席回数が3回以

下となっている

• 満たしていれば、「合格」 • 満たしていなければ「不合格」

(13)

25

開始

i ← i + 1

Yes No i ← 0

i > N

Yes

No

sum:成績の集計用変数

number:人数の集計用変数

i:成績表の行を数えるインデックス

N:成績表の人数

test(i):成績表の点数 未受験者

は「-」

終了

test(i) >= avg かつ coount(i) >= 12 か

success(i) ←「合格」 success(i) ←「不合格」

この問題の概要フローチャート

26

試験受験者の成績合 計と人数を計算する

試験受験者の平均点 を計算する

履修者の出席状況と 試験結果を評価し合

格判定をする

開始

(14)

27 開始

sum ← 0 number ← 0

test(i) = “-” i ← i + 1

Yes No i ← 0

sum ← sum + test(i) number ← number + 1

i > N Yes

No

avg ← sum / number

i ← i + 1

Yes No i ← 0

success(i) ←「不合格」 i > N Yes

No test(i) >= avg かつ count(i) >= 12 か

success(i) ←「合格」

終了 フローチャート

回答例

PAD

Problem Analysis Diagram

PAD

はフローチャートと同様に、プログラムやアルゴリズムの論理

構造を図示する方式の一つ。

PAD

1980

年代に、日本でソフトウェア開発の現場で考えられた

図化方式である。

PAD

の利点

– フローチャートは、処理手順のイメージを、考えながら図解するやり

方。試行錯誤のプロセスに使いやすい。しかしフローの戻りが多い 時や、複雑で込み入った流れであると、それを他人が見て理解する ことが難しくなる。

– PADは、処理の流れを二次元に整理し、フローが戻ることがない。複

雑であれば、横に展開するので他人にも理解しやすいものとなる。

– PADは作成されるプログラミング言語の構造に近く、PADを見てプロ

グラミングすることは容易である。

– PADは、フローチャートよりも構造化プログラミングに適している。

(15)

PAD

の記述法

① 順次構造

②選択構造

③多岐選択構造

開始

終了 処理1

処理2

処理3

開始

終了

処理1

処理2

条件

開始

終了

処理1

処理3

条件1

条件2

条件3

処理2 Yes

No

29

PAD

の記述法

④ 繰返し構造

(while)

⑤繰返し構造

(until)

開始

終了

処理1 while

i < 10

開始

終了

処理1 until

i > 10

(16)

フローチャートの例 ①条件付き集計

PAD

while i < 20

開始

終了

sum ← 0

i ← 0

sum ← sum + i

iは2の倍数?

No

Yes

PADは、構造化プログラミングの フローチャートであるため、前に戻る 線の記述(goto)がない

そのため、whileを使用する

31

フローチャートの例 ①順次探索

PAD

開始

終了

while i < N If key(i) =

学籍番号

Yes

学籍番号を入力

i ← 1

key(i)に対応する 氏名、電話番号

name(i),tel(i) を出力

keyにはないこと を出力

終了

No

(17)

フローチャートの例 ②合格判定

PAD

開始

終了

while i < N

test(i) = “-” Yes sum , number, i ← 0

sum ← sum+test(i) number ← number + 1 No

33 i ← i+ 1

success(i) ←「不合格」

success(i) ←「合格」

while i < N

test(i) >= avg かつ

count(i) >= 12 か Yes

No i ← i+ 1

avg ← sum / number i ← 0

PAD

フローチャートの演習問題

試験の最高得点と最低得点

問題

– ある高校の3年生のテストで、英語、国語、数学の3科目のテストを行っ

た。クラスはA組からE組まであり、各組40人の生徒がいる。各組で3科

目の合計点数が最高の生徒と、最低の生徒の氏名と成績を一覧表に するフローチャートをPADで作成してください

– 試験結果の成績表の配列。表は組、学生番号の小さい順に並んでいる

34

学生番号 学生番号 学生番号 学生番号 (Number)

組 組 組 組 (Class)

氏名 氏名 氏名 氏名 (Name)

英語 英語 英語 英語 (Eng))))

国語 国語 国語 国語 (Jap)

数学 数学 数学 数学 (Math)

101 A 会田一郎 85 74 68

102 A 池澤夏樹 54 72 61

103 A 富田太郎 95 63 85

・・・・・・

204 B 新藤兼人 35 57 66

205 B 須賀巧 87 67 81

206 B 副島次郎 62 75 86

(18)

PAD

フローチャートの演習問題

試験の最高得点と最低得点

結果としてほしい表

35

組 組 組 組 ( ( (

(rClass)

区別 区別 区別 区別 ( ( ( (HL)

氏名 氏名氏名 氏名 (rName)

英語 英語 英語 英語 (rEng)

国語 国語 国語 国語 ( ( ( (rJap)

数学 数学 数学 数学 (rMath)

合計 合計合計 合計 rTotal)

A 最高点 会田一郎 85 74 68 227

A 最低点 池澤夏樹 54 72 61 187

B 最高点 須賀巧 87 67 81 235

B 最低点 新藤兼人 35 57 66 158

C 最高点 山田茂 96 89 92 277

C 最低点 阿部信三 41 23 54 118

・・・・・

E 最高点 ・・・・

E 最低点 ・・・・

1

2

3

10

それでは最後の用紙に

Pad

フローチャートを

書いてください

(19)

37

フローチャート問題の回答例①

開始

終了

while I < 5

合計点はTotal[0]

より大きいか

Total[]の奇数番地に-999を設定

Total[]の偶数番地に999を設定

学生データの 氏名、英語、国語、数

学、合計を0行目

に代入

Yes i ← 0

while i < 200

i ← 0 i番目の学生のデータを設定

英語、国語、数学の合計点を計算

クラスは“A”か?

Yes

合計点はTotal[1]

より小さいか

学生データの 氏名、英語、国語、数

学、合計を1行目

に代入

Yes

クラスは“B”か?

クラスは“C”か?

クラスは“D”か?

クラスは“E”か?

i ← I + 1

結果表の印刷 学生データの読み込み

(20)

フローチャート問題の回答例②

開始

終了

while I < 5

合計点は

Total[i*2]

より大きいか

Total[]の奇数番地に-999を設定

Total[]の偶数番地に999を設定

学生データの

氏名、英語、国語、数学、

合計をi*2行目に代入

Yes i ← 0

while i < 200

i ← 0 i番目の学生のデータを設定

英語、国語、数学の合計点を計算

Yes

合計点は

Total[i*2+1]

より小さいか

学生データの

氏名、英語、国語、数学、

合計をi*2+1行目に代入

Yes i ← I + 1

結果表の印刷 学生データの読み込み

結果表に、クラスと最高点、 最低点の文字を設定

while j < 5

j← 0

クラスは rClass[j*2]と

等しいか?

(21)

41

(22)

Updating...

参照

Updating...

関連した話題 :