cp-3. 計算
(C プログラミング入門)
URL: https://www.kkaneko.jp/pro/adp/index.html
1
金子邦彦
• Cプログラムによる計算処理の実現。四則演算とライ
ブラリ関数を用いた数値計算の習得。
【学習内容の構成】
1. 四則演算:加減乗除の演算子(+, -, *, /)による基本
計算
2. 変数と入出力:浮動小数(double)の変数宣言、
scanf による入力、printf による出力
3. 代入文:計算結果を変数に格納する処理
4. ライブラリ関数:sin、sqrt、exp 等の数学関数の利
用(math.h のインクルード)
• 前提:Cプログラムの基本構造の理解
• 意義:数式をプログラムで表現し、自由な計算を実行
する能力の獲得
2
例題1.自由落下距離
• 自由落下距離を求めるプログラムを作る
• 地上で物を落とし始めた後の自由落下距離を求める
• 重力加速度 g は 9.8 とする
• 自由落下距離を求めるために,プログラム中に,計算
式 y = ( 9.8 / 2.0 ) * x * x を書く
3
#include <stdio.h>
#include <math.h>
#pragma warning(disable:4996)
int main()
{
double x;
double y;
char buf[256];
int i;
double start_x;
double step_x;
FILE* fp;
printf( "start_x =" );
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf¥n", &start_x );
printf( "step_x =" );
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf¥n", &step_x );
fp = fopen( "z:¥¥data.csv", "w" );
for( i = 0; i < 20; i++ ) {
x = start_x + ( i * step_x );
y = ( 9.8 / 2.0 ) * x * x;
printf( "x= %f, y= %f¥n", x, y );
fprintf( fp, "x=, %f, y=, %f¥n", x, y );
}
fprintf( stderr, "file created¥n" );
fclose( fp );
return 0;
}
自由落下距離の
計算を行っている部分
4
実行結果例
start_x =0
step_x = 0.1
x= 0.000000, y= 0.000000
x= 0.100000, y= 0.049000
x= 0.200000, y= 0.196000
x= 0.300000, y= 0.441000
x= 0.400000, y= 0.784000
x= 0.500000, y= 1.225000
x= 0.600000, y= 1.764000
x= 0.700000, y= 2.401000
x= 0.800000, y= 3.136000
x= 0.900000, y= 3.969000
x= 1.000000, y= 4.900000
x= 1.100000, y= 5.929000
x= 1.200000, y= 7.056000
x= 1.300000, y= 8.281000
x= 1.400000, y= 9.604000
(以下続く)
5
四則演算のための演算子
• + 和
• - 差
• * 積
• / 商
6
例題2.三角形の面積
• 底辺と高さを読み込んで,面積を計算するプログ
ラムを作る
例) 底辺が2.5,高さが5のとき,
面積: 6.25
• 底辺,高さ,面積を扱うために,浮動小数の変数
を3つ使う
7
#include <stdio.h>
#pragma warning(disable:4996)
int main()
{
double teihen;
double takasa;
double menseki;
printf("teihen=");
scanf("%lf", &teihen);
printf("takasa=");
scanf("%lf", &takasa);
menseki = teihen*takasa*0.5;
printf("menseki=%f¥n", menseki);
return 0;
}
入力部分
出力部分
計算部分
8
実行結果例
x=2.5
y=5
z = 6.250000
9
プログラム実行順
printf("teihen=");
scanf("%lf", &teihen);
menseki = teihen * takasa * 0.5;
printf("menseki = %f¥n", menseki);
return 0;
メッセージ「teihen=」を表示
浮動小数データを読み込み
計算
計算結果を表示
終わり
printf("takasa=");
scanf("%lf", &takasa);
メッセージ「takasa=」を表示
浮動小数データを読み込み
10
プログラムとデータ
メモリ
takasa
menseki
3つの変数
scanf("%lf", &teihen);
teihen
①
浮動小数データを読み込み
printf("menseki = %f¥n", menseki);
④
計算結果を表示
menseki = tekhen * takasa * 0.5;
③
計算
scanf("%lf", &takasa);
②
浮動小数データを読み込み
11
変数宣言
• 変数は,データを入れるための容器
• 変数宣言とは,変数を使うために,名前と型を書い
て,変数の使用をコンピュータに伝えること
double teihen;
double takasa;
double menseki;
浮動小数データで,変数名は「teihen」
浮動小数データで,変数名は「takasa」
浮動小数データで,変数名は「menseki」
「double」とは,浮動小数データという
意味.
12
代入文
• 計算結果(teihen*takasa*0.5)を,変数 menseki
に格納する(このことを,代入という)
• 「=」は,変数に計算結果等を格納するという意
味.「両辺が等しい」という意味ではない
menseki = teihen*takasa*0.5;
13
入力,出力とは
• 入力
• データの読み込み
(読み込まれたデータは変数に格納される)
• 出力
• メッセージの表示
• データの表示
(変数に格納されたデータが表示される)
14
入力文
• 入力文とは,データを読み込むための文
• 書式と読み込むべき変数名を書く
• 書式: 浮動小数データを読み込む場合,書式は
「%lf」 と書くことになっている
• 変数名: 変数名の前には「&」を付けること
scanf("%lf", &teihen);
書式
読み込むべき変数名
&
15
いろいろな入力
double x;
scanf( "%lf¥n", &x );
double a;
double b;
scanf( "%lf¥n", &a );
scanf( "%lf¥n", &b );
浮動小数の変数
x への入力
浮動小数の変数
a と b への入力
16
出力文
• 出力文とは,データとメッセージを表示するため
の文
• 書式と表示すべき変数名を書く
• 書式: 浮動小数データを表示する場合,書式は
「%f」 と書くことになっている
• 変数名: 変数名の前には「&」を付けない (scanf と
は違う)
printf("menseki=%f¥n", menseki);
書式
表示すべき変数名
17
いろいろな出力
printf( "x= ?" );
メッセージ 「x= ?」の
表示
printf( "x= %f" );
printf( "y= %f" );
「x= 10.0000
y= 20.0000」
のように,メッセージ
と変数の中身を並べて
表示
18
¥n
次の行に進め(改行)という指示
printf 文などの中で用いる
(例)
printf("menseki=%f¥n", menseki);
19
浮動小数データの使い方
• 変数宣言:
double teihen;
double takasa;
double menseki;
• 書式:
%lf - scanf(入力)での書式
%f - printf (出力)での書式
20
例題3.sin 関数による三角形の面積
• 三角形の2辺の長さ a, b とその挟角 thetaを読み
込んで,面積 S を計算するプログラムを作る
• 面積を求めるために,sin関数を使う
• 円周率π=3.14159 とする
sin
2
1
abS =
21
#include <stdio.h>
#include <math.h>
#pragma warning(disable:4996)
int main()
{
double a;
double b;
double theta;
double S;
printf("a=");
scanf("%lf", &a);
printf("b=");
scanf("%lf", &b);
printf("theta=");
scanf("%lf", &theta);
S = 0.5 * a * b * sin( theta * 3.14159 / 180.0 );
printf("S = %f¥n ", S );
return 0;
}
入力部分
計算部分
出力部分
22
ライブラリ関数
• 指数,対数,平方根
• exp 指数関数(eを底とする指数zの累乗,eのz乗)
• log 対数関数(底をeとする自然対数の計算)
• sqrt 平方根
• 三角関数
• acos 逆コサイン
• asin 逆サイン
• atan 逆タンジェント
• cos コサイン
• sin サイン
• tan タンジェント
• その他
• fabs 絶対値
• fmod(x,y) 浮動小数データの剰余
• pow(x,y) べき乗(xのy乗)
23
いろいろな計算
y = sin( x );
y = sqrt( x );
d = sqrt( ( x * x ) + ( y * y ) );
sin x を計算し,y に格納
x を計算し,y に格納
√
x
2
+ y
2
を計算し,d に格納
√
24
ライブラリ関数の利用
• 計算に関するライブラリ関数を利用するには,
を,プログラムの先頭部分に書くこと
#include <math.h>
25
三角関数では「ラジアン」を使う
#include <stdio.h>
#include <math.h>
#pragma warning(disable:4996)
int main()
{
double degree;
double s;
printf("degree=");
scanf("%lf", &degree);
s = sin( degree * 3.14159 / 180.0 );
printf("sin(%f) = %f¥n ", degree, s );
return 0;
}
• 180.0 の「.0」には意味がある(浮動小数での計算を行うべき
であることをコンピュータに教えている)
「度」から「ラジアン」への変換
26
課題1.Heron の公式
• 三角形の3辺の長さ a, b, c を読み込んで,面
積 S を計算するプログラムを作りなさい.
• Heronの公式を用いること
但し
))()(( csbsassS −−−=
2/)( cbas ++=
27
課題2.四則演算
• 2つの数を読み込んで,和,差,積,商,
剰余を計算するプログラムを作りなさい
28