プログラミング基礎
1. プログラミング言語
1.1ハードウエアとソフトウエア パソコンをはじめとするコンピュータは「ハードウエア」といわれます。このハードウエアだけで何 ができるかといえば単なる計算だけです。もちろんそれを表示することもできませんし、キーボードか ら文字を打つこともできません。計算ができるといっても、数字を入力できないのですから数値を与え ることすらできないのです。 このハードウエアを制御したり、計算させたりするために必要なのが「ソフトウエア」です。ソフト ウエアがハードウエアをコントロールしているわけです。前期の文書処理で使ったワープロソフト MS-Word や表計算ソフト MS-Excel もそんなソフトウエアの一つです。ソフトウエアがあるからこそ、 ハードウエアを使うことができるのです。そのソフトウエアを「プログラム」とも呼びます。このソフ トウエアを作るために必要なのがプログラミング言語なのです。 逆にいえば、ソフトウエアがあるとからこそパソコンというハードウエアが意味を持ってくるのです。 ここのプログラミング基礎では、そのプログラムを作成するための最初の部分を学習します。 1.2 プログラミング言語とは すでに習っていると思いますが、コンピュータ(正確には CPU) が理解できるのは「マシン語(機械語)」といわれるものだけで す。このマシン語は人には単なる数字の羅列にしか見えません。 2 進数ですが、ほとんどの場合、16 進数で表示することが多いの です。 しかし、これでは人間にとっては何がなんだか分かりません。 そこで、そのマシン語を人間の言葉に近いもの(アメリカで生ま れたのでもちろん英語をもとにしています)で置き換えたものが 「アセンブラ言語」といわれるものです。このアセンブラ言語を マシン語に変換するプログラムをアセンブラといいます。一応、 人の言葉に近いものになっていますがわかりにくいものです。ア センブラ言語を「低水準言語(低級言語)」といいます。 アセンブラ言語では開発効率が低い、わかりにくいなどの問題 点があります。そこで、もっと人間の言葉に近い、開発効率を考 えた言語の開発が行われました。アセンブラ言語に対して、この 言語を「高水準言語(高級言語)」といいます。ここで扱う C 言 語のほかにも BASIC や Fortran, Pascal, Java などが高水準言語 です。 しかし、どの言語も英語を元にしているので、かなり似たものに見えます。ですから、プログラミン グ言語、特に高水準言語はひとつを知っていれば、二つ名以降の学習は割と楽になることが多いもので す。 24 5F BC 47… mov ax, bx add bx : #include <stdio.h> int main(void) { printf("Hello"); return(0); }1.3コンパイラとインタプリタ プログラミング言語で書かれたプログラムを「ソースプログラ ム」といいます。しかし、これはマシン語ではないので CPU は 理解することができません。ソースプログラムを CPU の理解で きるマシン語に変換しなければなりません。この方法には 2 通り あります。 一つ目は「コンパイラ」といわれるプログラムを使って、ソー スプログラムをすべて一度にマシン語に直し、それを実行する方 法です。ちょうど英語の本を日本語に翻訳してもらい、その本を 読むようなイメージです。最初の翻訳のときには時間がかかりま すが、本になっているのですから、繰り返し何度でも読むことが できます。 もう一つは「インタプリタ」といわれるプログラムを使って、 ソースプログラムを 1 行ずつマシン語に直し、実行する方法です。 英語の分かる人にその場で英語の本を日本語に訳して読んでも らうことのようなイメージです。すぐに内容は分かりますが、そ の場で訳してもらっているので、時間がかかります。もう一度内 容が知りたくなったら、また、日本語に訳して読んでもらわなけ ればなりません。 今回の講義ではコンパイラを使って C について勉強して行きま す。 1.4 C言語について
1950 年代に IBM で開発された最初の高水準プログラミング言語が Fortran でした。この Fortran は 数値計算の分野で現在も多く使われています。この Fortran をもとに簡素化した BASIC も使われてい ます。高校の範囲に含まれるのがこの BASIC です。これらの言語はプログラムの流れがつかみにくく なるという欠点も持ってました。 これに対し、1970 年頃、「構造化プログラミング」といわれる概念が提案されました。これはプログ ラムを論理的にわかりやすく記述することを目的としています。現在では、この構造化プログラミング がもはや常識となり、Fortran や BASIC の現在のバージョンでも、構造化プログラミングの概念を取 り入れるようになっています。 C 言語は UNIX と呼ばれる OS のために AT&T のベル研究所のリッチー、カーニハンらによって開 発されたシステム記述用の言語で、構造化プログラミングを基本とする言語です。当初 C 言語はベル研 1行ずつ ソース プログラム インタプリタ 実行 ソース プログラム コンパイラ マシン語
1.5ファイル パソコンのディスクの中に保存されるものはすべて「ファイル」と呼ばれます。たとえば、ワープロ で作成した文書であれば、文書ファイルと呼ばれます。 この講義で作成するのは「ソースプログラムファイル」ということになります。このファイルを Wz-Edtor というエディタで作成することになります。これをコンパイラを使ってマシン語に直すので すが、これもディスクに保存されますのでファイルです。CPU がわかる=実行できることから、「実行 ファイル」と呼びます。この実行ファイルを作成することを「コンパイルする」と呼ぶことになります。 ソースファイル #include <stdio.h> int main(void) { printf("Hello, World¥n"); return(0); } コンパイラ 実行 ファイル 実行
2. はじめての C
2.1 使い方 ①ソースプログラムの入力 今回の講義では、C++言語用の統合環境ソフトと いわれるプログラムを利用します。デスクトップに ある CPad for C++のアイコン(右参照)をダブルク リックしましょう。(同じアイコンで Java_pad と かいてあるものもありますので気をつけてください。)これで、 起動します。統合環境を立ち上げると、エディタ部とメッセ ージ部をもった画面が出てきます。エディタ部はソースを入 力・編集する部分で、メッセージ部はコンパイラ等のメッセ ージを表示します。 ではエディター部に次のとおりに入力しましょう。 ex01.c #include <stdio.h> int main(void) { printf("Hello, world¥n"); return (0); } 入力が終われば、「ファイル」メニューから「名前をつけて 保存」を選んで保存してください。このとき、「保存する場 所」を変更するのを忘れないでください。ファイル名は必ず 「ex01.c」としてください。最後の『.c』を忘れないよう にしましょう。適当なフォルダ(例えばプロ基礎)を作成し て、その中に保存しましょう。 ②コンパイル・実行 次にこれをコンパイルして実行形式のファイルを作成します。 アプリケーションの三角のボタン(右図参照)を押します。そうす ると、メッセージ部に次のように表示され(左)、プログラムがコ ンパイルされたものが、実行されます(右)。 エディタ部 メッセージ部すべきところを「print」としてしまうと、左のようなダイアログが出て、メッセージ部につぎのよう なエラーが出ます。 「警告 W8065 ex01.c 4:プロトタイプ宣言のない…」の部分のコロンの前の数字 4 がエラーのある行 を意味しています。このときには4行目、もしくはその直前の行にミスがある可能性がありますので、 自分で調べてください。 では、もう少し、本格的なプログラムを入力して、実行してみましょう。このプログラムの個々の内容 については、この講義の中で説明していきます。今日は特別に覚えなくても結構です。 ex02.c #include <stdio.h> int main(void) { int x, y; printf("整数を入れてください:"); scanf("%d", &x); y = x * x; printf("%d の 2 乗は%d です。¥n", x, y); return (0); } このプログラムをコンパイル・実行すると、「整数を入れてください:」と表示されます。正の整数を タイプし、エンターキーを押すと、その整数の2乗の値を表示するものです。簡単なプログラムですが、 この講義ではこの程度のプログラムはすぐに作れるようになります。 2.2 講義の Web
http://hakuto.mis.ous.ac.jp/~yanagi/bprog2015/
講義で配布した資料をここに全ておいておきます。紛失、欠席したとには自分で印刷しておいてくださ い。《レポート問題》 どの問題も使えるのは天秤(てんびん)だけとします。つまり、コインの質量の比較だけしかできない とします。 問題1 ここにコインが5枚あります。このうち、1枚が偽コインで、偽コインは本物のコインに比べて重さ が軽いことがわかっています。5枚のコインに A, B, C, D, E と名前をつけるとき、偽コインを見つける 方法を考えなさい。 問題2 ここにコインが4枚あります。このうち、2枚が偽コインで、偽コインは本物のコインに比べて重さ が軽いことがわかっています。4枚のコインに A, B, C, D と名前をつけるとき、偽コインを見つける方 法を考えなさい。 問題3 ここにコインが4枚あります。このなかに1枚の偽コインが入っているか、全部本物のどちらかであ ることと、偽コインは本物のコインに比べて重さが軽いことがわかっています。4枚のコインに A, B, C, D と名前をつけるとき、あれば偽コインを見つける方法を考えなさい。 問題4 ここにコインが3枚あります。このうち、1枚が偽コインで、偽コインは本物のコインに比べて重さ が異なることがわかっています(つまり、重いか軽いかはわかりません)。3枚のコインに A, B, C と名 前をつけるとき、偽コインを見つける方法を考えなさい。 問題5 ここにコインが3枚あります。この中に偽コインが入っていることと、偽コインは本物のコインに比 べて重さが軽いことがわかっています。しかし、何枚偽コインかわかりません。つまり、可能性として は全部本物である可能性はないけど、全部偽コインである可能性はあるということです。3枚のコイン に A, B, C と名前をつけるとき、偽コインを見つける方法を考えなさい。 問題6 ここにコインが3枚あります。この中に本物のコインが入っていることと、偽コインは本物のコイン に比べて重さが軽いことがわかっています。しかし、何枚偽コインかわかりません。つまり、可能性と しては全部本物である可能性はあるけど、全部偽コインである可能性はないということです。3枚のコ インに A, B, C と名前をつけるとき、あれば偽コインを見つける方法を考えなさい。 問題7
この 7 問のうち、学籍番号を 7 で割った余りによって次の問題の手順を作成して提出しなさい。 7 で割った余り 0 1 2 3 4 5 6 問題 1 2 3 4 5 6 7