第2回(2011年10月12日)


今日の演習

 今日は以下の内容で演習を行います。


今日の目標

 今日の目標は与えられたC言語のプログラムを,テキストエディタで入力し,それをコンパイルし,実行できるようになることです.この一連の作業は,この演習で今後繰り返し行います.よく理解してください.


エディターの使い方

今回から「C言語」によるプログラミングを行いますが、プログラムを書く為にエディターというソフトウェアを利用します。エディターとは、機能が限定されたワープロだと思えばよいでしょう。では

という一連の作業を順をやってみましょう。(こちらでデモします)


ファイル名に関する注意

 ファイル名は適当につけていただいて結構なのですが(もちろん、レポート提出時には指定したファイル名にしてもらいます)次のような英数字で構成されるものにしてください。例えば、

suika.c

filename

this_is_sample.c

20111012.c

など。

漢字や / * ? & 等の文字(全角文字、記号)は使わないようにしてください。


ソースプログラムの作成

 ソースプログラムとは、まさにプログラムの元であり、通常テキストファイル(文字ファイル)です。テキストエディタを使って編集します。ソースプログラムは、C言語やFORTRANといった高級言語でかつ、それら言語の文法に従った形式で記述されています。次に示すものは、C言語で書かれたソースプログラムの例です。

- - - - - - - - - - - - - - - -

#include <stdio.h>

main()
{
    printf("Hello!\n");
}

- - - - - - - - - - - - - - - -

 エディターを開き、ソースプログラムを例のとおりに打ち込み、ファイル名を hello.c というファイル名で保存してください。(プログラムは半角英数文字で打ち込んでください.)このように、C言語のソースプログラムがかかれているファイルには、最後に .c をつける決まりがあります。例のプログラムの内容は後ほど説明しますが、ここでは、画面に Hello! と表示するプログラムであるとだけ言っておきましょう。後ほどこのプログラムを実際に動かします。


ソースプログラムのコンパイル

 先に説明したとおり、C言語で書かれたソースプログラムをコンピューターは直接実行することはできません(機械語に変換されている必要がある)。そこで、ソースプログラムをコンパイル(翻訳・変換)するという作業が必要となります。

 C言語で書かれたソースプログラムのコンパイルにはCコンパイラーというソフトウェアを使います。Cコンパイラーというソフトウェアはターミナルと呼ばれるソフトウェア上で実行します。

 このように、コンピューター上で何かする場合、あらゆるものがソフトウェアなわけです。今後、混乱が無いようであれば、ソフトウェアという言葉を省略します。

 まず、ターミナルを起動します。(演習中に実演します)

 ターミナル上での手順も実演しますが、

 

cc  hello.c  -o  hello

 

とすることで、機械語に翻訳されたプログラム hello が生成されます。(ファイルマネージャーに hello というファイルが現れます。)ソースプログラム中にエラーがある場合(文法上の誤りが大半)画面上にエラーがあるといったメッセージが表示されます。

 ここで cc というのがCコンパイラーです。ターミナルでプログラム名を打ち込むことでそのプログラムを実行できるのですが、つまり、ここでは cc というプログラム(Cコンパイラー)を実行しています。

 プログラム hello を実行するには、ターミナル上で、

 

./hello

 

とします。作成したプログラムを実行するときには、はじめにピリオド、次にスラッシュをつけます。はじめのピリオド、スラッシュは省略できる場合もありますが、当面必要だと思っておいてください。

./hello

と実行すると、画面に Hello! と表示されたことと思います。


画面に文字列を表示するプログラム

 ./hello を実行して分かったと思いますが、先ほどのサンプルプログラムは、画面に文字列 Hello! を表示するものでした。たった5行(空白行も含む)のプログラムです。一行ずつみてみましょう。説明の為に、行頭に行番号をつけました。(説明の為につけたのであって、ソースプログラムに書き込む必要はありません。書き込むとエラーになってしまいます。)

- - - - - - - - - - - - - - - -

1: #include <stdio.h>
2:
3: main()
4: {
5:     printf("Hello!\n");
6: }

- - - - - - - - - - - - - - - -

1行目: 

 この行で、 stdio.h というヘッダーファイルを読みこみます(インクルードするともいう)。 .h で終わるファイル名を持つファイルをヘッダーファイルと呼び、stdio.h のほかにも math.h など色々な種類があります。ヘッダーファイルでは定数や関数の定義を行っていますが、いまのところを詳細を知る必要はありません。当面、C言語でプログラムを書くときは必ず#include<stdio.h> という行をプログラムのはじめの方に入れるのだと覚えておいてください。(演習が進むにすれて、他のヘッダーファイルもインクルードする必要がでてきます。そのときには指示をしますので、それに従ってください。)詳しくは参考書を参照してください。

2行目:

 空白行(何も書かれていない行)です。プログラムを読みやすく(見やすく)するためには空白行も必要です。Cのソースプログラムには好きなだけ空白行を入れることができます。

3行目〜6行目:

 関数 main の定義です。C言語では、プログラムの単位として「関数」と呼ばれるものがあります。プログラマー(プログラムの作成者)は、あらゆる処理(繰り返し処理、画面に文字列を表示する処理等)を関数にまとめる必要があります。この例の場合、main という名前の関数のなかで、printf という名前の関数を引数 "Hello!\n" で呼び出しています。引数とは、関数に渡す値です。

関数

 詳しくは、演習5〜6回目あたりに行う関数定義の方法のところで説明しますが、C言語の構成単位である「関数」は戻り値引数というものがあります。例えば、

y = sin(x)

と書いたとき、sin が関数名で x が関数 sin の引数変数 y には sin(x) の戻り値(この例の場合、関数 sin(x) の値)が入ることになります。変数や、ここでの = 記号の意味は来週以降説明します。(早く知りたい人は参考書を見てください。)

main 関数

 この例では、プログラムは main という名前の関数のみで構成されています。実は、main という名前の関数はC言語で書かれたプログラムには必ず1つある必要があります。C言語では勝手な名前の関数を定義することができますが(関数の定義は再来週あたりに勉強します)その場合どの関数をはじめに実行するかルールを作る必要があります。C言語では main という関数に書かれた内容をはじめに実行する決まりとなっています。

main 関数の ()

 また、main 関数の定義では main() と最後に () がついています。当面、このようにするものだと覚えてください(関数の定義の部分で説明します)。引数なしという意味です。

main 関数の有効範囲

 関数の定義は中括弧{ } で囲まれている必要があります。main という関数を定義していますが、その有効範囲は中括弧で囲まれた範囲(3行目〜6行目)となります。

 Cのプログラムは関数で構成されますが、その関数はいくつもの「」で構成されます。文は終端に ; を伴います(セミコロンとよむ)。ただし、次週以降でてくる for や while といった制御文は ; をつけません。このセミコロンが1つの文の終わりを示します。セミコロンを忘れてエラーになることがよくありますので、気をつけましょう。

画面に文字列を表示する関数 printf

 さて、5行目で printf という関数を呼び出しています。printf はC言語にはじめからある関数(標準関数とよぶ)で、引数(括弧で囲まれた中にかかれたもの)として文字列を受け取り、それを画面に表示する関数です。文字列は " (ダブルクォーテーションとよむ)で囲まれている必要があります(printf 関数には他にも色々機能があります。次週以降、その他の機能を使うことになります)。つまり、

printf("Hello!\n");

は、文字列 "Hello!\n" を画面に表示せよという意味となります。さて、最後にある \n はなんでしょうか?プログラムを変更して、\nの働きを理解しましょう。プログラムを次のように変更してください(hello.cをエディターで開き、変更して保存する)。

- - - - - - - - - - - - - - - -

#include <stdio.h>

main()
{
    printf("Hello!\nHello!");
}

- - - - - - - - - - - - - - - -

先ほど同様、ターミナルでコンパイルしましょう。
(* ソースプログラムを変更した場合、再びコンパイルし直し、実行ファイル(ここでは「hello」)を更新しないと、その変更はコンピューターに反映されません。)

 

cc hello.c -o hello

./hello

 

どうですか?

Hello!
Hello!

と2行に渡り表示されたと思います。この例から分かるように、\n は改行をあらわしています。


コンパイルエラーについて

 先の hello.c を次のように書き換えてください。

- - - - - - - - - - - - - - - -

#include <stdio.h>

main()
{
    plintf("Hello!\n");
}

- - - - - - - - - - - - - - - -

みて分かるように、printf 関数のつづりが間違っています。ターミナルでコンパイルしてみましょう。

cc hello.c -o hello

なにかエラーメッセージがでましたね。このように、C言語に限らず、プログラミング言語では、つづり間違いなどは許されません。このようなコンパイル時に出るエラーのことを、コンパイルエラーと呼びます。(エラーメッセージの内容については演習中に触れます)

 また、次のようなプログラムもコンパイルエラーが出ます。

- - - - - - - - - - - - - - - -

#include <stdio.h>

main()
{
    printf("Hello!\n";
}

- - - - - - - - - - - - - - - -

この例では、printf関数の閉じカッコを忘れています。このような些細な間違いもエラーとして、表示されます。

 このような些細なつづり間違いや文法的に間違ったプログラムはうまくコンパイル(翻訳)できず、エラーを表示して終わってしまいます。

 Cのプログラムを書く場合は、C言語の文法に厳密に従い、つづり間違いもおかさないようにする必要があります。


以下の4つの課題に取り組んでください。

課題1

5行目中の \n を取り除くとどうなるか?実際に試してみよ。

課題2

サンプルプログラムを変更して、色々な文字列を表示してみよ。

課題3

サンプルプログラムでは printf 関数を一度だけ使っているが、二度、三度と使うプログラムに変更せよ。

課題4

自分の名前をローマ字で表示するソースプログラムを作成せよ。プログラムのファイル名を myname.c とせよ。(コンパイルして実行すること)


フォルダーについて(ディレクトリとファイル構造)

 端末室のパソコンにログインした直後には、ファイルマネージャーが起動しているはずです。これを用いて、フォルダーをつくり、これまで作ってきたファイルをフォルダー内にまとめましょう。ファイルマネージャーの使い方の詳細はマニュアルにまかせて、簡単な使い方を実演します(work というフォルダーを作成してもらい、hello.c などのファイルを移動してもらいます)。
再履修の方は既に work があるかもしれません。その場合は、フォルダー作成の前にそれらの名前をそれぞれ work.old などと名前を変更してもらいます。

(work フォルダーを作成)

 実際に work というフォルダーを作成します。そして、そのwork フォルダーにこれまで作成したソースファイル(hello.c)とそれをコンパイルしたもの(hello)を移動しましょう。こんなことをして、上でおこなったターミナルでの作業(コンパイルおよび実行)には影響ないのでしょうか?(当然影響があります。)

 ターミナルを開きます。先ほどと同様、

cc  hello.c  -o  hello

としてみましょう。フォルダー作成等の作業がうまくいっていれば、エラーがでます。なぜなら、コンパイルするべきファイル hello.c を別の場所である work フォルダーに移動してしまったからです。

ホームディレクトリ(ホームフォルダー)

 ターミナルを起動した時点では、自分はホームディレクトリと呼ばれる位置にいます(ディレクトリとフォルダーは同じものだと思ってください)。それは、起動時のファイルマネージャーも同様で、起動時にはホームディレクトリの内容を表示しています。先ほどの作業で、ホームディレクトリにあったファイルを workフォルダーにファイルを移動してしまったため、ターミナルを起動した後、

cc  hello.c  -o  hello

としても、hello.c というファイルが見つからないのでエラーとなったわけです(エラーメッセージもファイルが見つからないといったものだったはずです)。正しくコンパイルするためには、work フォルダー内に自分が移動する必要があります。それには、ターミナルで次のコマンドを実行します。

cd  work

この新たに出てきたコマンド cd は Change Directory の略で、文字通り自分の位置を変更します。上記コマンドで、work フォルダーの中に移動できたので、改めて

cc  hello.c  -o  hello

としてみましょう。今度はうまくいくはずです。ついでに、コンパイルされたプログラムが実行できるかどうかも確かめておきましょう。

./hello

正しく実行できたと思います。

 ところで、ターミナル上で、そのフォルダー内のファイルの一覧を見たい場合もあるでしょう。次のコマンドで見ることができます(ls は LiSt の略です)。

ls  -l

ファイル名と、そのサイズ変更日時などが一覧として表示されます。hello.c や、そのコンパイルされた結果の hello もでていると思います。

 さて、今 work フォルダーの中にいますが、先のホームディレクトリに戻るにはどうするのか?次のコマンドで、ホームディレクトリに戻れます。

cd

当面はこれだけのことができれば十分でしょう。実際ターミナル上でもフォルダーを作成することができるのですが、この演習ではフォルダーの作成ファイルの移動ファイルのコピーはファイルマネージャーで行うことにします。(Windows や Macintosh を使いなれた人は何も問題ないでしょう)

 ターミナルで使えるフォルダーやファイル操作のコマンドのより詳しい情報はこちらにあります。

 今後、この演習で作成するファイルは全て work フォルダーに保存するようにしてください(実演します)。ただし、自動回収によるレポート提出をする場合には、対象となるファイルを report フォルダーにコピーしてもらう必要があります。手順は来週実演にて示す予定です(次回から自動回収にて集める形式のレポートをやってもらう予定です)。


今日の要点

  • アルゴリズムとは,仕事の手順の事である(料理ならば,レシピに対応)
  • C言語によるプログラミングとは,C言語によるアルゴリズムの実装である
  • C言語のプログラムはテキストファイルである
  • C言語では厳密にその文法に従わなければならない(曖昧な表現は無い)
  • C言語によるプログラムはCコンパイラーによって機械語に翻訳され,コマンドを打ち込む事で実行される(マウスによるダブルクリックでも実行できる)
  • 文字列を画面に表示するC言語でかかれたプログラムをテキストエディタで打ち込み,コンパイルし,実行することができた.この一連の作業のつながりを理解する事(例えば,プログラムをテキストエディタで編集したら,再びコンパイルの作業が必要であるが,そのことが理解できるか?)

今日学んだ事

  • こちらが与えたCのソースプログラムをエディターで打ち込み、ファイルとして保存し、それをコンパイルして実行することができるようになりました。
  • コンパイルにはCコンパイラーと呼ばれるソフトウェアを用いました。
  • Cコンパイラーはターミナルと呼ばれるソフトウェア上で実行しました。
  • C言語の文法に従わないソースプログラムはコンパイル時にエラーとなりました。
  • 画面に文字列を表示するプログラムを作ることができるようになりました。

戻る