8回目の授業


6回目の課題について



第7章

変数の型



 今までプログラム中では,変数の型としては,int型(整数型)とdouble型(浮動小数点型)の二つのみを使用してきましたが,C言語には他にも使用できる変数の型がいくつかあります。以下に,それらを示します。

使用目的 型名 入れ物の大きさ 表現できる数値の範囲
文字型
(文字を代入するために使う)
char  8 bit  0 〜 28-1
 (0 〜 255)
整数型
(整数を代入するために使う)
short  16 bit  -215 〜 215-1
 (-32,768 〜 32,767)
int  16 bit(16bitコンピュータの場合)
  または,
 32 bit(32bitコンピュータの場合)
 -215 〜 215-1
 (-32,768 〜 32,767)
  または,
 -231 〜 231-1
 (-2,147,483,648 〜 2,147,483,647)
long  32 bit  -231 〜 231-1
 (-2,147,483,648 〜 2,147,483,647)
浮動少数点型
(実数を代入するために使う)
float  32 bit  約 ±10-38 〜 ±1038
double  64 bit  約 ±10-308 〜 ±10308

 実は,これ以外にも使用可能な変数の型がいくつかあるのですが,
(Cf. テキスト182ページFig.7-1,短縮名は187ページTable7-2)
上にあげた型だけを使用するとしても,プログラムを作成する際に困ることはありません。ですので,上にあげた型以外は,覚える必要はないでしょう。

[補足]
 もっと言ってしまえば,上にあげた型以外は,あえて使用しないほうがよいでしょう。特に,符号無し整数型(unsigned という修飾語がついたもの)は,よほど注意して使用しない限りバグの原因となります。

繰り返しになりますが,通常のプログラムを作るうえでは,上の表にまとめた型だけで事足りますので,その他の型は使用しないようにしましょう。


int型とfloat型は使わないようにしましょう

 これまで,課題でトレースしてもらったソースプログラムにおいてはint型が使われていましたので,int型を使ってもらっていましたが,皆さんがこれから自分でオリジナルのプログラムを書くときには,int型は使わないようにしましょう。

また,今回浮動小数点型の一つとしてfloat型を学びましたが,このfloat型についても使わないほうがよいでしょう。

これらの理由は,以下のとおりです。

0.0001を,10000回足しても,1にはならない?

 以下のコードを実行すると,どのような結果になると思いますか?
ぜひ,自分の計算機で,実験してみてください。
予想と違ったならば,なぜ,そのようになるのか? の原理を,考えてみてください。
#include 

int main(void)
{

	int n ;
	float d, ans ;

	d = 0.0001 ;

	ans = 0. ;

	for( n = 1 ; n <= 10000 ; n++ ){

		ans += d ;

	}

	if( ans == 1. ){
		printf("\n0.0001を,10000回足し算すると,1になります。\n") ;
	}
	else{
		printf("\n0.0001を,10000回足し算すると,1にはなりません。\n") ;
		printf("答えは,%f\n", ans) ;
	}

}

char型(文字型)には文字コードが代入される

 プログラム言語では,a, b, cなどの文字も数値として扱います(コンピュータは0と1の数値しか扱えませんので,おのずとそうなります)。

よって,文字に関しても,整数や実数などと同様に,変数に代入して記憶させておくことができます。

例えば,char型の変数としてcxという名前の変数を使うとして,それに a という文字を代入して記憶させておくためには,以下のようなコードを書きます。
    char cx ;
    
    cx = 'a' ;
このように,文字を ' ' (一重引用符)で囲むことによって,その文字がある一意の整数に変換され,その数値が変数 cx に代入されることになります。

 ある文字に対して,どんな値の整数を割り当てるのかは,文字コードと呼ばれるものによって約束されています。

例えば,日本語を取り扱うためによく使われる文字コードの一種であるJISコード(Cf. テキスト248ページTable8-2)では,a という文字には(16進数表記で)61という数値が割り当てられています。

文字コードには,大抵 0 〜 255の範囲の整数値が使われていますので,char型の変数についても,同様に 0 〜 255の範囲の整数値が収められるようになっているというわけです。

 char型の変数に文字を代入したあとは,
(より厳密に言うとすれば,“その文字に対応した文字コードの数値を代入したあとは”,という表現になります)
今までに使用してきた関数 putchar() や,printf() を用いることによって,収められた文字を画面表示することができます。
    putchar(cx) ;
あるいは,
    printf("%c", cx) ;
など。

 文字型の変数について, 詳しくは第9章を参照してください。

[おまけ]
 変数 cx を画面表示するコードとして,次のようなコードを実行させると,a という文字ではなくて,ある整数値が画面に表示されるようになります。興味のあるひとはその理由をぜひ考えてみてください。
    printf("%d", (short)cx) ; /* 変換指定子を,%c ではなくて,%d としている */

数学関数の使い方



 UNIXはベル研究所で開発されたシステムであるため,科学技術計算にも使いやすくなるような設計が十分なされており,C言語においても数学計算に便利なように,多くの数学関数(三角関数や対数関数など)が標準ライブラリの形で提供されています。

C言語のプログラマは,自分の作成しているプログラムの中で数学関数を使いたくなった場合には,(基本的な数学関数であれば)わざわざ自分でその関数を作成する必要はなく,標準ライブラリに納められているものを自分のプログラムの中から呼び出せばよいということになります。(一般的でない数学関数は自分で作成しなければならないかもしれませんが。)

 標準ライブラリには,今まで皆さんも使用してきたprintf()やscanf()などの関数や,基本的な数学関数値を計算する関数などが,その機能によって分類され,幾つかのファイルに分割されて納められています。

これらの関数の多くは,あらかじめコンパイル(狭義のコンパイル)され,オブジェクトコードの形式で標準ライブラリに納められています。したがって,これらの標準ライブラリは,リンカによって自分の作成したプログラムにリンクされて使用されるということになります。

 基本的な数学関数が納められているのは,標準ライブラリの内,libm.a というファイル名のライブラリファイル(ライブラリアーカイブ)です。このライブラリを使用するときは,以下の手順が必要です。
  1. ソースプログラムにおいて,#include 指令で,math.hをインクルード(ソースプログラムに読み込む)する。
    たとえば,
    #include <math.h>
    	.
    	.
    	.
    int main(void)
    {
    	.
    	.
    	.
    }
    
    とする。

  2. コンパイル時に,gcc-lm というオプションを指定する。
    たとえば,

    $ gcc -o list7-11 list7-11.c -lm(enter)

    としてコンパイルする。
ヘッダ math.h には,libm.a に納められている関数の関数原型宣言(function prototype declaration)が書かれてあります。

また,gcc は, -lm オプションを指定して起動すると,コンパイルの最終フェーズにおいて,libm.a を自分の書いたプログラムにリンクして(結合して)くれます。

math.h をインクルードしておけば,自分の書いているソースプログラム内で安心して libm.a に納められている数学関数を使用することができる,というわけです。(math.h をインクルードしないと,コンパイルエラーがでます。)


C言語で使用できる数学関数

 以下に,一般的にC言語で使用できる数学関数の一部を示します。処理系(コンパイラの種類)によっては,これら以外の数学関数が提供されている場合もあります。

関数名 機能 引数の型 関数返却値の型
exp(x) 指数関数,ex double double
log(x) 自然対数,logex double double
log10(x) 常用対数,log10x double double
sqrt(x) xの平方根 double double
pow(x, y) べき乗,xのy乗,xy double double
hypot(x, y) sqrt( x2 + y2 ) double double
sin(x) サイン,xの単位はラジアン double double
cos(x) コサイン,xの単位はラジアン double double
tan(x) タンジェント,xの単位はラジアン double double
asin(x) アークサイン(サインの逆関数),
-π/2〜π/2の値が返される。xは-1〜1
double double
acos(x) アークコサイン(コサインの逆関数),
0〜πの値が返される。xは-1〜1
double double
atan2(y, x) y/xのアークタンジェント(タンジェントの逆関数),
-π〜πの値が返される。
double double
sinh(x) ハイパボリック・サイン double double
cosh(x) ハイパボリック・コサイン double double
tanh(x) ハイパボリック・タンジェント double double
abs(k) 整数の絶対値,|k| int int
labs(k) long型整数の絶対値,|k| long long
fabs(x) 浮動小数点数の絶対値,|x| double double

 なお,C言語の標準ライブラリ関数の詳細は, man コマンドで調べることができます。

たとえば exp() 関数の詳細を調べるためには,以下のように入力します。

$ man exp(enter)

そうすると,exp() 関数の使い方(オンラインマニュアル)を読むことができます。

 以前,man コマンドでUNIXコマンドのオンラインマニュアルが見られることを説明しましたが,man コマンドを使うと,このようにC言語のオンラインマニュアルも見ることができるのです。このようなことからも,UNIXとC言語の関係の深さを知ることができますね。

(注意) 上記の数学関数をプログラム中で使用する場合には,必ず,以下の二つの手順を忘れないで下さい。
  1. math.hをインクルードする。
  2. コンパイル時に,gcc-lm というオプションを指定する。
この手順を忘れると,コンパイルエラーが出ますからね!


今日の実習問題と宿題



(重要)  宿題の締切は次の授業が始まる前までとします。きちんと動作をチェックしてから,提出して下さい。


戻る