計算機言語
I
第2
回変数
,
標準入力からの読み込み今回からは,プリントを配りません.
今日の講義資料は,次の場所に置きましたので, Webブラウザで読んでください. http://www.math.u-ryukyu.ac.jp/~suga/gengo/2018-1/02.pdf
この資料のLATEXファイルは,間違いを訂正後,数理のftpサーバに置いていきます.
ファイルの整理や,ファイル名のつけ方については,いちいち指示を書きません. 前回の講義で一例を述べま したので,各自の方法で行なってください.
1
変数コンピュータで実行させたいことは, 複雑で面倒なことを自動的にさせることです.複雑で面倒なことの処 理には,「処理の途中経過を一時的に保持する」という動作が必要になります. 変数とは,この「一時的に保持 する」ための記憶領域のことです.
ほとんどのプログラミング言語には,変数という概念があります. ただし, その使い方は,プログラムング言 語(処理系)によって全く異なります. ここでは, Cでの変数について(可能なら他と比較しながら)述べます.
1.1 変数名
Cでは,変数には必ず名前(変数名)がつきます. 変数名は,文字の並び(文字列)です. Cで許容される変数 名には. 次の制限があります.
使える文字は,アルファベットと数字とアンダースコア( , アンダーバーともいう) 文字は, Asciiコードにあ る文字(日本語で,半角文字と通称される文字)です. アンダースコア以外の記号は使えません.
文法上特別な意味を持ついくつかの単語(例えば, main)は, 変数名にはできません.
最初の文字は,アルファベットかアンダースコア 数字から初まる変数名は, 利用できません.(使おうとする と,文法エラー, Syntax Errorとなる)
文字数(文字列の長さが)は31文字まで 32文字以上の変数名をつけても, 32文字目以降は無視されます.
1.2 変数の宣言
Cで変数を使うには,その前に宣言をする必要があります. 宣言の方法は,次のような形です.
1
変数の型 変数名;
変数の型 変数名1,変数名2, ...;
1行目では, 変数名を持つ変数が1つ宣言されています. 2行目は,同じ変数の型を持つ複数個の変数を宣言 する方法です.
型とは
Cにおいて,変数の型とは, その変数の値を保持するのに必要なメモリ量を特定するためのものです. メモ リ量は, 処理系に依存し,メモリ量の値はコンパイラが利用します. プログラミング言語の種類によっては,型 指定が, その型で使用できる演算も規定したりします. しかし, Cではそれはほとんどありません(全く無いわ けではない).
例えば, 数値が入る変数型では, その型を持つ変数に対する4則演算ができるのが通常です. Cには文 字列型というものがありませんが,もし, 文字列型が使えるプログラミング言語を作るとすると, 文字列 の連結のような演算もできるように言語を設計するのが自然です. C ではこのような複雑な型は,プロ グラマが定義していきます. 型の指定の主目的がメモリ量の特定であるというところを見ても,比較的 原始的な,あるいは低水準(ハードウェアに近い)な言語であることがわかります.
宣言をする理由
上で述べた,型を指定して(利用するメモリ量を特定して)変数名を宣言する理由は,プログラム実行開始時 に,必要なメモリを確保するためです. これにより,実行速度が速くなります. 計算機言語Iで学習した, awk のようなインタプリタ系の言語では, 変数宣言は不要でした. しかし,このような処理系では,実行時に,必要 となったメモリをその都度システムから確保していくという動作をします. この動作は時間がかかるので,ど うしても速度が遅くなります.
実行時に必要なメモリの総量が確定しないプログラムというのも,多く存在します. 例えば,テキストエディ タを考えれば,どのような大きさの文書を編集するかを,あらかじめ決めることはできません. このような場合 には,メモリの動的確保という操作をします. これは, かなり高度なことなので, 後期の授業で取り上げること になります.
1.3 基本変数型
以下が4つがCの基本変数型です.
• char: 1文字(Ascii文字, charの語源は character)
• int 整数型 (intは の語源はinteger)
• float 浮動小数点型(floating point number)
• double 倍精度浮動小数点型
これらには,「型を修飾する」キーワードをつけることができます. これ以外は,「これらから派生させて新 しい型を作る」という操作で型を定義することもできます. 型や修飾語の意味や使い方の詳しい事柄は,後の 講義で述べて行きますので, ここではとりあえずint型を利用して行きます. これは,「整数」を値として保持
2
する変数の型です.
1.4 代入演算子 =
Cでは,単独の数式記号=は,代入の意味で用いられます. すなわち, lhs = rhs
は,変数lhsの保持する値を, rhsの値に変更するという操作になります. これまでの事を踏まえて,教科書 p.
11, List1-8をコンパイルして実行してください.
1.5 初期化
変数の宣言の後は,その変数に値を代入するためのメモリが確保されていますが,その値は「不定」すなわ ち,「どのような値が入っているかは,決まっていない」というのが, Cの言語としての仕様です.
計算機言語Iで少しやったawkでは,変数の初期値が「数としての0」が代入されているというのが,言語 の仕様です. すなわち, Cでは, 単純にメモリ確保だけが行われていますが, awkでは,メモリ確保のあと0を 代入するという操作が行われています.
これらは,プログラム言語を設計するときの考え方によるもので, どちらかが優れているというものではあ りません. この事を踏まえて,教科書p. 12, List1-9をコンパイル,実行して見てください. 多くの場合,初期 値には0 が出てくるのですが,これはあくまでも偶然です.
宣言と同時に初期化する
awkと同じように宣言と同時に初期化することも可能で,次のような書式をとります. 変数の型 変数名=初期値;
教科書p.13 List1-10をコンパイル,実行してください.
2
標準入出力とのやりとり標準入力,標準出力という言葉については,計算機概論Iで学習したので,それを復習してください.
これまで, printfという関数を用いて,標準出力に書式指定して出力するという事をしました. この講義で
は, scanfという関数を用いて,標準入力からの入力を受け付けることにします.
プログラムと標準入出力とのやりとりには,何通りかの方法がありますが, scanfはその中で最も手軽な方法 です. ただし, 問題点があり,予想外の入力があったときの対処が大変になります(人間のミスをフォローする のが難しい). 入力に際して, 人間のミスやわがままに付き合うのはとても大変なことで, 入門講義であるこの 講義では,このことを無視します.
scanfは次のような書式をとります.
scanf(”入力書式”,代入する変数1の場所,代入する変数2の場所, ... );
書式の記述は, printfと同じです. 例えば,整数値を読み込んで,変数a に代入するには,
3
scanf("%d", &a);
と書きます. &はアドレス演算子で,単項演算子と呼ばれる種類のものです. ここでは変数の場所を表すもの と考えてください. 詳しい解説は, 後期の授業になると思います. scanfでは,値を受け取るのに必要なものは, 変数名ではなく「その変数名を持つ変数の場所」になってます. なぜこのようになってしまったかというのは, 難しい問題ですのでここでは述べません. これを踏まえて, 教科書p.14, List1-11, p.15, List1-12をコンパイ ル,実行してください. なお, 4則演算に用いる記号が, +,−,∗, /であるのは, ほとんどのプログラミング言語 で共通しています.
puts を使った出力
printfは書式を指定して出力しますが, puts (put stringの略, stringは文字列という意味)を用いて,文字
列を標準出力に出すこともできます. putsが出力できるのは,文字列(2重引用符で囲まれた文字の並び)だけ で,数値を出力することはそのままではできません. printfでは,行末の改行を指定しないと改行してくれませ
んが, putsは自動的に改行してくれます. これらは,共に標準ライブラリにある関数ですが,その特性を利用し
て使い分けます. (printf があればputs は必要ないので, printfしか使わないというのもアリ.) 教科書 p.16 List1-13, p.17 List 1-14を実行してみてください.
putsの逆の操作として,標準入力から文字列を読み込む関数gets (get string)もあります.
講義ノートの
L
ATEX
ファイルの置き場ftp://ftp.math.u-ryukyu.ac.jp/pub/gengo/2018-1/
前回のテキストで述べたところとは違っていますので, ご注意ください. 講義終了後,間違い等を訂正して, LATEXソースをここに置いていきます.
レポート問題
• 演習1-4を実行するとどうなるかの結果を報告する. 件名: enshu1-4
• 演習1-8, 1-9のプログラムソース. 件名: enshu1-8, enshu1-9 締め切りは, 4月23日(月)
4