数字の大きいものから並べる

前項ではフローチャートに使う記号の説明をしましたが、この項では具体例として、ランダムに並んでいる5つの数字を大きい順に並べる、というプログラムのフローチャートについて解説していきます。

今回の前提条件は、読み込みの時点でn=5とし、次のa[1]~a[5]が最初は以下のような数値になっているものとします。これらを大きい順に並び替えるのが今回の主旨です。

  • a[1]=1
  • a[2]=3
  • a[3]=2
  • a[4]=5
  • a[5]=4

以下のフローチャートを見ながら、その下の解説文を読んでください。


上図のフローチャートのうち、青い枠線で書かれている部分は問題文には記載されないものと思って下さい。フローチャートを読み解く中で、必要に応じて自分で記入していく内容です。


まず最初は、角に丸みを帯びた長方形のところに「START」と書かれていますが、このマークは「端子」で、フローチャートの始まりや終わりを明確にするための記号です。

続く平行四辺形は「入出力」ですが、ここでは右に「読込み」と書いてある通り、まずは「入力」です(フローチャートの最後のほうにある平行四辺形が「出力」です)。ここには配列が全部でn個であることが示されています。今回は上記の前提条件の通り、n=5とします。

次に「a[n]」と書いてある六角形をしたものは、「準備」のマークです。このあとに続く「判断」のために、このフローチャートではa[n]という5つの配列を使いますよ、と宣言しているだけなので、あまり気に留めなくても大丈夫です。

そして4段目では再度の「入出力」があります。ここで、a[1]からa[5]までの数字を読み取ります。今回は冒頭で提示したように、a[n]が以下の5つの順に並んでいるものとして、これらを大きい順に並び替えていきます。

  • a[1]=1
  • a[2]=3
  • a[3]=2
  • a[4]=5
  • a[5]=4

ここから具体的な「処理」(長方形)や「判断」(ひし形)を行っていきます。

まず、「i←1」というのは、iに1を入れる、つまり「i=1」ということです。同様に「j←i+1」は「j=i+1」なので、この流れだと「j=2」になります。

次に、ひし形で表される「判断」で、2つの数値の大小を比較します。このフローチャートの目的は数値を大きい順に並べることなので、2つの数値を比べてみた結果、最初の数のほうが小さければ数値を入れ替え、最初の数のほうが大きければそのままスルーするという操作がここで行われます。

最初の段階ではi=1、j=2なので、a[1]=1とa[2]=3との比較になります。1と3では3のほうが大きいため、今回は「1<3」が成り立ち、判断の結果は「YES」となります。

YESの矢印を進むと、今度は「処理」が3つ連続であります。ここでやりたいことは上記の通り、a[i]とa[j]の値を交換することです。2つの値を直接入れ替えることはできないので、mを間にはさむことで数値の入れ替えをしています。

この流れ(フローチャートのX)は、次の通りです。

  1. まず、a[i]の値をmの値に代入します。これにより、a[i]の値をmという場所に仮置きすることができます。
  2. 次に、a[j]の値をa[i]の値に代入します。これによりa[i]の元の値は消えてしまいますが、mに仮置きしておいたので大丈夫です。
  3. 最後に、mの値をa[j]の値に代入します。mの値はもともとa[i]だった値です。
  4. 以上で、a[i]とa[j]の値が入れ替わります。

以上をまとめると、Xの直前では2つの大小を比べ、若い番号の配列(a[1]とa[2]ならa[1]のほう)の値が小さければ、Xにおいて2つの配列の中身の数値を入れ替えるという操作を行いました。一方、若い番号の配列の値が大きいなら、そのままにしておきます(判断の結果がNOのルート)。

そしてXのあと、jを+1して、その値がn(=5)よりも大きいかどうか判断します。NOなら矢印に従って前に戻り(ただしjが+1されているため、戻ったあとの判断の結果は変わってきます)、YESなら下へと進みます。

ここでの意味合いは、5つの配列a[1]、a[2]、a[3]、a[4]、a[5]のうち、a[1]を固定して、a[2]との大小を比較、それが終わったらa[3]との比較、その次はa[4]との比較、最後にa[5]との比較…というような感じです。

a[i]は変えずにa[j]のjを1つずつ上げて、jは5が上限なので、そうなったらフローチャートを下に進んで今度はiを1つ上げます。iを+1したら、今度はiがn-1(=4)よりも大きいかどうかを判断します。つまり、a[2]に対して、今度はそれとa[3]と比較、a[4]と比較、a[5]と比較…というような感じです。

そうしてiが上限の4(jの上限が5なのでiの上限は4)を超えたら、a[1]~a[5]の数字は大きい順に並んでいるはずなので、平行四辺形マークのところで出力します。これでようやく目的が達成したので、最後に、角に丸みを帯びた長方形マークで「END」を示します。


以上をまとめると、このフローチャートでは、2つの数値を比較して、左側のほうが右側よりも小さければ順序を入れ替えるという操作を、合計で以下の10回行っています。その結果、最終的に5つの配列は値の大きい順に並ぶことになります。

ちなみに、10回という根拠は、5種類の数値を2つずつ比較するため、5C2=10からわかります。

  1. a[1]とa[2]の比較
  2. a[1]とa[3]の比較
  3. a[1]とa[4]の比較
  4. a[1]とa[5]の比較
  5. a[2]とa[3]の比較
  6. a[2]とa[4]の比較
  7. a[2]とa[5]の比較
  8. a[3]とa[4]の比較
  9. a[3]とa[5]の比較
  10. a[4]とa[5]の比較

これら10回分の処理をまとめると、下表のようになります。青字のところは比較している数値です。青字同士で左側の値が小さければ、Xの処理を行います。また、Xの処理により数値を入れ替えたときは赤字で強調しています。


このフローチャートを全て丸暗記する必要はありませんが、図を見て何が起こっているかを読めることと、穴埋め問題などが出題されたときに適切な選択肢を選べる程度には理解しておくことが求められます。

コメント