📘 CodingMarble Learn

応用プログラミングとアプリケーション

応用プログラミングとは、目的に合ったデータ構造(配列・連結リスト・スタック・キュー)を選び、IDEでコードを書いてテストし、グラフやアニメーションを作り、表計算の関数を使い、SQLで検索できるリレーショナルデータベースにデータを安全に保存することです。

🎬 ステップ別ストーリー

  1. 配列には決まった数のマスがあります。ここでは6個です。大きさは最初に決めます。いっぱいになったら、もう追加できません。
  2. 連結リストは必要に応じて長くなります。それぞれのノードは、値と次のノードへのリンクを持っています。最後のノードは何も指しません(null)。「追加」を押してみましょう。
  3. スタックは重ねたお皿のようなものです。いちばん上に置き(push)、いちばん上から取ります(pop)。最後に入れたものが最初に出ます。
  4. キューは切符を買う行列のようなものです。うしろに並び、先頭から出ていきます。最初に入ったものが最初に出ます。
  5. データベースはデータを表(テーブル)に入れて持っています。2つの表はキー、つまりidでつながります。SQLの問い合わせで、ほしい行だけを選べます。ここでは50点以上の行です。
  6. あなたの番です。リスト、スタック、キューのどれかを選び、ボタンを押して追加したり取り出したりしてみましょう。

ヒント:3Dをドラッグすると回せます。2本指で拡大・縮小できます。

🤔 よくある疑問をスッキリ解決

なぜ配列に7個目を追加できないのですか。

配列の大きさは、つくるときに決まります。ステップ0では、6つのマスが配列のすべてです。増えていくものには、リストを使いましょう。

連結リストは順番をどこに持っていますか。

リンクの中です。各ノードは次のノードだけを知っているので、矢印に沿って進みます。ステップ1を見てください。

なぜpopは最後に追加したものを返すのですか。

スタックの口は1つだけで、それが一番上です。新しいものが一番上にあるので、最初に出ていきます。ステップ2を見てください。

キューはスタックとどう違いますか。

キューはうしろに追加して前から取り出すので、一番古いものが先に出ます。ステップ3でボタンを押してみましょう。

なぜ1つの表ではなく2つの表を使うのですか。

1つの事実を1回だけ保存するためです。名前は1つの表、点数は別の表に入れて、idでつなぎます。そうすれば、名前を直すときも1か所を変えるだけです。ステップ4を見てください。

どの構造を使えばいいですか。

大きさが決まっていて、添字で速く取り出したいなら配列。増えていくものならリスト。元に戻す、戻るならスタック。順番待ちならキュー。ステップ5でそれぞれ試してみましょう。

データ構造:配列、連結リスト、スタック、キュー

データ構造とは、プログラムが速く簡単に使えるようにデータを並べる方法のことです。

ライブラリには、これらの道具がすでに入っています。Pythonでは list がスタックとして使えます(append、pop)。collections.deque は速いキューとして使えます。ライブラリがあるときはそれを使い、自分で作り直さないようにしましょう。

stack = []
stack.append(5); stack.append(8)
stack.pop()      # gives 8
from collections import deque
q = deque([4, 9]); q.append(2)
q.popleft()      # gives 4

IDEを使う:書く、動かす、テストする

IDE(統合開発環境)は、エディタ、実行ボタン、デバッガ、各種ツールを1か所にまとめたものです。コードに色を付け、名前の候補を出し、入力中にエラーを教えてくれます。

2D・3Dの可視化とアニメーション

絵を使うと、パターンが見えやすくなります。プログラムは、グラフ(棒、折れ線、散布図)、2Dの図、3Dの場面を描けます。アニメーションとは、少しずつ変えた同じ絵を何度も描き直すことです(1秒に30〜60回ほど)。簡単な方法は、x のような変数を用意し、フレームごとに少し足して描き直すことです。このページの3Dも、3Dライブラリを使って同じようにつくっています。

表計算の応用関数

表計算ソフトは、関数を使ってプログラムのような作業ができます。

リレーショナルデータベースとSQL

リレーショナルデータベースは、行と列でできたテーブルにデータを入れます。各テーブルには主キーがあります。主キーは値が重ならない列です(id)。別のテーブルは、その値を外部キーとして持ち、つながります。よい設計では、1つの事実を1回だけ保存するので、同じデータが繰り返されません。

SQLは、質問をしたりデータを変えたりするための言語です。

SELECT name, score FROM students
JOIN marks ON students.id = marks.id
WHERE score >= 50 ORDER BY score DESC;

INSERT INTO marks (id, score) VALUES (5, 67);
UPDATE marks SET score = 55 WHERE id = 2;
DELETE FROM marks WHERE id = 5;

整合性とは、データが正しいままであることです。キーは重ならず、外部キーは実在する行に合い、値は正しい型を持ちます。セキュリティとは、ユーザーごとのパスワード、必要な権限だけを与えること、バックアップ、そしてユーザーの文字をそのままつなげてSQLを作らないこと(パラメータを使う)です。これでSQLインジェクションを防げます。

オープンな資源への貢献

多くの道具やライブラリはオープンソースです。ライセンスのもとで、だれでも読んで、使って、改良できます。バグを直す、説明を良くする、ページを翻訳する、例を足すなどで協力できます。必ずライセンスを読み、作者の名前を示し、変更を提案するときは、分かりやすく丁寧に書きましょう。

やってみよう

3Dのステップ5で、スタックに3つの値をpushし、それからpopしてみましょう。出てきた順を書きます。キューでも同じことをします。次に、先に予想してから確かめましょう。4、9、2を追加して1つ取り出したあと、キューの先頭とスタックの一番上には、どの値が残るでしょうか。

重要な公式と用語

例題

1. 5、8、2の順にスタックへpushします。そのあとpopを2回行います。いま一番上にあるのはどれですか。

pushしたあとのスタックは 5、8、2(2が一番上)。popで先に2、次に8が取れます。残るのは5。一番上は5です。

2. 4、9、2の順にキューに入ります。dequeueを1回行います。いま先頭にあるのはどれですか。

最初に入ったものが出るので、4が取り除かれます。先頭は9です。

3. 点数の表:idが1〜4で、点数は72、45、88、51です。WHERE score >= 50 は何行を返しますか。

72、88、51が50以上です。つまり3行です。

4. セルB2:B5に72、45、88、51が入っています。=SUMIF(B2:B5,">=50") の結果はいくつですか。

72、88、51だけを足します。72 + 88 + 51 = 211。

5. ( [ ] ) のような式のかっこをチェックするのに、なぜスタックを使うのですか。

開きかっこを1つずつpushします。閉じかっこが来たらpopして、対応するかを確かめます。いちばん新しい開きかっこを先に閉じる必要があり(LIFO)、スタックはまさにそうなっています。最後にスタックが空なら、かっこは合っています。

よくある間違い

練習クイズ

1. LIFOなのはどの構造ですか。
2. リンクでつながり、ノードを1つずつ増やせる構造はどれですか。
3. SQLで、条件に合う行を選ぶ句はどれですか。
4. どの行も値が重ならない列は何ですか。
5. デバッガのブレークポイントは何をしますか。

練習:自分で答えてみよう

答えを入力するか選んで、「チェック」を押そう。困ったらヒントを見てね。解答は答えたあとに表示されます。

よくある質問

配列と連結リストは何が違いますか。

配列は大きさが決まっていて、添字でどの要素にもすぐ行けます。連結リストは増えたり減ったりできますが、要素に届くにはリンクを1つずつたどる必要があります。

主キーと外部キーとは何ですか。

主キーは、出席番号のように、どの行にも重ならない値を与える列です。外部キーは、別のテーブルにある列で、その値を持って2つのテーブルをつなぎます。

SQLインジェクションはなぜ危険で、どう防ぎますか。

ユーザーの文字をそのままSQLの命令に貼りつけると、悪意のある人が自分の命令を足して、データを読んだり消したりできてしまいます。パラメータ付きの問い合わせを使えば、その文字はいつもデータとしてだけ扱われます。

先に学ぼう

次に学ぼう