プログラミング入門 第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
© Copyright 2024 ExpyDoc