情報処理II

情報処理Ⅱ
第2回
2007年10月15日(月)
授業の進め方
構造体
プリプロセッサ
指令
その他の型
ライブラリ関数
識別子
算術型
制御文
演算子
2年以降で
さらに学習・習熟
ファイル入出力
配列・文字列
ポインタ
関数
変数の
有効範囲
再帰呼び出し
プログラムの作成・
コンパイル・実行
2
本日学ぶこと

コラッツの問題のプログラムで,変数の宣言を
int x = 3;
としたが,これ以外にどんな書き方があるのか?


xは「識別子」
intは「型」
3
識別子(identifier)

プログラムの中でさまざまな対象を識別するために用いられ
る「名前」のこと

リp.36
対象の例
• 変数 ⇒ 本日のテーマ
• 関数
• 型定義
• 構造体のタグやメンバ
• 列挙体と列挙定数
• ラベル など
4
識別子の命名規則(1)

最初の文字は,英字または下線記号(_)
2文字目以降は,英字,下線記号または数字
英字は大文字と小文字が区別される

例




○ int x, variable, Variable, x_y, _, _ _;
× int 0x, <variable>, x-y;
5
識別子の命名規則(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;
入p.231
リp.42
6
識別子の命名規則(3)

「予約済み識別子」もNG



例


リp.38
printfなど,既に定義されている名前
下線記号から始まるもの
× int printf, NULL, __LINE__;
○ int Printf;
7
変数名の慣習

変数名は,1文字~数文字.もしくは,その用途がわかるも
のにする.


よく使う変数名



a, b, c, filename, msg
ループカウンタ: i, j, k
座標: x, y
大文字は使わない

定数は大文字のみで書くのが慣例(NULL,EOFなど)
入pp.229-230
8
型(type)

変数や値がどのような種類の情報を持っているか


C, C++, Javaなどでは,変数宣言時に型を決めなければ
ならない
型の違いの例

int i = 1;
double d = 1.0;
char c = '1';
char *p = "1";
(整数の「1」)
(実数の「1」)
(文字の「1」)
(文字列の「1」)
入p.222-225
リp.60
9
型の分類

オブジェクト型







リp.62
算術型 ⇒ 本日のテーマ
配列型 ⇒ 後日しっかり学ぶ
構造体型 ⇒ 後日しっかり学ぶ
共用体型
ポインタ型 ⇒ 後日しっかり学ぶ
派生型
関数型
不完全型
10
算術型(よく使う)

char : 文字,小さな範囲の整数


int : 整数


語源…long integer
float : 実数


語源…integer
long : より大きな範囲の整数


語源…character
語源…floating point(浮動小数点)
double : より大きな範囲の実数

語源…double precision(倍精度)
入p.223
リp.64
11
算術型(あまり使わない)

たまに見かけるかも






short
unsigned char
signed char
unsigned int
unsigned long
long double

なるべく使わない








short int
long int
long long
long long int
signed
unsigned
signed int
char signed
12
整数型の範囲

整数型(char, int, longなど)のとり得る値は


その型を何バイト(何ビット)で表現するか
符号の有無

で決まる.
nビットなら,2進数を用いて2n個の数値を表現できる.
どの整数型も,0を表現できる.

この授業では,整数の表現として「2の補数」を前提とする.


入pp.131-133
13
signedとunsigned

signed (符号あり)




unsigned (符号なし)




負の数をとり得る整数
1 0 0 0 0 0 0 0
最小は,-2n-1
0 1 1 1 1 1 1 1
最大は,2n-1-1
負の数をとらない整数
0 0 0 0 0 0 0 0
最小は,0
1 1 1 1 1 1 1 1
最大は,2n-1
n=8の
ビットパターン
signedもunsignedも書かなかったら…


int, short, longでは「符号あり」と決まっている
charでは処理系に依存
14
整数型の範囲の例

例1: int型が4バイト(32ビット)なら,



例2: char型は常に1バイト(8ビット)



-2147483648≦int型の値≦2147483647
0≦unsigned int型の値≦4294967295
char=signed charなら,-128≦char型の値≦127
char=unsigned charなら,0≦char型の値≦255
注意


char以外の整数型のバイトサイズは処理系に依存
• 演習室の環境は,intとlongがともに4バイト.
• intが2バイトという処理系もあったりする.
範囲を超えた演算や代入は? …第4回授業で
15
浮動小数点とは?

科学技術計算では,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
入pp.135-137
リp.66
16
実数型の範囲(1)

仮数と指数をそれぞれ何ビットで表現するかによって,取り
得る値が決まる.



単精度の例:符号1ビット+仮数部23ビット+指数部8ビット
=32ビット(4バイト)
倍精度の例:符号1ビット+仮数部52ビット+指数部11ビット
=64ビット(8バイト)
ビット数の制約があるため,あらゆる実数を表すことはできな
い.

表現できない数の例:101000 ,√2,π
17
定数の表現方法

整数定数








123, 0123, 0x123
-123
long型
123U, 123L, 123UL
浮動小数点定数

8進数値
16進数値
( 0~9, a~f )
int型
unsigned long型
unsigned int型
3.14, -3.1415926
double型
.14, 3.
6.02×1023
float型
6.02E23
6.63E-34F, 6.6260693E-34L
long double型
上記の英字は,大文字でも小文字でもよい.
constant.c
入p.130
リp.46, p.52
18
printfの変換指示子





int a = 123;
unsigned int b = 123;
long c = 123;
double d = 3.14;
double d2 = 3.14;
printf("%d\n",
printf("%u\n",
printf("%l\n",
printf("%f\n",
printf("%g\n",
a);
b);
c);
d);
d2);
19
識別子と型:まとめ



変数や関数などの名前は「識別子」と呼ばれ,そのルール
(命名規則)や慣用的な使われ方がある.
「数」には,「整数」と「浮動小数点数」がある.
表現できる数値には制限がある.


「整数」といっても,いくらでも大きな整数値が使えるわけでは
ない.
「実数」といっても,いくらでも精密な実数値が使えるわけでは
ない.
20
次に学ぶこと

制御文



for, while, do~while
if~else, switch~case
問題

九九の表を出力できる?
21
ダイクストラの構造化プログラミング

プログラムは,「順接」,「反復」,「分岐」の組み合わせで表
現できる.
順接
反復
処理1
条件
条件
処理
条件を満たす
ときの処理
処理2
入p.253
分岐
条件を満たさ
ないときの処理
22
for

よく使う
構文

for (初期化; 条件; 増分) {
処理
}
•


初期化
最初に「条件」を満たしていな
ければ,1回も「処理」をしない.
条件
処理
増分
入p.260
リp.248, p.256
23
0, 0.1, ..., 1.0 を出力するには



ループ用の変数iは整数型にする.
for文を用いて,i の値を 0, 1, ..., 10 と変えるよ
うにする.
i / 10.0 は,0, 0.1, ..., 1.0 となる.
for (i = 0; i <= 10; i++) {
iの初期値は0
iは10まで
(for i less than
from0to1.c or equal to 10)
入p.261
iの値を1増やす
i = i + 1 と等価
24
while

よく使う
構文

while (条件) {
処理
}
•


条件
最初に「条件」を満たしていな
ければ,1回も「処理」をしない.
処理
入p.258
リp.248
25
do~while

構文

do {
処理
} while (条件);
たまに使う
セミコロンを忘れずに
•



少なくとも1回は「処理」をする.
while文で記述可能

リp.248
処理がbreakを含む場合は
やや煩雑
処理
条件
26
if

よく使う
構文

if (条件) {
処理
}
条件
•

処理

if (条件) {
条件を満たすときの処理
} else {
条件を満たさないときの処理
}
条件
•

•

条件を満たす
ときの処理
条件を満たさ
ないときの処理
入p.256
リp.232
27
制御文:ここまでのまとめ


反復は for,while,do~while
分岐は if,if~else
28