1999 年度「計算機基礎論3B」 1999-10-29

前の分が終わってない人は、 いきなりきょうの分を読んでもわかりませんから、 前の分に取り組んでください。 遅れ・進みはそのうち調節しますのであわてずに。 ただし、今回の分には単位を取るための課題の一つが出ています!

(いわゆる)ホームページの作成[最終改訂版]

先週、先々週の分でホームページ作成について書きましたが、 うまくない部分があったので書き直します。 今回のだけを読んでもわかるように書いたつもりです。

※ 「ホームページ」というのは俗称だそうだが、 これだけ広まっているので使わざるを得ない。 「Web ページ」「WWW ページ」と言っても なかなか通じない。 私は「インターネットの私のページ」などといったりしている。

自分のホームディレクトリのすぐ下に public_html という名前のディレクトリを作り、 そこに index.html という名前のファイルを作ると、 そのファイルはホームページとして公開されます。

※ これだけの説明で、 具体的にどんな操作をすればよいかわかるかな? 今までやってきたのは、こういう説明がわかるようになるためだったのだ。

URL は http://wwwedu.ipc.kanazawa-u.ac.jp/~eb00g??/ になります。 「??」には自分のユーザ名に合わせて数字をいれてください。 今年の実習の最初のページからもリンクを張っておきました。

※ 公開されるのは WS を使う人すべてが読めるファイルだけである。 よってそのようにディレクトリやファイルのパーミッションを設定しなければならないが、 自分で変更していなければそうなっているはずだ。

実習で使っている WS のページは金沢大学外のコンピュータからの閲覧を禁じるよう設定されているので、 結果的に学内からしか見えません。

しかし大学じゅうの人が見ますし、 なにかのはずみで全世界に公開されてしまうかもしれませんので、 書いてはいけないもの、書かないほうがいいものがあります:

ファイル index.html は HTML の文法に合わせて書かなければなりません。 次にひな型を示します。

    <html>
    <head>
    <title>ここにタイトルを書く</title>
    </head>
    <body>
    ここに本文を書く
    </body>
    </html>    

※ タイトルは、ブラウザ(Netscape, Internet Explorer などの、 インターネットを見るソフトの総称) によってはウィンドウの上部の枠に表示される。

※ こういうひな型を見て自作するときは、 まずごく小さなものを作って試すとよい。 たくさん打ち込んでから「全然違ってた〜」となるとがっかりだ。 また、上の見本どおりのものを作ると、 たとえうまくいって「やった〜」と思っても、 もしかしたら隣の人が作ったのを間違って見ていた、ということもありえる。 自由に変えられる部分(上には2箇所ある) を自分の名前に置きかえてみるとその心配はなくなる(だろう)。

本文を書く際、 段落は <P> と </P> で囲みます。 エディタ上で改行していてもブラウザ上では改行しません。

<H1> と </H1> で囲んで見出しをつけることができます。 <H2> と </H2>, <H3> と </H3>, <H4> と </H4>, ……の順で見出しは細かくなり、それにつれて文字も小さくなりますが、 これらを文字の大きさを変えるために使うのは邪道とされています。

※  くわしいことは、適当なページを Netscape に読み込み、 「表示(V)」「ページのソース(U)」 でソースを読んで勉強するとよいだろう。 ただし、そうやって覚えたことを人に教えるときは要注意。 自分のブラウザ(Netscape, Internet Explorer などの、 インターネットを見るソフトの総称) できちんと見えたからといってそれが HTML の文法に合致しているとは限らない。 まねして書いた自分のホームページの文法がおかしいのは自分だけの問題だが、 教えられた人は迷惑だ。 という私ももうすでにいくつかウソを教えているはずだ。

※ ファイルが大きくなったら、 ファイルを分けてリンクを張ってもよい。 そのやり方も適当に調べること。

※ 絵や写真なども貼りつけられるが、 元になる画像を入手するのがむずかしいだろう。 画像のあるページを見つけて、 画像の上にマウスの矢印を当ててマウスの右ボタンを押し、 押したままマウスカーソルを下げて「画像に名前を付けて保存(I)...」 で離し、あとは適当に判断して操作すれば、 その画像のファイルを自分のディレクトリにセーブできるが、 それをホームページに貼って公開すると一般には著作権の侵害になってしまう。

※  index.html を書きかえても、 Netscape で「再読み込み」しないと表示は変わらない。 (それでもダメなときは Shift を押しながら 「再読み込み」という話を聞いたことがあるが、 Netscape の話だったかどうか覚えていない。)

課題1:ホームページに自己紹介を書き、メールで報告する

上の説明を読んで、 ホームページに自己紹介を書いてください。 自分のニックネームの紹介、 家族・ペットの紹介、 ふるさとの紹介、 いま住んでいる地域の紹介、 はいっているサークルの紹介、 自分の趣味の紹介、 最近読んだ本・見た映画・聞いたCDの紹介、 などの中から適当に選んで書いてください。

ディレクトリの作り方、 ファイルの書き方などを学んだということをアピールしてもらうのが目的ですので、 本文が(ファイル index.html の上で)十数行あれば十分です。

※ もうすでにホームページをつくってしまった人は、 index.html が十数行の自己紹介を含んでいれば、 他のことが書いてあってもいいです。 また、別の名前のファイルに自己紹介を書いて index.html からリンクを張ってしまった場合、 どのページに自己紹介が書いてあるのかがすぐわかるようになっていればそれで構いません。 ただし、この授業で配った実習用アカウントのホームディレクトリの下以外の場所に書いてあってそこにリンクが張ってあるのはだめです。

そして、私(岩瀬)の実習用アカウント cf7175 に 「課題1のホームページを作ったから見てください」 のような内容のメールを「kadai 1」 (すべて小文字、スペースにも注意!)という Subject で送ってください。 自分の学籍番号、名前も忘れずに。 私はメールを受けとったら二三日以内にチェックして 「OK」なり「やり直し!」なりの返事をメールで送ります。 「OK」をもらったら、 ホームページは変更するなり削除するなりしても構いません。 「やり直し!」だった人は「OK」 がもらえるまでやり直して再提出しないと課題をこなしたことになりません。

締め切りは 1999 年 11 月 11 日(木)16 時 30 分とします。 これは、 その日時までにホームページを書き上げ私にメールを送るように、 という意味です。 締め切り間際にメールを送ってくれた場合は私からの返事は締め切り後になるかもしれません。

※ それで「やり直し!」だとまずいので、できれば早めに提出するように!

コマンド

WS で、 unix のプロンプトが出ているところから打ち込んで (最後に Return を打って) 実行させるものを 「コマンド(command)」と呼びます。 例えば、すでにでてきた「ls」はコマンドです。 また、そうやって ls と打って実行させることを 「コマンドラインから ls を実行した」 「コマンドラインに ls と打ち込んだ」 などとも言います。 あるいはもっと省略して 「ls を実行した」「ls した」 などと言うかもしれません。

※ 最後のは少しひどいな〜。:-)

コマンドの中には、 実行中に Ctrl+C で中止できるものがあります。 Ctrl+S は実行を一時中断します。再開は Ctrl+Q です。

※ MS-DOS を知っている人は再開が Ctrl+Q に限ることに注意。 これらの実験は、 すぐに終わってしまうコマンドでは(当然ながら)できない。 試すなら last がよいだろう。 このコマンドは今までにその WS を使った人の一覧を表示する。

※ コマンドを打っている途中、 Return を押す前に一行全部やり直したくなったときも Ctrl+C だ。

コマンドも、実はファイルです。 たとえば ls の“正体”は /usr/bin/ls ですのでコマンドラインに「/usr/bin/ls」 と打ち込んで実行させることもできますが、 「ls」だけでも実行できます。 どうして「ls」だけで /usr/bin/ls が実行されるのでしょう? そのしかけは、シェル変数 path にあります。 「シェル変数」についてのくわしい説明はここではしませんが、 定義されているシェル変数すべてを表示させるコマンド set を試してみると例えば次のようになります。

ws21{cf7175}1% set
argv	()
cdpath	(. /home/kakuma/iwase/cf7175)
cwd	/home/kakuma/iwase/cf7175
filec	
home	/home/kakuma/iwase/cf7175
mtfpath	(/opt/FSUNmtf/bin /usr/openwin/bin /usr/openwin/bin/xview)
openwinpath	/usr/openwin/bin
path	(. /usr/bin /usr/sbin /usr/ccs/bin /usr/ucb
/opt/SUNWspro/bin /opt/FSUNf90/bin /opt/FSUNnqs/bin
/opt/FSUNvppwb/bin /usr/local/bin /usr/openwin/bin
/home/center/fjh/Masphyc/WB /opt/JMAG/bin /opt/CSSCAN/bin)
prompt	ws21{cf7175}!% 
shell	/bin/csh
status	0
term	sun-cmd
user	cf7175
xinitpath	/usr/local/X11R6/bin
ws21{cf7175}2%

※ 上の出力結果には、 見やすくするため適宜改行を加えてある。 「path」で始まる4行は実際は1行である。

例えば「ls」と入力されると、 path で始まる行の小カッコの中に書かれたディレクトリが次々とさがされ、 みつかった ls が実行されるのです。 ls は /usr/bin にありましたから、/usr/bin/ls が実行されます。

※ 実習用アカウントでは path に「.」が含まれるよう設定されているが、 これはよくないといわれている。 特に「.」を先頭に指定するのは最悪だ。 たとえば、あるディレクトリに ls という名前でよからぬことをするプログラムがしかけられていた場合、 そこで ls するとそいつを動かしてしまう! しかし、ls という名前のファイルがあるかどうかは ls してみないとわからないのだから、 ls は常に /usr/bin/ls として起動しなければならないのだ!

※ 同じ理由で、 何をするものかわからない実行ファイルを実行するのも危険である。

※ MS-DOS ではカレントディレクトリの実行ファイルは無条件に実行できたが、 unix ではそうとは限らない。 その場合、 カレントディレクトリのファイルを実行するには 「./a.out」のようにファイル名の前に「./」をつければよい。

※ コマンドがどこにあるかは whereis コマンドでさがせる。 「whereis ls」のように。

※ シェル変数の設定法などはまたあとで気がむいたら説明する。

シェルスクリプト

もっとも簡単に作れる実行ファイルは、 シェルスクリプト(shell script)と呼ばれるものでしょう。 次の例は時間に余裕のある人以外は試してみなくてもよいと思います。

「#!/bin/csh -f」のあとに、 順次実行させたいコマンドを一行ずつに並べたものを内容とするファイルを用意します。

    #!/bin/csh -f
    ls -la
    date
たとえばこのファイルの名前を「a」としましょう。 a のパーミッションを変え、自分に実行許可を与えます。 (755 にすればよいでしょう。) そうしておいて「a」を実行すれば「ls -la」と「date」が続いて実行されます。 (date は現在の日時を表示するプログラムです。) タイピング練習の際の「~iwase/tx」も実はシェルスクリプトです。

プログラミング

既存のコマンドを使ってコンピュータを動かす方法はすでに学びました。 プロンプトの出ているところでその名前(それに加えて必要ならば引数も) を打ち込めばいいのでした。 また、 シェルスクリプトを書けば既存のコマンドを組み合わせて実行することができました。

しかし、 自分でコマンドを作れれば、 コンピュータをより自由に動かすことができます。 それが「プログラミング」です。 数学科の学生であるみなさんはすでに論理的・分析的にものごとを考える訓練ができているので、 容易にプログラミングを学ぶことができると思います。

コマンドはコンピュータが読んで理解し実行するものなので、 人間が読んでもよくわかりません。 たとえば「mule /usr/bin/ls」とすれば ls の中味が見えますが、 まず内容はわかりません。 そのようなファイルを「バイナリファイル」と呼ぶときがあります。 それに対し、 いままで習った「テキストファイル」は人間が読んで理解できるようなものでした。

シェルスクリプトではないコマンドはバイナリファイルであり、 人間が読むものではありませんから、直接これを書くことは困難です。 そこで、「ソースファイル」と呼ばれるテキストファイルに命令を書いておき、 それをバイナリファイルであるところの「実行ファイル」に翻訳してやります。 この「実行ファイル」は前に述べた「コマンド」と同様に実行することができます。

※ 「コマンド」と「プログラム」の違いを考えてみたが、よくわからない。 「コマンド」 と言われるとすでにできあがって定番になっているプログラムのような気がする。 「プログラム」 というのはソースファイルと実行ファイルの両方を指すのかな。 厳密にはよくわからない。

ソースファイルを実行ファイルに翻訳することを 「コンパイル(compile)する」と言います。 コンパイルは、 「コンパイラ(compiler)」と呼ばれるプログラムがやってくれます。

    +---------------------+                  +---------------------+
    | ソースファイル      | ---------------> | 実行ファイル        |
    | (テキストファイル)|  コンパイラで    | (バイナリファイル)| 
    +---------------------+   コンパイル     +---------------------+

この実習では、ソースファイルは「C言語」で書くことにします。 C言語で書かれたソースファイルから実行ファイルへの翻訳を行なうのは 「Cコンパイラ」と呼ばれるプログラムです。

よって、次に学ぶべきことは

の二つです。

Cコンパイラ gcc

C言語のソースファイルは 「hello.c」のように最後に 「.c」をつけるのが標準的です。 ただし、mule はそのようなファイルに対し 「これはC言語のソースファイルだぞ」 と判断しインデント(後述)に関して特別扱いをするようです。 扱いにくいと思う人は、 別の名前でエディットしコンパイラにかける前に改名するとか、 シェルスクリプトを作るとか、 工夫してみてください。

カレントディレクトリのソースファイル hello.c をコンパイルするなら、 「gcc hello.c」とします。 実行ファイルは a.out という名前でカレントディレクトリに作られます。 元から a.out があればその内容は失われます。 できあがった実行ファイルを実行するには上で説明した通り 「a.out」と打ち込みます。 必要なら mv で a.out 以外の名前に変更しても (この実習の範囲では)実行ファイルの動作に変わりはありません。

よって、以下のプログラミング実習の手順をまとめるとこうなります。

    +--------------------+
    | テキストエディタで | <----+
    | ソースファイル     |      |
    | …….c を作成      | <-+  |
    +--------------------+   |  |
              ↓             |  |
    +--------------------+   |  |
    | Cコンパイラ gcc   |   |  |
    | でソースファイルを | --+  |
    | コンパイル         | 失敗 |
    +--------------------+      |
              ↓成功            |
    +--------------------+      |
    | 実行ファイル a.out |      |
    | を動かす           | -----+
    |                    | 失敗
    +--------------------+
              ↓成功
          +--------+
          | 終わり |
          +--------+

最初のCプログラム

以下のプログラム例で、 最初と最後の「===」の行はプログラムには含まれません。 プログラムの最初と最後をはっきりさせるためのものです。 また、これらのプログラムはディレクトリ ~iwase/prog に置いてあります。 「cp -r ~iwase/prog .」でカレントディレクトリの下にディレクトリごとコピーできます。 (「-r」は「そのディレクトリの中味を再帰的に」の意味のオプション。)

※ 全角文字「\」と「¥」に対応する半角文字は実は ”同じもの”である。 Netscape の画面では「\」が表示されるようだが、 打つのは「¥」でも「\」でもよい。 textedit, cat, mule -nw では「¥」と、 mule では「\」と表示されるようだ。 (10 月 30 日補筆)

== hello.c =================================================
#include <stdio.h>

main() {
    printf("hello, world\n");
}
============================================================

1行目。ほとんどのプログラムはこれを書きます。 「stdio.h という名前のヘッダファイルをここで include せよ」という命令ですが、 今日はこれ以上説明しません。「決まり文句」と思っておいて結構です。

2行目。#include <...> の次は一行あけると見やすいです。

3行目。ここから main 関数が始まります。 行末の開き中カッコ「{」は5行目で閉じており、4行目を囲んでいます。

4行目。これがプログラムの本体です。 この行は行頭に4つのスペースをおいています。 それは人間にとってプログラムを読みやすいものにするためです。 このような「字下げ」を「インデント(indent)」とも言います。

printf は画面出力の関数です。 「関数(function)」といっても、 その意味は数学の関数よりは「機能」に近いでしょう。

※ 「print」ではなく最後に f がついている。注意。

出力されるものは、printf の後ろの小カッコの中にある「" "」で囲まれた部分、 すなわち「hello, world\n」です。 そのうち、「hello, world」は文字通り出力されますが、 最後の「\n」は二文字で「改行」を表わす約束です。 「\」と「n」ではありません。

よって、ここは「hello, world と画面に出力してそのあと改行せよ」という意味になります。

最後のセミコロン「;」はCにおける文の終わりの印です。必ずつける必要があります。

※ 上の例のような、一見奇妙なカッコのつけ方およびインデントについて説明しておく。 実はこれを

   main() { printf(...); }
と書いても
   main()
   { printf(...); }
と書いてもよいのである。

しかし、長年の経験により、 最初にあげたスタイルが最も使いやすいスタイルの一つであることがわかっている。 よって、すでに自分でC言語を使っていて自分なりのスタイルを確立している場合を除いて、 まずはこのスタイルをまねしてみることをすすめる。

このスタイルをすすめる理由の一つは、 プログラム本文を増やす場合に printf の次の行に行単位で文を加えるだけですむことである。 下の二つのスタイルだと、「;」と「}」の間に文を加えなくてはならない。 一般に、エディット作業は行単位のほうが楽なのである。

また、中カッコが複雑に入れ子になった場合でも、 どの開きカッコとどの閉じカッコが対応しているのかを見るのが容易である。 そのような例はそのうち出てくる。

なお、ここですすめているスタイルは、 普通のCの教科書に出ているスタイルとも少々違うが、 私はこれがベストと確信しているので、これを使うことにした。

練習

プログラミングを習うとき、 見本どおりに打ち込んでみる人と、 そういうのはうっとうしいと思う人とがいるようです。 要は見本のプログラムを参考にして自分のプログラムが書けるようになればよいのですから、 各自適当に取り組んでください。

次に、どちらのタイプの人も、 別の言葉 (「hello, 自分の名前」とか) が出力されるプログラムを書いてみましょう。

※ 「書いてみましょう」といっても、 ソースファイルを書いて終わりではない。 書いて、コンパイルして、自分の思うように動いて、 それで初めて「書いた」といえるのだ。

※ その別のプログラムを作る際には hello.c を書き換えてもよいし、 hello.c をコピーしたファイルを書き換えてもよい。 そのあたりは各自で考えること。

C言語の参考書

C言語の教科書としては B.W.カーニハン/D.M.リッチー著・石田晴久訳 「プログラミング言語 C  第 2 版 ANSI 規格準拠」(共立出版株式会社)が定番です。 略称を「K&R2」といいます。 最近、「訳書訂正版」が出ました。

この本はC言語の開発者によるもので、 これ一冊読めばC言語についてのすべてがわかるといってもいいすぎではありません。 私も、プログラムを書くときはこの本の原書をわきに置いてときどき参考にしています。 訳書は翻訳にやや難があると思います。

簡単な計算を行なうCプログラム

== tasizan.c ===============================================
    /* たし算  1990-04-28, written by Iwase */

#include <stdio.h>

main() {
    int a, b, sum;              /* 変数の宣言 */

    a = 2;                      /* 代入 */
    b = 3;
    sum = a + b;

    printf("%d たす %d は %d です.\n", a, b, sum);
}
============================================================

1行目。 「/*」と「*/」とで囲まれた部分はコメントです。 何を書いてもコンパイルしてできる実行ファイルには関係ありませんので、 自由にメモを書くことができます。 ここでは、何をするプログラムか、いつ誰が作ったかを書いています。

※ よって、以下、プログラムをそのまま打ち込んでみる場合、 コメントは打たなくてもいいわけだ。

「変数の宣言」の行。 変数を使う場合、前もって「宣言」しておく必要があります。 ここでは「変数 a, b, sum は int 型」と宣言しています。 変数名には小文字を使うのが普通です。 int 型というのは「整数型」の一つで、整数 integer に由来しています。

「代入」の行。 「a = 2」は、「a は 2 に等しい」という平叙文ではなく、 「a に 2 を代入せよ」という命令文です。 その下の2行も同様です。 プログラムは特に指定しなければ上から下へ実行されるので、 sum = a + b; を実行したあとの sum の値は 5 になります。

printf 文の行。 記号「%d」は、順に後ろの変数の値に置き換わって画面に出力されます。 ここでは、 一つ目の %d は a の値で、 二つ目の %d は b の値で、 三つ目の %d は sum の値で置き換わります。

よって、出力は「2 たす 3 は 5 です.」のあと改行、となります。

※ int 型は整数を表わすが、 コンピュータの世界は有限なのですべての整数を表わせるわけではない。 gcc における各整数型の変数が表わせる整数の範囲を次に示す。

整数型とその範囲
型名最小最大
int -21474836482147483647
short -32768 32767
long -21474836482147483647

よって、普段は int を使えばよいだろう。

※ ほかに、float 型、double 型、long double 型という型がある。 これらは 3.141592 のような小数を表わす型であり、 まとめて「浮動小数点型」と呼ばれる。 float 型よりも double 型のほうが、 double 型よりも long double 型のほうが、表わせる数の範囲が広くなり、 精度もよくなるが、コンパイラによっては等しいこともある。 浮動小数点型を使ったプログラム例はすぐあとに出てくる。

※ %d の代わりに別のものを書くと数の出力法が変わる。 代表的なものをいくつか K&R2 などから引用しておく。

int 型変数を出力する場合
%d 十進整数として出力
%6d 十進整数として出力、少なくとも6文字幅に

double 型変数を出力する場合
%f 浮動小数点数として出力
%6f 浮動小数点数として出力、少なくとも6文字幅に
%.2f 浮動小数点数として出力、小数点の後は2桁
%6.2f 浮動小数点数として出力、少なくとも6文字幅で、小数点の後は2桁

※ 演算子についてまとめておく。 ベキ乗を表わす演算子はC言語にはないことに注意。

 + たし算
 - ひき算 
 * かけ算 
 / わり算(int では小数点以下切り捨て)
 % 余り(例:10 % 3 は 1)

※ 演算の優先順位は数学の場合と同じ。必要ならば小カッコ「( )」を使う。 中カッコ「{ }」、大カッコ「[ ]」をこの目的に使ってはならない。

※ 「-」は c = -b/a のように「符号を変える」の意味でも使える。

== tasizan2.c =================================================================
#include <stdio.h>

main() {
    int a, b;

    printf("数を入れてください.\n");
    scanf("%d", &a);                                  /* 数の入力 */
    printf("もう一つ数を入れてください.\n");
    scanf("%d", &b);
    printf("%d たす %d は %d です.\n", a, b, a+b);
}
===============================================================================

「数の入力」の行。 ここでプログラムは止まってキーボードからの入力を待ちます。 変数名 a の前に「&」がついて &a となっていることに注意してください。 この「&」の意味は多分この実習では説明しません。

分岐を含むCプログラム

== warizan.c ==================================================================
#include <stdio.h>

main() {
    double a, b;

    printf("数を入力してください.\n");
    scanf("%lf", &a);                           /* %lf に注意!*/
    printf("もう一つ数を入力してください.\n");
    scanf("%lf", &b);
    if (b == 0) {                               /* if による分岐 */
        printf("0 では割れません.\n");
    } else {
        printf("%f 割る %f は %f です.\n", a, b, a/b);
    }
}
===============================================================================

「%lf に注意!」の行。 double 型に値を入力するときは「%lf」(エル、エフ)と書きます。

「if による分岐」の行からの数行。

    if (条件1) {
        文1
    } else {
        文2
    }
は次のように動作します。 条件1をまずチェック。 それが真ならば文1を実行し、文2は飛ばして先へ進む。 条件1が偽ならば文1は飛ばし、文2を実行して先へ進む。

    if (条件1) {
        文1
    } else if (条件2) {
        文2
    } else if (条件3) {
        文3
    } else {
        文4
    }
となっていたら次のように動作します。 条件1が真ならば文1だけを実行する。 条件1が偽で条件2が真なら文2だけを実行する。 条件1も条件2も偽で条件3が真ならば文3だけを実行する。 条件1も条件2も条件3も偽なら文4だけを実行する。 if の数がいくつであっても、文のうち一つだけが実行されます。

条件1が真ならば文1を実行し、 偽ならば何も行わない、という場合は

    if (条件1) {
        文1
    }
となります。

※ if (...) の中で使える記号は、数学上の記号と少々異なる。

C言語での記号><>=<===!=
数学上の記号

「==」には特に注意すること。 「=」は代入の記号だったので比較の意味では使えない。 「if (b = 0)」も文法的には正しいのでコンパイラはメッセージを出さないが、 「もし b が 0 に等しかったら」という意味ではない。 「if (a+b < c+d)」のように if の小カッコ内で計算をすることもできる。

※ 入出力についてまとめておく。

入力出力
int scanf("%d", &a); printf("%d", a);
double scanf("%lf", &a) printf("%f", a);

いろいろな数学関数

== sine.c =====================================================================
    /* 「gcc sine.c -lm」としてコンパイルすること */
#include <stdio.h>
#include <math.h>   /* sin */

#define PI 3.14159265

main() {
    printf("%d 度の正弦は %f です.\n", 30, sin(30*PI/180));
}
===============================================================================

「#define ...」の行は、 「以下で PI が出てきたら 3.14159265 で置き換えろ」という意味です。 ここでは PI は一回しか出てきていないのであまり意味がありませんが、 何度も出てくるときはこの方法を使うとタイピングの量が減るし、 間違いも起こりにくくなります。 それに、 「なぜここでこの定数が出てくるか」がプログラムを読む人にわかりやすくなります。 このような定数は大文字で書く習慣です。

※ 関数 sin を使うには math.h の include が必要である。 また、コメントにもつけておいたように、「-lm」をつけてコンパイルする必要がある。 このように使える関数をいくつかあげておく。x や y は double で、 計算結果も double である。

※ 2行目の「/* sin */」というコメントは、 関数 sin を使うから math.h を include したんだぞ、という意味でつけてある。

いろいろやってみよう

ここまでに習ったことを組み合わせると、 「2×2行列の積」「2×2行列の逆行列」 「二元の連立一次方程式を解く」「二次方程式を解く」 「等差数列の初項と公差、第何項目かを入力するとその項の値を出力する」 「等比数列の初項と公比、第何項目かを入力するとその項の値を出力する」 などのプログラムが作れるはずです。興味のある人は どんどんやってみましょう。

※ もしも

    printf("...
          ...");
のように "..." の中に改行を入れるとコンパイラを通らない。 この場合は、画面上で二行以上になってもいいからとにかく一行に printf 文をおさめるか、 あるいは "..." を短く切り分けて複数の printf 文で出力するようにする。 「 日本語なら30文字ぐらい、アルファベットなら60文字ぐらいまできたら改行する」 というのは普通の文章を書く場合のことであって、 プログラムを書いているときはそうもいかない場合があるのである。

※ 直前のコマンドを繰り返すときは「!!」でよい。 覚えておくとプログラムが正しく動くかどうかのチェックの際などに便利だ。

Fortran コンパイラの使い方

ここで、「計算機基礎論1」に関連して、 Fortran コンパイラの起動法を説明しておきます。 私が説明できるのはコンパイラの起動法だけです。 Fortran 言語に関する質問はしないでください。

test.f のように .f で終わる名前をもつファイルに Fortran のプログラムを書いて「frt test.f」 とするとカレントディレクトリに a.out という名前の実行ファイルができるそうです。 test.f90 のように .f90 で終わっていると Fortran 90 で処理されます。 くわしいことは「man frt」でしらべてください。

※ man はマニュアルを画面表示させるコマンドである。 起動後の操作は more と同じ。


岩瀬順一 <iwase@kappa.s.kanazawa-u.ac.jp>