===== コンピュータとの関わり =====
*ドリルで登場する用語をサンプルプログラムと一緒に説明しています。
*サンプルプログラムは、5,6年生向けの言語で書いています。プログラムはこちらのサイトで実行することができます。
*[[http://jsdolittle.eplang.jp/drill/5-6.html|テキストを入力してプログラミング]]
----
==== 順次処理 ====
*コンピュータが命令を1つずつ順番に実行することを「順次処理」といいます。順次処理は、プログラムの基本的な動きの1つです。
*たとえば、折り紙でツルを作るとき、順序よく紙を折る必要があります。順序よく折ると上手く作ることができますが、順序を間違えてしまうと違うものができてしまいます。
*コンピュータの命令も、同じように順序が大切です。順序よく命令してあげるとうまく動いてくれます。
*次の2つのプログラムは、2つだけ命令の順番を変えたものです。実行して違いを確認してみましょう。
***プログラム(1)**
進む(1)
左回り(90)
進む(1)
左回り(90)
***プログラム(2)**
進む(1)
左回り(90)
左回り(90)
進む(1)
----
==== 反復処理 ====
*複数の命令を1つのまとまりとして、繰り返し実行することを「反復処理」といいます。反復処理は、プログラムの基本的な動きの1つです。
*次の(1)と(2)のプログラムを見てみましょう。(1)は命令を順番に書いたプログラムで、(2)は2つの命令を1つのまとまりとして繰り返すように書いたプログラムです。どちらも同じ動きをします。
*(1)のプログラムのように同じ命令を何度も書くとプログラムが長くなってしまいますが、(2)のように、命令を繰り返して実行するとプログラムを短くすることができます。
***三角形をかくプログラム(1)**
進む(1)
左回り(120)
進む(1)
左回り(120)
進む(1)
左回り(120)
***三角形をかくプログラム(2)**
ここから3回
進む(1)
左回り(120)
をくり返す
----
==== 分岐処理 ====
*条件によって実行する命令を変えることを「分岐処理」といいます。分岐処理は、プログラムの基本的な動きの1つです。
*次のプログラムは、好きな数字の値が3だったら、画面に「3です!」と表示するプログラムです。
***プログラム**
好きな数字←3
もし 好きな数字 = 3 ならば
”3です!” を表示する
を実行する
----
==== フローチャート ====
*フローチャートは、プログラムの処理の流れを表した図です。
*プログラムの流れは上から下に書きます。
*フローチャートではいくつかの図形を使います。
*{{:tanshi.png?nolink&70|}}は、処理のはじまりとおわりを表します。
*{{:syori.png?nolink&70|}}は、処理を表します。
*{{:loop_s.png?nolink&70|}}と{{:loop_e.png?nolink&70|}}は、はさんだ処理を繰り返し実行することを表します。
*{{:handan.png?nolink&70|}}は、分岐処理を表します。
=== 順次処理のフローチャート例 ===
*次のフローチャートは、紙に図形を書く手順を表しています。
*長方形の中には、処理の内容を書きます。\\ {{:fc1.png?nolink&90|}} {{:fc1_ex.png?nolink&100|}}
=== 反復処理のフローチャート例 ===
*次のフローチャートは、「ピザ」と言う処理を10回繰り返す手順を表しています。\\ {{:fc2.png?nolink&90|}} {{:fc2_ex.png?nolink&150|}}
=== 分岐処理のフローチャート例 ===
*次のフローチャートは、池に魚がいるときに写真を撮る手順を表しています。
*条件はひし形の中に書きます。\\ {{:fc3.png?nolink&150|}} {{:fc3_ex.png?nolink&200|}}
*条件が成り立たないときの処理を書くこともできます。次のフローチャートは、犬がいる場合には一緒に遊び、そうでない場合には犬小屋を掃除する手順を表しています。\\ {{:fc4.png?nolink&200|}} {{:fc4_ex.png?nolink&200|}}
----
==== イベント処理 ====
*特定のことが起きたときにプログラムが動作することを「イベント処理」といいます。
*コンピュータやスマートフォンで文字を入力するときは、キーボードのキーを押したときだけ文字が入力されます。これもイベント処理の1つです。
----
==== 二進法 ====
*「0」と「1」の2つの値を使って数を表現することを「二進法」といいます。コンピュータは二進法を使って、数や画像などを表現します。
*普段の生活で使っている数は、0〜9までの10種類の値を使って数を表現しているので「十進法」といいます。
*「0」と「1」では2つの情報を表現することができます。二進法では桁が1つ増えるごとに表現できる数が2倍ずつ増えていきます。
*たとえば、二進法の「1100」は、十進法ではいくつになるか考えてみましょう。
*二進法では桁が1つ増えるごとに表現できる数が2倍ずつ増えていくので、左から8,4,2,1の数を表します。\\ {{:num.png?nolink&200|}}
*1になっている桁の合計を求めることで、どの数を表現しているのかがわかります。
*8と4に対応する桁が「1」なので、二進法の「1100」は8+4=12で「12」を表現していることがわかります。
----
==== 誤り検出 ====
* コンピュータは、データに確認用のデータを付けて送ることで、正しくデータが届いたことを確認しています。
* このような、データに誤りがないことを確認する処理を「誤り検出」といいます。
* 商品のバーコードでも、12桁の商品番号に1桁の確認用の番号を付けることでバーコードの読み間違いを検出しています。
* ドリルでは、商品のバーコードを確認するための計算方法を扱っています。書籍の裏表紙に印刷された13桁のバーコードで計算してみましょう。
----
==== 論理積(AND) ====
*プログラミングではいくつかの条件を組み合わせた結果によって命令を実行したい場合があります。このとき「条件がすべて成り立つとき」を「論理積(AND)」といいます。
*たとえば、冷蔵庫にりんごが3つ、みかんが5つ入っているとしましょう。「どちらも3つ以上あるときに「あります」と表示する」命令をすると、りんごとみかん、どちらも3つ以上あるので条件が成り立ち、画面には「あります」と表示されます。\\ {{:ronria3o5.png?nolink&100|}} {{:ronri1.png?nolink&100|}}
*もし、りんごを1つ食べると、冷蔵庫にあるりんごは2つ、みかんが5つとなり、どちらも3つ以上ないので条件は成り立ちません。\\ {{:ronria2o5.png?nolink&100|}} {{:ronri3.png?nolink&100|}}
*プログラムにすると、次のようになります。
***条件が成り立つ場合(論理積)**
りんご←3
みかん←5
もし りんご >= 3 かつ みかん >=3 ならば
"あります" を表示する
を実行する
==== 論理和(OR) ====
*プログラミングではいくつかの条件を組み合わせた結果によって命令を実行したい場合があります。このとき「1つ以上の条件が成り立つとき」を論理和(OR)といいます。
*たとえば、冷蔵庫にりんごが3つ、みかんが5つ入っているとしましょう。「どれかが3つ以上あるときに「あります」と表示する」命令をすると、りんごとみかん、どちらも3つ以上あるので条件が成り立ち、画面には「あります」と表示されます。\\ {{:ronria3o5.png?nolink&100|}} {{:ronri1.png?nolink&100|}}
*もし、りんごを1つ食べると、冷蔵庫にあるりんごは2つ、みかんが5つとなります。みかんが3つ以上あるので条件は成り立ちます。\\ {{:ronria2o5.png?nolink&100|}} {{:ronri1.png?nolink&100|}}
*もし、りんごを1つ、みかんを3つ食べると、冷蔵庫にあるりんごは2つ、みかんは2つとなります。どちらも3つ以上ないので、条件は成り立ちません。\\ {{:ronria2o2.png?nolink&100|}} {{:ronri3.png?nolink&100|}}
*プログラムにすると、次のようになります。
***条件が成り立つ場合(1)(論理和)**
りんご←3
みかん←5
もし りんご >=3 または みかん >=3 ならば
”あります” を表示する
を実行する
***条件が成り立つ場合(2)(論理和)**
りんご←2
みかん←5
もし りんご >=3 または みかん >=3 ならば
”あります” を表示する
を実行する
==== 論理否定(NOT) ====
*プログラミングではいくつかの条件を組み合わせた結果によって命令を実行したい場合があります。このとき「どの条件も成り立たないとき」を論理否定(NOT)といいます。
*たとえば、冷蔵庫にりんごが3つ入っているとしましょう。「りんごが3つではないときに「3つではありません。」と表示する」命令をすると、りんごは3つあるので条件は成り立ちません。\\ {{:ronria3.png?nolink&100|}} {{:ronri3.png?nolink&100|}}
*もし、りんごを1つ冷蔵庫に入れると、冷蔵庫にあるりんごは4つとなります。冷蔵庫のりんごは3つではないので条件は成り立ち、画面には「3つではありません。」と表示されます。\\ {{:ronria4.png?nolink&100|}} {{:ronri2.png?nolink&100|}}
*プログラムにすると、次のようになります。
***条件が成り立つ場合(論理否定)**
りんご←4
もし りんご = 3 でない ならば
”3つではありません” を表示する
を実行する
==== 排他的論理和(XOR) ====
*プログラミングではいくつかの条件を組み合わせた結果によって命令を実行したい場合があります。このとき「どれか1つの条件だけが成り立つとき」を排他的論理和(XOR)といいます。
*たとえば、冷蔵庫にりんごが3つ、みかんが5つ入っているとしましょう。「りんごとみかんのどちらかが3つ以上あるときに「あります」と表示する」命令をすると、りんごとみかん、どちらも3つ以上あるので条件は成り立ちません。\\ {{:ronria3o5.png?nolink&100|}} {{:ronri3.png?nolink&100|}}
*もし、りんごを1つ食べると、冷蔵庫にあるりんごは2つ、みかんが5つとなります。みかんだけが3つ以上あるので条件は成り立ち、画面には「あります」と表示されます。\\ {{:ronria2o5.png?nolink&100|}} {{:ronri1.png?nolink&100|}}
*もし、りんごを1つ増やして、みかんを3つ食べると、冷蔵庫にあるりんごは3つ、みかんは2つとなります。りんごだけが3つ以上あるので、条件は成り立ちます。\\ {{:ronria3o2.png?nolink&100|}} {{:ronri1.png?nolink&100|}}
*プログラムにすると、次のようになります。
***条件が成り立つ場合(1)(排他的論理和)**
りんご←2
みかん←5
もし りんご >= 3 かつ みかん >=3 でない ならば
"あります" を表示する
を実行する
***条件が成り立つ場合(2)(排他的論理和)**
りんご←3
みかん←2
もし りんご >= 3 かつ みかん >=3 でない ならば
"あります" を表示する
を実行する
----
==== 木構造 ====
*木構造はコンピュータでデータを扱う方法のひとつです。
*木構造では1個の点から複数の線が出て、その端の点からさらに複数の線が出る形を繰り返すことで、根を表す最初の点から枝を表す線が伸びていく構造を表すことができます。
*木構造はフォルダのような情報の階層構造を示す等に用いられます。
*ドリルでは木構造の一つである「二分木」を扱っています。
----
==== スタック ====
*スタックは、コンピュータでデータを扱う方法のひとつです。
*スタックはデータを並べた構造で、後から入れたデータを先に取り出します。
*実際のコンピュータでは、ソフトウェアで1つ前の状態に戻す場合やブラウザの戻るボタンで閲覧していたページに戻るときなどに利用されています。
----
==== 変数 ====
*プログラムでは、入力された値や計算した値を覚えておくことができます。
*1つの変数は1つの値を覚えます。変数の名前は自分で決めることができます。
***変数に数を覚えさせて、その数を画面に表示するプログラム**
へんすう1←10
へんすう2←20
へんすう1 を表示する // 10と表示される
へんすう2 を表示する // 20と表示される
*変数に他の値を覚えさせることもできます。元の値は新しい値に上書きされます。
***へんすう1の値を上書きするプログラム**
へんすう1←10
へんすう2←20
へんすう1←30
へんすう1 を表示する // 30と表示される
へんすう2 を表示する // 20と表示される
----
==== 配列 ====
*配列はいくつかのデータを1列に並べたもので、プログラムで複数のデータを扱いたいときに利用します。
*配列に入っているデータを「要素」といいます。配列の要素には番号が付いています。
*次の図では、「好きな数字」という名前の配列の要素に「12, 32, 23, 14, 5」の数を入れています。\\ {{::array.png?nolink&300|}}
***配列を作るプログラム**
好きな数字[]←{12, 32, 23, 14, 5}
*配列の要素は、配列の名前と番号で指定します。
*たとえば、「32」を取り出したい場合は、「好きな数字」の「2番目」にあるので、次のようなプログラムになります。
***好きな数字[2]の値を画面に表示するプログラム**
好きな数字[]←{12, 32, 23, 14, 5}
好きな数字[2] を表示する
*配列の要素に値を上書きする場合も、配列の名前とその数がある場所を組み合わせて指定します。
*たとえば、好きな数字[2]の「32」を「999」にする場合は、次のようなプログラムになります。
***好きな数字[2]の値を「999」に上書きして画面に表示するプログラム**
好きな数字[]←{12, 32, 23, 14, 5}
好きな数字[2] を表示する
好きな数字[2]←999
好きな数字[2] を表示する
*配列の要素を使って計算をすることもできます。
*たとえば、好きな数字[1]の「12」と好きな数字[4]の「14」を足し算した結果を表示する場合は次のようなプログラムになります。
***好きな数字[1]と好きな数字[4]の足し算の結果を表示するプログラム**
好きな数字[]←{12, 32, 23, 14, 5}
好きな数字[2] を表示する
好きな数字[2]←999
好きな数字[2] を表示する
好きな数字[1]+好きな数字[4] を表示する
----
==== 関数 ====
*関数は処理手順に名前を付けたものです。
*プログラミングでは、複数の命令を組み合わせて関数を作成し、利用することができます。
*たとえば、階段をかくプログラムを1つにまとめて「階段かく()」という関数を作る場合は、次のようなプログラムになります。
***「階段かく()」という関数を作るプログラム**
階段かく() とは
進む(1)
左回り(90)
進む(1)
右回り(90)
進む(1)
である
*「階段かく()」を実行するときは、次のようなプログラムになります。
***「階段かく()」を実行するプログラム**
階段かく()
*三角形をかくプログラムを1つにまとめて「三角かく()」という関数を作る場合は、次のようなプログラムになります。
***「三角かく()」という関数を作るプログラム**
三角かく() とは
ここから3回
進む(1)
左回り(120)
をくり返す
である
*「三角かく()」を実行するときは、次のようなプログラムになります。
***「三角かく()」を実行するプログラム**
三角かく()
*関数には、値を与えるとその値を利用して処理を行うものがあります。
*たとえば、先ほどの「三角かく()」は、何回実行しても同じ大きさの三角形がかかれます。進む距離を関数に与えて、その値を指定できるようにすると、次のようなプログラムになります。
***進む距離を自分で指定できる関数を作るプログラム**
三角かく(距離) とは
ここから3回
進む(距離)
左回り(120)
をくり返す
である
*進む距離は、関数を実行するときに指定します。()の中に書かれた値が、距離として利用されます。このように関数に渡す値を「引数(ひきすう)」といいます。
***「三角かく(n)」を実行するプログラム**
三角かく(10)
*関数には1つ以上の引数を指定することもできます。
*次のプログラムは、2つの引数を足し算して、その結果を画面に表示するものです。関数を実行するときに渡した「7」は「値1」として、「8」は「値2」として関数の中で扱われます。
***2つの引数の値で足し算をする関数を定義する**
足し算(値1、値2)とは
結果←値1+値2
結果 を表示する
である
// 関数の実行
足し算(7、8)
*関数による処理の結果を呼び出したプログラムに戻して使うこともできます。戻る値を「戻り値」といいます。
*次のプログラムでは、足し算した結果を返す関数を定義しています。実行する際には、足し算(7、8)の結果を「計算結果」に入れて、計算結果を画面に表示しています。
***2つの引数の値で足し算した結果を返す関数を定義する**
足し算(値1、値2)とは
値1+値2 を返す
である
// 関数の実行
計算結果←足し算(7、8)
計算結果 を表示する
----
==== スワップ ====
*プログラムで2つの変数の値を交換する方法を「スワップ」といいます。
*1つの変数は1つの値だけを覚えておくことができるので、値を交換するときには一時的に値を保存するための変数を用意します。
***aとbの値を交換するサンプルプログラム**
a←10
b←5
c←0
c←a
a←b
b←c
a を表示する
b を表示する
c を表示する
----
==== 探索アルゴリズム ====
*プログラムで問題を解決するための定石のような考え方のことを「アルゴリズム」といいます。
*データを探すアルゴリズムを「探索(サーチ)アルゴリズム」といいます。探索アルゴリズムには多くの種類があります。データの並びやアルゴリズムの種類によってデータを探し出す速さが変わります。
*ここではドリルで扱っている3つの探索アルゴリズムについて紹介します。
=== 線形探索 ===
*1つずつ順にデータを見ることで、目的のデータを探していくアルゴリズムを「線形探索」といいます。
*探したいデータが最初にある場合は1回で見つけることができますが、最後にある場合は全部のデータを見る必要があります。
=== 二分探索 ===
*データを半分ずつに分けて目的のデータを探していくアルゴリズムを「二分探索」といいます。
=== 深さ優先探索 ===
*木構造のデータを探索するときに使われるアルゴリズムです。
*道を一番奥まで探していく方法で、目的のデータを探していきます。
*左の図は、このアルゴリズムの動きを表したものです。右の図は探索したデータの順番を表しています。
{{:dfs2.png?nolink&200|}} {{::dfs.png?nolink&200|}}
----
==== 整列アルゴリズム ====
*データを並び替えるアルゴリズムを「整列(ソート)アルゴリズム」といいます。整列アルゴリズムには多くの種類があります。選択するアルゴリズムによって、データを並び替える速さが変わります。
*ここではドリルで扱っている2つの整列アルゴリズムについて紹介します。
=== 選択ソート ===
*一番大きい(小さい)値を探すことをくり返すことで、データを並び替えるアルゴリズムを「選択ソート」といいます。
*並び替えるデータの数が多くなるほど、並び替えに時間がかかります。
=== バブルソート ===
*隣にあるデータを比べて、値が大き(小さ)ければ交換することをくり返すことで、データを並び替えるアルゴリズムを「バブルソート」といいます。
*並び替えるデータの数が多くなるほど、並び替えに時間がかかります。
----
==== ダイクストラ法 ====
*目的地までにかかる時間が短い道を探す方法を「最短経路探索」といいます。
*ダイクストラ法は今の場所から次の場所へと進む組み合わせで最もコストが低い道を選んでいくことで、目的地までにかかる時間が短い道を選びます。
----
==== ナップサック問題 ====
*ナップサック問題は、入る量が決まっているカバンへ品物をつめたときに、品物の合計金額(価値)が一番多くなる組み合わせを考える問題です。
*効率的に解くことが難しい問題の1つとして知られています。
----
==== 関係データベース ====
*いくつかの表でデータを管理する方法を「関係データベース(RDB)」といいます。
*関係データベースでは、表から必要な部分のみを取り出したり、複数の表を組み合わせることで目的のデータを得ることができます。
----
==== 振る舞い図 ====
*本書で使用した振る舞い図は、機械同士や、機械と人とのやりとりを含む処理の流れを表した図です。
*{{:syori.png?nolink&80|}}は、処理を表しています。
*矢印は、相手に渡すものを表しています。矢印の上には、相手に渡すものを書きます。
*例:{{:activity.png?nolink&300|}}
----
==== 状態遷移図 ====
*状態遷移図は、状態の変化を表した図です。
*{{:joutai.png?nolink&50|}}は、状態を表します。
*矢印は状態が変化するときの条件や動作を表します。
*次の状態遷移図は、扇風機の状態の変化を表しています。
*例: {{:jyotai2.png?nolink&200|}}
----