3章 変数と式とフローチャート(スライド) (6/23)

3章 変数と式と
フローチャート
プログラムにおける処理
•
•
•
•
•
•
•
入力
出力
式の計算
変数への代入(値の書き換え)
条件分岐
繰り返し
まとまった処理に名前をつけて呼び出す.
プログラムにおける処理
•
•
•
•
•
•
•
入力
出力
第1章〜第2章
式の計算
変数への代入(値の書き換え)
条件分岐
第4章
繰り返し
第5章
まとまった処理に名前をつけて呼び出す
データの構造
• (単純)変数/定数
– 数値(整数/実数)
– 文字,文字の並び(文字列)
• 配列
– 同じ種類のデータをまとめて扱う
• 構造体
– 異なる種類のデータをまとめて扱う
• ポインタ
– 異なるデータを結びつけ複雑な構造を表現
する
データの構造
• (単純)変数/定数
第3章
– 数値(整数/実数)
– 文字,文字の並び(文字列)
• 配列
– 同じ種類のデータをまとめて扱う
• 構造体
– 異なる種類のデータをまとめて扱う
• ポインタ
– 異なるデータを結びつけ複雑な構造を表現
する
フローチャート
プログラムの処理の「流れ」を図で表す.
Process : 任意の処理を表す。出入口は1つ。
(2つ以上あるということは内部で条件判断
が行われていることになる)
Decision : 一つの入口と複数の出口。
条件にしたがって出口を一つ選ぶ。
(条件判断機能)
Terminal : 入口,出口を表す.
(プログラムの開始,終了など)
入口は一つ
合流
分岐するときは
条件判断が必要
出口は一つ
if (論理式) 文;
if (論理式) 文1;
else 文2;
変数とは
• コンピュータのメモリに確保された領域
• 数値を入れる「箱」と考える
• 変数(variable)の名前
– 最初の文字はA-Zまたはa-zおよび_
– 2番目以降は数字(0-9)も使用できる
– 最大31文字
– 大文字と小文字は区別される
– 途中に空白があってはいけない
– キーワード、予約済みの識別子は使えない
変数の型(type)
整数
char
int
実数
整数
8bit
32bit
short int
long int
long long
16bit
64bit
64bit
実数
float
32bit
double 64bit
long double
(普通はdoubleを使う)
80bit
長さ(bit数)により表現できる値の範囲に制限がある
(P65)
int型
宣言(定義)
int a = 123;
値の範囲(32bit)
2147483647~0~-2147483648
入力
scanf("%d",&a);
表示
printf("%d\n",a);
double型
宣言(定義)
double a = 6.02e+23;
値の範囲(絶対値)
最大値 1.79769e+308
最小値 2.22507e-308
精度(桁数) 15
入力
scanf("%lg",&a);
表示
printf("%g\n",a);
double型
入力 %lg を使用する
出力 %e、%f、%gが使用できる
%e
±d.dddddde±ddd
%f
±d.dddddd
%g
表示する桁数に応じて%eまた
は%f
(dは数字0-9)
/* 666666 Tachibana Masayoshi */
/* p74 list 3.5X */
#include <stdio.h>
int main(void)
{
const double h = 6.63e-34;
const double Na = 6.02e23;
printf("h = %f Na = %f\n",h,Na);
printf("h = %0.36f Na = %15.0f\n",h,Na);
printf("h = %e Na = %e\n",h,Na);
printf("h = %0.1e Na = %1.2e\n",h,Na);
printf("h = %g Na = %g\n",h,Na);
printf("h = %f Na = 15.1g\n",h,Na);
return 0;
}
list35x.c
/* 666666 Tachibana Masayoshi */
/* p77 */
#include <stdio.h>
int main(void)
{
double a,b,c;
a = 0.1;
b = 0.1*0.1*0.1*0.1*1000;
c = a-b;
if ( (a-b) == 0.0)
{
printf("誤差がない\n");
}
else
{
printf("誤差が%30.28f である\n",c);
}
return 0;
}
p77.c
浮動小数点数の計算での誤差
p77.cの実行結果
誤差が-0.0000000000000000277555756156 である
• 桁数が有限であるために誤差を生じる
• 丸め誤差
• 誤差を含む数の計算で生じる誤差
• 桁落ち
• 桁数の大きな数どうしの差を求めるとき
• 情報落ち
• 絶対値の大きい数と小さい数の加減算で
char型(P67)
宣言(定義)
char a = 'x';
値の範囲(8bit)
127~0~-128
入力
scanf("%c",&a);
表示
printf("%c\n",a);
文字の表現
char (8bit)で表現できるもの
定数は ’a’ のようにシングルクォートでくくる
数値(0-255)で表現することも出来る
printfでは %c で文字を表示
日本語の文字は1文字16〜32ビットで
表現しているので、charは使えない。
変数の定義(宣言)と初期化
1.
2.
3.
4.
型名 変数名;
代入されていない変数の値は不定
必ず初期化を行う
実行文の後には定義をおけない
定数(constant)
整数定数
10進数
浮動小数点定数
123.45
1.2345e+2
その他
const double c = 2.99792458e8;
変数の値を固定(定数化)
整数の表現形式を変える
unsigned 符号のない整数
unsigned char
0-255
unsigned short int 0-65535
unsigned int
0-4294967295
(約40億)
代入式(P87)
左辺値 代入演算子 右辺値
右辺値の値を計算し、代入演算子の規則に
従って、右辺値に適用する式
代入式も値を持つ
値は代入後の左辺値の値
代入演算子(P87)
= , += , -= , *= , /= , %=
<<= , >>= , &= , |= , ^=
代入式(2)
=
+= a+=b a=a+b
-= a-=b a=a-b
*= a*=b a=a*b
/= a/=b a=a/b
%= a%=b a=a%b
代入式(3)
<<= a<<=b a=a<<b
>>= a>>=b a=a>>b
&= a&=b a=a&b
|= a|=b a=a|b
^= a^=b a=a^b
代入式(4)
<<
>>
&
|
^
左シフト
右シフト
ビットAND
ビットOR
ビット排他的OR
詳しくは 情報処理概論で...
算術演算子(P90)
整数
+,-,*,/,%
浮動小数点
+,-,*,/
整数と浮動小数点は同じ記号を使う
コンパイラが型に応じて異なる演算器を
使う命令を生成する
sizeof
データの大きさ(バイト数)を答える演算子
演算子の優先順位-1
• Cにはたくさんの演算子がある
– すべてを「今」覚える必要はない
• 演算子には優先順位がある
– かけ算は足し算より先にやる
– すべて覚えるのは大変
• うろ覚えで間違えるよりは表を見ること
• 括弧を使って確実に
演算子の優先順位-2
4章までに出てくるものをリストにした
高
括弧
()
単項演算
+ - ++ -- (cast) sizeof
乗除
*/%
加減
+比較
< > <= => == !=
論理的AND
&&
論理的OR
||
代入演算
= *= /= %= -= += など
評価の結合規則
右から左
なし 左から右
低
演算子の優先順位-3
評価の結合規則
左から右
b+c-d+e
((b+c)-d)+e
右から左
a=b=c=0
a=(b=(c=0))
整数型と浮動小数点型の混合演算
一つの式の中で異なる型の値を混ぜて使う
結果に応じて型の変換を行う
精度の高い方へ型変換が行われる
代入における型変換
代入される左辺値の型にあわす
キャスト(cast)
明示的な型変換
整数型と浮動小数点型の混合演算
• 一つの式の中で異なる型の値を混ぜて使う
– 型変換が行われる
– 精度の高い方へ型変換が行われるが、精度が失われ
ることもある
• 代入における型変換
– 代入される左辺の型にあわす
– (切り捨てが起こることがある)
• キャスト(cast)
– 明示的な型変換
– 例: (double)i/(double)j
i、jがint型でもdoubleに変換して計算
型変換の順序
short int
int および long int
float
double
long double
float型の変数を使用する場合の注意
int および long int から float に変換すると
精度が失われる場合がある。
(floatの精度は6桁程度)