第1回



はじめに

計算数学演習ではC言語によるプログラミングの演習と、C言語を用いた数値計算(「微分方程式」の解の近似計算)およびその解の可視化の演習を行います。演習ではC言語の参考書として、

新訂 新C言語入門 スーパービギナー編
  林晴比古著 ソフトバンク
クリエイティブ
  16
00円 ISBN4-7973-2563-1

を用います。

今日演習を受けてみて、「是非プログラミングをマスターしたい」、「ある程度 はプログラミングというものもできたほうが良いのでは?」、「まぁ、知っていて損はないだろう」などと思った人で、C言語やプログラミングについてあまり 知識をもっておらず、かつ参考書も持っていない人は、なにか一冊参考書を買ってください.なお,演習の順序は上記の参考書の順序に大体従っています.「私には上記の参考書よりもこっちのほうが・・」といった参考書を見つけた人はもちろんそれでも結構です.気に入ったC言語に関する参考書は持っていた方が,演習を半年間受講する上では便利でしょう.


今日の演習

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

 次回の予告的内容も載せてあります.おそらく今日の時間内でそこまでは行けないと思いますが,来週以降の内容に興味がある人は是非読んでおいてください.


演習の進め方とTAの方々の紹介

この演習ではTAの方々が皆さんの学習をサポートします.全員広島大学大学院理学研究科の大学院生で皆さんの先輩にあたる方々です.

演習はこのホームページ皆さんに見てもらいながら,口頭で色々と説明をしながら分からないところはTAの皆さんにそれぞれ対応していただきます.演習の進め方の詳細は口頭で説明します.


半年間この演習で行うこと

この演習の最終的な目標は,計算数学の講義に出てくる様々な「微分方程式」(ニュートン力学系や現実の現象に関する数理モデル)をコンピュータを使って解き,講義内容の更なる理解と,皆さんの知識の拡大,ならびに数学の広がりを感じ取ってもらう事です(数値計算は特に、解析的に解く事のできない問題、方程式を考察する際、強力な味方になってくれます。また行列の計算や、公式のない代数方程式の近似解の探索などにも力を発揮します。).この演習の前半は,プログラミング演習となってしまいますが,それは最終目標に達する為のステップであって,それが目的ではありません.

上記の目標を達成する為には,いくつかのステップを踏む必要があります.まず はコンピュータのプログラミングの初歩をマスターしてもらう必要があります.これが出来なくてはどうにもなりません.まずはコンピュータを計算機として使 いこなせるようになってもらいます.その次のステップとして,実際の応用に取り組んでもらうことになります.以下に,ステップを1,2と分け,内容を詳細 に書いておきます.

ステップ1として,以下の2点を習得してもらう予定です.

演習序盤(次回から6回程度)は「プログラミング言語の習得」部分を行います。プログラミング言語には色々ありますが、この演習では「C言語」を用います。「プログラミング言語の習得」とはいっても、大変初歩的な部分のみ扱います。きちんと演習に出て、演習課題に取り組めば、現在プログラミングに関して全く知識が無い人でも、ある程度のプログラムは書けるようになります。演習中に,習得したプログラミング技術を用いて,簡単な数学的な諸問題(講義にて詳しい説明あり)に取り組んでもらいます.

演習中盤は、コンピュータを使ったお絵かきをしてもらいます。コンピュータをつかったお絵描きは,例えばグラフの描画やその他数学的な諸問題を解いた結果の可視化に用いる事ができます.

その後,ステップ2として,計算数学の講義で紹介された数理モデルを中心に計 算機を用いた数値解法について演習を重ねることにします.コンピュータを用いて方程式を解く場合,その結果は数値の羅列として得られます.それをきちんと グラフとして表示することが出来なければ結果を理解する事はできません.ステップ1のグラフィックスの演習はその為のものであります.


演習のホームページの紹介と見方

演習のホームページのトップに「お知らせ」という項目があります。そこには、レポートの回収状況やその他大事なお知らせを載せますので、毎週必ず見てください。

その他有用な情報へのリンクなどありますので、演習中に紹介します。


レポート提出について


コンピュータの基礎

 コンピュータの話となると、ハードウェアソフトウェアと いった言葉がよく使われます。友達との会話で、「うちのパソコン、ハードが古くってさぁ」とか、「私、あまりソフトもってないから・・」といった会話もあ るでしょう。ハードウェア、ソフトウェアは何もコンピュータの世界だけの言葉ではありません。例えば、最近DVDというものがありますが、DVDの再生装 置が発売された当初、「ソフトの充実が望まれる」といった話を聞いた方も多いでしょう(今現在では充実していると言って良いでしょう)。この場合、DVD の再生装置がハードウェアで、映画などが収められているDVDディスクがソフトウェアです(ディスク自体というよりは、その中に収められている情報(映画など))。もちろん、ゲーム専用機も同様です。語弊があるかもしれませんが、ハードウェアはソフトウェアの再生装置だと思っておいても良いでしょう。最近は、ソフトウェアと情報はしばしば同じ意味として扱われます。

 さて、コンピュータの世界では、ハードウェアとは文字通り硬いもの、つまり パソコンなどの機械本体のことをさします。コンピューターソフトウェアとしては、ワープロソフト(Wordや一太郎等)、メールソフト(Outlookや Thunderbird等)、表計算ソフト(Excel等)等がおなじみでしょう。最近の携帯電話多機能化していますが,それはまさしく一昔前のパソコン と同等以上の性能を持ったコンピュータです.携帯電話においても,メールソフトやWeb閲覧ソフトウェアが動いていますね.なお、コンピューターソフト ウェアは別名プログラムとも呼ばれます。プログラムは「計画」や「予定」と訳すことができますが、コンピュータはプログラムに書かれている指示どおりに作 動する自動機械ともいえます。なお、コンピュータの日本語訳は電子計算機で、その名のとおり、計算をする機械です。この演習ではその本来の使い方である数 値計算をコンピュータにさせることを目標としています。

 プログラミングとはソフトウェアを開発することであり、プログラミング言語とは、ソフトウェアを開発するための言葉です。プログラミング言語とは言語という名が示すとおり、文法があります。しかしながら、自然言語(日本語や英語)のような複雑さはありません。出てくるキーワードもわずかです。C言語もそのようなプログラミング言語の一種です。

 皆さんのこれまでのコンピュータの使い方は,他人の作成したソフトウェア (アプリケーションともよばれる)を利用する事だったでしょう.例えば,メールソフトをつかったり,Webブラウザでホームページを閲覧したり,日常的に コンピュータを用いない人は皆無と言っても良いでしょう.しかしながら,そういったソフトウェアの開発をする人は殆どいません.この演習で皆さんに行って もらう事は,簡単なソフトウェアではありますが,まさしくソフトウェア開発です.そのようなクリエイティブな事に挑戦できるという意気込みで取り組んでく ださい.

 余談ですが,実際数学科を卒業してソフトウェア関連の会社に就職する人が多いようです.ソフトウェア会社に入ってからも当然プログラミングの教育は受けますが,今の速い段階である程度の基礎を身につけるかつけないかは大きな差になると思います.


CコンパイラーとC言語

 コンピュータは機械語とよばれる言語しか実行できません。日本人が日本語しか理解できないのと同じことです。日本人が英国人と話をしたい場合、日本人である我々が英語を習得する方法と、通訳をとおして話をする方法があるでしょう。Cコンパイラーとは、C言語から機械語に翻訳を行う通訳だといえます。

 日本語と英語は両方とも自然言語であり、言語として大差ありません。しかし、機械語とC言語の間には大きな差があります。機械語に比べてC言語は人間にとって格段に理解しやすい言語なのです。C言語などのプログラミング言語を高級プログラミング言語と呼びますが、高級とは機械語に比べてより人間が理解しやすいという意味で高級であるということです。機械語にほぼ一対一で対応する言語としてアセンブラ言語というものがありますが、現在も今後もアセンブラ言語に接することはまず無いと思います。アセンブラ言語は、低級プログラミング言語と呼ばれることもあります。(もちろん、低級プログラミング言語では低級なことしかできないというわけではありません。どのようなプログラミング言語でかかれているにしろ、最終的には機械語に翻訳されるわけですから・・。)

 C言語とは、先述のように高級プログラミング言語の一種です。高級プログラ ミング言語にはC言語の他に、BASIC, Java, Ruby, Python, Visual BASIC, Delphi, PASCAL, LISP, FORTRAN, PROLOG, PL/I, C++, COBOL等々、それこそ山ほどあります。その他にアセンブラ言語という低級プログラミング言語もあります。高級プログラミング言語にはそれぞれ文法があり、その文法に従ってプログラムを記述する必要があります。

 繰り返しになりますが、コンピュータは直接的には機械語しか理解できません。 つまり、機械語で書かれたプログラムしか実行することができないのです。もちろん我々ががんばって、機械語のプログラムを書けばよいのですが、それは大変 でかつ効率もよくありません。そこで、高級プログラミング言語であるC言語が登場します。高級プログラミング言語は、機械語に比べて、より人間に理解しやすい言語となっています。

 そこで、高級プログラミング言語であるC言語でかかれたソースプログラムを機械語に変換する必要があり、その為のソフトウェアがCコンパイラーと呼ばれるソフトウェアです。(ソフトウェアの開発の為にC言語を用いるのですが、その為にCコンパイラーというソフトウェアを使うのです。)

 ところで今回、皆さんはたまたまC言語を習っていますが、高級言語どれか一つをマスターすれば、他の高級言語はたいした苦労も無くマスターできます。

 余談ですが、CコンパイラーというソフトウェアもC言語でかかれています。(卵が先か、鶏が先か?)


コンピューターを使って考えるときに

  ところでこの演習の目的はコンピューターを使って数学的な問題を解くことでありますが、これはもちろん、この演習ではコンピューターしか使ってはいけない、という訳ではありません(当たり前の事ですが。)。

  コンピューターの長所は、単純な作業をあきれるほど沢山の回数、正確かつ高速に処理できることで、数値計算ではその特性を最大限活かして(近似)解を探ります。よって問題を解くためには、その問題をそれと等価な「単純作業の繰り返し」という形に、書き換える必要があります。プログラミングとは、この書き換えを(コンパイルすれば)コンピューターでも分かる言語で行う事であります。

  例えばある積分や証明を行うときに、「この形にすれば(式変形すれば)、あの公式が使える」とか「この形にできれば、あの定理を使って証明できる」という 状況がよくあると思います。プログラミングとは、その「この形」にする、という作業に相当するものです(「この形に(プログラミング)すれば、コンピュー ターで近似解が求まる」)。それゆえ、プログラミングには数学的センスが問われる事にるわけです。積分や証明では多くの場合、「この形」が式の形で得られ ますが、数値計算の場合、(今回は)C言語によるプログラムになります。

  積分や証明をする場合、大抵の人は頭の中だけでなく、紙とペンでいろいろ試しながら「この形」を見つけていると思います。コンピューターでのプログラミン グでも同じです。頭の中だけで考えていては、(初歩的な所は別ですが)なかなかできるものではありません。(まあ、中には何でもできる天才もいますが。) その事をふまえて、常にノートとペンくらいは脇に備えておく事をお勧めします


エディターの使い方

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

という一連の作業を順を追って説明します。


次回の演習では、簡単なC言語によるプログラムを実際にテキストエディターで 打ち込み、それをコンパイルし実行するという一連の作業を行います。多少内容を変更するかもしれませんが,次回の内容を以下に示しておきます.自分で読ん で一人でもできるよう丁寧に書いたつもりですので興味がある人はどんどんすすんでください.操作方法で分からないところがあれば,各人の座っているマシン に備え付けの冊子に有用な情報がありますのでご覧ください.(途中,演習中に実演と書かれているものについては文字で説明するのが難しいため実演する予定 のもので,次回の演習で実際に実演しますが,備え付けの冊子で解決する程度の事です.)

unixのターミナル(端末)のコマンド等を知らない、もしくは綺麗さっぱり忘れてしまったという人は、こちらをご覧ください。


ソースプログラムの作成

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

#include <stdio.h>

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

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


ファイル名に関する注意

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

gebageba.c

filename

this_is_sample.c

20151006.c

など。

また、漢字や / * ? & 等の文字は使わないようにしてください。


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

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

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

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

 まず、ターミナルを起動します。(ターミナルは,画面の地を右クリックすると kterm というものがメニュー内にありますのでそれを選択すると起動できます.なお起動方法は演習中に実演します)

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

cc  hello.c  -o  hello

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

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

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

./hello

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

./hello

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


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

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

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

1行目: 

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

2行目:

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

3行目〜7行目:

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


関数

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

y = sin(x)

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

main 関数

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

main 関数の ()

 また、main 関数の定義では int 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>

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

先ほど同様、ターミナルでコンパイルしましょう。

cc hello.c -o hello

./hello

どうですか?

Hello!
Hello!

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

最後に6行目のreturn 0ですが,これは当面はmain関数終了,すなわちプログラム終了の合図だと思って下さい.

return 0は書かなくても問題なく動作します.



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

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

#include <stdio.h>

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

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

cc hello.c -o hello

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

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

#include <stdio.h>

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

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

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

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


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

課題1

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

課題2

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

課題3

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

課題4

          課題3のプログラムを用いる.main関数内で"return0;"の位置を変えたらどうなるか試してみよ.
          例えばprintf関数,return 0, printf関数の順でソースプログラムを書いた場合,実行結果はどうなるか.


おまけ1

  
printf("文字列");
で 一通りの文字,数字を出力することができるが.画面に出力するためには一工夫が必要な記号も存在する.例えば,"(ダブルクォーテーション)を画面に出力 したいときなどは,そのままでは,文字列の前後の"と見分けがつかないので,コンパイラの混乱を避けるために特殊な記法として \"と入力することになっている. このような,\ + 何か一文字 をエスケープシーケンスと呼ぶ.C言語の特殊文字,エスケープシーケンスについて調べて,試してみよ.


戻る