情報処理Ⅱ 第2回 2005年10月14日(金)
授業の進め方 構造体 その他の型 2年以降で さらに学習・習熟 プリプロセッサ 指令 ライブラリ関数 ファイル入出力 配列・文字列 ポインタ 変数の 有効範囲 識別子 算術型 制御文 演算子 プログラムの作成・ コンパイル・実行
本日学ぶこと コラッツの問題のプログラムで,変数の宣言を としたが,これ以外にどんな書き方があるのか? int x = 3; xは「識別子」 コラッツの問題のプログラムで,変数の宣言を としたが,これ以外にどんな書き方があるのか? xは「識別子」 intは「型」 int x = 3;
識別子(Identifier) プログラムの中でさまざまな対象を識別するために用いられる「名前」のこと 対象の例 変数 関数 型定義 構造体のタグやメンバ 列挙体と列挙定数 ラベル など
識別子の命名規則(1) 最初の文字は,英字または下線記号(_) 2文字目以降は,英字,下線記号または数字 英字は大文字と小文字が区別される 例 ○ int x, variable, Variable, x_y, _, _ _; × int 0x, <variable>, x-y;
識別子の命名規則(2) 「予約語」はNG auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, sizeof, static, struct, switch, typedef, union, unsigned, void, volatile, while 例 × int int; ○ int intchar;
識別子の命名規則(3) 「予約済み識別子」もNG 例 printfなど,既に定義されている名前 下線記号から始まるもの(例外はあるが,避けておくほうが無難) 例 × int printf, NULL; ○ int Printf;
識別子の命名方針 よく使う変数名 変数は,1文字~数文字.もしくは,その用途がわかるものにする. ループ用変数: i, j, k 座標: x, y 変数は,1文字~数文字.もしくは,その用途がわかるものにする. a, b, c, msg, from, to, filename 関数名は,その機能がわかるものにする.長くなる. transform_rectangle_to_circle transformRectangleToCircle ラベルや定数は,大文字と下線のみを使用する NULL, EOF, _ _LINE_ _
型(type) 変数や値がどのような種類の情報を持っているか 型の違いの例 C, C++, Javaなどでは,変数宣言時に型を決めなければ ならない 型の違いの例 int i = 1; (整数の「1」) float f = 1.0; (実数の「1」) char c = '1'; (文字の「1」) char *p = "1"; (文字列の「1」) 相互に変換できる?
型の分類 オブジェクト型 関数型 不完全型 算術型 ⇒ 本日のテーマ 配列型 ⇒ 後日しっかり学ぶ 構造体型 ⇒ 後日しっかり学ぶ 共用体型 ポインタ型 ⇒ 後日しっかり学ぶ 関数型 不完全型 派生型
算術型(よく使う) char : 文字,小さな範囲の整数 int : 整数 long : より大きな範囲の整数 float : 実数 語源…character int : 整数 語源…integer long : より大きな範囲の整数 語源…long integer float : 実数 語源…floating point(浮動小数点) double : より大きな範囲の実数 語源…double precision(倍精度)
算術型(あまり使わない) なるべく使わない たまに見かけるかも short int short long int unsigned char unsigned int unsigned long long double なるべく使わない short int long int long long long long int signed unsigned signed int char signed
整数型の範囲 整数型(char, int, longなど)のとりうる値は で決まる. nビットなら,2進数を用いて2n個の数値を表現できる. その型を何バイト(何ビット)で表現するか 符号の有無 で決まる. nビットなら,2進数を用いて2n個の数値を表現できる. どの整数型も,0を表現できる.
signedとunsigned signed (符号あり) unsigned (符号なし) signedもunsignedも書かなかったら… 負の数をとり得る整数 最小は,-2n-1 最大は,2n-1-1 unsigned (符号なし) 負の数をとらない整数 最小は,0 最大は,2n-1 signedもunsignedも書かなかったら… int, short, longでは「符号あり」と決まっている charでは処理系に依存 1 1 1 1 1 1 1 1 n = 8 の ビットパターン 1 1 1 1 1 1 1 1
整数型の範囲の例 例1: int型が4バイト(32ビット)なら, 例2: char型は常に1バイト(8ビット) 注意 0≦unsigned int型の値≦4294967295 例2: char型は常に1バイト(8ビット) char=signed charなら,-128≦char型の値≦127 char=unsigned charなら,0≦char型の値≦255 注意 char以外の整数型のバイトサイズは処理系に依存 演習室の環境は,intとlongがともに4バイト. intが2バイトという処理系も多い.
範囲を越えるとどうなるか? signed char型変数に13*13を格納すると?
浮動小数点とは? 科学技術計算では,602000000000000000000000 を 6.02×1023 と書く. 計算例:(6.02×1023)×10 = 6.02×1024 (符号)仮数×底指数による表現を,浮動小数点形式という. ただし1≦仮数<底,指数は整数(0や負でもよい) 「底」は「基数」とも言う. 計算例:(6×102)×(6×102) = (6×6)×102+2 = 36×104 = 3.6×105 2を底とする浮動小数点形式で表されることが多い. 例:-0.625 (=1/2+1/8)は,「-」1.01(2) * 2-1
実数型の範囲(1) 仮数と指数をそれぞれ何ビットで表現するかによって,取り得る値が決まる. 単精度の例:符号1ビット+仮数部23ビット+指数部8ビット =32ビット(4バイト) 倍精度の例:符号1ビット+仮数部52ビット+指数部11ビット=64ビット(8バイト) ビット数の制約があるため,あらゆる実数を表すことはできない. 表現できない数の例:101000 ,√2,π
無限小? 1から始めて2でどんどん割っていくと, いくらでも小さい数ができる? いずれは0になる?
1なのに,1でない? for文を用いて,0, 0.1, 0.2, ..., 1.0 を取り出す. プログラミングの心がけ (最善) 実数型はループ用変数にしない. (次善) != ではなく,> や < を用いて終了判定をする.
定数の表現方法 整数定数 浮動小数点定数 上記の英字は,大文字でも小文字でもよい. 123, 0123, 0x123 -123 123U, 123L, 123UL 浮動小数点定数 3.14, -3.1415926 .14, 3. 6.02E23 6.63E-34F, 6.62606876E-34L 上記の英字は,大文字でも小文字でもよい. 8進数値 16進数値 ( 0~9, a~f ) int型 double型 unsigned int型 long型 float型 long double型 unsigned long型 6.02×1023 物理定数 http://ja.wikipedia.org/wiki/%E7%89%A9%E7%90%86%E5%AE%9A%E6%95%B0
異なる型の値同士の計算 1/3 と 1.0/3 と 1/3.0 と 1.0/3.0 は同じ値? 演算において,大きい範囲の型に揃えられる. int > short, int > char (汎整数拡張) long double > double > float > long long > long > int (暗黙の型変換) unsigned > signed 変数に値を格納する(代入する)ときは,変数の型に応じて型変換が行われる. プログラミングの心がけ unsignedとsignedの整数値を混在させて演算しない. 1/3は,0
まとめ 変数や関数などの名前は「識別子」と呼ばれ,そのルール(命名規則)や慣用的な使われ方がある. 「数」には「整数」と「浮動小数点数」がある. 表現できる数値には制限がある. 「整数」といっても,いくらでも大きな整数値が使えるわけではない. 「実数」といっても,いくらでも精密な実数値が使えるわけではない. オーバーフロー,計算誤差,型変換に注意.