Relative Content

速習C言語入門3

C exercises(e) Exam

下記の演習サイトに、ミニテストを行ってください ログインID :  15TE123  パスワード: 15TE123@ueno.daiichi-koudai.ac.jp http://lms.chenlab.net/ (http://lmspress.net/) — メインサイト http://lms2.chenlab.net/ — ミラーサイト、演習専用 http://lms3.chenlab.net/ — ミラーサイト、演習専用

C exercises(d) Scope and Storage class

変数の通用範囲 自動変数のことを局所変数、外部変数のことをグローバル変数(大域変数)ともいいます。 変数のスコープの範囲を図で表してみます。 赤色で囲った部分がグローバル変数の有効範囲です。 青色で囲った部分がローカル変数の有効範囲です。 この図ではローカル変数の寿命を関数内と説明しましたが、正確にはブロック内です。 ブロックとは、{}で囲まれている範囲のことを指しています。 記憶クラス Cで扱う記憶領域は一般に、プログラム領域、静的領域、スタック領域、ヒープ領域の 4つに大別されます。 記憶クラスには、4つあり、自動、静的、外部、レジスタがあります。 記憶クラス 記憶領域 スコープ 記憶クラス指定子 自動変数 スタック { } の内側 auto( 不要 ) 静的変数 静的領域 { } の内側* static 外部変数 静的領域 全域 extern** レジスタ変数 レジスタまたはスタック { } の内側 register * { }の外側で宣言された時は、その行以降 ** 他のファイルにある時、externを付け、その変数を宣言(メモリを確保)しているファイルでは何も付けない。 自動変数は使う前に何らかの値を代入します。このことを、初期化するといいます。 静的変数は初期化の式がなくても、コンパイル時に0に初期化されます。 変数の名前 変数は名前を付けなければ、使えません。C言語では、名前(識別子)は、英字または’_’(アンダースコア)で始まり、英数字または’_’が0個以上続くという決まりになっています。’_’一つまたは二つで始まる変数は、システムに密着したデータに使います。例えば、コンパイラのプログラム等で使われます。 変数に名前を付ける時、外部変数は定義されている所から遠い所でも使われるので、その変数の用途を想像できるような名にすることが推奨されています。 例:timetable, itemindex, thisyear 自動変数は通用範囲が狭いので、何の変数かがすぐわかるので、タイピングの手間を省く意味でも、短くて良いとされています。 例:i, j, […]

C exercises(c) Command line arg.

今まで、main 関数へ引数なしを意味する int main(void) と記述、 実は main関数にも引数を渡すことができます。 この main関数に渡す引数のことを「コマンドライン引数」といいます。 コマンドライン引数 main関数へ渡せる引数は、 引数の総個数 引数の文字列を指すポインタの配列 の 2つです。 一般に int main(int argc, char *argv[]) と記述し、 int argc: 引数の総個数(プログラム名も含む) char *argv[]: 引数の文字列を指すポインタの配列を表します。 とりあえず、下の例を見てみましょう。 (例) #include <stdio.h> int main(int argc,char *argv[]) { int i; printf(“引数の総個数 = %d\n”, argc); for (i = 0; i < argc; i++) { printf(“%d番目の引数 = %s\n”, […]

C exercises(b) Recursive call

東京魅力PRサークル会員募集中 http://svn.mki.biz/pukiwiki/index.php?u-tokyo 興味があれば、ぜひコメントください。 階乗の計算 皆さんは「階乗の計算」を覚えていますか? 5の階乗なら「5!」と表記し, 5! = 5 × 4 × 3 × 2 × 1 と計算します。つまり答えは120です。 0 の階乗:1 1 の階乗:1 2 の階乗:2 × 1 3 の階乗:3 × 2 × 1 – – – – – – – n の階乗: n × (n – 1) × (n – 2) – – – 3 × […]

C exercises(a) Return Values

ある関数が別の関数を呼び出して、呼び出した関数に制御が戻って来た時に、関数によっては値が返ってくるものがあります。 関数から値を返すには、関数の戻り値の他に、ポインタを使って、関数から呼び出し側の領域を書き換えるも可能です。 値を関数戻り値で返す 関数の定義 戻り値の型 関数名(パラメータリスト) { 文 … } 関数の戻り値で返す。 この方法では、常に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 […]

C exercises(9) Basics of Function

関数の基本 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 […]

C exercises(8) Pointer Summary

ポインタのまとめ アドレス ポインタと使用手順 ポインタ配列 過去のページを参照 演習 ポインタを使ったプログラムをグループで作成する。 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 […]

C exercises(7) Pointer Arrays

ポインタの配列 複数の文字列を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”, […]

C exercises(6) Pointers and Variables

ポインタの仕組み:ポインタで変数を指す ポインタとは ポインタ (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; }   ポインタで配列 配列とポインタは全く別物 配列とは、多数の変数を順番つけでまとめて扱う方法であり、 ポインタとは、変数のショートカットを作る方法です。 […]