課題プリント

データ構造とアルゴリズム論 平成 26 年 4 月 18 日
第 1 章.アルゴリズムの表現-流れ図
【学習のねらい】
① 標準的な流れ図(JIS 規格に準拠)の記述の仕方を学ぶ。
② 流れ図を用いて簡単なアルゴリズムを記述できるようになる。
③ アルゴリズムの処理の流れをつかむため、トレースの仕方を身につける。
1-1
基本的な流れ図記号
以下に基本的な「流れ図記号」を表にまとめておきます。用法は今後の演習でトレーニ
ングすれば自然に身につくはずです。
<記号一覧(JIS X0121)>
記号
名称
意味(機能)
処理
任意の種類の処理を行う。
手操作入力
キーボードなどから手操作でデータを入力す
る。
表示
ディスプレイなどに出力結果を表示する。
判断
条件にしたがって幾つかの処理に分岐する
ループ端(開始)
繰り返し処理の始まりを表す。
ループ端(終了)
繰り返し処理の終わりを表す
端子
流れ図の始めと終わりを表す
線
データあるいは制御の流れを表す。
定義済み処理
手続きや関数など、すでに定義した一連の処理
を表す。
データ
ファイルからの入出力に用いる。
結合子
流れ図の他の場所への接続を表す(流れ図が 1
枚の紙面収まらなくなり、次ページに続く場合
などに用いる)
。
1
データ構造とアルゴリズム論 平成 26 年 4 月 18 日
1-2
例
基本制御構造の表現
-連接構造(順次処理)
朝起きて顔を洗って歯を磨く。
開始
朝起きる

一つ一つの処理を順番に(上から下へ)行う。

順序を入れ替えると処理がうまく行かない場合
がある。右の例では、
「顔を洗う」と「歯を磨く」
顔を洗う
を入れ替えても(全体としては)問題ないが、
「朝
起きる」と「顔を洗う」を入れ替えることはで
歯を磨く
きない。 → 一般に順序が意味を持つ!
終了
1-3
基本制御構造の表現
-選択構造(分岐処理)
A.2 分岐処理
例
テストの得点 X が 50 点以上なら合格、50 点未満なら不合格と表示する。
開始
X:50
X の値を入力
X≧50
≧
No
この書き方も可
Yes
“合格”と表示
“不合格”と表示
終了
プログラミング言語(Java)では、if 文によって表現します。
2
<
データ構造とアルゴリズム論 平成 26 年 4 月 18 日
B.多分岐処理
テストの得点 X が80 点以上なら「よくできました、」80>X≧50 なら「合格」
、50
例1
点未満なら「不合格」と表示する。→ 分岐が 3 つの場合の例
開始
X の値を入力
No
X≧80
Yes
X≧50
No
Yes
“よくできました”
“合格”と表示
と表示
“不合格”と表示
終了
学籍番号 X を入力すると、それを4で割ったときの余りの数 Y の値により(次の
例2
要領で)着席位置を表示する。
Y=0:1~3 列目
Y=1:4~6 列目
Y=2:7~9 列目
Y=3:10~12 列目
→ 変数の値で処理を分ける場合の例(Java 言語では switch 文で表現)
開始
学籍番号 X の値を入力
※ 具体的な値(下では1,
Y ← X%4
2、・・・等)の他に、
「そ
れ以外」という指定も可
Y
0
能。
1
2
3
“1~3 列目”
“4~6 列目”
“7~9 列目”
“10~12 列目”
と表示
と表示
と表示
と表示
終了
3
データ構造とアルゴリズム論 平成 26 年 4 月 18 日
※
AをBで割った時の余りを「A % B」と表現します。例えば、「10 % 3」の値は「1」
です。剰余演算子「%」については、「プログラミング」テキスト p.84(2012 年度版
は p.84)で説明しています。
※
流れ図では、通常、変数への値の代入を「0→X」の様に(左辺から右辺への代入と
して)表します。しかし、本講義・演習では、プログラム上の表記にそろえて、
「X←
0」の様に(右辺から左辺への代入の形で)記述することにします。
【基礎課題 1-1】
下は整数Xを入力すると、それが偶数か奇数かを表示するアルゴリズムです。空欄を埋
めてアルゴリズム(流れ図)を完成させてください。
開始
X の値を入力
Y ← X%2
No
Yes
“偶数です”と表示
“奇数です”と表示
終了
【応用課題 1-A】
【基礎課題 1-1】の処理を行う(Java 言語)プログラムを作成してください。ここに、X
の入力および、結果の表示(
「偶数です」など)には、テキストフィールドコンポーネント
を用い(2 つ用意します)
、
「判定」ボタンをクリックしたら結果を表示するようにしてくだ
さい。
4
データ構造とアルゴリズム論 平成 26 年 4 月 18 日
【基礎課題 1-2】
ある美術館の入場料金は、年齢に応じて次の様になっています。
7 歳未満
7 歳~12 歳
13 歳以上
無料
500 円
800 円
年齢 Age を入力すると、入場料金を表示するアルゴリズムを考えましょう。次の空欄お
よび下線部を埋めて流れ図を完成させてください。これは、判断記号の別表記に慣れる練
習です。
開始
Age の値を入力
≧
Age:7
No
<
Age:
“無料です”
“500 円です”
“800 円です”
と表示
と表示
と表示
終了
【応用課題 1-B】
【基礎課題 1-2】の処理を行うプログラムを作成してください。ここに、年齢 Age の入力
および結果の表示には、テキストフィールドコンポーネントを用い、
[表示]ボタンをクリ
ックすると、料金が表示されるようにしてください。
5
データ構造とアルゴリズム論 平成 26 年 4 月 18 日
1-4 基本制御構造の表現
A.決まった回数の繰り返し
例
-反復構造(繰り返し処理)
腕立て伏せを5回行う。
※
開始
Java 言語では for 文で表
現します。
①
②
i ← 1
No
i≦5
Yes
③
腕立て伏せをする。
④
i ← i+1
終了
⑤
繰り返し処理の流れを理解するためには、変数の変化の動きを追跡(トレース)する必
要があります。
<トレース表>
処理番号
iの値
①
1
②
1
③
1
④
2
②
2
③
2
④
3
②
3
③
3
④
4
②
4
③
4
④
5
②
5
③
5
④
6
②
6
判定結果
処理
Yes
腕立て伏せをする。
Yes
腕立て伏せをする。
Yes
腕立て伏せをする。
Yes
腕立て伏せをする。
Yes
腕立て伏せをする。
No
⑤
終了
6
データ構造とアルゴリズム論 平成 26 年 4 月 18 日
アドバイス
-トレースの勧め
一般に、アルゴリズム(流れ図)の処理過程を追って行くと、そこに現れる変数の値が
(アルゴリズムの進行に伴い)刻々と変化してゆきます。その変数(の値)の変化過程を
追跡することをトレースすると言います。具体的には、前ページのようなトレース表を作
ることです。
あるアルゴリズムを理解する、ということは、その処理過程をトレースして変数(の値)
の変化(の流れ)を理解する、ということに他なりません。そして、トレースすること自
体は、労を惜しまなければ誰にでもできることなのです。
今後、本講義・演習で出てくる色々なアルゴリズムを理解できるかどうか、さらには自
在に使えるようになるかどうかは、トレースする習慣を身につけ、地道に理解する作業を
行えるかどうかにかかっています。面倒でも、理解できるまでトレースを行ってください。
トレースの習慣が身に付いて来ると、自然と頭の中で処理内容のトレースができるように
なります。そうなればしめたもの!アルゴリズムの理解が飛躍的に速くなりますし、また
自分でアルゴリズムを考案する力もぐんぐんついて来ます。
プログラミングが上達するかどうかは、トレースができるかどうかで決まる、と言って
も良いでしょう。
B.一般的な終了条件による繰り返し
例
可能な限り腕立て伏せを行う。
開始
No
続行可能
Yes
腕立て伏せをする。
終了
※ Java 言語では、while 文で表現します。
7
データ構造とアルゴリズム論 平成 26 年 4 月 18 日
ループ端記号を使った表現
繰り返し処理は、次の様にループ端記号を使って表すことが出来ます。下の3つの流れ
図はいずれも p.6 の例(決まった回数の繰り返し)の流れ図と同じ処理を表します。
(1)
(2)
開始
ループ名
開始
カウンタの値列挙
ループ
ループ
i=1,2,3,…,5
腕立て伏せをする。
i:1,1,5
腕立て伏せをする。
ループ名
変数名:初期値,増分,終値
ループ
ループ
終了
終了
(3)
開始
i←1
ループ
i>5 ( と な る ま で )
ループ名
繰り返しの終了条件
(この条件が成立したら、ループから抜
ける事に注意)
=1,2,3,…,5
腕立て伏せをする。
i←i+1
ループ
終了
※
ループ端記号を用いると、繰り返しループ処理の開始と終了の位置が分かりやすいと
いうメリットがあります。実はこれは流れ図としては比較的新しい(新しく採用され
た)記号です。最近は、繰り返し処理にループ端記号を用いることが多くなりました。
8
データ構造とアルゴリズム論 平成 26 年 4 月 18 日
【基礎課題 1-3】
下の左図は、1~5までの整数を順に表示させるアルゴリズム(流れ図)です。右は繰
り返しループ中の「iを表示」と「i ← i+1」の順序を入れ換えたものです。これが、左図
と同等な処理となるよう、下線部を埋めてください。
開始
開始
i ←
i ← 1
No
i≦5
No
i≦
Yes
Yes
iを表示
終了
終了
i ← i+1
i ← i+1
iを表示
※
いずれの課題もiに 1,2・・・など具体的な数値を入れてトレ
ースして(処理内容を)確かめてみてください。
【基礎課題 1-4】
p.7
「1-4-B.一般的な終了条件による繰り返し」の例の流れ図において、腕立て伏せ
を行った回数を表示するよう、改良しました。iが腕立て伏せを行った回数となるために
は、空欄①~②にどのような処理が入ればよいですか?解答群から選んでください。
<解答群>
(a)
開始
i←0
(b)
(d) i←i+1
①
(f) i←i+2
続行可能
No
Yes
②
iを表示
腕立て伏せをする
終了
9
i←1
(c)
(e) i←i-1
i←2
データ構造とアルゴリズム論 平成 26 年 4 月 18 日
【基礎課題 1-5】
ある偶数N(≧0)を入力すると、その値までの偶数の和(=2+4+6+・・・+N)を求めて表
示する処理のアルゴリズムは下の左図の様になります。一方、右図は同様の処理を、ルー
プ端記号を用いて表したものです(p.8 の(3)の書式です)
。下線部に入る条件式を、解答群
から選んでください。
開始
開始
N を入力
N を入力
SUM←0
SUM←0
i←0
i←0
ループ
i≦N
No
Yes
SUM←SUM+i
i←i+2
SUM←SUM+i
SUM を表示
i←i+2
終了
ループ
SUM を表示
終了
<解答群>
(1) i>N (2) i≠N
(3) i≦N (4) i=N
【応用課題 1-C】
【基礎課題 1-5】の処理を行うプログラムを作成してください。繰り返し処理には、while
文を用いてください(左側の流れ図に対応します)。ここに、Nの入力および偶数和(SUM)
の表示には、テキストフィールドコンポーネントを用い、適当なボタンをクリックすると、
偶数和の計算結果を表示するようにしてください。
10
データ構造とアルゴリズム論 平成 26 年 4 月 18 日
【応用課題 1-D】
日本とヨーロッパ中部時間との時差は7時間です(ヨーロッパが夏時間の場合)
。例えば、
日本の午前 10 時は、ヨーロッパ中部(フランスやイタリアなど)では午前3時になります。
そこで、以下のように日本の時刻を入力すると、ヨーロッパの時刻を表示してくれるアル
ゴリズムを考えましょう(時刻は 24 時間表記)
。
<変数の意味>
開始
JH:時(日本時間) JM:分(日本時間)
EH:時(欧州時間) EM:分(欧州時間)
JH,JMを入力
ところが、このプログラムでは例えば、
「3 時 00 分」を入
EM←JM
力すると、ヨーロッパ時間が「-4 時 00 分」という奇妙な結
EH←JH-7
果になってしまいます。言うまでもなく、正しくは「20 時
00 分」です。
EH,EM を表示
終了
開始
そこで、全ての入力時刻に対して正しくヨーロッパ時
刻が表示されるように、このアルゴリズムを改良しまし
JH,JMを入力
た。左の空欄を埋めてアルゴリズムを完成させてくださ
い。
EM←JM
No
Yes
EH←JH-7
EH←
EH,EM を表示
終了
11
データ構造とアルゴリズム論 平成 26 年 4 月 18 日
【応用課題 1-E】
1日目に1円、2日目に2円、3日目に4円・・というように、前日の2倍ずつ貯金を
して行く場合を考えましょう。このときの貯金総額の変化は下表の通りとなります。
日数
1日目
2日目
3日目
4日目
・・・
貯金する額
1円
2円
4円
8円
・・・
貯金総額
1円
3円
7円
15円
・・・
こうしたペースで貯金をした場合、貯金総額が1万円を越えるのは何日目でしょうか?
それを求めるアルゴリズムを考えましょう。下線部を埋めてアルゴリズムを完成させてく
ださい。
<変数の意味>
開始
N
N:日数
Chokin:貯金する額
Sougaku:貯金総額
←
Chokin ←
Sougaku←
No
Yes
N を表示
Chokin←
終了
Sougaku←Sougaku+Chokin
N← N+1
【応用課題 1-F】
【応用課題 1-E】の処理を行うプロ
グラムを作成してください。ここに、
フレームのデザインは次の通りとし、
[日数計算]ボタンをクリックすると、
結果(何日目か)を表示するものとし
ます。
12