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