2 変数とデータ型(教科書の3章)

2.1 プログラムとはなにか

コンピューターは,非常に高速にデータの処理を行う機械である.入力データをもとにさ まざまな計算を行い,目的のデータに加工する.たとえば,二次関数の値をコンピューター で計算させる場合,その係数と範囲が入力データで,計算された値が処理された出力データと なる.

データと命令を書いたものをプログラムという.データ処理のためには,この2つ の要素--データと命令--は必要不可欠である.プログラム中の命令は,printfとか, それっぽい英語が書かれているので,ひとめでわかる.データの方は分かりにくいが,プログラ ム中に変数として書いてある.今はわからなくてもよいが,本日の学習を進めればすぐ にわかるだろう.

2.2 プログラム中のデータ

次のプログラムを見よ.この中の,hogeが変数で,データを表している.そして, printfreturnが命令である.このプログラムの動作は単純で,変数hoge に整数の値2468を代入し,その値を表示させている.
#include <stdio.h>

int main(void){
  int hoge;

  hoge=246;
  printf("ホゲの値は %d です\n",hoge);

  return 0;
}

この例から分かるように,プログラム中の変数には,数値(データ)を代入することができ る.コンピュータープログラムでは,データは変数の中に入れて,その変数を処理するよ うに記述する.プログラム中でデータが丸裸で表れることは良くないとされ,変数の中に 隠すのが一般的である.こうすることにより,変数の値を変化させるだけで,プログラム を変更することなく,異なったデータの処理ができる.

データを格納する方法をデータ構造という.ここでしめした例は,最も単純な方法で,ひ とつの変数にひとつのデータを格納している.本日は,この単純型と複数のデータを効率 良く格納する配列型のデータ構造を学習する.本講義では配列までしか使わないが,問題 に応じて,いろいろなデータ構造がある.困難な問題にあたったときには,さらに複雑な データ構造を学習しなくてはならない.

2.3 変数の型と宣言

2.3.0.1 単純なイメージ

変数とは数値を入れる箱のようなもので,図1 にそのイメージを示す.図の左端に書かれているcharintdoubleは, その変数の型である.それぞれ文字型,整数型,倍精度実数型というもので,箱に格納できるデー タの種類を表している.箱の下の文字列は変数名である.文字型の変数名 (c,h,moji)には1文字を,整数型の変数(i,j,seisu)には1つの整数を,倍精度実 数型の変数名(x,y,jisu)には1つの実数を入れることができる.
図 1: 変数のイメージ.変数とはデータを入れる箱のようなもの.
\includegraphics[keepaspectratio, scale=0.8]{figure/image_variable.eps}

2.3.0.2 型が必要な理由

数学の関数でも変数というものがあり,値を入れることができる.このことは,C言語の変 数と似ている.しかし,数学の変数と決定的に異なることがある.C言語の変数 を使用するとき型を指定しなくてはならない.数学の変数$ x$であれば,整数 でも,実数でも,複素数でも,ベクトルでも$ \cdots$なんでも代入できる.C言語の場合 は,整数型の変数には整数しか代入できない.異なる型のデータを代入すると,コンパイ ラーが警告を出すか,エラーを出すか,あるいは間違った計算をする可能性がある.

良く考えるとプログラムの動作にはこの型の指定は無意味のように思える.あとで,型を 使った操作をしていないからである.また,数学のように,どんなデータでも代入できれ ば便利である.事実,そういう言語もある.この場合は,計算速度やメモリーの使用効率 を犠牲にしている2

コンピューターの都合から,プログラミング言語では型が必要である.このことは,メモ リーを考えないと理解できない.先に述べたように,データを格納するものが変数で,実 際にはコンピューターのメモリーがその役割を担う.図1に示し たように,データは型によって大きさ--正確には情報量--が異なる.したがって,1文 字を格納する場合と,1つの倍精度実数を格納する場合では,必要なメモリーの量が異な る.表1に,代表的な型の大きさ--バイト数3--をしめす.データを格納す るために,メモリーを確保する場合,必要な量をコンピューターに知らせるために,型と いうものがある.

たいていのプログラミング言語では,変数の宣言することにより,メモリーを確保 する.必要なメモリー量はプログラマーが決めなくてはならない.コンピューターは,こ のプログラムがどの程度のメモリーが必要か全く分からないからである.

表 1: 変数の型と情報料
型名 データ型 バイト数 ビット数
文字型 char 1 8
整数型 int 4 32
倍精度実数 double 8 64

2.3.0.3 メモリーと変数の関係

C言語の変数には名前と型があり,データを格納している.変数の実体はメモリーで,メ モリーにはアドレスと記憶内容がある.それらの関係は,図 2のようになっている.
図 2: メモリー中に格納されたデータの例
\includegraphics[keepaspectratio, scale=1.0]{figure/data_in_memory_hexadecimal.eps}

2.3.0.4 C言語の型

同じint型でもいろいろあり,表現できる範囲が異なっている4.これは一つの変数の情報量の差か ら生じる.C言語の型によって表現できるデータの範囲は,教科書の表3-1(p.34)の通りで ある.全てのC言語は同一になっておらず,諸君が使っているシステムではこの表の ようになっている.いろいろな型があるが,ほとんどの場合,charintdoubleで十分である.諸君がこの講義で作成するプログラムでは,これで十分であ る.

文字型の変数に代入できるのは,諸君の教科書の表紙の裏の黄色のページの文字コード表 に書かれているもののみである.漢字や平仮名を代入したい場合は,文字型の配列を使う ことになる.興味のある者は自分で調べよ.

2.3.0.5 変数宣言

C言語のプログラムで,変数を使う場合,その宣言を最初にしなくてはならない.プログ ラムを実行する前に,変数のメモリー領域を確保する必要がある.メモリー領域を確保し た後,実際の処理が行われるのである.

変数宣言により,変数が使うメモリー領域を確保する.変数宣言の方法は,以下のように型名と変数名 を記述するだけである.

	char c, h, moji;
	int i, j, seisu;
	double x, y, jisu;

変数宣言ができる場所は,以下の通りである(教科書のp.54).

  1. 関数の外で,宣言を行う(図3).これをグローバル変数と言い,どの関数からでもこの 変数を使うことができる.
  2. 関数の先頭で宣言を行う(図4).これはローカル変数と呼ばれ,宣言を行った関数のみで 使える.
  3. ブロック--{ }で囲まれた部分--の先頭で宣言を行う.変数は,ブロッ ク内のみで有効である.
3番目は,滅多に使うことがない.1番目のグローバル変数は,プログラム作法上,好まし くないとされている.諸君は,できるだけ2番目のローカル変数を使うことに心がけよ. これら変数宣言とおまじないをあわせると,プログラムの構造は,図 3や図4のようになる.

図 3: おまじないとグローバル変数宣言
\includegraphics[keepaspectratio, scale=1.0]{figure/global_variable.eps}
図 4: おまじないとグローバル変数宣言
\includegraphics[keepaspectratio, scale=1.0]{figure/local_variable.eps}

2.4 プログラム例

文字型と整数型,実数型の変数を宣言,それに値をに代入,そして画面へ出力するソース をリスト1に示す.各行の内容は以下の通りである.
3行
文字型の変数を宣言.
4行
整数型の変数を宣言.
5行
倍精度実数型の変数を宣言.
6-7行
シングルクォーテーション5で囲まれた文字が代入さ れる.
16行
文字変数を出力するための変換仕様は,%cを使う(教科書p.322).

   1 #include <stdio.h>
   2 
   3 int main(void){
   4   char c, h;                   // 文字型変数の宣言
   5   int i, j;                    // 整数型変数の宣言
   6   double x, y;                 // 倍精度実数型変数の宣言
   7   
   8   c = 'a';
   9   h = 'A';
  10 
  11   i = 123;                     // 変数に値の代入
  12   j = -987654321;
  13   
  14   x = -1.23456;
  15   y = 9.87654321e-12;
  16 
  17   printf("c = %c \t h = %c\n", c, h);
  18   printf("i = %d \t j = %d\n", i, j);
  19   printf("x = %e \t y = %e\n", x, y);
  20   
  21   return 0;
  22 }
[練習1]
リスト1を,以下のように変 数を使うように変更せよ.もちろん,変数の代入された結果 も表示させること.
  • 文字型の変数,hogehogehogeを宣言し, それぞれにAkを代入する.
  • 整数型の変数,fugafugafugaを宣言し, それぞれに-123と321を代入する.
  • 倍精度実数型の変数,foobarを宣言し, それぞれに$ -0.1987$ $ -96.85\times 10^{-28}$を 代入する.
[練習2]
変数piに3.1415を,変数eに2.718281828を代入し, 以下の変数を計算する.
  • 変数waは,pi+eとする.
  • 変数saは,pi-eとする.
  • 変数sekiは,pi*eとする.
  • 変数shouは,pi/eとする.
これらの4つの値を,以下の例のように表示するプログラムを 作成せよ.
pi+e = 5.859782
pi-e = 0.423218
pi*e = 8.539482
pi/e = 1.155693

ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成18年5月2日


no counter