プログラミング実習I
人間システム工学科 井村 誠孝
変数とは
C言語のプログラム中で,入力あるいは計算され た数や文字を保持するには,変数を使用する. 名前がついていて値を入れられる箱,というイメージ. 変数定義: 変数は変数定義(宣言)してからでないと 使うことはできない. 代入: 変数には値を代入できる. 代入できる値の範囲や精度は,変数の型によって決まる. 参照: プログラム中に変数名が現れると,格納さ れている値に置き換わる. p.60フローチャート
アルゴリズムを視覚化したもの #include <stdio.h> int main(void) { int a, b, c; scanf("%d", &a); scanf("%d", &b); c = a + b; if (c < 0) { printf(“cは負です¥n"); } return 0; } はじめ データa,b を入力 c←a+b c < 0? 「cは負です」と表示 N Y p.61変数名の制限
教科書p.62-63を参照してください. Q. 次のうち,変数の名前として使えないのは? 1. when 2. if 3. 2days 4. a12345 5. hoge!hoge 6. fuga_fuga 7. ABC (注: 全角文字) 8. (*゚ー゚)v p.62-63float double char int
変数の型
実数(浮動小数点数) • 範囲・精度が異なる 整数 • 表現できる数の範囲が 異なる • 前にunsignedをつける と,正の数のみ扱う • char型変数は文字(アル ファベット,数字,記 号)を格納する. 表現できる値の 範囲や精度 占有するメモリ トレードオフ p.63整数型と格納可能な値の範囲
型名 ビッ ト数 最小値 最大値 char 8 -27 =-128 27-1 =127 short int 16 -215 =-32768 215-1 =32767 int long int 32 -2 31 =-2147483648 -2 31-1 =2147483647 long long int 64 -263=-9223372036854775808 -2
63-1
=9223372036854775807 p.64
ビットとバイト
ビット(bit) コンピュータが扱う情報の最小単位. 二つの選択肢から一つを特定する(=0か1のいずれか決め る)のに必要な情報量が1ビット. バイト(byte) (一般的には) 8ビット = 1バイト 1バイトで表すことができる選択肢の数は? 28=256 2 × 2 × 2 × 2 × 2 × 2 × 2 × 2 p.64実数
(浮動小数点数)
コンピュータで実数(ただし有効桁数が決まってい る)を扱う際の表現方法. 絶対値が小さな数から大きな数まで,先頭の桁か らの正確さ(有効桁数)を同程度に保って情報を保 持できる. C言語では実数を保持する変数の型として,float と double が用意されている. 型 メモリ量 仮数部の桁数 (10進数換算) 指数部の範囲 float 4 6 10-37~1038 double 8 15 10-307~10308 p.65floatの内部フォーマット
floatは一般的に,IEEE754標準のbinary32形式(32 ビット単精度浮動小数点数)で表現される. 指数部: 8ビット 仮数部: 23ビット 符号部: 1ビット ※doubleの場合: 符号部1ビット,指数部: 11ビット,仮数部: 52ビット p.652.56×10
2 仮数部 指数部参考
: 浮動小数点数 各部の詳細
符号部 正ならば0,負ならば1となる. 指数部 実際の値に,ある固定値 emax (floatの場合127)を加算して表 す(バイアスされた表現). 0と255は特殊な値として予約されているため,表現できる指 数は-126から+127である. 2の補数による負の整数の表現とは異なる. 仮数部 最初の1ビットは常に1であるから省略され,実質24ビットの 精度を持つ(ケチ表現; economized form).文字
文字はchar型で表される 文字1つ1つに数字が対応している(文字コード) 例: Aの文字コードは65 'A'とすると,その文字の文字コードが得られる ¥ とアルファベット1文字 = 特殊記号(エスケープシーケ ンス) ¥n – 改行 / ¥t – タブ など エスケープシーケンスは教科書の付録表を見る 当面,ひらがな・カタカナ・漢字は忘れてください. char型は1バイトしか格納できない.日本語特有の文字は2バイト (以上)の領域が必要. p.67「文字」を表示
/ 「文字コード」を表示
#include <stdio.h> int main(void) { char c = 'A'; printf("%c %d¥n", c, c); return 0; } ここに注目 同じ変数cを異なる型で表示 p.70定数の型
整数 int型として扱われます. 16進数表記: 先頭に0xを付ける. 8進数表記: 先頭に0を付ける. 浮動小数点数 double型として扱われます. 整数だけど浮動小数点数として扱いたい場合は,.0(.だけでもよ い)を末尾に付加する.例: 100.0 float型にしたい場合は,末尾にfを付ける.例: 3.14f p.73参考
: 2進数-10進数-16進数の対応
2進数 10進数 16進数 0 0 0 1 1 1 10 2 2 11 3 3 100 4 4 101 5 5 110 6 6 111 7 7 2進数 10進数 16進数 1000 8 8 1001 9 9 1010 10 A 1011 11 B 1100 12 C 1101 13 D 1110 14 E 1111 15 F 10000 16 10画面出力
/ キーボード入力
printf(フォーマット, 変数, 変数,...);
scanf(フォーマット, &変数, &変数,...);
ただし,scanfであっても,文字列(char配列)のときは& を付けない(そのうち出てくるだろう). printf と scanf のフォーマットはほとんど同じだが, double 変数のときは異なるので要注意. フォーマット文字列の詳細は参考書を見よ. double d; scanf("%lf", &d); printf("%f¥n", d); p.74-75
主なprintfのフォーマット文字列
%d: int型変数; 整数 %c: int型変数; 単一文字 %s: char型配列; 文字列 %f: double型変数; 浮動小数点数 %e: double型変数; 科学的表記法 %g: double型変数; 最適な表記法を自動選択 フォーマット文字列の指定と,引数として与える変数 の型が一致していないと,予期せぬ内容が出力される. 例: double d = 1.0; printf("%d¥n", d); p.75浮動小数点数の表示
printfのフォーマット文字列で以下を指定可能 通常の表記(%f) / 指数表記(%e) / 自動選択(%g) 桁数および精度を指定可能 XX: 全体の文字数を指定(フィールド幅) YY: 小数点以下の桁数を指定(精度) 省略した場合は6桁になる. double d; printf("%XX.YYf",d); printf("%XX.YYe",d); p.75#include <stdio.h> int main(void) { double e; e = 99.123456789012345; printf("%f¥n", e); printf("%.10f¥n", e); printf("%20.10f¥n", e); printf("%e¥n", e); printf("%.10e¥n", e); printf("%20.10e¥n", e); return 0; }
浮動小数点数の表示
: 例
出力結果 99.123457 99.1234567890 99.1234567890 9.912346e+01 9.9123456789e+01 9.9123456789e+01 20文字分 10桁 p.75ついでに
: 主なscanfのフォーマット文字列
%d: int型変数; 整数 %c: char型変数; 単一文字 %s: char型配列; 文字列 (変数名に&は付けない) %f: float型変数; 浮動小数点数 %lf: double型変数; 浮動小数点数 注意!! float型とdouble型で フォーマット文字列が異なる変数の宣言場所
変数の宣言は { の直後(ブロックの先頭)でしかで きない. C言語の仕様. {…}でかこまれた部分を「ブロック」と呼ぶ. ブロックの中で宣言された変数は,そのブロック内のみ 有効. 全てのブロックの外で 宣言すると「グローバル 変数」となる. int x; : if (x == 0) { int a = 1; : printf("%d¥n", a); /* OK */ } printf("%d¥n", a); /* NG */ p.78変数の初期値
関数の中で(つまりブロックの先頭で)宣言された 変数の初期値は不定です. main()関数であっても同じです. 変数は必ず初期化することを習慣付ける. ただし,グローバル変数(関数の外で宣言された変数)の 初期値は0であることが保証されている. p.79符号付き
/ 符号無し 整数
型名 signed unsigned 最小 最大 最小 最大 char -2=-1287 2=1277-1 0 2=2558-1 short int -2=-3276815 2=3276715-1 0 2=6553516-1 int long int -2 31 =-2147483648 -2 31-1 =2147483647 0 -2 32-1 =4294967295 p.83だいたいが式
C言語では思っている以上のものを式として扱う. 代入文も式 例: a = 3 比較の条件も式 例: a == 3 単なる変数(や関数呼び出し)も式 例: a 実は定数だけでも式 例: 3 もちろん,数学的に式らしい式も式 例: y = a * x * x + b * x + c p.85四則演算
演算子(operator): 数値や変数に対して何らかの処 理(演算)を行うことを表す記号 1 + 2 の + は演算子 演算 数学 C言語 加算 + + 減算 - -乗算 × * 除算 ÷ / 剰余(余り) % アスタリスク 線が5本だったり6 本だったりします が同じもの p.89四則演算
演算子の優先順位に注意.迷ったら () を付ければ よろしい. 整数 / 整数の答えは整数になるので注意. 整数 / 整数の答えを小数点以下まで求めたいときにはど うすればよいか? int a, b; double c; a = 1; b = 3; c = a / (double) b; キャスト: 型の変換 double c; c = 1 / 3; double c; c = 1 / 3.0; double c; c = 1.0 / 3; p.90演算子の優先順位と結合規則一覧
() [] -> . 左から右
! ~ ++ -- + - * & (type) sizeof 右から左
* / % 左から右 + - 左から右 << >> 左から右 < <= > >= 左から右 == != 左から右 & 左から右 ^ 左から右 | 左から右 && 左から右 || 左から右 ?: 右から左 = += -= *= /= %= &= ^= |= <<= >>= 右から左 , 高 低 注: 上から2段目 + - は単項演算子 *は間接演算子 &はアドレス演算子 p.94
演算子の優先順位
以下の条件式はどう解釈されるか y+1<x&&y==z+10*x||x!=y 演算子の間には優先順位がある 例えば,5×2+3 → (5×2)+3 次の順に優先(先に演算)される 乗算・除算→加算・減算→比較→論理積→論理和 従って,(((y+1)<x)&&(y==(z+(10*x))))||(x!=y)