前回の練習問題の解答例

前回のヘロンの公式のプログラムを流用する。
#include <stdio.h>
#include <math.h>

int main(void)
{
	double length1, length2, length3, temp, area;
	
	//1個目の三角形
	length1=4.9;
	length2=6.2;
	length3=8.5;
	temp=(length1+length2+length3)/2.0;
	area=sqrt(temp*(temp-length1)*(temp-length2)*(temp-length3));
	
	//2個目の三角形
	length1=8.5;
	length2=6.7;
	length3=10.1;
	temp=(length1+length2+length3)/2.0;
	area=area+sqrt(temp*(temp-length1)*(temp-length2)*(temp-length3));
	//↑右辺のareaは1個目の三角形の面積、sqrt以降は2個目の三角形の面積
	
	printf("四角形の面積は%fです。\n",area);
	return 0;
}
5つの変数のうち、length1, length2, length3, tempについては、面積を求めた後は値を保持し続ける必要がないので、次の三角形を計算する時は上書きしてしまって構わない。 変数areaについても「area=area+2個目」という形の代入文にすればよいので、結局、変数を増やす必要はない。


キーボードからの入力

scanf関数を用いると、キーボードから入力したデータを変数に代入することができる。 scanf関数は、printf関数と同じく「stdio.h」を組み込むことで利用できる。 通常、キーボードからの入力を標準入力という。 それに対し、標準出力は通常、ディスプレイへの表示のことである。 stdioは標準入出力(standard input/output)の意味である。

scanf関数の使い方

  1. stdio.hをインクルードする
  2. scanf関数を使う前に、何を入力すればよいか分かる文をprintf関数で表示する
  3. 第1引数は、整数を入力するなら"%d"、実数を入力するなら"%lf"(lfはエルエフ)
  4. 第2引数以降には変数の左側に&を付けたものを書く
キーボードから入力された税抜価格に対し税込価格を計算するプログラムを作ってみる。
#include <stdio.h>

int main(void)
{
	int price;
		
	printf("税抜価格:");
	scanf("%d",&price);
	printf("税抜%d円の商品の税込価格は%d円です。\n",price,price*108/100);
	return 0;
}


以前作ったプログラムを書き換える

以前作った定数の例題(バナナ5本とパイナップル2個の合計金額を求めるプログラム)を書き換えて、バナナの本数とパイナップルの個数をキーボードから入力するようにしてみる。
#include <stdio.h>
#define BANANA_PRICE 80
#define PINEAPPLE_PRICE 600

int main(void)
{
	int banana, pineapple;
	int banana_num, pineapple_num;
		
	printf("バナナの本数:");
	scanf("%d",&banana_num);
	printf("パイナップルの個数:");
	scanf("%d",&pineapple_num);

	banana=BANANA_PRICE*banana_num;
	pineapple=PINEAPPLE_PRICE*pineapple_num;
	printf("税抜%d円のバナナ%d本と税抜%d円のパイナップル%d個を買うと、税込価格は%d円です。\n",BANANA_PRICE,banana_num,PINEAPPLE_PRICE,pineapple_num,(banana+pineapple)*108/100);
	return 0;
}


実数の入力

前回作った三角関数の例題(山の高さを求めるプログラム)を書き換えて、測定値をキーボードから入力するようにしてみる。
#include <stdio.h>
#include <math.h>
#define PI 3.1415926535897932

int main(void)
{
	double length, angle1, angle2, height;
		
	printf("測定点間の距離:");
	scanf("%lf",&length);
	printf("遠い測定点での仰角:");
	scanf("%lf",&angle1);
	printf("近い測定点での仰角:");
	scanf("%lf",&angle2);

	angle1=angle1*PI/180.0;
	angle2=angle2*PI/180.0;
	height=length/(1.0/tan(angle1)-1.0/tan(angle2));
	printf("山頂の高さは%.0fmです。\n",height);
	return 0;
}
実数を入力する場合、scanf関数の第1引数は"%f"ではなく"%lf"(lfはエルエフ)であることに注意。

複数の数値の入力

前回作った平方根の例題(ヘロンの公式で三角形の面積を計算するプログラム)を書き換えて、3辺の長さをキーボードから入力するようにしてみる。
#include <stdio.h>
#include <math.h>

int main(void)
{
	double length1, length2, length3, temp, area;
		
	printf("三角形の3辺の長さ:");
	scanf("%lf%lf%lf",&length1,&length2,&length3);

	temp=(length1+length2+length3)/2.0;
	area=sqrt(temp*(temp-length1)*(temp-length2)*(temp-length3));
	printf("3辺の長さが%f, %f, %fの三角形の面積は%fです。\n",length1,length2,length3,area);
	return 0;
}
このように、1つのscanf関数で複数のデータを入力こともできる。 その場合、
  1. %dまたは%lfをデータ数だけ並べる
  2. 第1引数の%dや%lfの間には何も書かないか、または区切り文字を書く
  3. 引数と引数の間はコンマで区切る
  4. 第1引数の%dや%lfの間に何も書かなかった場合は、「3.0 4.0 5.0」のように数値の間をスペースで区切って入力する(タブか改行で区切ってもよい)。区切り文字を書いた場合は、その区切り文字で区切って入力する。


型変換

整数を実数に、あるいは実数を整数に変換することを型変換という。
  1. 整数あるいは整数型変数の左に(double)を付けると、値が実数に変換される。
  2. 実数あるいは実数型変数の左に(int)を付けると、値が整数に変換される。
変数の左に(int)や(double)を付けた場合、型変換されるのは参照された値である。変数の型と代入されている値の型は変換されない。

数値の型変換の例
#include <stdio.h>

int main(void)
{
	printf("整数3を実数に変換すると%fになる。\n",(double)3);
	printf("実数2.6を整数に変換すると%dになる。\n",(int)2.6);
	return 0;
}
実数2.6を整数に変換すると2になる。このことから、小数点以下が四捨五入ではなく切り捨てられていることが分かる。


変数の値を型変換する例
#include <stdio.h>

int main(void)
{
	int seisuu;
	double jissuu;
	
	seisuu=3;
	jissuu=2.6;
	printf("整数%dを実数に変換すると%fになる。\n",seisuu,(double)seisuu);
	printf("実数%fを整数に変換すると%dになる。\n",jissuu,(int)jissuu);
	printf("型変換しても変数の値は変わらず%dと%fのままである。\n",seisuu,jissuu);
	return 0;
}
整数型変数seisuuと実数型変数jissuuの値をそのまま表示したり、型変換して表示したりしている。
変数名の左に(int)や(double)を付けて型変換しても、型変換されるのは参照された値であり、変数の型と代入されている値は変わらない。 つまり、(double)seisuu と書くと参照された整数3が実数3.0に変換されるが、seisuuは整数型変数のままであり、代入されている値も整数3のままである。 同様に、(int)jissuu と書くと参照された実数2.6が整数2に変換されるが、jissuuは実数型変数のままであり、代入されている値も実数2.6のままである。

練習問題

以前作った、雷までの距離を計算するプログラムを書き換えて、測定値をキーボードから入力するようにしなさい。