第1回(2011年10月5日)


はじめに

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

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

を用います。

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


今日の演習

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


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

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

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


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

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

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

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

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

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

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


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

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


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

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


成績について

演習の成績は

  • 課題( 作成したプログラムファイルや、本等を調べて紙面で作成するレポート )
  • 定期試験(中間、期末テスト、実施はまだ未定です。)
  • で評価します。


    CコンパイラーとC言語

    この演習ではC言語を用いてプログラムを作成して、コンピュータに様々な事を実行してもらいます。プログラミング言語にはC言語の他に、BASIC, Java, Visual BASIC, Delphi, PASCAL, LISP, FORTRAN, PROLOG, PL/I, C++, COBOL, アセンブラ等々、山ほどあります。しかし実は、コンピュータは直接的には機械語しか理解できません。つまり、機械語で書かれたプログラムしか実行することができないのです。もちろん我々ががんばって、機械語のプログラムを書けばよいのですが、それは大変でかつ効率もよくありません。そこでプログラミング言語が登場します。プログラミング言語は、機械語に比べて、より人間に理解しやすい言語となっています。

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

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

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


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

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

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

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

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


    エディターの使い方

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

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


    ソースプログラムの作成

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

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

    #include <stdio.h>

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

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

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


    ファイル名に関する注意

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

    gebageba.c

    filename

    this_is_sample.c

    20111005.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: 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" で呼び出しています。引数とは、関数に渡す値です。

    関数

     詳しくは、再来週あたりに行う関数定義の方法のところで説明しますが、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!");
    }

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

    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言語の文法に厳密に従い、つづり間違いもおかさないようにする必要があります。


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

    課題1

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

    課題2

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

    課題3

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


    x

    コンピュータの基礎

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

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

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

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

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


    戻る