62
3変数と演算 ランダムで決めた二つの数の和と差を求めたい。 さて、どんな動きをすればできるだろうか・・・ 1 3変数と演算

3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

第3章 変数と演算

ランダムで決めた二つの数の和と差を求めたい。

さて、どんな動きをすればできるだろうか・・・

1 第3章 変数と演算

Page 2: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

変数 値を収納できる箱のようなもの

第3章 変数と演算 2

Page 3: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

変数とは(1)

表紙のプログラムを以下のように組んだとする

上手くいきません・・・・

►rand()が呼び出される度、新しい乱数が生成される

►全てのrand()が別の値になってしまう

第3章 変数と演算 3

#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void){ srand(time(NULL)); printf("%d+%d=%d¥n",rand(),rand(),rand()+rand()); printf("%d-%d=%d¥n",rand(),rand(),rand()-rand()); return 0; }

Page 4: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

変数とは(2)

仮に、次のようなことができたとする

1. 箱を2つ用意して、その中にランダムの値を入れる

2. %dの部分にその箱の中身を表示する

第3章 変数と演算 4

rand()=3 rand()=7

3 7 "%d+%d=%d¥n"

3+7=10

Page 5: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

変数とは(3)

このような概念がプログラミングに存在するよ

さっきのスライドの箱のように、データを一時的に保管する領域を変数といいます

数学の変数とは別物です!

►数字以外に文字なども保管できます

第3章 変数と演算 5

Page 6: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

変数の使用(宣言)(1)

変数を使う前に、変数(箱)を作る必要があるよ

►変数を作る処理のことを変数宣言という

第3章 変数と演算 6

文法

データ型 変数名;

データ型 その変数にどんな種類の値を入れることができるかを表す(詳しくはのちほど)

例) 整数→int 小数→double

Page 7: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

変数の使用(宣言)(2)

第3章 変数と演算 7

変数を使う前に、変数(箱)を作る必要があるよ

►変数を作る処理のことを変数宣言という

文法

データ型 変数名;

変数名 複数の変数を区別するために付けられる名前

変数名の注意 1)半角アルファベット、数字、アンダーバー(_)のみ使用可能 2)ただし、最初の文字は数字不可 3)intなど他にC言語で使われてる単語は不可(含まれるのは可)

Page 8: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

変数の使用(宣言)(3)

2つ以上の変数を一気に宣言することも可能

先ほどのプログラムを実現するため

►rand1、rand2という変数を作りましょう

これで、変数が作れたから、次は代入だー!!

第3章 変数と演算 8

文法

データ型 変数名1,変数名2,変数名3,…;

int main(void){ int rand1,rand2; return 0; }

Page 9: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

変数の使用(代入)(1)

変数に値を入れることを代入というよ

イコールはあくまで、右から左への代入

►だから次の×は認められない

9

文法

変数名 = 値;

int main(void){ int a; a=5; }

int main(void){ int a; 5=a; }

5にaを代入する ことはできない

int main(void){ a=5; int a; }

変数宣言前に 代入などは できない

int main(void){ int a=5; }

第3章 変数と演算

宣言と代入は、 同時にできる

Page 10: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

変数の使用(代入)(2) では、先ほどのコードに代入を追加しよう

#include <stdlib.h> #include <time.h> int main(void){ int rand1,rand2; srand(time(NULL)); rand1=rand(); rand2=rand(); return 0; }

ここまでこれば後もう少しです。次は変数を表示させます

10 第3章 変数と演算

Page 11: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

変数の使用(参照)(1) 変数は普通の数字と扱いはそんなに変わらない

►計算式に混ぜたり、引数に指定したりできる

先ほどのプログラムを完成させよう

変数の中身を使うことを参照というよ 第3章 変数と演算 11

#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void){ int rand1,rand2; srand(time(NULL)); rand1=rand(); rand2=rand(); printf("%d+%d=%d¥n",rand1,rand2,rand1+rand2); printf("%d-%d=%d¥n",rand1,rand2,rand1-rand2); return 0; }

Page 12: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

変数の使用(参照)(2)

次のソースはどうなるでしょうか

「=」は代入を表すのであって、

右辺と左辺が等しいというわけではない

►文法エラーにはならない

►代入後に等しくならないこともある

第3章 変数と演算 12

#include <stdio.h> int main(void){ int value = 5; value = value + 1; printf("%d¥n",value); return 0; }

Page 13: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

変数の使用(参照)(3)

第3章 変数と演算 13

#include <stdio.h> int main(void){ int value = 5; value = value + 1; printf("%d¥n",value); return 0; }

value = value + 1;

value = 5 + 1;

value = 6;

Valueに5が代入されているので、valueが5に変化

5+1を計算

ここまで来て、初めて代入される

Page 14: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

scanf関数 scanf関数(stdio.hで定義) キーボードの入力を変数に代入します

引数1 データ型に対応するフォーマット指定子

⇒引数2がintなら "%d" doubleなら "%lf" 引数2 代入する変数。変数の先頭に&をつける

戻り値 ここでは必要ないので省略

入力された小数値を表示するプログラム

#include <stdio.h> int main(void){ double value; printf("小数値を入力してください > ");

scanf("%lf",&value); printf("入力された値は%lfです¥n",value);

return 0; }

変数名の前の&を忘れない

14 第3章 変数と演算

Page 15: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

マクロ(1) 次のプログラムを実行しよう #include <stdio.h> int main(void){ int price; printf("商品の値段を入力してください > ");

scanf("%d",&price); printf("小計 ¥¥%d¥n",price); printf("税 ¥¥%lf¥n",price * 0.05); printf("合計 ¥¥%lf¥n",price * 1.05);

return 0; }

このプログラムの問題点

0.05、1.05が何を表しているのかがわかりにくい

消費税率が変わったら、数か所変えなければならない

小さい規模なので何も感じないかもしれないですけど これが数万行のプログラムだったら・・・

15 第3章 変数と演算

Page 16: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

マクロ(2) たとえば次のように問題を回避できます #include <stdio.h> int main(void){ int price; double tax = 0.05; //変数taxに税率を代入 printf("商品の値段を入力してください > ");

scanf("%d",&price); printf("小計 ¥¥%d¥n", price); printf("税 ¥¥%lf¥n", price * tax); printf("合計 ¥¥%lf¥n", price * (1 + tax));

return 0; }

括弧の中が先に計算される(詳しくはのちほど)

このプログラムの問題点

「 scanf("%d", &tax); 」と間違えて書くと、 バグを見つけるのは難しい

「そんなことね~よ」って思うかもしれないですけど、 やるときはやります

16 第3章 変数と演算

Page 17: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

マクロ(3) そこで、マクロという物が出てきます。

マクロを使って、ある英単語などを

特定の数字に置き換えることができるよ

変数同様、宣言が必要だよ

►必ず、int main~の外、使用する場所より上に書きます

#includeの下らへんに書こう!

コード中に「マクロ名」を書くと「値」に置換わる

第3章 変数と演算 17

文法

#define マクロ名 値

セミコロン(;)はつけない

Page 18: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

マクロ(4) 先ほどのプログラムを以下のように修正できるね

プログラム中に突然出てくる数字を

マジックナンバーというよ

►最初の例だと0.5とか1.05とか

マジックナンバーはプログラムを見にくくする 第3章 変数と演算 18

#include <stdio.h> #define TAX 0.05 int main(void){ int price; printf("商品の値段を入力してください > ");

scanf("%d", &price); printf("小計 ¥¥%d¥n", price); printf(“税 ¥¥%lf¥n”, price * TAX); printf("合計 ¥¥%lf¥n", price * (1 + TAX));

return 0; }

Page 19: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

マクロ(5) よく使うマクロはヘッダーファイルに定義されています

M_PIマクロ(math.hで定義) 円周率が入っているマクロ

M_Eマクロ(math.hで定義) 自然対数の底が入っているマクロ

これらのマクロを使うときは、math.hの読み込みの前に 「 #define _USE_MATH_DEFINES 」が必要です #include <stdio.h> #define _USE_MATH_DEFINES #include <math.h> int main(void){ printf("π=%lf¥n",M_PI); printf("e=%lf¥n",M_E); return 0; }

19 第3章 変数と演算

Page 20: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

プログラムが大きくなると変数・マクロがいっぱい

►どれがどれだか分けわかめになる

変数名、マクロ名は極力分かりやすい名前に!!

1. 変数名は、複数の英単語の組み合わせて命名すべし

2. 英単語を省略するべからず

良い例

enemyPositionX

dateTime

dataTable

変数・マクロ名の命名法(1)

第3章 変数と演算 20

悪い例

num

X

dt

練習問題で出てくる意味のない数字は別に気にしなくてもいいです

Page 21: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

変数・マクロ名の命名法(2) 変数・マクロの命名は他人にも分かりやすいように

►他の人と命名法を合わせる必要あり?

以下、C言語でよく使われる命名法

►複数の英単語を並べ、

先頭以外の英単語の先頭を大文字にする

主に変数で使用

►複数の英単語を並べ

全ての英単語の全ての文字を大文字にする

単語と単語はアンダーバーで連結

主にマクロで使用

第3章 変数と演算 21

キャメル記法

大文字記法

例) userName gameScore

例) USER_NAME GAME_SCORE

Page 22: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

ここまでのまとめ

変数は値を入れておくための箱のようなもの

「データ型 変数名」で変数宣言

データ型とは変数に入れれる値の形(int → 整数

double→小数)

「=」は右の値を左に代入

scanf関数でキーボードからの入力を受け取れる

マクロは、ある単語を特定の値に置き変えれる

「#define マクロ名 値」でマクロの定義 22 第3章 変数と演算

Page 23: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

練習問題

変数a,bにキーボードから値を代入して、a,bを入れ替えて表示するプログラムを作れ。ただし、以下の文は必ず含むこと。

鉄球を初速度0で自由落下させる。鉄球がt秒後に何m落ちたかを計算するプログラムを作れ。ただし、時間tはキーボードから入力を求め、重力加速度g=9.8とする。 また、値は全て小数値として扱え。

問1

問2

printf("変数a>");scanf("%d",&a);

printf("変数a=%d¥n",a);

printf("変数b>");scanf("%d",&b);

printf("変数b=%d¥n",b);

実行例 変数a>3 変数b>5 変数a=5 変数b=3

2

2

1gtx ヒント :

23 第3章 変数と演算

Page 24: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

データ型 値はどんな形をしてるの?

第3章 変数と演算 24

Page 25: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

データ型とは

データ型とは、データの形式のこと

変数以外のデータにもデータ型は存在

データ型についてもっと詳しく見ていこう

第3章 変数と演算 25

変数の説明で出した例) 整数→int 小数→double

printf("%lf”, 1 + 0.8);

int型 double型

Page 26: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

整数型 整数型はint以外にもたくさんあるよ

国家予算を扱う変数を作るとしよう

►21億じゃ到底足りん!! ⇒ long longを使おう

型名の最初にunsignedを付けると

►負の数が使用不可になる

►その代わりに、正の数の有効範囲が倍に! 第3章 変数と演算 26

型名 メモリ使用量 扱えるデータの範囲 処理速度

char 1 Byte -128~127

short 2 Byte -32,768~32,767

int 4 Byte 約-21億~約21億 最速

long 4 Byte 約-21億~約21億

long long 8 Byte 約-千京~約千京

Page 27: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

浮動小数点数型

浮動小数点数型?なにそれ?美味しいの?

►厳密なことは無視して、小数が使える型だと理解しよう

基本的にdoubleを使っておけば問題ないよ

►昔はdoubleの計算速度が遅かったけど、今は変わらん

とっても大きな値まで扱えるから、有効範囲は無視

精度については後ほど

第3章 変数と演算 27

型名 メモリ使用量 精度

float 4 Byte 低い

double 8 Byte 高い

Page 28: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

論理値型

こんなの何に使うの?

►「第4章 制御文」で分かるよ

変数に数字以外を代入するのは慣れない

►今のうちに慣れておこう

第3章 変数と演算 28

型名 メモリ使用量 代入できる値

bool 1 Byte 「false」または「true」のみ

#include <stdio.h> int main(void){ bool flag; flag = true; printf("bool型変数flagにtrueが代入されました。¥n");

return 0; }

Page 29: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

フォーマット指定子とデータ型(1)

フォーマット指定子は、データ型と対応してる

►今までの整数なら「%d」は絶対ではない

►これ以外の物については、別資料を見てね

第3章 変数と演算 29

指定子 データ型

%d short,int

%ld long

%lld long long

%f float

%lf double

Page 30: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

フォーマット指定子とデータ型(2)

#include <stdio.h> int main(void){ long long budget; budget = 90000000000000; printf("今年度の国の予算は%d円です。¥n",budget);

return 0; }

#include <stdio.h> int main(void){ long long budget; budget = 90000000000000; printf("今年度の国の予算は%lld円です。¥n",budget);

return 0; }

整数は全て%dというわけではない

30 第3章 変数と演算

Page 31: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

接尾語(1)

以下のプログラムは割り算を小数まで計算します

小数以下を書くと、double扱いとなる

double同士の計算の結果もdouble扱いになる

ではfloat扱いさせたい場合は?

第3章 変数と演算 31

#include <stdio.h> int main(void){ printf(“10/3=%lf¥n“, 10.0 / 3.0); return 0; }

Page 32: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

接尾語(2)

数字の最後に「f」を付けるとfloat扱いになる

数字の後に付けるアルファベットを接尾語と呼ぶ

他にも接尾語は色々あります

►接尾語は大文字、小文字を問わない

第3章 変数と演算 32

#include <stdio.h> int main(void){ printf(“10/3=%f¥n“, 10.0f / 3.0f); return 0; }

接尾語 データ型

l long

ll long long

f float

Page 33: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

接尾語(3) 次のプログラムを実行しよう

numに一兆が入らない・・・

1. int型同士の計算結果はint扱い

2. だから、1兆(int)ができる

3. それを、1兆(long long)に変換して代入される

2. はおかしいから結果が崩れる

long longとし、計算させる必要性

第3章 変数と演算 33

#include <stdio.h> int main(void){ long long num=1000000 * 1000000; printf("1000000*1000000=%lld¥n", num); return 0; }

Page 34: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

接尾語(4)

#include <stdio.h> int main(void){ long long num=1000000LL * 1000000LL; printf("1000000*1000000=%lld¥n", num); return 0; }

これで意図したプログラムができましたね

34 第3章 変数と演算

Page 35: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

キャスト(1) キャストとは、あるデータを異なるデータ型に変換

すること

以下、さっきのコードをキャストに置き換えた物

接尾語は数字にしか使えない

キャストは、関数の戻り値、変数、数字など万能

►速さ等の観点上、数字の場合は接尾語を用いる場合が多い

第3章 変数と演算 35

文法

(データ型)値

#include <stdio.h> int main(void){ long long num=(long long)1000000 * (long long)1000000; printf("1000000*1000000=%lld¥n",num); return 0; }

Page 36: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

キャスト(2) #include <stdio.h> int main(void){ int na,nb; printf("二つの整数を入力してください。¥n"); printf("整数A : "); scanf("%d",&na); printf("整数B : "); scanf("%d",&nb);

printf("%d * %d = %lld¥n" , na , nb , (long long)na * (long long)nb);

return 0; }

□のprintf関数を 以下の物に変えてみよう

printf("%d * %d = %lld¥n" , na , nb , (long long)(na * nb));

int型同士の掛け算がされる →答えがintなのにintで表せない →おかしくなる

36 第3章 変数と演算

Page 37: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

キャスト(3) 次のプログラムを実行しよう #include <stdio.h> int main(void){ double da,db; printf("二つの小数を入力してください。¥n"); printf("小数A : "); scanf("%lf",&da); printf("小数B(B≠0) : "); scanf("%lf",&db);

printf("%lf / %lf = %lf¥n", da, db, da / db); printf("%lf / %lf = %d¥n", da, db, (int)(da / db)); return 0; }

浮動小数点数型→整数型の キャストは切り捨てになります。 他の数字でも試してみよう

37 第3章 変数と演算

Page 38: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

キャスト(4)

次のプログラムを実行しよう

以上より以下のことが分かります

►trueを整数型にキャストすると 1

►falseを整数型にキャストすると0

第3章 変数と演算 38

#include <stdio.h> int main(void){ printf("(int)true = %d¥n",(int)true); printf("(int)false = %d¥n",(int)false); return 0; }

Page 39: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

キャスト(5)

以下のプログラムを実行しよう

0以外の数値を入力したら、必ず1になります

第3章 変数と演算 39

#include <stdio.h> int main(void){ int num; printf("整数を入力してください>"); scanf("%d",&num);

printf("(int)((bool)num)=%d¥n",(int)((bool)num)); return 0; }

Page 40: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

キャスト(6)

今までのことより、以下のようにまとめれます

第3章 変数と演算 40

bool→int int→bool

変換前 変換後

false 0

true 1

変換前 変換後

0 false

それ以外 true

Page 41: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

暗黙の型変換 次のプログラムを実行しよう

numはint型なので代入前にintに自動的に変換される

自動的な変換を暗黙の型変換と呼ぶよ

第3章 変数と演算 41

#include <stdio.h> int main(void){ int num; num = 4.1 + 3.6; printf("num = %d¥n", num); return 0; }

まずは計算しよう

num = 4.1 + 3.6;

num = 7.7; num = 7;

numがintだからintに変換!! (暗黙の型変換)

Page 42: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

(参考)浮動小数点数の計算誤差 次のプログラムを実行しよう

浮動小数点型では、計算誤差が出ることがある

►doubleでも誤差が出るけど、floatよりは正確

よって、以下のことに注意しよう

►お金の計算に原則用いない(練習問題程度は可)

►演算子「==」「!=」に用いない(演算子はこの後扱います) 第3章 変数と演算 42

#include <stdio.h> int main(void){ float fa,fb; printf("2つの小数を入力してください。¥n"); printf("小数A : "); scanf("%f",&fa); printf("小数B : "); scanf("%f",&fb);

printf(“%f * %f = %f¥n”, fa, fb, fa * fb); return 0; }

Page 43: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

ここまでのまとめ(1)

整数型の扱える範囲

(char < short < int = long < long long)

浮動小数点数型の計算精度(float < double)

bool型はtrue または falseのみ

%dはint型、%lldはlong long型、%lfはdouble型

43 第3章 変数と演算

Page 44: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

ここまでのまとめ(2)

第3章 変数と演算 44

1.0はdouble型、1.0Fはfloat型、1LLはlong long型

「(データ型名)値」で値を指定したデータ型にする

小数→整数のキャストは小数以下切り捨て

trueをint型にすると1、falseは0

0以外をbool型にするとtrue、0はfalse

Page 45: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

練習問題 問1

問2

商品の税抜価格を入力させて、その商品の税込価格を表示するプログラムを作れ。ただし、小数以下は切り捨てとし、万単位まで入力できるようにせよ。多少の誤差は許容する。(以下誤差の記述がない場合は金銭関連を除いて許容)

3つのint型整数を入力させ以下の値を表示するプログラムを作れ。

3つの相加平均を小数まで表示

3つの相乗平均を小数以下切り捨てで表示

相加平均 = 3

cba 相乗平均 = 3

1

3 )(abcabc

45 第3章 変数と演算

Page 46: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

演算子 色々な演算をしよう!

第3章 変数と演算 46

Page 47: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

算術演算子(1)

算術演算子は、数学でいう四則演算+αのこと

もう皆つかってるね

優先順位が小さいほど、先に計算されるよ

第3章 変数と演算 47

演算子 意味 優先順位

+ 足し算 6

- 引き算

* 掛け算

5 / 割り算

% 割り算の余り

Page 48: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

算術演算子(2) %を除く算術演算子で、左右のデータ型が

►等しい時は、計算結果はそのデータ型になる

►等しくないときは、狭い方のデータを広い方のデータと同じデータ型に自動的に変換する(暗黙の型変換)

第3章 変数と演算 48

データ型 広さ

double 広い

float

long long

long

int

short

char 狭い

#include <stdio.h> int main(void){ printf("1 / 3.0 = %f¥n", 1 / 3.0f); return 0; }

int / float →intより広い

floatに暗黙の型変換 →計算結果もfloat

Page 49: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

負符号演算子 これも数学と同じなので、とても感覚的!!

結果は、符号右側のデータと同じデータ型になる

算術演算子より先に実行!!

第3章 変数と演算 49

演算子 意味 優先順位

- 符号逆転 3

#include <stdio.h> int main(void){ printf("整数を入力してください > "); scanf("%d",&num); printf("符号反転させると %d になります¥n", -num);

return 0; }

Page 50: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

単項演算子と二項演算子

二項演算子・・・ある演算子「R」が存在して

「値 R 値」と書ける演算子

単項演算子・・・ある演算子「R」が存在して

「R 値」 または「値 R」と書ける演算子

算術演算子は二項演算子

負符号演算子は単項演算子 三項演算子もあるけど、講習では扱わないよ

第3章 変数と演算 50

例) 6 + 7

例) - 6

Page 51: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

代入演算子(1)

「num += a;」は

「num = num + a;」と同じ意味

「-=」「*=」「/=」も同様

優先順位は演算子の中で2番目に遅いよ

第3章 変数と演算 51

演算子 意味 優先順位 種類

= 代入

16

二項

+= 加算代入 二項

-= 減算代入 二項

*= 乗算代入 二項

/= 除算代入 二項

Page 52: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

代入演算子(2)

#include <stdio.h> int main(void){ int num; printf("整数を入力してください > "); scanf("%d",&num);

num -= 5; printf("numから5を引くと %d です¥n", num);

return 0; }

#include <stdio.h> int main(void){ int num; printf("整数を入力してください > "); scanf("%d",&num);

num = num - 5; printf("numから5を引くと %d です¥n", num);

return 0; }

同じ動作をしますが、下の方が見やすいですね 52 第3章 変数と演算

Page 53: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

インクリメント、デクリメント演算子(1)

「num++」又は「++num」は

「num += 1」とほぼ同じ意味

「--」も同様

優先順位が曖昧な理由、その他この演算子については別紙資料に載せておきます

第3章 変数と演算 53

演算子 意味 優先順位 種類

++ インクリメント 2 or 3

単項

-- デクリメント 単項

Page 54: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

インクリメント、デクリメント演算子(2)

#include <stdio.h> int main(void){ int num; printf("整数を入力してください > "); scanf("%d",&num);

num++; printf("numに1足すと %d です¥n", num);

return 0; }

54 第3章 変数と演算

Page 55: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

比較演算子(1) 演算子 意味 優先順位 種類

== 等号 8

二項

!= 不等号 二項

> 大なり

9

二項

< 小なり 二項

>= 大なりイコール 二項

<= 小なりイコール 二項

左右の式の関係が成り立つならば「true」 そうでないなら「false」になります

※代入の「=」と間違えやすいので注意 55 第3章 変数と演算

Page 56: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

比較演算子(2)

#include <stdio.h> int main(void){ int num; printf("整数を入力してください > "); scanf("%d",&num); printf("整数が非負の時は1、負は0 : %d¥n",(int)(num >= 0));

return 0; }

#include <stdio.h> int main(void){ int num; printf("正の整数を入力してください > "); scanf("%d",&num); printf("整数が偶数のときは1、奇数は0 : %d¥n",

(int)(num % 2 == 0)); return 0; }

56 第3章 変数と演算

Page 57: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

論理演算子(1) 演算子 意味 優先順位 種類

&& 論理積(かつ) 13 二項

|| 論理和(または) 14 二項

! 論理否定 3 単項

&& 情報数学の「∧」と同じ。左右両方trueの時はtrue それ以外はfalseになる。

|| 情報数学の「∨」と同じ。左右どちらかtrueの時は true、それ以外はfalseになる。

! 情報数学の「¬」と同じ。直後の式がtrueの時は false、falseの時はtrueになる。

評価対象の式がbool型以外の時はbool型に暗黙の型変換がされる

※「&」と「&&」を間違えやすいので注意 57 第3章 変数と演算

Page 58: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

論理演算子(2)

論理値表

A B A && B A || B !A

true true true true false

true false false true false

false true false true true

false false false false true

情報数学の復習

ド・モルガン律

!( A && B ) ⇔ !A || !B !( A || B ) ⇔ !A && !B

58 第3章 変数と演算

Page 59: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

論理演算子(3) #include <stdio.h> int main(void){ int year; printf("年を入力してください > "); scanf("%d",&year); printf("うるう年の時は1、そうでないときは0 : %d¥n",

(int)((year % 4 == 0 && !(year % 100 == 0)) || year % 400 == 0));

return 0; }

4の倍数

400の倍数

100の倍数

うるう年

59 第3章 変数と演算

Page 60: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

演算子の実行順序(1) この章で習った演算子+αの演算子の実行順序をまとめました

演算子 意味 順位

++ --

インクリメント デリメント(後置)

2

++ --

インクリメント デリメント(前置)

3 ! 論理否定

- 負符号

(データ型) キャスト演算子

* / % 乗除算、剰余 5

+ - 加減算 6

< <= > >= 大なり、小なり 8

== != 不等号 9

演算子 意味 順位

&& 論理積(かつ) 13

|| 論理和(または) 14

= *= /= += -=

代入 16

他の演算子は 資料の方に載せてあります

60 第3章 変数と演算

Page 61: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

演算子の実行順序(2) もう皆さん使っていると思いますが 括弧を付けることで、演算子の実行順を変更できます

#include <stdio.h> int main(void){ printf("3 + 4 * 5 = %d¥n", 3 + 4 * 5); printf("(3 + 4) * 5 = %d¥n", (3 + 4) * 5); return 0; }

数学のように{}を使うことはできません。 括弧が2重になっても()を用います。

61 第3章 変数と演算

Page 62: 3 変数と演算 - Multi Media Club Wikiへようこそ [Multi Media Club …nanzanmmcwiki.net/_media/pc/lecture/c/2013/2013_03... · 2013. 5. 15. · 変数の使用(宣言)(2)

練習問題 問1

問2

二次方程式 の解が存在すれば1、しなければ0を表示するプログラムを作れ。ただし、a,b,cはユーザーにint型で入力させ、aにユーザーが0を入力しないと仮定してよい。

ユーザーにint型で整数を入力させ、その整数が3の倍数または3の付く数字であれば1、そうでなければ0を出力するプログラムを作成せよ。ただし、ユーザーは1~999のデータしか入力しないと仮定してよい。

02 cbxax

62 第3章 変数と演算