4.1 while文
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とは参照してください。 入力チェックプログラム 下記のプログラムの入力チェックを追加して下さい。 入力値が間違って誤った月を入力された場合、再入力を行ってください。 […]
6.2 関数から値を返す
ある関数が別の関数を呼び出して、呼び出した関数に制御が戻って来た時に、関数によっては値が返ってくるものがあります。 関数から値を返すには、関数の戻り値の他に、ポインタを使って、関数から呼び出し側の領域を書き換えるも可能です。 値を関数戻り値で返す 関数の定義 戻り値の型 関数名(パラメータリスト) { 文 … } 関数の戻り値で返す。 この方法では、常に1つの情報しか返すことが出来ません。 2つ以上の情報を返したい時などは不便です。 値を引数の配列に返す 配列の先頭要素のアドレスを引数にして、上位関数側と下位関数側で配列を共有し、見かけ上、複数のデータを返したようにします。 #include <stdio.h> void waru2(int *p); int main(void) { int i; int dt[] = { 20, 10, 4, 35, 66, 78, -1 }; waru2(dt); /* 配列の先頭要素のアドレスを渡す */ for(i = 0; dt[i] != -1; i++) { printf(“%d “, dt[i]); } printf(“\n”); return […]
3.2 switch文
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: […]
6.1 関数の呼出
関数の基本 C言語において関数を使うことには、以下のような利点があります。 関数化しておくとそれを1つのブラックボックスとして扱うことができます。 つまり、使用する側が知っておくべきことは、以下の通りです。 入力として、どのような引数を与えるか 出力として、関数がどんな値を返すのか 関数を使ったことによって、どんな副作用があるか 一度、関数として作成しておけば、後で何度でも再利用することができる 関数として各機能をまとめていくと、一般にプログラムが見やすく、デバッグの作業もしやすい 関数の呼び出し #include <stdio.h> void func(); //関数のプロトタイプ宣言 int main() { func(); //関数呼び出し printf(” ここがメイン関数内\n”); return 0; } void func() //自作関数 { printf(“ここは自作関数内\n”); return; //「return;」は省略可 } 関数定義 関数の定義 戻り値の型 関数名(パラメータリスト) { 文 … } 関数プロトタイプ宣言 戻り値型 関数名(パラメータリスト); 戻り値の型、関数名、引数のルールは関数を作る際とほとんど同じです。但し、プロトタイプ宣言する行の最後には「;」が必要。 Void Type関数 void型は、今までの数値型や文字型とは異なり、戻り値が無い関数のデータ型のことです。処理の結果を戻す必要が無い場合は、わざわざint型にして「return 0;」としなくても、void型で関数を定義すれば、最後にreturn文を書く必要はありません。 値を返さない return型に用いる 引数が無い場合に用いる 関数へ値を渡す 値 C言語では、関数へ情報を渡す場合、必ず元の変数の値のコピーを渡します。 この様な方法を値渡しと呼び、元の変数の値が変更されないことが特徴です。 「値渡し」, ex : printf() #include <stdio.h> void […]
3.1.1 複合文
C の推奨されるスタイル C言語やJava言語は、中括弧 { } を使ってブロックを記述します。 中括弧だけでなく、ブロックの範囲を字下げ(インデント)して記述します。 ただ、中括弧をどの位置に記述するかによって、コーディング・スタイルの宗教論争が起きています。 主に中括弧の位置の違いなのですが、なぜか字下げスタイルと呼ばれています。 // 中括弧の開始を、文末に記述するスタイルを「K&R スタイル」といいます。 void FuncA() { if ( … ) { } } // 中括弧の開始を、文のない行に記述するスタイルを「BSD スタイル」といいます。 void FuncA() { if ( … ) { } } // 関数の開始も、文末に記述するスタイルを「Java スタイル」といいます。 void FuncA() { if ( … ) { } } 複合文(ブロック) 文の並びを{ }で囲んだものを「複合文」といいます。ブロックとも言います。 複合文は複数の「宣言」と「文」を扱うことができます。 関数の定義に使うブロック { […]
11.2 ポインタによる文字列の操作
ポインタのまとめ アドレス ポインタと使用手順 ポインタ配列 過去のページを参照 演習 ポインタを使ったプログラムをグループで作成する。 7-3-4-3(P245) 大きさ10の整数型配列を用意し、下図のように初期設定しなさい。 この配列を順に調べ、奇数の値のみ、別の大きさ10の整数型配列に代入しなさい。 また、配列の中身と、何個格納したかを画面表示しなさい。 実行結果 15 45 9 71 37 格納個数 = 5 ヒント: 大きさ10の整数型配列を用意し、初期設定する。 別の大きさ10の整数型配列を用意。 この配列を順に調べ、奇数の値のみ、別の大きさ10の整数型配列に代入。 配列の中身と、何個格納したかを画面表示。 #include <stdio.h> int main( void ) { int data1[10] = { 10, 15, 22, 45, 9, 66, 71, 4, 37, 82 }; int data2[10], i, cnt; int *p1, *p2; cnt […]
3.1 if文
制御構文 制御構文は、上から下へ流れるプログラムを途中で流れを分岐させたり、流れを繰り返したりすることができる構文を表します。 制御構文の主な種類として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は等しくない […]
11.1 文字列とポインタ
ポインタの配列 複数の文字列をchar型の2次元配列で宣言しました。それを下記に示します。 char kw[3][7] = {“double”, “extern”, “switch”}; 同様なものをポインタを使って宣言すると、下記のようにポインタの配列となります。 const static char *wday[ ] = { “Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”, NULL }; [ ]の中には8が入るのですが、コンパイラが数えてくれるので省略しています。 wday[0]は最初は”Sunday”の先頭アドレスを指します。 wday[1]は最初は”Monday”の先頭アドレスを指します。 wday[0]++とすると、 wday[0]は”Sunday”の1番目の要素を指します。 wday[1]++とすると、 wday[1]は”Monday の2番目の要素を指します。 以下、同様です。 配列の最後の要素は、’NULL’です。このようにしてあるのは、ポインタの配列が幾つあるか計るためです。 ‘NULL’を使わない場合は、ポインタの配列の数を保持している変数が必要になります。 #include <stdio.h> /* ポインタwday[ ]の指している文字列の配列は、 const:書き変え禁止で static:他のファイルから参照禁止 */ const static char *wday[ ] = { “Sunday”, “Monday”, “Tuesday”, […]
10.3 ポインタと配列
ポインタの仕組み:ポインタで変数を指す ポインタとは ポインタ (pointer)とは、あるオブジェクトがなんらかの論理的位置情報でアクセスできるとき、それを参照するものである。有名な例としてはC/C++でのメモリアドレスを表すポインタが挙げられる。(ja.wikipedia.org) ポインタ=メモリアドレス 間接演算子 * と アドレス演算子 & ポインタの使用手順 宣言 アドレスの設定 使用 ポインタで変数 間接演算子を使って、ポインタが指すメモリの値を取得することを間接参照するといいます。 間接演算子を用いれば、アドレスを間接参照するだけではなく、ポインタが表すアドレスに値を間接代入することもできます。 #include <stdio.h> int main() { int iVar = 0; int *iPo = &iVar; // 宣言&設定 printf(“*iPo = %d\n” , *iPo); // 使用 *iPo = 100; // 間接代入 printf(“iVar = %d\n” , iVar); return 0; } ポインタで配列 配列とポインタは全く別物 配列とは、多数の変数を順番つけでまとめて扱う方法であり、 ポインタとは、変数のショートカットを作る方法です。 […]
2.2 型
型と型変換 型 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] […]