「高等学校情報B」の版間の差分

削除された内容 追加された内容
内容2の途中までを追加。一旦保存したいのでここまでを投稿する。
 
内容3までを追加。内容4はまだ作成していない。
431 行
という文を書く必要がある。これは、import文と呼ばれる文だが、これについては
詳しく説明しない。[[python]]などを参照。
 
これらの結果を用いて、プログラムを書けばよい。与えられたデータが、
[1, 4, 3, 2, 5]
であり、探しているデータが2であったとすれば、
1: from sys import exit
2: data = [1, 4, 3, 2, 5]
3: looking_for_this= 2
4: i = 0
5: while (i < 5):
6: if (looking_for_this == data[i]):
7: print "I found this. The order of the number I need is"
8: print i
9: print "."
10: exit(0)
11: i = i + 1
12:print "I can't find that."
となる。ただし、先頭の数字は解説のためにつけたもので、実際のプログラムには
現われない。
 
ここからはプログラムを順に見ていく。
1行目は、先ほど述べたimport文であるが、この文については詳しく扱わない。
2行目は、<nowiki>[1, ..., 5]</nowiki>で与えられるリストを、変数dataに代入
している。
3行目では、探している変数をlooking_for_this という変数に代入している。
4行目では、iというくり返しの条件に用いる変数に0を代入している。この値は、
後にdataの数だけくり返しを行なうために必要となる。この数は、dataに代入された
リスト内の要素の数と、一致しなくてはいけない。実際には、変数data自身から、
data内に含まれる要素の数を取得することも出来る。しかし、それが出来るかどうかは
言語や、用いている環境による場合もあるので、ここでは考えない。
<!--
Cで、配列を用いてデータを記憶するときは、
v[5] = {1,4, ..., 5};
となるだろう。ここで、配列の最後がいくつめであるかを獲得する方法は
あるだろうか?Cの文字列の場合は'\0'を終端として用いるので、これを用いて
標準関数
#include <string.h>
size _t strlen(const char * s)
を書くことが出来る。
-->
5行目が、くり返しの始まりである。この時条件文の中身は、iが0であることから、
0 < 5
となっており、0が5より小さいかどうかを調べている。これは'真'であるので、while内の文が実行される。そのことによって6行目が
実行されるが、ここでは、if文を用いて、dataのi番目の要素が、探している
量であるlooking_for_thisと等しいかどうかを調べている。ここでは、iが0の
時には、data[0]が1であり、looking_for_thisが2であり、条件式は
1 == 2
となるが、これは1と2が等しいかどうかを調べている。これは'偽'であるので、if文の中身は
実行されない。そのため、プログラムの実行は次に11行目へと移る。
11行目の文は奇異に見えるかも知れないが、=が等しいことを表わす演算子では
なく、代入を表わす演算子であることを考える必要がある。
更に、加法の演算子の優先度が、代入の演算子より高いことを考えると、
11行目は、'変数iに、現在の変数iの値に1を足したものを代入せよ'という命令と
なる。結局、iの値に1を加えることに対応する。
while文の範囲はここまでであるので、次に文の実行は、5行目に戻る。
ここで、再び、i < 5の比較を行なう。ここでは、さっきと違ってiは、1であるが、
依然としてiが5より小さいことは変わらないので、再びwhile文の中身が
実行される。ここで、iが5になればこの条件式が'偽'となることから、
このくり返しは、iが0,1,2,3,4の5回だけ実行されることが分かる。この
5回は、リストに貯えた情報の数と一致しているため、ちょうど全ての
情報を調べることができるのである。iが1の場合はdata[i]は4であるので、
これも求める数ではない。再び、iが1だけ増える手順をくり返すのだが、
iが3になったとき、
looking_for_this == data [i]
が'真'になる。ただし、要素の番号は0から数えることに注意。data[3]が
2であり、data[4]が5である。このとき、7から10行目のif文の中身が実行される。
7行目はprint文であり、書かれた内容を出力する。8行目も、print文だが、
今度は、iの中に貯えられている値を出力する。ここで、print文の後に
書かれている語の性質によって、print文の動作が変化していることに注意。
実際にはこのために複雑な処理をしているが、それについては詳しく述べない。
9行目もprint文だが、これは文末のピリオドをつけるだけである。
10行目のexitは、プログラムの実行を停止する関数であるので、ここで
プログラムの実行は止まる。結局探していたデータがdata[3]に保存されていた
ことがわかったわけである。
 
ここまでが、最も簡単な探索である線形探索の手順である。探索では
[[w:2分探索]]なども有名であるが、ここではそれについてはふれない。
[[計算機科学]]などを参照。
 
<!--
*補足
実際には、whileに対応する機械語は存在せず、ただ、実行する順番を
変える機械語だけが存在する。このような操作は、高級言語で対応する
操作を表わすときには、'goto'という名称を与えられることが多い。
しかし、gotoよりも、while
-->
 
===問題のモデル化とコンピュータを活用した解決===
 
この章では、コンピューターを用いて、簡単なプログラムを作ることを目的と
する。その際、対象の性質に注目し、それらをコンピューターに解決させる
方法を考え出すことを、主要な目的とする。
 
この章には、'モデル化とシュミレーション'と、'情報の蓄積・管理とデータベースの活用'
の2つの内容が存在する。どちらも実習を含む内容となっているが、実際には
両方の実習を行なう必要はなく、情況に応じて、片方を選択すればよい。
ただし、基本的な考えは、両方の分野について学習を行なうものとする。
<!--
安易に'基本的な'などとつけると、'曖昧だ'、'定義がおかしい'と
つっこまれることは避けられないと思うのだが ... 。
-->
 
====モデル化とシミュレーション====
 
<!--
身のまわりの現象や社会現象などを通して,モデル化とシミュレーションの考え方や方法を理解させ,実際の問題解決に活用できるようにする。
-->
 
ここでは、いくつかの簡単なプログラムを作成してみる。例として、
;1から12までの数値を与えたとき、対応する月の英語名を返すプログラム
を作成する。ここでは引き続きpythonを用いるが、他の手法を用いてもよいものとする。
 
ある数値に対応して、月の名前を得るようなデータは、
上で述べたリストを用いると、
l[1] = 'January'
l[2] = 'February'
...
l[12] = 'December'
などとして表現することが出来る。これは、lの1番目や2番目に対して個別に代入を
行なっていることに対応する。ただし、実際にはこのような作業はより簡単に、
l = ['January', 'February', ..., 'December']
のように書くことが出来る。このような簡略化された書き方が出来るかどうかは、
インタプリタの性質によっており、様々な言語が作成される原因ともなっている。
 
次に、与えられた数値に対して対応する文字列を得るには、
print l[i]
とすればよい。ただし、iは対応する数値とする。後は、iを与える方法を
指定すればよい。単にiをプログラム中で指定するようにするなら、
単に代入を行なえばよい。
i = n
ただし、nは、1から12の整数である。
 
これらをまとめると、最終的に求めるプログラムは次のようになる。
l = ['January', 'February', ..., 'December']
i = 2
print l[i]
ただし、ここでは求めたい月の名前が、2月の名前であるものとした。
求めたい月の整数を、プログラムの外部から与える方法は、ここでは扱わない。
<!--
ここでは、より進んだ話題として、
プログラムを起動するときに、値を個別に与える手法について説明する。
一般に、プログラムは起動されるときにOSから、いくつかの文字列を
受け取る。これらは、プログラムの動作を制御するために用いることができる。
このような文字列の用い方は、言語ごとに異なっているが、pythonでは、
sys.argv
という名のリストとして与えられる。
-->
 
====情報の蓄積・管理とデータベースの活用====
<!--
情報を蓄積・管理するためのデータベースの概念を理解させ,簡単なデータベースを設計し,活用できるようにする。
-->
<!--
オープンソースのデータベースはMySQLとPostgreSQLしか思いつかないが
これを用いてよいのだろうか ... 。
-->
 
ここでは、データベースソフトウェアの活用について述べる。
データベースソフトウェアは、情報を蓄積し、それを必要な時に取りだすことを、
専門に行なうソフトウェアである。データベースソフトウェアは、いくつかの
重要な用件を満たさなくてはならない。
これらの特性は'ACID特性'と呼ばれ、データベースの性質を議論する上で有用となる。
しかし、これらの性質はやや複雑なので、ここでは詳しくは述べない。詳細は、[[w:ACID特性]]を参照。
 
データベースソフトウェアはその性質上、主にデータを貯えることだけを専門にしており、
単独では、複雑なことは出来ないのが普通である。そのため、データベースから取りだした
データを加工するために、上で用いたpythonのような言語が技術として用いられるので
ある。この性質上、データベースソフトは'データを保存したり、取りだしたりことを専門に行なう
部分'と、'データを受け取り、加工し易いようにする'の2つの部分に分割されることが
多い。一般に、これらの機能を持ったプログラムは別々に作成され、お互いの間で通信を行なうことで、
目的を達するような設計となることが普通である。このようなソフトウェアを、一般にサーバクライアント型と呼ぶ。
ここでは、データの管理を行なう部分がサーバであり、データを利用者に
与える部分が、クライアントである。サーバは英単語server、
クライアントは英単語clientから来ている。
 
 
データベースソフトウェアは、種類によってそのデータの保存の仕方や、扱い方が異なっているのが
普通である。しかし、これらの扱い方が、少なくとも利用者の視点からは、全く同じに見える方が
望ましい。なぜなら、もしそうであるなら、あるデータベースのために作成した利用者の
ソフトウェアが、他のデータベースに対しても用いることが出来るからである。
一般に、各々のソフトウェアの間で、プログラムを共有できる性質を、[[w:互換性]]と呼ぶ。
このとき、データベースの利用者側のソフトウェアは、各々のデータベースソフトウェア間で
互換性があることが望ましい。
 
このような互換性は実際に存在し、利用者がデータを受け取るために用いる
プログラムは標準化されている。ただし、利用者のプログラムを解釈するソフトウェア
や、解釈したソフトウェアがサーバ部分と通信する方法は、標準化されておらず、高価で優れたソフトウェアは通信の安定性や速度などがよりよく考慮されており、差別化が行なわれている。
 
実際に、データベースを用いるために利用者が用いる言語は、[[w:SQL]]
と呼ばれる。SQLは、Structured Query Language の略で、日本語では
'構造化問い合わせ言語'と訳される。SQLの文法は、英語の文法に近く、
修得は比較的簡単であるとされている。ただし、この言語を一般の
アルゴリズムを作成するために用いることは困難であり、あくまで、
データベースに要求を伝えるためだけに作られた言語であることには
注意する必要がある。一般にSQLは、[[w:リレーショナルデータベース]]を
用いるための言語である。リレーショナルデータベースとは、データとデータの
関係を表の形で表わし、その表を用いて、データを蓄積する手法である。
<!--
この文には'直観的には'とつけないと'数学的には'間違い。
定義は数式で与えられる。
-->
この手法は直観的にわかりやすいため、現在のデータベースソフトウェアの
構成法として広く用いられている。
 
 
ここでは、SQLを用いて、簡単なデータベースを作成してみる。
ここでは、標準的な内容しか扱わないので、用いるデータベースは
<!-- ANSI標準らしい。調べないと ... 。 -->
どのようなものでも構わないが、オープンソースソフトウェアとしては
[[w:MySQL]]や[[w:PostgreSQL]]が有名である。
 
ここでは、データベースソフトウェアが既に起動し、SQLを用いることで、
データの出し入れが出来る状態が整っているものとする。詳しい導入は付録を参照。
<!-- とはいうものの、MySQLの導入を簡単に行なう方法はないと思うが ... 。
-->
 
データベースで非常に重要なことは、表を適切な形に定義する事である。
一度定義した表の情報は、変更できるが、やや手順が面倒なので、
最初に定義するときには気を付けて定義を行なうことが望ましい。
 
テーブルを定義するSQLは、
CREATE TABLE name ( element type, element type, ...)
が基本である。ここで、nameは、表の名前であり、elementは、
それぞれの要素の名前である。typeは、それぞれのデータの
型を表わしている。型とは、それぞれのデータがどのようなものであるかを
表わす量であり、整数型、文字型などがある。ここではこの2つしか
用いない。
 
ここでは、商品番号と商品名のみからなる、簡単な表を考える。
このとき、表を作成するSQLは、
CREATE TABLE goods (num INTEGER, name CHAR (30) )
となる。ここで、INTEGERは、英語で'整数'という意味であり、
CHARは、character'文字'の略である。numとnameは、それぞれ商品の番号と、
商品名を表わす量である。
 
ここでは用いないが、作成した表を消去するには、
DROP TABLE name
というSQLが対応する。
 
実際に作成した表に、データを挿入するには、
INSERT INTO name VALUES (elem1, elem2, ... )
が用いられる。ここで、insert'挿入する'である。
ここでは、この文を3回用いて3つのデータを挿入する。
INSERT INTO goods VALUES (1, 'bread')
INSERT INTO goods VALUES (2, 'humburger' )
INSERT INTO goods VALUES (3, 'peanut)
これで、goodsという名の表には3つのデータが挿入された。
ここまででデータの作成は終了である。一方、実際のデータベースの運用では
データの挿入と読み出しが自由な順でなされるのが普通であることは注意が必要である。
 
作成したデータを読みだすには、SELECTという命令を用いる。SELECTの
用い方は複雑であるが、ここでは最も簡単な用い方だけを導入する。
nameという名の表から、elem1, elem2, ... などのデータを取りだしたいときには、
SELECT elem1, elem2, ... FROM name
というSQLを用いる。ただし、全ての情報を読みだしたいときには、
elem1 , ... を*に書き換えた文を用いる。例えば、上の例では、
SELECT name FROM goods
というSQLは、3つの商品名を返す。また、
SELECT * FROM goods
というSQLは、それぞれの商品の、商品番号と商品名を、組にして取りだすために
用いられる。ただし、SELECTは、情報を取りだす働きがあるが、取りだされたデータが
消える事はなく、単に情報が複製されることには注意が必要である。。
 
SELECTには、更にWHEREや、ORDER BYを用いた表式があるので、ここで説明する。
WHEREは、
SELECT ... FROM ... WHERE 条件式
の形で用いられる。ここで、条件式とは、それぞれの要素に関して正しいか
間違いであるかが定まる量のことであり、条件式が正しい('真である'という)
時に、対応するデータを取りだし、条件式が正しくない('偽である'という)
時には、データを取りださない。条件式の性質は詳しくは扱わないが、
加法や減法なども用いることが出来る。例えば、
SELECT name FROM goods WHERE id = 3
は、'菓子パン'を返す。また、
SELECT name FROM goods WHERE id + 1 = 3
は、'サンドイッチ'を返す。最後にORDER BYは、
SELECT ... FROM ... ORDER BY ...
の形で用いられ、読みだされたデータの並べ換えをさせる効果がある。
例えば、
SELECT name FROM goods ORDER BY num
は、numが小さい順にデータを表示する。一方、numが大きい順に表示させたい時には、
SELECT name FROM goods ORDER BY num DESC
とDESCをつけてSQLを作成する必要がある。
 
ここまでで簡単なSQLを扱って来た。実際のデータベースを用いたプログラムでは、
取りだした情報を別の言語を用いて、加工することが普通である。データベースとの
接続の詳細は、複雑なのでここでは触れない。
<!--
'詳解MySQL'のような本があれば、それを勧めるが ... 。そのような本は見たことがない。
-->
<!--
日本語を用いる方法を説明したかったのが、手元のマシンのMySQL3.23.58では、
UTF8などのSQLを認識しないようなので、断念した。infoファイルには
ユニコードの使い方が載っていたが、ユニコードについては4.0以降で実装された機能も多いと
並記されていた。
-->
 
 
====情報社会を支える情報技術====
 
====情報通信と計測・制御の技術====
<!--
情報通信と計測・制御の仕組み及び社会におけるそれらの技術の活用について理解させる。
-->
 
 
====情報技術における人間への配慮====
<!--
情報技術を導入する際には,安全性や使いやすさを高めるための配慮が必要であることを理解させる。
-->
 
 
 
 
====情報技術の進展が社会に及ぼす影響====
<!--
情報技術の進展が社会に及ぼす影響を認識させ,情報技術を社会の発展に役立てようとする心構えについて考えさせる。
-->