• 検索結果がありません。

プログラミング実習I

N/A
N/A
Protected

Academic year: 2021

シェア "プログラミング実習I"

Copied!
32
0
0

読み込み中.... (全文を見る)

全文

(1)

プログラミング実習I

人間システム工学科 井村 誠孝

(2)
(3)

変数とは

 C言語のプログラム中で,入力あるいは計算され た数や文字を保持するには,変数を使用する.  名前がついていて値を入れられる箱,というイメージ.  変数定義: 変数は変数定義(宣言)してからでないと 使うことはできない.  代入: 変数には値を代入できる.  代入できる値の範囲や精度は,変数の型によって決まる.  参照: プログラム中に変数名が現れると,格納さ れている値に置き換わる. p.60

(4)

フローチャート

 アルゴリズムを視覚化したもの #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

(5)

変数名の制限

 教科書p.62-63を参照してください.  Q. 次のうち,変数の名前として使えないのは? 1. when 2. if 3. 2days 4. a12345 5. hoge!hoge 6. fuga_fuga 7. ABC (注: 全角文字) 8. (*゚ー゚)v p.62-63

(6)

float double char int

変数の型

実数(浮動小数点数) • 範囲・精度が異なる 整数 • 表現できる数の範囲が 異なる • 前にunsignedをつける と,正の数のみ扱う • char型変数は文字(アル ファベット,数字,記 号)を格納する. 表現できる値の 範囲や精度 占有するメモリ トレードオフ p.63

(7)

整数型と格納可能な値の範囲

型名 ビッ ト数 最小値 最大値 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

(8)

ビットとバイト

 ビット(bit)  コンピュータが扱う情報の最小単位.  二つの選択肢から一つを特定する(=0か1のいずれか決め る)のに必要な情報量が1ビット.  バイト(byte)  (一般的には) 8ビット = 1バイト  1バイトで表すことができる選択肢の数は? 28=256 2 × 2 × 2 × 2 × 2 × 2 × 2 × 2 p.64

(9)

実数

(浮動小数点数)

 コンピュータで実数(ただし有効桁数が決まってい る)を扱う際の表現方法.  絶対値が小さな数から大きな数まで,先頭の桁か らの正確さ(有効桁数)を同程度に保って情報を保 持できる.  C言語では実数を保持する変数の型として,float と double が用意されている. 型 メモリ量 仮数部の桁数 (10進数換算) 指数部の範囲 float 4 6 10-371038 double 8 15 10-30710308 p.65

(10)

floatの内部フォーマット

 floatは一般的に,IEEE754標準のbinary32形式(32 ビット単精度浮動小数点数)で表現される. 指数部: 8ビット 仮数部: 23ビット 符号部: 1ビット ※doubleの場合: 符号部1ビット,指数部: 11ビット,仮数部: 52ビット p.65

2.56×10

2 仮数部 指数部

(11)

参考

: 浮動小数点数 各部の詳細

 符号部  正ならば0,負ならば1となる.  指数部  実際の値に,ある固定値 emax (floatの場合127)を加算して表 す(バイアスされた表現).  0と255は特殊な値として予約されているため,表現できる指 数は-126から+127である.  2の補数による負の整数の表現とは異なる.  仮数部  最初の1ビットは常に1であるから省略され,実質24ビットの 精度を持つ(ケチ表現; economized form).

(12)

文字

 文字はchar型で表される  文字1つ1つに数字が対応している(文字コード)  例: Aの文字コードは65  'A'とすると,その文字の文字コードが得られる  ¥ とアルファベット1文字 = 特殊記号(エスケープシーケ ンス)  ¥n – 改行 / ¥t – タブ など  エスケープシーケンスは教科書の付録表を見る  当面,ひらがな・カタカナ・漢字は忘れてください.  char型は1バイトしか格納できない.日本語特有の文字は2バイト (以上)の領域が必要. p.67

(13)

「文字」を表示

/ 「文字コード」を表示

#include <stdio.h> int main(void) { char c = 'A'; printf("%c %d¥n", c, c); return 0; } ここに注目 同じ変数cを異なる型で表示 p.70

(14)

定数の型

 整数  int型として扱われます.  16進数表記: 先頭に0xを付ける.  8進数表記: 先頭に0を付ける.  浮動小数点数  double型として扱われます.  整数だけど浮動小数点数として扱いたい場合は,.0(.だけでもよ い)を末尾に付加する.例: 100.0  float型にしたい場合は,末尾にfを付ける.例: 3.14f p.73

(15)

参考

: 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

(16)

画面出力

/ キーボード入力

 printf(フォーマット, 変数, 変数,...);

 scanf(フォーマット, &変数, &変数,...);

 ただし,scanfであっても,文字列(char配列)のときは& を付けない(そのうち出てくるだろう).  printf と scanf のフォーマットはほとんど同じだが, double 変数のときは異なるので要注意.  フォーマット文字列の詳細は参考書を見よ. double d; scanf("%lf", &d); printf("%f¥n", d); p.74-75

(17)

主なprintfのフォーマット文字列

 %d: int型変数; 整数  %c: int型変数; 単一文字  %s: char型配列; 文字列  %f: double型変数; 浮動小数点数  %e: double型変数; 科学的表記法  %g: double型変数; 最適な表記法を自動選択  フォーマット文字列の指定と,引数として与える変数 の型が一致していないと,予期せぬ内容が出力される.  例: double d = 1.0; printf("%d¥n", d); p.75

(18)

浮動小数点数の表示

 printfのフォーマット文字列で以下を指定可能  通常の表記(%f) / 指数表記(%e) / 自動選択(%g)  桁数および精度を指定可能  XX: 全体の文字数を指定(フィールド幅)  YY: 小数点以下の桁数を指定(精度)  省略した場合は6桁になる. double d; printf("%XX.YYf",d); printf("%XX.YYe",d); p.75

(19)

#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

(20)

ついでに

: 主なscanfのフォーマット文字列

 %d: int型変数; 整数  %c: char型変数; 単一文字  %s: char型配列; 文字列 (変数名に&は付けない)  %f: float型変数; 浮動小数点数  %lf: double型変数; 浮動小数点数 注意!! float型とdouble型で フォーマット文字列が異なる

(21)

変数の宣言場所

 変数の宣言は { の直後(ブロックの先頭)でしかで きない.  C言語の仕様.  {…}でかこまれた部分を「ブロック」と呼ぶ.  ブロックの中で宣言された変数は,そのブロック内のみ 有効.  全てのブロックの外で 宣言すると「グローバル 変数」となる. int x; : if (x == 0) { int a = 1; : printf("%d¥n", a); /* OK */ } printf("%d¥n", a); /* NG */ p.78

(22)

変数の初期値

 関数の中で(つまりブロックの先頭で)宣言された 変数の初期値は不定です.  main()関数であっても同じです.  変数は必ず初期化することを習慣付ける.  ただし,グローバル変数(関数の外で宣言された変数)の 初期値は0であることが保証されている. p.79

(23)

符号付き

/ 符号無し 整数

型名 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

(24)
(25)

だいたいが式

 C言語では思っている以上のものを式として扱う.  代入文も式  例: a = 3  比較の条件も式  例: a == 3  単なる変数(や関数呼び出し)も式  例: a  実は定数だけでも式  例: 3  もちろん,数学的に式らしい式も式  例: y = a * x * x + b * x + c p.85

(26)

四則演算

 演算子(operator): 数値や変数に対して何らかの処 理(演算)を行うことを表す記号  1 + 2 の + は演算子 演算 数学 C言語 加算 + + 減算 - -乗算 × * 除算 ÷ / 剰余(余り) % アスタリスク 線が5本だったり6 本だったりします が同じもの p.89

(27)

四則演算

 演算子の優先順位に注意.迷ったら () を付ければ よろしい.  整数 / 整数の答えは整数になるので注意.  整数 / 整数の答えを小数点以下まで求めたいときにはど うすればよいか? 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

(28)

演算子の優先順位と結合規則一覧

() [] -> . 左から右

! ~ ++ -- + - * & (type) sizeof 右から左

* / % 左から右 + - 左から右 << >> 左から右 < <= > >= 左から右 == != 左から右 & 左から右 ^ 左から右 | 左から右 && 左から右 || 左から右 ?: 右から左 = += -= *= /= %= &= ^= |= <<= >>= 右から左 , 高 低 注: 上から2段目 + - は単項演算子 *は間接演算子 &はアドレス演算子 p.94

(29)

演算子の優先順位

 以下の条件式はどう解釈されるか y+1<x&&y==z+10*x||x!=y  演算子の間には優先順位がある  例えば,5×2+3 → (5×2)+3  次の順に優先(先に演算)される  乗算・除算→加算・減算→比較→論理積→論理和 従って,

(((y+1)<x)&&(y==(z+(10*x))))||(x!=y)

(30)

結合規則とは

 以下の計算結果は何になるか 12/5*3  これは当然ながら, (12/5)*3  結合規則は,同じ優先順位の演算子が連続してい る場合に,左側から適用していくか,右側から適 用していくか,を規定する.  ほとんどの演算子は左から右 p.94

(31)

混合演算

 演算は同じ型間で行われる.  C言語の方針: なるべく効率よいように実行する→ 型の変換が必要なければ行わない.  1/3が0になる理由はこれ.  異なる型間での演算は,一方をより広い範囲の値 が扱える型に変換して演算がなされる.  整数と浮動小数点数を演算するときは,整数が浮動小数 点数に変換されてから計算が行われ,結果は浮動小数点 数となる.  代入の場合は左辺値に変換される. p.95

(32)

キャスト

 強制的に型を変換したい→キャスト演算子を使う  キャスト演算子: ()の中に型名が入っている.例 (double) int i, j; double d; i = 1; j = 3; d = i / j; int i, j; double d; i = 1; j = 3; d = (double)i / j; d = i / (double)j; d = (double)i / (double)j; →dは0になる. うまくいかない例 キャストを使う例 p.98

参照

関連したドキュメント

これはつまり十進法ではなく、一進法を用いて自然数を表記するということである。とは いえ数が大きくなると見にくくなるので、.. 0, 1,

(注)本報告書に掲載している数値は端数を四捨五入しているため、表中の数値の合計が表に示されている合計

、肩 かた 深 ふかさ を掛け合わせて、ある定数で 割り、積石数を算出する近似計算法が 使われるようになりました。この定数は船

LF/HF の変化である。本研究で はキャンプの日数が経過するほど 快眠度指数が上昇し、1日目と4 日目を比較すると 9.3 点の差があ った。

近年は人がサルを追い払うこと は少なく、次第に個体数が増える と同時に、分裂によって群れの数

各テーマ領域ではすべての変数につきできるだけ連続変量に表現してある。そのため

られる。デブリ粒子径に係る係数は,ベースケースでは MAAP 推奨範囲( ~ )の うちおよそ中間となる

(注)本報告書に掲載している数値は端数を四捨五入しているため、表中の数値の合計が表に示されている合計