カテゴリー: C programming1
C programming (e) Exam
C programming (d) break & continue
break文
switch文のところでbreakというのが何回も登場しました。
switch文での意味は「switch文から抜け出す」という意味でしたね。
breakはswitch文以外にもfor文やwhile文のループの中でも使うことが出来ます。
この時もbreakは「for文やwhile文のループから抜け出す」という意味を持っています。
break文を使って抜けられるのはループひとつだけです。ですから、二重、三重のループを抜けるには、その度にbreak文を使うようになります。
continue文
continueはfor文やwhile文などのループ処理をスキップさせるに用います。
breakとは違い、continueはスキップした後は、ループの先頭に戻ります。
#include <stdio.h> int main(void) { int i = 1, n, sum; sum = 0; while (i <= 5) { printf("正の整数を入力 : "); scanf("%d", &n); if (n < 0) continue; sum = sum + n; i++; } printf("sum = %d\n", sum); return 0; }
無限ループ
while(1)とすると、基本的に処理は無限に繰り返されます。これは、条件式が偽の場合は、0、真の場合はそれ以外の値をとることを利用した方法で、無限に繰り返されます。 ただ、こういった無限ループでも、break(ブレイク)があると、ループから出ることができます。
電卓のプログラムで無限ループで、繰り返し計算を行います。
#include <stdio.h> main() { double a, b, ans; char op; printf( "加減乗除(+,-,*,/)ができます。指定例:2+5、終了時はq\n" ); while( 1 ) { printf( "ready : " ); if( scanf( "%lf %c %lf", &a, &op, &b ) != 3 ) break; switch( op ) { case '+': ans = a + b; break; case '-': ans = a - b; break; case '*': ans = a * b; break; case '/': if( b == 0.0 ) { printf( "Error!(ゼロでの割算はできません)\n" ); continue; } ans = a / b; break; default: printf( "Error!(演算記号の指定が誤りです)\n" ); continue; } printf( "--> %g\n", ans ); } printf( ".... Power OFF\n" ); }
多重ループ
九九の計算結果を表示するプログラム
#include <stdio.h> int main(void) { int i, j; for (i = 1; i <= 9; i++) { for (j = 1; j <= 9; j++) { printf(" %2d", i * j); } printf("\n"); } return 0; }
forループの2重ループを使っています。
最初のループでiが1の時はその下のforループで、
jが1から9まで増加させながら、その1の値と掛け合わせた結果を表示しています。
つまり九九の計算結果となるわけです。
二つ目のforループが終わると、printfで改行コードを出力してるので、
ちょうど9個結果を横に表示した後に次のループに入ることになり、
綺麗に九九の表が表示されるというわけです。
計算結果の間にスペースがあるのは一つ目のprintfで%2dの前にスペースが入っているからです。
ミニテスト
http://lmspress.net/courses/c-programming-i/
演習(p101)
- 演習4-24 (A, B クラス)
— List(4-18)、List(4-19)p99 を参考してください。 演習4-25 (C, D クラス)
C programming (c) while / for statement
東京魅力PRサークル会員募集中
http://svn.mki.biz/pukiwiki/index.php?u-tokyo
興味があれば、ぜひコメントください。
while文構文
条件式を前判定して反復制御を行います。
while (条件式) { 繰り返す文; }
- 継続条件が真である間、文を繰り返し実行。
- 継続条件式がはじめから偽の場合は一度も実行されない。
例題:
for文構文
定められた回数だけ反復制御を行います。
for (初期化式; 継続条件式; 後始末) { 文; }
- 再初期化式の後に「;」は入れてはいけない。
例題:
#include <stdio.h> int main(void) { int i; for (i = 1;i <= 10;i++) { printf("%02d 回目\n",i); } return 0; }
for文とwhile文の交換性
一般的にfor文は「指定した回数分だけ処理を繰り返す」、while文は「指定した条件を満たすまで処理を繰り返す」と言う意味で、for文とwhile文は似ているようで定義されている意味は違います。
while文は、for文の条件式だけと同じです。
逆に言えば、for文はwhile文を拡張した文だと言えるでしょう。
実は、この2つは、同じような使い方をすることが可能です。
while文をfor文のように使う場合、次のようにします。
初期化式; while (継続条件式) { 繰り返す文; 後始末; }
for文をwhile文のように使う場合、次のようにします。
for (;継続条件式;) { 繰り返す文; }
演習
- 演習4-12 (A, Bクラス) p89
正の整数値を読み込んで、その桁数を表示するプログラムを作成せよ。 - 演習4-13 (C,Dクラス)p93
1からnまでの和を求めるプログラムを作成せよ。nの値はキーボードから読み込むこと。
C programming (b) do statement
C言語には、全部で3つのループ文が用意されています。
while文、for文、そして、do(デュウ)~while文です。
do~while文構文
do~while文は、一般に、次のような書き方で使用します。
do { 繰り返す文; } while (条件式);
do~while文には、1つ大きな利点があります。それは、繰り返し文が、必ず1回は実行されるという点です。入力チェックの時に威力を発揮します。
- 継続条件式の後の(;)を忘れないよう注意。
円の面積を計算するプログラム。半径入力値が間違っているならば、再入力させる。
int main(void) { int r; double s; do { printf("半径?:"); scanf("%d",&r); } while (r < 0); s = r * r * 3.14; printf("面積は %f です。\n",s); return 0; }
演習
ミニクイズ
http://lmspress.net/ (登録は : 学籍番号 / 学校e-mailアドレス)
詳しくはLMS Pressとは参照してください。
入力チェックプログラム
下記のプログラムの入力チェックを追加して下さい。
入力値が間違って誤った月を入力された場合、再入力を行ってください。
#include <stdio.h> int main(int argc, char* argv[]) { int month; printf("何月ですか:"); scanf("%d", &month); switch (month) { case 3: case 4: case 5: puts("春です。"); break; case 6: case 7: case 8: puts("夏です。"); break; case 9: case 10: case 11: puts("秋です。"); break; case 12: case 1: case 2: puts("冬です。"); break; default: puts("そんな月はありませんよ!!"); } return 0; }
C programming (a) Switch statement
お知らせ
本日ABCDクラス合同避難訓練、第4時限目、本館141教室にて実施。
Switch文構文
条件式を判定して多方向分岐を行う。
switch (式) { case 定数: ブロック文 default: デフォルト・ブロック文 }
Berak文構文
- switch文で、case句の処理を打ち切りブロックを脱出するときに用いる。 ⇒ 説明済み
- for文、while文などのループから脱出するときに、if文と併用して用いる。
break;
例題
毎月の末日の判断
#include <stdio.h> int main() { int n; printf("月を入力して下さい --> "); scanf("%d", &n); switch(n){ case 1: case 3: case 5: case 7: case 8: case 10: case 12: printf("--31日--\n"); break; case 4: case 6: case 9: case 11: printf("--30日--\n"); break; case 2: printf("--28日--\n"); break; default: printf("入力データの誤りです。\n"); break; } getch(); return 0; }
演習
- 演習3-12 (A, B クラス)
- 演習3-13 (C, D クラス)
- 簡易電卓(自由選択)
実行例
加減乗除(+,-,*,/)ができます。指定例:2+5、終了時はq ready : 6.5 * 3 --> 19.5
ヒント:
- 演算記号の判定: switch 文
- 計算式の入力: scanf( “%lf %c %lf”, &a, &op, &b );
(変換指定文字列で、期待していなかったデータを入力すると、 バッファのデータをそのまま残し、動作を終了してしまいます。)
- アスキーコード表
C programming (9) logical operators
C の推奨されるスタイル
C言語やJava言語は、中括弧 { } を使ってブロックを記述します。 中括弧だけでなく、ブロックの範囲を字下げ(インデント)して記述します。 ただ、中括弧をどの位置に記述するかによって、コーディング・スタイルの宗教論争が起きています。 主に中括弧の位置の違いなのですが、なぜか字下げスタイルと呼ばれています。
// 中括弧の開始を、文末に記述するスタイルを「K&R スタイル」といいます。 void FuncA() { if ( ... ) { } } // 中括弧の開始を、文のない行に記述するスタイルを「BSD スタイル」といいます。 void FuncA() { if ( ... ) { } } // 関数の開始も、文末に記述するスタイルを「Java スタイル」といいます。 void FuncA() { if ( ... ) { } }
複合文(ブロック)
文の並びを{ }で囲んだものを「複合文」といいます。ブロックとも言います。
複合文は複数の「宣言」と「文」を扱うことができます。
関数の定義に使うブロック { }
は「複合文」です。
main
関数の定義に使われているブロック { }は「複合文」です。
実例: 二つの整数値を読み込んで、値の関係を表示するプログラムを作成
#include <stdio.h> int main(void) { int no1, no2, max, min; printf("二つの整数を入力してください。\n"); printf("整数1:"); scanf("%d", &no1); printf("整数2:"); scanf("%d", &no2); if(no1 > no2){ max = no1; min = no2; printf("大きい方の値は%dです。\n", max); printf("小さい方の値は%dです。\n", min); } else if(no2 > no1){ max = no2; min = no1; printf("大きい方の値は%dです。\n", max); printf("小さい方の値は%dです。\n", min); } else printf("その値は同じです。\n"); return 0; }
条件演算子(三項演算子)
/* 今日は、三項演算子(?:演算子)について学びます。条件が真なら処理1を、偽なら処理2を行います。
条件? 処理1:処理2;
これは、
if ( 条件 ) 処理1; else 処理2;
と同じです。
しかし、三項演算子を使えばコンパクトなコードを書くことができます。
printf("%s", (x % 2)? "奇数" : "偶数");
論理演算子
/* 論理演算子には次の3種類があります。
- 式1 && 式2 // and
- 式1 || 式2 // or
- !式 // not
#include <stdio.h> void main(void); void main(void) { char c = 'c'; printf("c = '%c'\n", c); if (c >= 'a' && c <= 'z') /* c が英小文字なら真 */ printf("c は小文字です。\n"); else printf("c は小文字ではありません。\n"); if (c >= '0' && c <= '9') /* c が数字なら真 */ printf("c は数字です。\n"); else printf("c は数字ではありません。\n"); if (c == '+' || c == '-') /* c が '+' か '-' なら真 */ printf("c は符号です。\n"); else printf("c は符号ではありません。\n"); }
演習
演習3-10 (教科書P62)
三つの整数値読み込んで、値の関係を表示するプログラムを作成せよ。
表示例:
- 三つの値は等しいです。
- 二つの値は等しいです。
- 三つの値は異なります。
参考
C programming (8) if statement
制御構文は、上から下へ流れるプログラムを途中で流れを分岐させたり、流れを繰り返したりすることができる構文を表します。
制御構文の主な種類としてif文、for文、while文、switch文の4パターンあります。
if文を使うと、分岐構造を作ることができます。
条件式の真偽
状態 | 真偽 | 値 |
条件が満たされた場合 | true(真) | 1(0以外) |
条件が満たされなかった場合 | false(偽) | 0 |
関係演算子
2つの値の大小を比較します。
条件を満たせば「真(true)」、条件を満たさなければ「偽(false)」となります。
関係演算子の形式は以下の通りです。
演算子 | 例 | 意味 |
---|---|---|
< | a < b | aはbよりも小さい |
> | a > b | aはbよりも大きい |
<= | a <= b | aはbよりも小さい(a == bの条件も含む) |
>= | a >= b | aはbよりも大きい(a == bの条件も含む) |
== | a == b | aとbは等しい |
!= | a != b | aとbは等しくない |
if 文
if文の基本形
条件式には真、又は偽を表す値(すなわち、最終的には数値型)を指定します。if 文は条件式の結果が真の場合のみ実行され、そうでなければ実行されません。より単純にいえば、条件式に 0 以外の値が指定されたときのみ実行されるのです。
if(条件式) { 文1; }
if ~ else ~
if(条件式) { 文1; } else { 文2; }
実例: 偶数奇数判定
/* a5-1-4.c */ #include <stdio.h> int main(void) { int n; printf("整数値を入力してください。> "); scanf("%d", &n); if (n % 2 == 0) { printf("入力値は偶数です。\n"); } else { printf("入力値は奇数です。\n"); } printf("プログラムのおわり\n"); getch(); return 0; }
if文の多分岐構造
if(条件式1) { 文1; } else if(条件式2) { 文2; } else if(条件... : (中略) : } else if(条件式n) { 文n; } else { 文x; }
実例:成績判定
/* 成績判定プログラム */ #include <stdio.h> // C判定:ten 60以上69以下 不合格:ten 59以下 int main(void) { int ten; while (1) //ブロック { printf("点数を入力してください。> "); scanf("%d", &ten); if ( ten == 0 ) break; // OR if (ten < 0 || ten > 100) { // ペアー printf("点数の入力エラーです。\n"); } else if (ten >= 80) { // block ブロック printf("成績はA判定です。\n"); } else if (ten >= 70) { printf("成績はB判定です。\n"); } else { printf("成績はC判定です。\n"); } } getch(); return 0; }
if文のネスト
if(条件文1) { if(条件文2) { 文1; } else { 文2; } } else { 文3; }
実例:出席率と点数から成績を判定
/* 出席率と点数から成績を判定するプログラム */ #include <stdio.h> // nest 入れ子 int main(void) { int ten, percent; while (1) // ブロック block { printf("授業の出席率は何%ですか。> "); scanf("%d", &percent); if (percent >= 80) { printf("点数は何点ですか。> "); scanf("%d", &ten); // 入れ子 nest if (ten >= 60) { printf("合格です。\n"); } else { printf("再試験です。\n"); } } //ペアー else { printf("補習です。\n"); } } return 0; }
演習問題
演習3-4 (教科書P51)
二つの整数値を読み込んで、値の関係を表示するプログラムを作成
- 「AとBは等しいです。」
- 「AはBより大きいです。」
- 「AはBより小さいです。」
実行例
二つの整数を入力してください。 整数A:12 整数B:6 AはBより大きいです。
C programming (7) Ch1 & Ch2 Summary
履修システム使い方
(塚本先生担当)
連絡事項
花やしきについて、学生にお知らせ頂きたい事項を3点連絡
第一章、第二章のまとめ
過去のページを参照
演習
演習2-6(P37)
身長を整数値として読み込み、標準体重を実数で表示するプログラムを作成せよ。
標準体重 = (身長 – 100) * 0.9
実行例
身長を入力してください: 175
標準体重は 67.5 です
C programming (6) type and conversions
型と型変換
型
- int — 整数
- double — 浮動小数点数
平均点を求めるプログラム
#include <stdio.h> int main(int argc, const char * argv[]) { // insert code here... int score[5]; // 5人の点数を入れる配列 int sum; // 合計点 // 各点数を入れる score[0] = 77; score[1] = 80; score[2] = 65; score[3] = 60; score[4] = 70; // 各点数を全て足して合計点を求める sum = score[0] + score[1] + score[2] + score[3] + score[4]; // 平均点を表示する printf("平均点は%d点です。", sum / 5); return 0; }
正しい結果は70.4
しかしプログラムは平均点は70点と表示され、一部情報を失ってしまう。
sum / 5 = 70 (余り 2)
型と演算
算術変換
オペランドは、式の中でよりサイズの大きい型に合わせて変換されるというお約束があります。(暗黙的な型変換)
もし、サイズの大きい型を小さい型に変換した場合、上位ビットを切り捨てることになるため、情報を失ってしまう可能性があります。しかし、サイズを拡張する場合は情報を失うことはありません。
sum / 5 = 70
sum / 5.0 = 70.4
#include <stdio.h> int main(int argc, const char * argv[]) { // insert code here... int score[5]; // 5人の点数を入れる配列 int sum; // 合計点 // 各点数を入れる score[0] = 77; score[1] = 80; score[2] = 65; score[3] = 60; score[4] = 70; // 各点数を全て足して合計点を求める sum = score[0] + score[1] + score[2] + score[3] + score[4]; // 平均点を表示する printf("平均点は%f点です。", sum / 5.0); return 0; }
代入変換
代入の場合も、型が異なる場合は暗黙的に変換して代入されます。これを代入変換と呼びます。
- 拡張変換
- 縮小変換 (情報一部損失)
- 整数から整数の場合、上位ビットが切り捨て
- 浮動小数点数から整数の場合、小数部の情報が失われ
#include <stdio.h> int main(int argc, const char * argv[]) { // insert code here... int score[5]; // 5人の点数を入れる配列 double sum; // 合計点 // 各点数を入れる score[0] = 77; score[1] = 80; score[2] = 65; score[3] = 60; score[4] = 70; // 各点数を全て足して合計点を求める sum = score[0] + score[1] + score[2] + score[3] + score[4]; // 平均点を表示する printf("平均点は%f点です。", sum / 5); return 0; }
型キャスト変換
指定した型に値を変換するようにプログラマが伝える明示的な変換方法も存在します。これを型キャスト変換と呼びます。
(変換型名)式
sum / 5 = 70
(double) sum / 5 = 70.4
#include <stdio.h> int main(int argc, const char * argv[]) { // insert code here... int score[5]; // 5人の点数を入れる配列 int sum; // 合計点 // 各点数を入れる score[0] = 77; score[1] = 80; score[2] = 65; score[3] = 60; score[4] = 70; // 各点数を全て足して合計点を求める sum = score[0] + score[1] + score[2] + score[3] + score[4]; // 平均点を表示する printf("平均点は%f点です。", (double)sum / 5); return 0; }
演習課題
型キャストを利用して浮動小数点型変数 から実数や小数を取り出す
出力例:
浮動小数点数 = 12.34 実数 = 12 小数 = 0.34
解答例:
#include <stdio.h> int main() { float fVar = 12.34f; printf("全体 = %g\n" , fVar); printf("実数 = %d\n" , (int)fVar); printf("小数 = %g\n" , fVar - (int)fVar); return 0; }