計算機言語 I 第 2 回 教科書 2 章の補足とレポートに対するコメント
この資料 : http://www.math.u-ryukyu.ac.jp/~suga/gengo/2020-1/04.pdf
1 ご託宣
この講義でなぜ C. を取り上げるかの理由を少し書いておきます . ほとんどは , 教科書の第 1 章に書かれ ているのでそれを読んで頂きたいのですが , それに加えて ,
C の言語仕様が比較的小さいこと . があります .
言語仕様が大きい , つまり , 色々な機能を既に備えている言語の方が , プログラミングはしやすくなりま す . 最近 , AI とかビッグデータ方面で注目されている Python などは , 多機能なプログラミング言語で , 様々なことが簡単な記述でできます . ( 例として ; 計算機言語 I の最後の授業 .)
1
プログラムを書いて問題解決をする必要がるなら , プログラミング言語として , C 以外の選択を考えよ . と , 今では言われています . 実際 , 例えば数学の問題を解決しようとするなら , まず , ( 計算機概論でやったよ
うに ) Maple のような数式処理ソフトを利用するのが普通です .
しかし , 教える側からすると , 大きな言語仕様は大変なのです . 言語の機能の解説に時間を費やして , プロ グラムの基本的な書き方やアルゴリズムの時間がなくなります .
もう一つは , 何のためのプログラムを授業するかという問題もあります . コンピュータの利用は多方面に 渡ります . ゲームを作るプログラムなどは面白いとは思いますが , 私には講義できません . 数理の学生には , やはり数学に関わる数値計算を取り上げるのが一番良いと考えます .
上のふたつを考えると , C は数値計算アルゴリズムを実現するには , 十分な機能を持っており , しかも言語 仕様が小さいので , 短時間で授業ができるというメリットがあると思います .
さらに , ネットに色々なプログラムソースがあるという事も理由です . ネットのソースを読むことで , 自習
することができます .
2 C プログラム入門 : その 2
今回の課題は , 教科書 2 章 , 2.1 節から 2.7 節です . 2.8 節以降は , この授業では省略しますが , できれば , 自習をして下さい .
まずは , 教科書 p. 18 – p. 20 の内容を読んで , プログラムを実行してください . プログラムの書き方など
は , 教科書に沿って音声で解説します . p. 20 の最後のソースのエラーの見つけ方は , 前回の資料で述べたも のでもあります .
C プリプロセッサ
前回述べましたが , C 言語の処理系では , 処理を分割して最終的な成果物を作成します . その際 , 行の先頭 が # で始まる行は cpp (C pre processor) が処理をします . それは , C compiler (ccom) が処理をする前に , コメント文の削除や , マクロ置換 ( 後で解説 ) などの文字列処理を行いなす .
プログラムの先頭に書かれる #include は , 別ファイルに記述してある内容をプログラムの中に取り込む 操作が行われます .
#include <stdio.h>
は , stdio.h という名前のファイルをプログラムに取り込んでいます . この時 , ファイル名の両脇にある記
号 <, > は , プログラム処理系で特に定まった場所にあるファイルを取り込むという意味になります . Linux, WSL などの Unix 系処理系では , その場所は , /usr/include というディレクトリです . 実際そこには , stdio.h や , math.h という名前のファイルがあります . Mac や Visual Studio では , 少し面倒な場所にありますが , 気になる人は Finder や Explorer. で検索してください .
3
3 変数と型 , 識別子
この部分は , 教科書に添って解説音声を聞いてください .
4 マクロ置換 : #define
教科書 p. 24 にあるように , 行頭の #define は cpp により , マクロ置換と呼ばれる操作が行われます .
#define HOGE hogehoge
とあると , cpp がプログラムソース内の HOGE という単語を hogehoge という単語に置き換えて , その結果
を C compiler に渡します . 実行していることは単純な置き換え以外の何者でもありません .
5 教科書へのツッコミ
さて , ファイル math.h を前回のプログラム , レポート問題 , この後の教科書のプログラムで用います .
math.h というのは , 数学関数を利用するにあたって , それらの宣言が記述されたファイルです . 当然 , その
中には , 計算に重要な数学定数も定義されているはずです . 実際 , math.h の中には ,
#define M_PI 3.14159265358979323846 という行があります .
従って , double 型で数値計算をするときには , math.h を include して , M_PI を利用するのが通常で , 教 科書のように , #define PAI .... と書いたりはしません .
5
6 レポートへのツッコミ
多くの方が , 上で述べたように , math.h の M_PI を利用してプログラムを書いていました . 素晴らしいこ とす . これに関して , プログラムソースの先頭に ,
#define _USE_MATH_DEFINES
が書かれたレポートが多くありました . これは , cpp への処理への指示で , M_PI をプログラムで用いるため に必要なものです .
ただし , これが必要な環境は , Visual Studio だけで , Mac, WSL, Linux ではこの指示は不要です .
Visual Studio でこれが必要な理由は , M_PI が C の標準的な仕様である , ANSI (American National Standard for Industory) の仕様に決められていないからです . この仕様に忠実な実装をすると , M_PI は常 にプログラマが書く必要があります .
sin 30
◦の計算でもわかるように , π の値は数値計算では必須です . そこで , 通常は M_PI が定義されてお
り , 特別なことをせずともそれを使えるようにしてあります . Visual Studio (Visual C++) だけ , ANSI の 仕様を忠実なぞるようにしてあり , M_PI. を使うときに特別なことを必要とする実装にしたようです .
レポートの解答で , sin(30) を計算した方がいました . 通常 , sin の変数は radian ですので , 当然 , 間違った
答になっています . sin の引数は , 何も指定していないとラジアンです . 度数法の時には 30
◦のように書き
ます .
間違いを犯すのは , よくあることなのですが , 重要なのは間違いに気づくことです . sin(30
◦) =
12は , 三角 比を習った時点ですぐに知る内容なはずです . 0.5 に近い値が出なかったときに , 「何かを間違えている」と 気づけないようでは , 数理の学生として失格です .
3 角関数の変数が radian を単位にする理由もきちんとわかっていてください . (sin x)
′= cos x のそこそ こ厳密な証明くらいはできるようになって , ( あるいは , 高校の教科書の lim
x→0
sin x
x = 1 の証明のどこにゴマ カシがあるのかを理解して ) 卒業してください .
レポート問題
1. ( 必修 ) double 型を利用して ,
( a ) 640320 · 640320 · 640320
( b ) 640320 · 640320 · 640320 + 744
( c ) e
π√163− 640320 · 640320 · 640320 − 744
の 3 つの値をコンピュータが計算して出力するプログラムを書け .
• レポートする内容は , プログラムソースと実行結果 . 実行結果の出力形式は , 各自に任せる .
• 件 名 : gengo2020-1 report 2-1, 送 り 先 : [email protected], 締 切 5 月 25 日 ( 月 ) 10:00(JST)
2. ( 必修ではないが提出すると加点 ) 上の問題の (b) は正しい計算結果を与えない . 正しい値との差を
IEEE–754 の規格に則って説明せよ .
• 件名 : gengo2020-1 report 2-2, 送り先 : [email protected], 締切は今学期終了時 .
7