以下のプログラム(.cが付くファイル), および解答をメールで提出する. 本文に, 学籍番号, 氏名を明記すること.
printf
, scanf
の使い方を理解する.
とくに, 実数の出力形式を制御して, 使用している環境における double 型の変数の有効桁数を答えよ.
10
-10
+10
1.
や 1.0
のように整数と区別するため後ろに .
または .0
を付ける.
桁数が大きな実数を表記する場合には 1.2e34
のように指数表示を用いる. この例は
-1.
, -1.0
, 1.2
, -1.2e34
, 1.2e-34
整数および実数を入力場合, 出力する場合の書式を覚えましょう.
int a; double x;とするとき,
整数 | 実数 | |
出力 | printf("a = %d\n", a); |
printf("x = %f\n", x); |
入力 | scanf("%d", &a); |
scanf("%lf", &x); |
printf
関数の第一引数を与える書式では, 出力桁を制御できる.
%23d
のように %
と d
の間に整数 nを指定することで,
出力する文字数 (桁数) を制御できる. ここで n
は全体の桁数.
これにより桁を揃えた出力が可能になる.
#include <stdio.h> #include <stdlib.h> int main(void) { int x = 21; int y = 4321; int z = 1; printf("x=[%7d]\n", x); printf("y=[%7d]\n", y);; printf("z=[%7d]\n", z); return EXIT_SUCCESS; }
%f
の他に %e
および %g
が有用.
%e 1.2e-34 のような指数表示. %g 12.00000 のように必要のない 0 が続くときは 12 のように省略する. また, 自動的に 桁が小さい実数は 12, 0.0034 のように出力し, 桁が大きい実数は 5.6e78 のように出力する. 例 printf("a=%f\n", a); printf("a=%e\n", a); printf("a=%g\n", a);
%10.5f
のように %
と f
の間に n.m
のように整数 n, m を指定することで,
出力する文字数 (桁数) を制御できる. ここで n
は全体の桁数, m
は小数点以下の桁数.
#include <stdio.h> #include <stdlib.h> int main(void) { double x = 3.4e56; printf("x=[%30.22f]\n", x); printf("x=[%30.22e]\n", x); printf("x=[%30.22g]\n", x); printf("x=[%f]\n", x); printf("x=[%g]\n", x); return EXIT_SUCCESS; }
以下のプログラムを実行した結果を答えよ. さらに, 各演算においてどの型変換の規則が適用されたかを答えよ.
#include <stdio.h> int main(void) { int a, b, c; double x, y, z; a = 7; b = 3; x = 7.0; y = 3.0; c = a/b; printf("[1] %d\n", c); z = a/b; printf("[2] %f\n", z); z = x/y; printf("[3] %f\n", z); z = a/y; printf("[4] %f\n", z); z = x/b; printf("[5] %f\n", z); c = x; printf("[6] %d\n", c); c = x/b; printf("[7] %d\n", c); z = (double)(a/b); printf("[8] %f\n", z); c = (double)(a/b); printf("[9] %d\n", c); return 0; }
変数を用いて以下のような量を求めてみましょう.
例:
// プログラム中で 底辺の長さと高さを与え, 三角形の面積を求めるプログラム. #include <stdio.h> int main(void) { double base, height, area; base = 5.0; height = 2.0; area = base * height / 2.0; printf("面積は %g です。\n", area); return 0; }
// キーボードから 底辺の長さと高さを入力し, 三角形の面積を求めるプログラム. #include <stdio.h> int main(void) { double base, height, area; printf("三角形の面積を求めます。\n底辺の長さを代入してください:"); scanf("%lf", &base); printf("高さを代入してください:"); scanf("%lf", &height); area = base * height / 2.0; printf("面積は %g です。\n", area); return 0; }
// Taylor 展開により sin(x) を x=0 の近傍で近似する. #include <stdio.h> int main(void) { double x, y; x = 0.2; y = x - 1.0/(3*2*1) * x*x*x + 1.0/(5*4*3*2*1) * x*x*x*x*x - 1.0/(7*6*5*4*3*2*1) * x*x*x*x*x*x*x; printf("sin(%g) = %g\n", x, y); return 0; }
// 1次方程式 a x + b = 0 の解を求める. #include <stdio.h> int main(void) { double a, b, x; a = 1.0; // a は 0 でないこと. b = 3.2; x = -b/a; printf("a=%g, b=%g, x=%g\n", a, b, x); return 0; }
/* 2次方程式 a x*x + b x + c = 0 の解を求める. sqrt は平方根を求める数学関数. 数学関数を用いる場合は 予め math.h をインクルードする. gcc でコンパイルする場合は 数学関数のライブラリ libm に含まれる 数学関数 sqrt を使用するので, このファイルの名前を a.c とすると cc a.c -lm のように -lm オプションが必要. */ #include <stdio.h> #include <math.h> int main(void) { double a, b, c, D, x1, x2; a = 1.0; b = -4.0; c = 3.0; // a は0でない数としかつ D は負にならないよう a, b, c を与えること. D = b*b - 4.0 * a * c; x1 = (-b+sqrt(D))/2.0/a; x2 = (-b-sqrt(D))/2.0/a; printf("a=%g, b=%g, c=%g\n", a, b, c); printf("D=%g\n", D); printf("x1=%g, x2=%g\n", x1, x2); return 0; }
変数の型を整理してみると,なぜ実数を double により宣言するのか. scanf,
printf の書式でなぜ 整数や実数を %d
, %lf
により指定するの
かが見えてくる.
ここでは, C言語の規格では明示されていないが, 多分こんなことだろうということを書いてみる.
単精度実数 float は %f により指定する:
float x; scanf("%f", &x);倍精度実数 double は float よりサイズが大きい. C言語ではサイズが大きい変数したがって有効桁が多い変数は long により修飾し宣言し, printf や scanf の書式では l (エル)により修飾することになっている. double 型は float 型に対して long であるので %lf で指定するようになったようだ.
unsinged
を付けて宣言する. これと区別するために,
符号付き整数は singed
により明示することができる.
サイズ | 小 | 通常 | 大 |
符号無し | singed short int | signed int | signed long int |
符号有り | unsinged short int | unsigned int | unsigned long int |
サイズ | 小 | 通常 | 大 |
符号無し | short | int | long |
符号有り | unsinged short | unsigned | unsigned long |
サイズ/精度 | 通常 | 倍 | 倍より大きい |
float | double | long double |
(c)1999-2013 Tetsuya Makimura