前回の練習問題の解答例
#include <stdio.h>
int main(void)
{
double time, temperature, speed, distance;
time=12.0;
temperature=-1.0;
speed=331.5+0.61*temperature;
distance=speed*time;
printf("雷までの距離は%.0fmである。\n",distance);
return 0;
}
4つの実数型変数を宣言している。実数型変数は double で宣言する。
初めに2つの測定値(雷鳴が聞こえるまでの時間と気温)を time と temperature に代入し、その後で計算によって求める値(音速と雷)を speed と distance に順に代入している。
求めた距離を %.0f の場所に当てはめて表示している。
%.0f の .0 は第0位までの表示、つまり小数点以下を表示しないという意味である。
単位m(メートル)を付けることも忘れずに。
数学関数の利用
C言語には何種類かの数学関数が用意されており、「math.h」をインクルードすることでそれらを利用できる。
- math.hをインクルードする
- 実数を使う(答も実数)
よく使うと思われる数学関数
数学関数 | 使い方 | 意味 |
冪 | pow(x,y) | xy |
平方根 | sqrt(x) | √x |
自然対数 | log(x) | log e x |
常用対数 | log10(x) | log 10 x |
正弦 | sin(x) | sin x |
余弦 | cos(x) | cos x |
正接 | tan(x) | tan x |
関数名の後ろの丸括弧( )の中に書く値のことを引数(ひきすう)という。
上の表ではxとyが引数である。
対数(log, log10)
自然対数を求める関数logと、常用対数を求める関数log10を使って、log e100 と log 10100 を計算する。
#include <stdio.h>
#include <math.h>
int main(void)
{
printf("eを底とする100の対数は%fである。\n",log(100.0));
printf("10を底とする100の対数は%fである。\n",log10(100.0));
return 0;
}
log10 の 10 は関数名の一部であり、他の数値に変えることはできない。
math.h のインクルードを忘れないこと。
2進接頭辞・冪(pow)・指数形式
データ量を示すのに B(バイト;byte)という単位が使われる。
大きな数値を表す場合には
- 1kB(キロバイト)=1,024B
- 1MB(メガバイト)=1,024kB
- 1GB(ギガバイト)=1,024MB
のように、210(=1,024)ごとに接頭辞を付けて表すのが慣例である。
しかし本来は、接頭辞k, M, G は103, 106, 109のように10の累乗を表すものなので、上の表記は間違っている。
正しくは
- 1kB=1,000B
- 1MB=1,000kB
- 1GB=1,000MB
である。
2の累乗を表す方法としては、210, 220, 2 30を表す2進接頭辞 Ki(キビ), Mi(メビ), Gi(ギビ)を使って
- 1KiB(キビバイト)=1,024B
- 1MiB(メビバイト)=1,024KiB
- 1GiB(ギビバイト)=1,024MiB
とする表記が正しい。
Ki, Mi, Gi の読み方キビ, メビ, ギビは、kilobinary, megabinary, gigabinary に由来している。
システムがこの悪い慣習に従っている場合、ファイルサイズやドライブ容量がGBで表示されていても、実際にはGiBの数値になっていることがある。
その場合、8GBのUSBメモリの容量は何GBと表示されるだろうか?
冪の関数powを使って、8GBは何GiBであるか計算してみよう。
#include <stdio.h>
#include <math.h>
int main(void)
{
printf("8GBは%.2fGiBである。\n",8.0e+9/pow(2.0,30.0));
return 0;
}
ここで、8.0e+9 は 8.0×10+9の意味である。
この表記を指数形式といい、大きな数値や小さな数値を表すときに便利である。
小さな数値は、例えば0.0000012(すなわち1.2×10-6)を 1.2e-6と表す。
pow(2.0,30.0) は 230 を計算している。
pow(x,y)=xy である。
結果を見ると、本当は8GBであっても7.45GBと表示されてしまうことが分かる
(USBメモリ等の記憶媒体にはファイル管理のための情報も記録されるため、実際の数値はさらに小さくなる)。
三角関数(sin, cos, tan)
次の方法で山の高さを測定することができる。

3000m隔てた2点から測定した山頂の仰角が 3.59°, 4.31°だったとすると、山頂の高さ(標高ではなく測定者からの高さ)は何mだろうか?
#include <stdio.h>
#include <math.h>
#define PI 3.1415926535897932
int main(void)
{
double length, angle1, angle2, height;
length=3000.0;
angle1=3.59*PI/180.0;
angle2=4.31*PI/180.0;
height=length/(1.0/tan(angle1)-1.0/tan(angle2));
printf("山頂の高さは%.0fmです。\n",height);
return 0;
}
三角関数の角度は、度(°)ではなくラジアンでなければならない。
度をラジアンに変換するためには円周率が必要である。
このプログラムでは円周率を定数として定義している。
平方根(sqrt)
次の式(ヘロンの公式)で三角形の面積を計算できる。

3辺の長さが3, 4, 5の三角形の面積をヘロンの公式で計算しよう。
#include <stdio.h>
#include <math.h>
int main(void)
{
double length1, length2, length3, temp, area;
//3辺の長さを3つの変数に代入
length1=3.0;
length2=4.0;
length3=5.0;
temp=(length1+length2+length3)/2.0; //ヘロンの公式のtを計算
area=sqrt(temp*(temp-length1)*(temp-length2)*(temp-length3)); //ヘロンの公式のSを計算
printf("3辺の長さが%f, %f, %fの三角形の面積は%fです。\n",length1,length2,length3,area);
return 0;
}
3辺が3, 4, 5の三角形は直角三角形で、ヘロンの公式を使わなくても面積を計算できるので、検算してみよう。
このプログラムの変数temp のように、計算の途中結果を一時的に記憶しておくために使う変数をテンポラリー変数(一時変数)と呼ぶ。
プログラム中の「//」で始まる文はコメントと呼ばれるものである。「//」の右から改行するまでの間に書いたものは無視されるので、自由にメモなどを書くことができる。コメントには全角文字を書くこともできる。
練習問題
下図の四角形の面積を求めるプログラムを作りなさい。
上のヘロンの公式のプログラムを流用すると作りやすい。
