アルゴリズム・フローチャート・プログラム

Go.Ota1

概要
1. プログラム構造とフローチャートの理解
2. Scratchを使用したプログラムの基本要素の組み込み・各自のペースで進めてください。
注意: プログラムを作る場合は、作り始めに「新規」又は「コピーの保存」を使って別のプログラムにしてください。

2

アルゴリズムは役に⽴つアルゴリズム = 問題解決や⾏動の⼿順
例: お昼のパンの選択
1. がっつり食べたい
そうならば 揚げ物系のパン
1.2 肉っぽいのがいいか
そうならば トンカツパン
そうでなければ コロッケサンド
そうでないなら スィーツ系のパン
1.3 油っこいのも平気
そうならば ツイスト
そうだないならば チョコタルト

3

フローチャートはアルゴリズムを視覚化する⼿法
開始
No
がっつり
Yes
No肉No
油OK

Yes

カツサンド

Yes

コロッケサンド

ツイスト

チョコタルト終了

4・以下の作業を理解できた/作成できたを確認するチェックリストがあります。
◎スライドとサンプルプログラム◎サーチプログラム◎応用:素数プログラム◎応用:並び替えのプログラム

5チェックリストの使い方

・スライドNo. スライド内の番号
・理解 :スライドの内容を⾒て自分なりにわかったらチェック
スタジオ内のプログラムの意味がわかったらチェック・打ち込み : スライドのプログラムを⼊⼒して動作確認
・開発 : スライドの課題のプログラムを作ったらチェック

6

変数とScratchでの利用

理解・打込みa と b の変数を作ってください。
普通の数学と演算記号が違います。
掛け算
割り算

*/

7

Scratchでの変数への⼊⼒

理解・打ち込み

aとbの値を⼊⼒してから計算しています。

8

変数とScratchでの利用
X+1

1

X=1
Xと名前をつけた箱(変数)に1を⼊れる

理解(XX = X +1
X + 1のイメージ)

初めにXの箱(変数)の中を取り出し+1する。
計算結果をXの箱(変数)に⼊れなおす。

◎Scratchでの X = X +1
次の二つは同じ意味
変数への代⼊は普通の数学の=とは違う意味なのでイメージを示してみました。

9

プログラムの構造/フローチャート
逐次構造(直線型)
処理1
処理2

理解

選択構造:分岐条件

No

条件

Yes

Yes

Yesの処理Yesの処理

No

Noの処理

処理3

プログラムや人間の判断などのアルゴリズムは基本的に、逐次、選択:分岐、繰り返し(ループ)の組み合わせで表現できます。

繰り返し構造(ループ)
ループの処理ループの処理

No

終了条件

Yes

No

終了条件

ループの処理Yes

無限繰り返し型

後判定型

前判定型

10

フローチャートとScratchの対応

理解

分岐条件

No条件

No

Yes
処理1

Yes
処理

処理2

繰り返し:回数指定(カウンター) = 0
繰り返し:終了条件指定(カウンター) 1づつ変える(カウンタ) <= (回数)
Yes
処理

終了条件
No

Yes

No
ループの処理11

補足:フローチャートとScratchの対応

理解

(回数)

繰り返し:回数指定(カウンター) = 0(カウンター) 1づつ変える(カウンタ) <= (回数)
Yes
処理

No

Scratchでは(カウンター)
はシステムが使い⾒えません。
カウンターも変数です。

12チャレンジ: 合格の判断

開発

aの変数に値を⼊⼒しaが70未満だったら不合格
それ以外だったら合格とネコに言わせてみよう。

13

⼀番簡単な自動販売機

100円

⾦額0000

理解・打ち込み

簡単な仕組みの自動販売機
・100円玉を1枚だけ⼊れられる・商品は1つだけ・商品切れランプは無し
・お⾦返却ボタンは無し
・つり銭切れランプは無し
・お⾦を⼊れて⼀定時間たったら自動的にお⾦返却は無し

まず、始めの⼀番簡単な自動販売機について考えてみましょう。お⾦を⼊れることと製品のボタンを押すことしかできません。
このプログラムの動作をフローチャートとサンプルプログラムを次スライドに示します。

14

自動販売機01」
開始
No

お⾦が投⼊される
Yes

⾦額を100円にする
No 飲み物ボタンが押される
No

Yes
お⾦が100円⼊っている
Yes
飲み物缶を出す15

チャレンジ: 正三角形の判断

開発

a, b, cの3個の三辺の値を⼊⼒して、すべての値が同じ場合に、「正三角形」、そうでない場合は「正三角形じゃない」と表示するプログラムを作ってみよう。
フローチャートは作っても、作らなくてもいいです。
・a,b,cは1以上の数を⼊⼒する前提で作っていいです。

16

理解・打ち込み

1からnを言う
1から10までの数を言うプログラムです
開始
I=0

Yes

I= 10
No
I=I+1
I を言う

終了

次のスライド(スライド18)を先に⾒て
17

「1からnを言う」のイメージ

理解

1から10までの数を言うプログラムです←変数I(アイ)のイメージ
ただし、このフローチャートは →のような動作をしています。
カチカチしてみましょう
I=I+1

これがIをカチカチしているところ。
カウンターが10になったら終了。
18

開発

単純な1からnの合計

1から10までの合計を計算するプログラムを作ってください
最期にネコに合計を言わせてね。
開始

次のスライド(スライド20)を先に⾒て重要なヒント
プログラムは⼀つ前(スライド14)の「1からnを言う」を少しだけ改造して作ります。
スライド17のフローチャートと、右のフローチャートを⾒⽐べてどこが違うか考えてみよう。

X=0
I=0Yes

I = 10No
I = I +1
X=X+I
終了

19

「単純な1からnの合計」のイメージ

理解

1から10までの数を言うプログラムです

X+I

I=I+1

1,2,3・・・と数を作る

X=X+I

プログラムは、これがIをカチカチやって出てきた数をXの内容に足していくイメージです。
カチカチしながら、Xの中がどのように変わるか紙に書いてみよう
20

チャレンジ:単純な2からAまでの偶数の合計

開発

Aの値を⼊⼒して、2からA以下の偶数の合計を求めるプログラムを作成してください。
例: A = 6の場合、 2+4+6
A = 9の場合、 2+4+6+8

ヒント:
Step1:
まず、⼀つ前(スライド19)の「1から10までの合計」を求めるプ
ログラムを少し改造して、2から10までの偶数を認めるプログラムを作ります。次のスライド(スライド22)を先にみてね
Step2:
次に数をAに⼊⼒したあと、その数までの合計を求めるプログラムに改造します。Aを⼊⼒することは、スライド8の変数への⼊⼒を⾒て。「その数までの合計」は、スライド19のフローチャートを良く⾒て、どこで終わりを判断しているかな?。

21

「単純な1からnの合計」のイメージ

理解

I = I +1????????

X=X+I

1,2,3・・・と数を作る場合

2,4,6・・・と数を作る場合これは同じ。

プログラムは、これがIをカチカチやって出てきた数をXの内容に足していくイメージは同じです。
Iで偶数を作る方法を考えてみてください。
22

チャレンジ:5個の数の合計5個の数を⼊⼒して合計を求めるプログラムを作成してください。

開発

ヒント:
5つの数を⼊⼒するプログラムです。
これに合計する部分を追加してください。
A,B,C,D,Eの変数を使います。

23たくさんの数の合計
次からたくさんの数を⼊⼒して合計を求めるプログラムをつくっていきます。
今まで、数を⼊⼒するのに変数をつくっていきましたが、たくさんの数を⼊⼒するには、A,B,C,D,E・・・・と多くの変数を使うのは大変です。
こんな時に配列(リスト)使うと便利です。
次から配列(リスト)を学習していきます。

24

理解・打ち込み

配列(リスト)を作る

変数の中で[リストを作る]を指定。

リスト名を指定して作成

配列はDに番号がついているイメージ25

おみくじをつくる

理解・打ち込み配列(リスト)を使っておみくじを作ってみます。

動作のイメージは次のスライド(スライド27)を⾒て26

理解・打ち込み「おみくじを作る」のイメージ
大吉 中吉↓
↓吉
↓

凶↓

大凶
↓

D[ I ] の内容を言う
27

チャレンジ: 5回数字を⼊⼒してその合計(配列利用)5個の数を⼊⼒して、合計を計算するプログラム
配列を利用します。

⼊⼒部分

Yes

開始

合計部分

開発
続き

配列Dをクリアー

X=0

I=0I=0I=5No
I = I +1
D(I)を⼊⼒
続く

次の2枚のスライドを先に⾒てYes

I=5No
I = I +1
X = X + D(I)終了

28

チャレンジ: 5回数字を⼊⼒してその合計(配列利用)⼊⼒部分(スライド28の左側)のプログラムです。
これに合計部分を追加してください。

この下に、スライド28の右側のプログラムを追加して開発
カチカチやりながら、D[ I ] を5回⼊⼒しているイメージです。

合計のイメージの次のスライドも⾒て29チャレンジ: 5回数字を⼊⼒してその合計(配列利用)合計部分のプログラムのイメージです。
カチカチやりながら、D[ I ] を5回とりだしています。

開発

おみくじで使いました。
X = X + D[ I ]D[ I ] を5回, Xに加えています。

30

配列に数をセットする方法(1)(2)理解

配列(リスト)に数をセットする方法にはいくつかあります。ここでは、3つの方法を理解しましょう。
(1) ⼊⼒する。
スライド29で説明済み(2) 配列(リスト)に直接、数値を⼊⼒する。
ここに直接⼊⼒する。

次のスライドで(3)を説明しています。 31

配列に数をセットする方法(3)(3) ランダムな数を設定する。

理解・打ち込み
カチカチしながら、1から100の目の出るサイコロを振って数値を⼊れているイメージです。

次から課題はこれを使って配列(リスト)に数値を設定します。
D[1:5]に数値設定

32

チャレンジ:配列の中から数を探す(検索)
予め配列D[1]からD[5]まで数を⼊れておきます。

開発

つぎに変数のAに数を⼊⼒して、その数がD[1]からD[5]にあれば、何番目に⼊っていたか変数Xにその番号を⼊れます。
⼊っていなければ変数Xに0を⼊れます。
次のスライド(スライド34と35)にヒントがあります。

33

チャレンジ:配列の中から数を探す(ヒント)1. あらかじめ配列(リスト)Dに5つの数を⼊れておきます。
スライド32のプログラムを使います。
2. 変数Xに⾒つからなかった時のために0を初0めに⼊れときます。
3. 変数Aに探す数を⼊⼒します。
4. 変数Iをカチカチしながら,D[I]とAの内容を⽐較します。
もし等しければ、I(何番目かの番号)の値をXに⼊れます。

順番に⽐較していく。

34

チャレンジ:配列の中から数を探す(ヒント)
検索部分

続き
X=0
I=0

Yes

I=5
No
I = I +1
検索する部分の処理

終了

検索する部分の処理は数のAに数を⼊⼒して、AがD[I]と等しければ、何番目に⼊っていたか変数Xにその番号を⼊れます。
補足:
合計部分の前には、ス
ライド31/32のどれから方法使って、配列に数値を⼊れておきます。

数の並び替えの作業の説明
予め配列D[1]からD[5]まで数を⼊れておきます。

理解

この中の数を⼩さい順番に並び替えて配列
D[1]からD[5]に⼊れなおしてください。
これが最後の課題です。できると思う人は、いきなり開発してもいいです。
少し難しいと思う人は、次の課題を順番にやっていきましょう。
・配列の中の⼀番⼩さい数を⾒つける
・配列の中の⼀番⼩さい数を、配列の先頭に⼊れる。
・二重のループを使う
・並び替えの開発

36

配列の中の⼀番⼩さい数を⾒つける
予め配列D[1]からD[5]まで数を⼊れておきます。

開発

その中で⼀番⼩さな数をXに⼊れます。
次のスライド(スライド38)にヒントがあります。

37

配列の中の⼀番⼩さい数を⾒つける(ヒント)⾒つける部分
続き
X = 99999
I=0Yes

I=5No
I = I +1
⼩さい数を⾒つける
部分の処理

終了

ポイント
変数Xにあらかじめ、配列に無いような大きな数を⼊れておきます。
⼩さい数を⾒つける部分の処理はXには常に⼀番⼩さい数が⼊っていると考えます。
Xの中の数とD[I]を⽐較して、D[I]の方が⼩さければXにそのD[I]を⼊れます。

配列の中の⼀番⼩さい数を配列の先頭に⼊れ替える
予め配列D[1]からD[5]まで数を⼊れておきます。その中で⼀番⼩さな数を配列の先頭(D[1])に⼊るように⼊れ替えます。

開発

次のスライド(スライド40/41/42)にヒントがあります。
10251031312

588

プログラムを実⾏した後は、⼀番⼩さい数がD[1]に⼊ります。
但し、配列には元の配列にあったすべての数が残っています。

39

配列の中の⼀番⼩さい数を配列の先頭に⼊れ替える

ヒント: プログラムの考え方 (実際に紙に数値を書いてやってみよう)
10552510101031313131222

58888

1番目と2番目を⽐較して5の方が⼩さいので⼊れ替え
1番目と3番目を⽐較して5の方が⼩さいので⼊れ替えない
1番目と4番目を⽐較して2の方が⼩さいので⼊れ替え
1番目と5番目を⽐較して2の方が⼩さいので⼊れ替えない40

配列の中の⼀番⼩さい数を配列の先頭に⼊れ替える
ヒント: 数の⼊れ変え

1番目と2番目の⼊れ替え
1051053128

いきなり⼊れ替えると10が残らない

5312810531285531285103128

⼊れ替え先の数を別の変数に保存しておき、それを後で戻す

41配列の中の⼀番⼩さい数を配列の先頭に⼊れ替える
⼊れ替える部分
続き
A=0Yes

A=5No
A = A +1
⼩さい数を⾒つけて⼊れ替える部分の処理終了

⼩さい数を⾒つけて⼊れ替える部分の処理はD[1]には常に⼀番⼩さい数が⼊っていると考えます。
D[1]の中の数とD[I]を⽐較して、D[I]の方が⼩さければD[1]とD[I]を⼊れ替えます。
ポイント:
ちょっとおかしいけど初めはD[1]とD[1]⽐較します。
補足
今までは、配列の番号はIという変数を使っていましたが、ここではAという変数を使っています。

二重繰り返しに挑戦

理解・打ち込み

予め配列D[1]からD[5]まで数を⼊れておきます。
初めにD[1]からD[5]までの数
次にD[2]からD[5]までの数
その次にD[3]からD[5]までの数
その次の次にD[4]からD[5]までの数
最期にD[5]までの数を言うプログラムを作ります。
スライド44にプログラム
スライド45にフローチャート
スライド46に解説があります。

43

二重繰り返しに挑戦

理解・打ち込み

補足:二重に言う部分の前には、スライド31/32のどれかの方法使って、配列に数値を⼊れておきます。

二重に言う部分44

二重に言う部分

続き
A=0

Yes

A=5No
A = A +1

フローチャートはごちゃごちゃしていますが、プログラムで⾒ると、Aを使った大きな繰り返しの中にBを使った繰り返しが⼊っている形になります。

B=A-1
Yes

B=5No
B = B +1
D[B]を言う終了

45

二重繰り返しに挑戦

二重に言う部分

続き
A=0Yes

通る場所

AB

①1?

②10③11③12③13③14③15

B = B +1 ←③①25

D[B]を言う②21③22③23③24

A=5No

A = A +1 ←①
B = A – 1 ←②
Yes

プログラムを動かすと①②③のどこを通って、AとBがどのように変わるか考えてみましょう。

B=5No

終了

続いていきます46

最期のチャレンジ:数の並び替え

開発

予め配列D[1]からD[5]まで数を⼊れておきます。この中の数を⼩さい順番に並び替えて配列
D[1]からD[5]に⼊れなおしてください。
10255318210831

プログラムを実⾏した後は、数が大きくなるように⼊れ替えが⾏われています。

次のスライド(スライド48/49)にヒントがあります。

47

最期のチャレンジ:数の並び替え

ヒント: プログラムの考え方︓「配列の中の⼀番⼩さい数を配列の先頭に⼊れ替える(スライド37)を繰り返し実施(実際に紙でやってみよう)

1回目
D[1]からD[5]で⼀番⼩さい数を配列の先頭D[1]に⼊れ替える
2回目
D[1]に⼀番⼩さい数がはいっているので、D[2]からD[5]で⼀番⼩さい数を配列のD[2]に⼊れ替える
3回目
D[3]からD[5]で⼀番⼩さい数を配列のD[3]に⼊れ替える

10531282

1031

5821031582531108

3回目
D[4]からD[5]で⼀番⼩さい数を配列のD[4]に⼊れ替え48る最期のチャレンジ:数の並び替え
プログラムは①「二重繰り返しに挑戦」の中に、②「配列の中の⼀番⼩さい数を配列の先頭に⼊れ替える」を組み込んだものになります。
ポイント:②のプログラムの場合は、⼀番⼩さな数が⼊る配列はD[1]に固定されていました。
並べ替えの場合は、これが変わっていきます。右のフローチャートでIを追加したので、これを利用して開発してみてください。

続き
A=0

Yes

並びかえの部分

A=5No
A = A +1
I=A
B=A–1

Yes

B=5No
B = B +1
⼩さい数を⾒つけて⼊れ替える部分の処理終了

発展課題1: 沢山の数の並び替え

開発

配列⼊れる数の個数Aを⼊⼒し、配列にA個のランダムな数を設定してから、この配列の中の数を⼩さい順番に並び替えてください。
ヒント:
スライド32の方法で、配列にA個のランダムな数を設定します。

50

発展課題2:並び替えの無駄を省く開発「最期のチャレンジ:数の並び替え」のプログラムは、「二重繰り返しに挑戦」のプログラムを改良したため、他えばA=5, B=5の時はすでに並び替えが終っているのに、無駄な処理をしているようなことがあります。
この無駄を省いたプログラムを考えてみましょう。

51

発展課題3:いろいろな並び替えの方法

開発

並び替えにはいろいろなソートの方法があります。今回開発した方法は、「選択ソート」という方法です。
他にいろいろな並べ替えの方法がありますが、Webで「バブルソート」を調べて、プログラムを開発してみてください。

52