プログラミング入門・情報科学演習
2017.10.02
この授業では,C言語によるプログラミングを学習します.プログラミン
グを通して,コンピュータの中で行われている処理を経験して行きましょう.
扱って行く処理としては,コンピュータの中で数値はどのようになっているのか,
整数 (Integer) や浮動小数点数 (Floating Point Number) の違い,内部処理で
利用される二進数 (Binary number) や便宜上人間が二進数
を扱いやすくした16進数 (Hexdecimal Number) などについて学習します.また,文字がどのように処理
されるのか,文字列 (String) についても学習します.そして,「制御構造
(Control Structure)」とよばれる処
理の流れを自由に制御する方法とデータの入れ物である「配列(Array)」について学習すると,プログラミングの入門とし
ては終わりです.そこまでがこの授業の範囲です.
事前にその日の授業で扱う教科書の範囲を指示しておきますので,その範囲は予
習をしてきてください.教室で実際にパソコンを使用した予習が望ましいです.予習のための実習問題も次の週のWebテキストにリンクを張りますので,それを行ってください.
(自分のパソコンでもC言語の勉強はできますので,環境を準備すれば自宅でもも
ちろん可能です.)
次回以降は宿題を用意していきますので,課題のプログラミングを行うついで
に予習をする習慣を付けてください.また,水曜日の7・8時
限にこの教室でメン
ターが自習に対応してくれます.活用してください.
教科書の例題などは,自分でもう一度打ち込んでいると,大変な時間がかかりま
す.ですので,教科書に載っている例題は実習では扱いません.実習課題を用意
しますので,その課題のプログラミングを実習として行います.ですので,前に
も書きましたように,教科書はしっかり予習してきてください.
実習課題は教科書に書いてあることを応用する問題を中心に用意されています.
そこで,自分では分からないこともときどき出てくることがあります.TAや私に
授業中に質問をすることで,理解を深めて行くことができますので,授業中はど
んどん質問をしてください.コミュニケーション能力の養成にもつながります.
教科書の順番でプログラミング作業を勉強していきますが,教科書ではまだ出て
きていない処理もいくつか使用します.一つは「乱数」の発生の処理で,その後で「関数」の作成も扱います.
乱数については,教科
書では,パラメータを自分で入力するために scanf というコマンドを
使用しますが,授業では scanf を使用しないために乱数を用います.理由は,大勢の課題を採点する際に, scanf では採点を自動化できないからです.そのため,毎回値が変わるようにするために乱数
を使用します.使用方法は,Web版のこのテキストで詳しく紹介します.
「関数」については整数型の冪乗の演算を簡単にするために使用します.反復処理が出てきたらいっしょに学習します.
プログラミングとは面倒な処理をコンピュータにやらせるためにあるものです.
自分が楽をするためにあるので,そのような処理を考えることが重要です.数字
を100個表示するプログラムでも,表示させる命令は1つで済ませるのが,プログ
ラミングです.これについては,必要に応じてその都度説明します.ただし,大事な言葉として「アルゴリズム」というものがあります.これはどのように処理を行うかの流れのようなものですが,これを考えることが重要です.以下の例で見てみましょう.
12という整数の約数を見つけるプログラムを作るとします.以下のような手順をみなさんは考えるでしょう.
プログラミング学習は図1のような作業で行うことになります.エディタでプロ
グラミングを行い,ターミナルでコマンドによりプログラムを実行して結果を確
認します.プログラムが期待どおりに動いていない場合には,再びエディタに戻っ
て修正作業を行います.
以下に,それぞれの作業を詳しく説明します.
図1 プログラミングの流れ
現在教室で使用しているデスクトップ環境としては標準でGNOMEというものになっ
ています.その中で標準として備わっているテキストエディタがgeditと呼ばれ
るものですので,この授業ではこれからgeditを使っていきます.画面上のタス
クバーの中の一番左の「アプリケーション」メニューから「アクセサリ」を選択すると「gedit」という項目がありますので,それを選択しましょう.すると,図2
のような構成のgeditが起動します.
図2 geditの画面(保存前)
何かプログラムが書かれています.文字の色は黒です.ところが,C言語のプログラムであることを意味する拡張子 .c をつけて保存すると,下のようにソースが色分けされます.このようにgeditではC言語のソースを自動で判り易く色分けしてく
れる機能があります.プログラミングを行う際には参考にしてください.
図3 geditの画面(保存後)
この授業は演習科目ですので,実際にみなさんがプログラミング作業を行なうと
いうことを中心に,授業の最初にその日の作業内容の紹介と注意点,重要なポイ
ント,教科書の補足説明などを行って,実習,小テスト,課題提出などのように
行っていきます.以下のことを覚えておいてください.
さて,上記のような手順は九九を覚えている人間だからできる作業です.計算機はそんな気の利いたことはしてくれません.では,どうするのでしょうか.
どうでしょうか.上記の2番目の作業のように同じことを規則的に繰り返すのは計算機は得意なので,このようにすると簡単に実現できます.では,もうちょっと違うケースとして20の素因数分解ではどうでしょうか?
どうでしょうか.上の2番めと3番目の処理のどちらか一方を行う作業を繰り返すことで,素因数分解が実現できます.このような処理を考えることがプログラミングです.頭の中で漠然と考えるのでは無く,上記のように言葉にすること,これを「言語化」と言いますが,それを行うことが大事です.今後は自分でいろいろ考えてみてください.
プログラムを作成するには,いくつかのパターンがあります.そのもっとも素朴
な形式は,「テキストエディタ」を利用して,自分でプロ
グラム(ソースともいいます)を入力して行き,あるファイル名で保存したものを
実行環境で実行するというものです.C言語は人間がわかりやすい文字や記号を
使って作ったソースを,教科書の図1.6(p.6)にあるように一度機械語に変換して実行ファイルを作るという形式です
ので,そのやり方を覚えていきましょう.
もちろん起動したときには中には何も入力されていません.
色分けは,geditがC言語のソースだと判断できる場合に行われます.すなわち,
拡張子に.cが付いたものを開いた場合や,拡張子を付けて保存した場合です.そ
れまでは色分けはされませんので,なるべく早く一度保存するようにしてくださ
い.
エディタで作成したプログラム(ソース)は教科書の図1.6や図2.1にあるような流
れで実行されます.この一連の作業は,基本的にはLinuxであってもWindowsであっ
てもコマンド入力により行われます.そこで,実行までのコマンド操作を行う
「仮想端末」の復習を行いましょう.ここではGNOME標準のgnome-terminalを使
用します.
ターミナルの起動は「アプリケーション」メニューの中から「端末」を 選択することで行います.起動すると図3のようなターミナルが現れます.
図4 gnome-terminalの画面
ターミナル画面でいくつか重要なことを紹介しておきますと,上のウィンドウ枠 には,ログインしているユーザ名,端末名,作業しているディレクトリ名が表示 されています.また,それらの情報は「コマンドプロンプト」と呼ばれるコマン ド入力を受け付ける部分にも表示されています.作業するディレクトリを間違え るとエラーが出ますので,注意してください.
デスクトップ左上の「home」アイコンをダブルクリックするとファイルブラウザが起動します.Windowsの「エクスプローラー」に相当するものです.
図5 ファイルブラウザの画面
画面内で右クリックし,「新しいフォルダ」を選んでフォルダを作り,名前を program としましょう.そうすると,図5のように program フォルダが作られます.
図6 program フォルダの作成
このディレクトリが今後この授業で作成するプログラムの保存に関するベースに なります.
テキストで書かれたソースコードを機械語に翻訳することをコンパイルと言いま す.さっそく試してみましょう.教科書ではp.10の例題2.1で最初のプログラム が紹介されています.が,古今東西プログラミングの練習の最初は
Hello, world!
という文字を画面に出すことと決まっていますので,ここではそっちで進めます.
教科書の例題2.1とほとんど同じですが,次に示すソースをgeditにコピーしてコ
ンパイルの練習をしましょう.
#include <stdio.h> main() { printf("Hello, world!\n"); return(0); } |
この内容で先ほどの program ディレクトリに hello.c とい う名前で保存します.保存するフォルダは program フォルダですので,間違えないようにしてください.保存が完了したら,ターミナルで確認してみましょう.
$ ls
とファイル表示コマンドを実行してみましょう.ちゃんと hello.c と いうファイルがあったでしょうか?普通は無いですよね.作ったフォルダが program フォルダだからです.
まず,「フォルダ」という呼び名ですが,これはApple社がMacintoshを作った際に世間に広めた呼び名で,それ以前のコンピュータでは「ディレクトリ」と呼ばれていました.ですので,この授業でも今後はディレクトリと呼びます.で,まず,
ディレクトリに移りたい場合には cd というコマンド(Change Directoryの略)で出来
ます.
$ cd ~/program
図7 cd コマンドによるディレクトリ移動
再び ls コマンドで確認してみましょう.
$ ls
今度は hello.c というプログラムがありますね. では,コンパイルしてみましょう.コンパイルのコマンドは cc もし くは gcc でどちらも同じ動作をします.
$ cc hello.c
とすれば良いのですが,これからコマンドによるコンパイルのときには必ず 「TAB補完」機能を使用してください.どういうことかというと,例えば,
$ cc he
まで入力してからキーボードの左上の方にある TAB キーを押してくだ さい.そうすると,ファイル名が補完されて
$ cc hello.c
のようになるはずです.この機能はキー入力を減らす効果だけではなく,保存し たディレクトリが正しいかどうかの判断にも役に立つので,必ず使うようにして ください.
図8 cc コマンドの実行
正しくコンパイルされるとエラー表示もなくもとのコマンドプロンプトに戻りま す.
もう一度リストコマンドでディレクトリにあるファイルを確認します.
$ ls
すると, a.out という名前のファイルができているはずです.これが プログラムが機械語に翻訳された結果の実行ファイルです.実際に動かすには, それ自身がコマンドになっていますので,
$ ./a.out
とします.このときもTAB補完を忘れないでください.
図9 実行コマンド入力画面
最初にあるドットとスラッシュ ./ はこのディレクトリに あるファイルを指定するために必要なものですので,忘れないでください.
Hello, world! |
と図10のように正しく表示されたでしょうか?
図10 実行結果
最後によく使用するコマンドをまとめておきますので,今後の参考にしてくださ い.
コマンド | 意味 | 補足 |
---|---|---|
ls | ファイル一覧表示 | list |
cd | ディレクトリ移動 | change directory |
pwd | 今作業しているディレクトリの表示 | print working directory |
mkdir | ディレクトリ作成 | make directory |
. | 今居るディレクトリ(カレントディレクトリ) | |
.. | 上のディレクトリ | |
~ | 自分のホームディレクトリ | |
TAB | コマンドライン補完 | |
↑ | 直前のコマンド表示 |
これがC言語プログラミングと実行の流れです.次週以降は教科書のp.10以降の 流れに従って作業します.その際に,このWebテキストの約束事を紹介しておき ます.
先ほどの hello.c のところで示したように,薄い青色の背景で 表示されているものは,gedit で自分で入力するプログラムです. プログラム全体が表示されている場合や,特定の行だけが表示される場合 など,その都度異なっているかもしれませんが,青の背景であれば,とに かくプログラムの中身を表します.
ターミナルで ./a.out を実行して結果が表示されますが,その際の表 示内容は,先ほどの Hello, world! の例のように薄いピンク色の背景 で区別されます.ピンク色の部分は実行結果の表示ですので,覚えておいてくだ さい.
ターミナルを利用してコマンド入力する部分は,コマンドプロンプト $ 付きで表示します.以下のようにドルマークが付いているときは,ター ミナルのコマンド入力を意味します.
$ ./a.out
先ほど gedit の紹介のところで示しておいたサイコロのプログラムを実際にエディタを使用して作ってみましょう.また,実行してみましょう.それから
Hello, world! |
と表示させたプログラムも,以下のようにいろんな文字を表示するものに変更してみましょう.
1234567890 + - / * % "Hello" \n |
今日のうちにやっておかないといけないのは,プログラムを作成,コンパイル,実行,修正や再編集,コンパイル,実行,という一連のプロセスをいちいち考えなくてもできるように何度も繰り返して習得することです.
C言語のプログラミングにgeditを使用する場合,最初に設定しておく方が便利なものがいくつかあります.以下に示しておきますので,各自設定してください.
まず,geditがアクティブなっている状態で上のメニューバーを見てください.geditの項目が図11に示すように選択できるようになっています.
図11 geditの設定メニューを呼び出すメニュー
図3や図4に示すように行番号が表示できます.コンパイル時のエラーメッセージは行番号で説明してくれますので,行番号は必須です.図12の「表示」タブから「行番号を表示する」にチェックを入れて表示させましょう.
図12 行番号表示のチェック欄
プログラムを入力するときには,ブロックのまとまり単位でインデント(字下げ)を行います.これはTABキーを用いて行いますが,C言語では標準的には4文字分,もしくは2文字分のインデントが用いられます.ところが,geditはデフォルトで8文字なのでちょっと幅が大きすぎます.なので,設定画面の「エディタ」タブでタブ幅を4にしておきましょう.
一度TABで字下げをすると,それ以降の行も自動的にインデントしてくれる機能が自動インデントです.インデントの解除にはバックスペースを使います.これもチェックを入れておきましょう.
ファイルを間違って上書きした時などに一つ前のファイルを読み出せるように自動バックアップをして前のファイルを保存する使用にしておくと安心です.これは必要に応じてチェックを入れてください.
図13 各種設定
教科書の例題や図表を使用してその日の授業内容の説明を行います.よって,教 科書は必ず持ってきてください.また,プログラミング処理がだんだん複雑になっ てくると,アルゴリズムや処理の進捗状況の理解 が必須になってきます.その際に,紙に書いて確認することが理解を深める上で 重要なので,ノートも必ず持ってきてください.
キーボードの右上の方,Backspaceキーの右側にInsertキーがあります.このキー の役割は,入力中の文書において,文字入力の「挿入」モードと「上書き」モー ドを切替えることです.通常は挿入モードになっていますが,Insertキーを押す と上書きモードに切り替わります.そうすると,すでに入力されている文字が上 書きされて消えていきますので,それが嫌な場合にはもう一度Insertキーを押し てモードを挿入モードに戻してください.
今はまだ心配する必要はありませんが,教科書のp.37から始まる「反復処理」を学習する と,プログラムの作成ミスにより「無限ループ」を実行してしまう可能性があり ます.そうなった場合には,Ctrl キーと C キーを同時に押 して処理を止めてください.
宿題やテストの提出には「レポート提出システム」を利用します.以下のURLにアクセスすると,ログイン画面が表示されますので,ログインした後,提出可能なレポート一覧から作業してください.
10.184.10.130/report/
ただし,このシステムは学科外からはアクセスできませんので,注意してください.