04: 式・条件分岐 (if) C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと

Slides:



Advertisements
Similar presentations
情報処理演習 (秋学期・樋口担当) 2回目 10/1 日本工業大学 コンピュータリテラシーII.
Advertisements

第6回条件による分岐.
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
基礎プログラミングおよび演習 第9回
プログラミング基礎I(再) 山元進.
プログラミング入門 第5回講義 第5回講義 制御の流れ(1) ループ(その1) - while - インデント(3) ループとは(7)
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
12: コマンドライン引数 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
12: コマンドライン引数 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと
第6章 2重ループ&配列 2重ループと配列をやります.
構造体.
条件式 (Conditional Expressions)
情報処理Ⅱ 第4回 2007年10月29日(月).
プログラミング入門2 第3回 繰り返し文 芝浦工業大学情報工学科 青木 義満
第7回 条件による繰り返し.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
プログラムの制御構造 選択・繰り返し.
プログラミング2 関数
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
関数の定義.
第10回関数 Ⅱ (ローカル変数とスコープ).
基本骨格 #include #include : int main(void) { 変数の宣言 実行すること return 0; } #include int main(void) { int i; printf(”Hello world!\n”);
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング演習I 2003年5月7日(第4回) 木村巌.
プログラミング入門2 第2回 型と演算 条件分岐 篠埜 功.
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
第7回 条件による繰り返し.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
プログラムの制御構造 配列・繰り返し.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
復習 一定回数を繰り返す反復処理の考え方 「ループ」と呼ぶ false i < 3 true i をループ変数あるいはカウンタと呼ぶ
C言語ファミリー C# 高級言語(抽象的) Java オブジェクト指向 C++ C 機械語(原始的)
地域情報学 C言語プログラミング 第2回 変数・配列、型変換、入力 2017年10月20日
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
情報処理Ⅱ 第3回 2007年10月22日(月).
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
プログラミング基礎a 第4回 C言語によるプログラミング入門 条件判断と反復
復習 if ~ 選択制御文(条件分岐) カッコが必要 true 条件 false 真(true)なら この中が aを2倍する 実行される
C言語講座 制御(選択) 2006年 計算技術研究会.
情報処理Ⅱ 2005年10月28日(金).
プログラミング入門2 第2回 型と演算 条件分岐 篠埜 功.
第2章 printf(“変数と入力”); scanf(“%d”,&num);
知能情報工学演習I 第8回(後半第2回) 課題の回答
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
PROGRAMMING IN HASKELL
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
第7章 そろそろ int 以外も使ってみよう! ~データ型 double , bool~
情報処理Ⅱ 第2回 2004年10月12日(火).
プログラミング1 プログラミング演習I 第2回.
プログラミング入門2 第5回 配列 変数宣言、初期化について
情報処理Ⅱ 小テスト 2005年2月1日(火).
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
printf・scanf・変数・四則演算
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
復習 いろいろな変数型(2) char 1バイト → 英数字1文字を入れるのにぴったり アスキーコード → 付録 int
情報処理Ⅱ 第3回 2004年10月19日(火).
情報処理Ⅱ 2006年10月20日(金).
C言語講座 四則演算  if ,  switch 制御文.
情報処理Ⅱ 2006年10月27日(金).
分岐(If-Else, Else if, Switch) ループ(While, For, Do-while)
プログラミング演習I 補講用課題
第1章 文字の表示と計算 printfと演算子をやります 第1章 文字の表示と計算.
第1章 文字の表示と計算 printfと演算子をやります.
12: コマンドライン引数 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
Presentation transcript:

04: 式・条件分岐 (if) C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと http://www-it.sci.waseda.ac.jp/ teachers/w483692/CPR1/ 2015-04-27

今日の内容 式 算術演算子 比較演算子 その他 条件分岐 if-else switch-case

代入演算子によって変数の内容を書き換えること 変数の初期化と似ているが、区別されている 代入 (assignment) 代入演算子によって変数の内容を書き換えること 変数の初期化と似ているが、区別されている #include <stdio.h> int main(void) { double x = 15, y = 10, s, m; s = x + y; m = s / 2.0; ... x, y を初期化 15 x 10 y ?? s ?? m s, m を式の評価値で置き換える(=代入)

基本的な演算子 (operators) 代入演算子 a = 7 (変数 a の値を 7 に書き換える) x = (複雑な式)

基本的な演算子 (operators) 四則演算子 剰余演算子 インクリメント・デクリメント x + 10 y - z n * 1.5 p / q 剰余演算子 9 % 4 (9 を 4 で割った余り = 1) インクリメント・デクリメント a++ ++a a-- --a 乗算 除算 型により結果が異なる(後述) 変数の値を 1 増加する 変数の値を 1 減少する 後置の評価値は変更前の値、前置は変更後の値

その他の演算子 (1) ビット演算子 (ビットごとに行われる) 関数呼び出し 演算: & | ^ ~ 演算: & | ^ ~ シフト: << >> 関数呼び出し printf("hello") AND OR XOR NOT C の規格では算術シフトか論理シフトかは未定義

その他の演算子 (2) ポインタ関係 キャスト サイズ演算子 カンマ演算子 間接演算子 *, アドレス演算子 & 要素選択 . -> 要素選択 . -> キャスト (int)A サイズ演算子 sizeof(int) カンマ演算子 式1, 式2 今後の回で説明 強制的に型を変更する。 ただしルールは非常に難しいので使うときは注意。 char を 1 とする単位で返す。 sizeof(double) == 8 など 式1の評価値は捨てられて、結果は式2の評価値となる

複合代入演算子 演算と代入を同時に行う a += 7 a = a + 7 と同じ -= *= /= %= &= |= ^= -= *= /= %= &= |= ^= <<= >>= 記号の順番に注意

演算子の計算を行うこと、関数の呼び出しをすることなどで、値を計算することを評価 (evaluation) という s = (x + 2) * 2; ⇓ (変数の評価) s = (5 + 2) * 2; ⇓ (+ 演算子の評価) s = 7 * 2; ⇓ (/ 演算子の評価) s = 14; ⇓ (代入演算子の評価) 14; 5 x 関数の呼び出しも演算子の一種 ? s 代入で書き換えられる 代入演算も評価値を持つ 14 s 最後の評価値は捨てられる

どの演算子から演算を行うかは優先順位と結合方向で決まっている(詳しくはリファレンス参照) 優先順位 演算の順序 どの演算子から演算を行うかは優先順位と結合方向で決まっている(詳しくはリファレンス参照) 優先順位 異なる演算子の演算順番 おおよそ数学の用法に近いが、一部は直観と反する 結合方向 同じ演算子、または優先順位が同じ演算子の順序 a+b+c は (a+b)+c (左から右) となるなど

代入演算子はその代入された値を評価値として持つ 代入演算子を複数つなげて、連続した代入を行うことができる 代入演算について 代入演算子はその代入された値を評価値として持つ 代入演算子を複数つなげて、連続した代入を行うことができる x = y = 5; x = (y = 5); (右から左への結合) x = 5; 代入演算子の評価により 5

printf() も評価値を持っている printf も値を返す関数である 普段はあまり利用されず、単に無視されている 標準出力 printf("Hello, world!\n"); ⇓ (printf 関数の評価) 14; Hello, world! ▮ 出力された文字数が返されるが、この場合、特にそれを使っていないので、そのまま捨てられる

int 同士の除算は結果が切り捨てられて int になる 除算演算子の注意 int 同士の除算は結果が切り捨てられて int になる int x = 5, y = 2; double z; z = (x + y) / 2; ⇓ (変数の評価) z = (5 + 2) / 2; ⇓ (+ 演算子の評価) z = 7 / 2; ⇓ (/ 演算子の評価) z = 3; int x = 5, y = 2; double z; z = (x + y) / 2.0; ⇓ z = (5 + 2) / 2.0; z = 7 / 2.0; z = 3.5; 整数リテラル 浮動小数点リテラル 少なくとも一方が double なら結果はdouble になる 結果が整数となった

制御構造 逐次実行 条件分岐 ループ(反復) 関数は、ブロック内の文を書かれた順に実行する 変数などがある条件を満たす場合だけ実行する 条件を満たす間、繰り返し実行する 基本的には、条件判断とジャンプ(実行位置の変更)があれば実現できる。

条件分岐(今回) ループ(次回) if - else for switch - case while (goto) do - while 制御構文 条件分岐(今回) if - else switch - case (goto) ループ(次回) for while do - while

if (式) 文; if (式) {ブロック} if 文 与えられた条件を満たす場合のみ、次の文またはブロックを実行するための構文 ブロックとは { } で複数の文をまとめた部分のことである。 { } を含めてブロックですが、ここでは、わかりやすいように { } を明示的に書いています。 与えられた条件を満たす場合のみ、次の文またはブロックを実行するための構文 式の値は以下の様に扱われる 0 以外…真 (true); 条件を満たした 0 …偽 (false); 条件を満たさなかった

if の例 条件によって表示が変わる。 x = 5 ▮ x = -3 x is negative ▮ 5 で初期化した場合 #include <stdio.h> main(void) { int x = 5; // = -3; printf("x = %d\n", x); if(x < 0) printf("x is negative\n"); } return 0; x = 5 ▮ −3 で初期化した場合 x = -3 x is negative ▮

条件判断のための演算子 制御構造の条件式として主に使われる 成り立てば 1 (真), そうでなければ 0 (偽) 比較演算子 論理演算子 x == 10 y != 5 x < y x > y a >= b a <= b 論理演算子 複数の比較を結合する (以下 x, y は真偽値) x && y x || y !x 代入演算子 = とは異なることに注意 ≠ =>, =< というものはない 論理積 かつ、 and 論理和 または、 or 論理否定 ではない、not

条件式の例 X が 0 以上 0 以上 20 未満 3の倍数 if(x >= 0) if(x >= 0 && x < 20) if((x >= 0) && (x < 20)) if( 0 <= x < 20 ) 3の倍数 if( x % 3 == 0 ) 優先順位的には括弧はなくてもよいが書いた方が読みやすい場合もある 数学でよく書かれるような、こういう書き方はできない

基本的にはいつでもブロックで書くのが読みやすい if 文の書き方 (基本) 基本的にはいつでもブロックで書くのが読みやすい 同じ行に書く 次の行に書く if(x < 0) { printf("x is negative\n"); } if(x < 0) { printf("x is negative\n"); } インデントを忘れない ほかにもたくさんあるが、あまり一般的ではない https://ja.wikipedia.org/wiki/字下げスタイル

以下の記法は、見づらくなることがあるので、他との整合性が十分とれる場合のみつかう。素人は使わない。 if 文の書き方 (その他) 以下の記法は、見づらくなることがあるので、他との整合性が十分とれる場合のみつかう。素人は使わない。 1文だけなので、ブロックにしない if(x < 0) printf("x is negative\n"); すべて一行で書く if(x < 0) { printf("x is negative\n"); x+=1; } 1文だけの場合、1行で書く if(x < 0) printf("x is negative\n");

ブロックを書かない場合、次の 1 文のみが対象となるため、書き方で勘違いをする可能性がある if 文の注意 (1) ブロックを書かない場合、次の 1 文のみが対象となるため、書き方で勘違いをする可能性がある ブロックがない if(x < 0) { printf("x is "); printf("negative\n"); } if(x < 0) printf("x is "); printf("negative\n"); 2行目は常に実行される if (式) {ブロック} if (式) 文;

if 文の注意 (2) 代入演算子と等価演算子の書き間違い if(x == 0) { printf("x is zero"); } 評価値は 0 となり、 常に偽となる if(x == 0) { printf("x is zero"); } if(x = 0) { printf("x is zero"); } gcc では -Wall -Wextra などの警告オプションを付けていれば、指摘してくれる

if (式) 文1 else 文2; if – else 文 式が真の場合は文1を、偽の場合は文2をそれぞれ実行する 構文 文1,2 はブロックでもよい 式が真の場合は文1を、偽の場合は文2をそれぞれ実行する

if-else 文の例 式の評価に応じて実行される部分が変わる if(x != 0) { printf("x is non-zero\n"); } else printf("x is zero\n"); もちろん、ブロックでなくても構わないが、ややこしくなるので、なるべくブロックで書いた方がよいでしょう。

else の後の文が if 文となる場合、見た目を簡潔に書くための定型スタイルがある if(x == 0) { ... } else if(x == 1) if(x == 2) if(x == 0) { ... } else if(x == 1) else if(x == 2) この様な else if の連続をぶら下がり else (dangling else) と呼ぶことがある。

switch – case 文 整数の値に従って、実行する文を制御する 今回の講義では省略する 詳細は、2013年度の第4回後半を参照