(double)i

プログラミング入門
第3回講義
その他の整数型(2)
浮動小数点型(3)
型変換(6)
printf/scanfの書式(13)
プログラム例(18)
printf/scanf書式まとめ(20)
マークのあるサンプルプログラムは
/home/course/prog0/public_html/2013/lec/source/
下に置いてありますから、各自自分のディレクトリに
コピーして、コンパイル・実行してみてください
Prog-0 2013 Lec 03-1
Copyright (C) 1999 - 2013 by Programming-0 Group
int型ではない整数型(p.64,65)
int型以外に以下のよ
うな整数型がある
short型
long型
会津大標準環境では
右表の範囲を表現出
来る
printfではどの整数型
も「 %d 」を使用して
表示可
1
演習室5,6(Mac)では%ldを使用
しないと、コンパイル時にwarning
Prog-0が出るが、問題なく実行出来る。
2013 Lec 03-2
型
short型
long型
int型
範囲
-32768
~
32767
-2147483648
~
2147483647
-2147483648
~
2147483647
printf
scanf
%d
%hd
%d
%ld
%d
%d
Copyright (C) 1999 - 2013 by Programming-0 Group
整数型以外の数の型:
浮動小数点型(p.65)
int型には、ある範囲の整数しか入れられず、以
下のような数は表現出来ない
例えば、
身長 (173.5 cm)
円周率(3.141…..)
光年(9兆4600億キロメートル):非常に大きな値
電子の重さ(9.1x10-31キログラム):非常に小さな値
小数を格納する浮動小数点型変数には、
単精度float、倍精度doubleの2種類の型がある
Prog-0 2013 Lec 03-3
Copyright (C) 1999 - 2013 by Programming-0 Group
浮動小数点変数の宣言と形式
2種類の浮動小数点型
単精度浮動小数点型:float
float a;
倍精度浮動小数点型:double
double b;
この授業では
主にdouble型
を使用する
2種類の表現形式
小数点形式:3.14
答え
a = 3.14;
3.6e23
指数形式:4.3e-5 (4.3x10-5のこと)
b = 4.3e-5;
(eは大文字でも小文字でも良い)
(問題)それでは3.6x1023は指数形式でどう書きますか?
Prog-0 2013 Lec 03-4
2
Copyright (C) 1999 - 2013 by Programming-0 Group
各型の表現出来る範囲(p.65,66)
範囲:short < int,long < float < double
short
int,long
-32768 ~ 32767
(SHRT_MIN ~ SHRT_MAX)
-2147483648 ~ 2147483647
(LONG_MIN ~ LONG_MAX)
float
±1.2x10-38 ~ ±3.4x1038
double
±2.2x10-308 ~ ±1.8x10308
Prog-0 2013 Lec 03-5
(±FLT_MIN ~ ±FLT_MAX)
(±DBL_MIN ~ ±DBL_MAX)
会津大の値は、
p.65、表3.5の値
と若干異なる。
p.66のプログラム
を参考に調べた
結果、左のように
なった。
Copyright (C) 1999 - 2013 by Programming-0 Group
型変換(p.95)
異なる型間で変換を行うこと。その際、値は…
整数型→浮動小数点型: そのまま 3 → 3.0
浮動小数点型→整数型: 切り捨て 3.15 → 3
3
4
以下の場合に型変換が行われる
代入
混合演算
明示的な型変換
Prog-0 2013 Lec 03-6
Copyright (C) 1999 - 2013 by Programming-0 Group
代入による型変換(p.97)
型が違うものを代入すると、右辺の値が代入
される側(左辺)の型に変換される。
double a;
int i = 3;
a = i;
double a = 3.14;
int i;
i = a;
→aの値は3.0になる
→iの値は3になる
(整数型への型変換は切り捨てになる)
Prog-0 2013 Lec 03-7
Copyright (C) 1999 - 2013 by Programming-0 Group
代入の変換例
b
a,bがそれぞれ表の宣言の時
a = b を実行した場合のaの値
int b = 3;
double b =
3.5;
int a;
3
3
double a;
3.0
3.5
a
Prog-0 2013 Lec 03-8
Copyright (C) 1999 - 2013 by Programming-0 Group
混合演算による型変換(p.95)
型が混ざった演算のことを「混合演算」と言う
(例えばint a;double b;の時の a + bの演算)
混合演算は、より大きな範囲を持つ型 に
自動的に変換された後、演算処理される。
5
a
b
short
long
float
double
Prog-0 2013 Lec 03-9
short
short
long
float
double
long
long
long
float
double
float
float
float
float
double
double
double
double
double
double
Copyright (C) 1999 - 2013 by Programming-0 Group
混合演算による型変換時の注意:割り算
代入すると左辺の型になるというので、以下のような計算を
した。でも結果は2.5とならず、2.0になる。何故だろう?
int i = 10;
int j = 4;
double a;
a = i / j;
これはi、jが整数型なので、i/jの計算が 整数型 で行わ
れてしまうからである。(つまりaへ代入する時にはすでに結
果が2になっている)
6
/home/course/prog0/public_html/2013/lec/source/lec03-1a.c
Prog-0 2013 Lec 03-10
Copyright (C) 1999 - 2013 by Programming-0 Group
キャスト-明示的な型変換(p.98)
正しい割り算結果を得るために、割り算の前に整数i、jを
浮動小数点型(double又はfloat)に変換する必要がある。
このように 明示的に型を変換する 事を「キャスト」と呼ぶ。
キャストは変数や定数の前に変換後の型をカッコ()で
くくってつけることで示す。
前頁の例は
これで正しい
つまり「(変換したい型)変数や定数」とする。
7
int i = 10;
int j = 4;
double a;
a = (double)i / (double)j;
計算が出来る
補足:
混合演算の型変換が行われ
るので、キャストはi,jどちらか
一方のみで良い。
しかしながら両方にキャストを
付けた方がより分かり易い。
/home/course/prog0/public_html/2013/lec/source/lec03-1b.c
Prog-0 2013 Lec 03-11
Copyright (C) 1999 - 2013 by Programming-0 Group
キャストの変換例
int i = 3, j = 2;
double a;
の時
式
aの値
a = i/j;
1.0
a = (double)i/j;
a = i/(double)j;
1.5
a = (double)i/(double)j;
1.5
a = (double)(i/j);
1.0
Prog-0 2013 Lec 03-12
Copyright (C) 1999 - 2013 by Programming-0 Group
printfの書式
浮動小数点数を表示するには
%f、%e、%E、%g 、%Gを使用する
double a = 0.00125 の時
%dを使用すると
デタラメな値が表
示される
書式
説明
表示例
printf("%f",a);
printf("%e",a);
printf("%E",a);
printf("%g",a);
printf("%G",a);
小数点で表示
指数で表示(e小文字)
指数で表示(E大文字)
適切な形式で表示(e小文字)
適切な形式で表示(E大文字)
0.001250
1.250000e-03
1.250000E-03
0.00125
0.00125
printf("%d",a);
間違って%dを使用すると、誤った
数字が表示されるので注意!
(コンピュータによって値が違う)
1073741824
/home/course/prog0/public_html/2013/lec/source/lec03-2.c
Prog-0 2013 Lec 03-13
Copyright (C) 1999 - 2013 by Programming-0 Group
printfの高度な書式(整数)
%dにはもっと高度な書式を設定する事も出来る
%[記号][数字]d
記号(省略可)
数字(省略可)
省略すると、桁数指示がある場合右詰
「-」:左詰
「+」:正の場合も+記号を表示
#include <stdio.h>
実行結果
main()
%5d:__314 %-5d:314
{
%5d:_-314 %-5d:-314
int
i = 314, j = -314;
printf("%%5d:%5d\t%%-5d:%-5d\t%%+5d:%+5d \t
%%2d:%2d\t%%05d:%05d\n",i,i,i,i,i);
printf("%%5d:%5d\t%%-5d:%-5d\t%%+5d:%+5d \t
%%2d:%2d\t%%05d:%05d\n",j,j,j,j,j);
}
注:%%は%を表示、
Prog-0 2013 Lec 03-14
\tはタブになる
普通の数字:桁数を指定
0付きの数字:左側の空白に0
を詰める
%+5d:_+314
%+5d:_-314
%2d:314
%2d:-314
分り易くするため
に空白には「_」を
表示してある
%05d:00314
%05d:-0314
数字が桁数以上の
場合は桁数指示は
無効になる
Copyright (C) 1999 - 2013 by Programming-0 Group
/home/course/prog0/public_html/2013/lec/source/lec03-3a.c
printfの高度な書式(浮動小数点)
%fにはもっと高度な書式を設定する事も出来る
%[記号(%dと同じ)][全体桁数][.[小数点以下桁数]]f
全体桁数(省略可)
小数点以下桁数(省略可)
省略すると、全体桁数は考慮されない
数字全体の桁数指定(小数点含む)
整数部分の桁数は 全体-小数点以下-1
省略すると整数部分のみ表示
数字:小数点以下桁数を指定
(次の桁で四捨五入されて表示)
#include <stdio.h>
実行結果
main()
%9.3f:__314.159 %3.1f:314.2
{
%9.3f:_-314.159 %3.1f:-314.2
double d = 314.1592653538;
printf("%%9.3f:%9.3f\t%%3.1f:%3.1f\t%%.4f:%.4f\n",
d, d, d);
分り易くするために
printf("%%9.3f:%9.3f\t%%3.1f:%3.1f\t%%.4f:%.4f\n",
空白には「_」を表
-d, -d, -d);
示してある
}
注:%%は%を表示、
Prog-0 2013 Lec 03-15
\tはタブになる
小数点以下の桁の
み指示する場合
%.4f:314.1593
%.4f:-314.1593
整数部分が桁数以
上の場合は桁数指
示は無効になる
Copyright (C) 1999 - 2013 by Programming-0 Group
/home/course/prog0/public_html/2013/lec/source/lec03-3b.c
scanfの書式
浮動小数点数を入力するには
%f、%e、%E、%g 、%Gを使用する
%e、%g等はprintfと同じ意味を持つ
その他
int(10進): %d
short(10進): %hd
long(10進) : %ld
float
: %f, %e, %E, %g, %G
double
: %lf, %le, %lE, %lg, %lG
例:scanf("%lf",&var_dbl);
Prog-0 2013 Lec 03-16
Copyright (C) 1999 - 2013 by Programming-0 Group
scanfの注意点
printfはfloat/doubleどちらも「%f」で表示出来る。
double dd = 3.14;
printf("%f\n",dd);
ところが、 scanf は型に合った形式の指示をしない
とうまく読み込めない!(この場合は %lf にすべき)
8
double dd;
scanf("%f",&dd);
Prog-0 2013 Lec 03-17
Copyright (C) 1999 - 2013 by Programming-0 Group
#include <stdio.h>
main()
{
double da, db;
int
ia, ib;;
プログラム例
scanf/printfの書式
printf("double型のデータaを固定小数点形式で入力 : ");
scanf("%lf",&da);
printf("double型のデータbを浮動小数点形式で入力 : ");
scanf("%le",&db);
ia = da;
ib = (int)db;
printf("a = %f / %e / %d\n",da, da, ia);
printf("b = %f / %e / %d\n",db, db, ib);
}
std1dc1{s1000000}1: ./a.out
double型のデータaを固定小数点形式で入力 : 3.14
double型のデータbを浮動小数点形式で入力 : 3.14159e2
a = 3.140000 / 3.140000e+00 / 3
b = 314.159000 / 3.141590e+02 / 314
std1dc1{s1000000}2:
Copyright (C) 1999 - 2013 by Programming-0 Group
/home/course/prog0/public_html/2013/lec/source/lec03-4.c
Prog-0 2013 Lec 03-18
#include <stdio.h>
main()
{
int i,j,k;
double average;
プログラム例
平均を求める
printf("3人分の体重(整数kg)を空白で分けて入力してください : ");
scanf(
"%d%d%d" 9 ,&i,&j,&k);
キャスト!
average = ((double)(i + j + k))/3;
printf("3人の体重はそれぞれ %dkg %dkg %dkgで、\n",i,j,k);
printf("その平均は %fkg となりました\n",average);
}
std1dc1{s1000000}1: ./a.out
3人分の体重(整数kg)を空白で分けて入力してください : 57 72 49
3人の体重はそれぞれ 57kg 72kg 49kgで、
その平均は 59.333332kg となりました
std1dc1{s1000000}2:
/home/course/prog0/public_html/2013/lec/source/lec03-5.c
Prog-0 2013 Lec 03-19
Copyright (C) 1999 - 2013 by Programming-0 Group
scanf/printfの書式のまとめ
変数の型
printf
scanf
short
%d
%hd
int
%d
%d
long
%d
%ld
float
%f, %e, %E, %g, %G
%f, %e, %E, %g, %G
double
%f, %e, %E, %g, %G
%lf, %le, %lE, %lg, %lG
10
注:上記の整数型入力書式は全て10進数である。16進数の
入出力は「%x(入力では%x、%hx、%lx)」という書式で行う
Prog-0 2013 Lec03-20
Copyright (C) 1999 - 2013 by Programming-0 Group