H23 年度秋学期情報スキル活用 入門 担当 : 田中基彦 ( 工学部共通教育科 ) Email: ak_tanaka@isc.chubu.ac.jp 授業のホームページ学術情報センター > 教育支援 > 情報リテラシー 授業の日程 講義内容提出課題 連絡事項を掲載 > 定期的にアクセスして確認する
C 言語によるプログラミング (3) 制御文 繰り返し文 if, while, switch, for, goto 構文 参考文献 : Practical C Programming 第 5, 7 章 Steve Oualline (O Reilly) ( 岩谷宏訳 ソフトバンク社 )
プログラムの流れの制御 通常は : 上から順に 1 行ずつ実行していく 以下は その実行順序を変える方法 複数の文の 実行 非実行 を指定する (a) 条件に応じて 実行する しない if (b) 同じブロックを繰り返し実行 while, for (c) 条件に合致したブロックを実行 switch (d) 指定のラベルにジャンプ goto
条件 : if 文 if( 条件 ) statement ; 条件が真 ( 値が非ゼロ ) ならば 文を実行する if( score >= 90) printf ( あなたの成績は S です n ); 条件 を書くために用いる演算子 演算子 意味 < 左辺が右辺より小さい =< 左辺が右辺と等しいか小さい > 左辺が右辺より大きい >= 左辺が右辺と等しいか大きい == 左辺と右辺が等しい!= 左辺と右辺が異なる
条件 : else 文 条件が真のとき 偽のときで異なる実行 if( 条件 ) statement 1; 条件が真のとき else statement 2; 条件が偽 ( 値ゼロ ) のとき
複数の実行文があるとき その範囲を ブレース { で囲む if( score >= 90) { your_point += 1; printf( あなたの成績は S です n ); if( score >= 80 ) { if( score >=90 ) printf( あなたの成績は S です n ); else printf( あなたの成績は A です n ); この { がないと else if の対応が不明確
strcmp 関数 2つの文字列が等しければ ゼロを返す strcmp ( string1, string2 ) cf. if, while 文では 真ならば非ゼロ つまり 逆!
条件で繰り返し :while 条件が真のあいだは 実行文を実行する while( 条件 )statement 注意 ) 文の最後に ; は打たない 無限ループ while( 1 ){. if( ) break; < 値 1 は 必ず真 (true)
実習 : Fibonacci 数 Fibonacci 数とは : 前の2 項を加えて 次の項とする f n 1 + f n > f n+1 (n>2) ただし 第 1 項と第 2 項は1 問題 :100 より小さい Fibonacci 数を求め それを印刷しなさい ヒント : 繰り返しに while を用い 変数は配列を定義して格納する
/* Fibonacci 数を求める */ #include <stdio.h> #define size 100 int f[size]; int n; main(){ f[0]= 1; f[1]= 1; n= 1; while( f[n]<100 ){ printf("f[%d]= %d n", n, f[n]); n= n+1; f[n]= f[n 1] + f[n 2]; return 0;
break 文 ここでループを終了する という合図 終了条件の発生が予め予想できないとき 出口を指示 #include <stdio.h> int line[100]; int item; main(){ fgets (line, sizeof(line), stdin); sscanf ( line, %d, &item); /* 整数なので %d を使う */ if( item == 0 ) break; /* 入力が尽きたとき終了 */ ここに様々な実行文 return 0;
break 文の例 Q: 以下のプログラムは 実行が終了しない なぜか? char line[30]; int item, total=0; while( 1 ){ fgets(line, sizeof(line), stdin); sscanf( line, %d, &item); if( item = 0 ) break; total += item;
実習 キーボードから入力された点数を 以下の表に従い評価して それを画面に表示しなさい 点数評価 90 以上 S 80 以上 - 90 未満 A 70 以上 - 80 未満 B 60 以上 - 70 未満 C 60 未満 F
答え : grade.c #include <stdio.h> int score; char line[100], grade; main(){ while(1){ printf("enter the score: "); fgets (line, sizeof(line), stdin); if( line[0] == ) break; sscanf (line, "%d", &score); /* valid without {... if( condition ) statement1; else statement2; */ if(score >= 90) grade= S'; else if(score >= 80) grade= A'; else if(score >= 70) grade= B'; else if(score >= 60) grade= C'; else grade= 'F'; printf ("The grade is: %c n", grade); /* For string (more than two characters), use %s for output descriptor. */ return(0);
繰り返し :for あらかじめ 繰り返し回数が分かっているとき for( 初期値 ; 終了条件 ; 繰り返し制御 ) statement ; 注意 ) 実行文の最後に 必ず ; を打つ /* 1 から 10 までの数を加える */ int i, total; for( i= 0; i< 10, i++) total= total + (i +1);
実習 : while を使わず for で書く /* キーボードから数を 10 個入力し それらを加える その結果は 入力する毎に表示する */ int i; float value, total=0.0; main(){ 数値を入力する for( i= 0; i< 10; i++) {.. 結果を表示する
このプログラムは和を計算しない なぜ? #include <stdio.h> int i; float value, total=0.0; char line[30]; main(){ for(i=0; i<10; i++); printf ("Enter a number to add..."); fgets (line, sizeof(line), stdin); sscanf (line, %f, &value); total += value; printf( Current total is %f n, total); return 0; 正解 : add.c
場合に応じてジャンプ : switch switch( 整数式 ) { 整数式と合致する case 定数 へジャンプ case 定数 1: statement 1; break; <-switchから抜け出す指示 case 定数 2: statement 2; break; default: 整数式がどの 定数 とも合致しないとき statement n; break; 必ず 各 case ブロックの最後に break を入れる ( そこで抜け出るために )
実習 : 四則演算を行うプログラム 考え方 : 1) 入力を促すメッセージをプリント 2) キーボードから数値 1 演算子数値 2 を入力変数名 : value1 operator value2 3) もし q が入力されたら すぐ終了する 4) 演算子ごとに ふさわしい計算を行う除算で 数値 2がゼロのときは 警告メッセージ 5) 結果を表示する次の計算をするため 初めに戻る
Prog7 3.c 答え : Prog7 3.c /* Simple calculator */ #include <stdio.h> char line[100]; float result; float value1, value2; char operator; main() { while (1){ printf( Enter value1 operator value2, or q to quit: "); fgets( line, sizeof(line), stdin); /* to quit */ sscanf( line, "%c", &operator); if( operator == 'q' ) break; sscanf( line, "%f %c %f", &value1, &operator, &value2); switch(operator){ case '+': result = value1 + value2; break; case ' ': result = value1 value2; break; case '*': result = value1 * value2; break; case '/': if( value2 == 0 ){ printf("error: Divide by zero. Operation ignored. n"); continue; else { result = value1 / value2; break; default: printf("error: Invalid operator n"); break; printf("result= %f n", result); return 0;
break と continue 文 break switch, while, forの繰り返しブロックの外へ出る continue ループの先頭へ戻る
知っていると便利な ジャンプ機能 ( 流れが分かりづらくなるので 多用は避けるべき ) ラベルのついたところへジャンプ if( ) goto label; exit(8); 上から来ると ここで終了する label: 実行文 ; ラベルへ飛ぶ : goto ラベル名は ( 英数字 _ で ) 自由につけてよい
きょうのまとめ プログラムの流れの制御法 if ( 条件 ).; else..; switch ( 式 ){ case 定数 : break; default:. break; for (i=0; i<10; i++). ; while ( 条件 ){.. ; break;.