C言語を3か月で身につけてるための第2週でやるべきことは、
・配列
・関数
です。第1週で解説した内容も随時出てきますので、それがわからなければ、前に戻って復習をしてください。
大まかなスケジュールはこちらのページを参照ください。
———————————————————————–
C言語 プログラムを3か月で身につけるスケジュール
———————————————————————–
では、早速書いていきます。
第2週
配列とは
同じ型のオブジェクトを並べ、0 から始まる番号をつけたものを配列といいます。どういうことかというと、例えば、同じ用途のint型変数を100個ほしいとき、いちいち宣言してたら、大変ですよね。これを一元化するということです。
宣言の仕方は次のようになります。
int a[100];
aが配列名で、[]で囲っている100が数になります。つまり、aというint型の変数を100個持つというイメージです。
これをいちいち、
int a1;
int a2;
・
・
・
int a100;
と書いていられないですよね。
配列は0番目から始まります。なので、int a[100];となっている配列はa[0]からa[99]まででアクセスが可能です。そして、この配列aは100個の要素を持っていると言います。
配列a[0]への代入方法は、第1週で解説した容量と同じで「=」を用います。
a[0] = 10;
これで、配列aの0番目の要素は10ということになります。
配列の使い方
配列の使い方について、簡単に解説していきます。
まずは、プログラム例を記述します。
(例) #include <stdio.h> #define MAX 10 main() { int data[MAX]; /* 数値データ配列 */ int i; /* 配列の添字 */ int sum; /* 合計 */ /* 初期設定 */ sum = 0; for ( i = 0; i < MAX; i++ ) { data[i] = i; } /* 配列の要素をすべて加算 */ for ( i = 0; i < MAX; i++ ) { sum += data[i]; } /* 結果を出力 */ printf( "配列の要素の合計は%d\n", sum ); } 出力結果 配列の要素の合計は45
配列にデータを設定し、配列のすべての要素の合計値を求めて出力するプログラムです。
まず、変数を宣言したら、初期化してから使います。これは配列に限らず、あらゆる変数すべてにおいてです。初期化しない場合は、初期化していなくても、プログラムが暴走しないかなど、よく吟味する必要があります。
組み込みマイコンでは、わざと変数と初期化しない場合もあります。例えば、エラー情報やログなどです。これらは、残しておく必要があるため、特定の操作等をしないと初期化しないように作りこみます。
話を戻しますが、まず、配列の要素の合計値を入れる変数sumを0で初期化するとともに、配列を配列のIndexで初期化しています。配列の初期化はまとめてできないので、for文で記述しています。
その後、配列の要素を順番に足していき、sumに代入していき、結果を表示させています。
配列の初期化については、こちらのページに詳細に記載していますので、よければお読みください。
配列を使用する際の注意事項を記載しておきます。
・配列全体へまとめて代入できない
・配列全体を関数の引数として渡せない
・配列全体を関数の戻り値とすることはできない
どういうことなのかは、追々解説していきます。この段階ではそうなんだという感じでいいです。
それでも、まとめて代入できないのはわかると思います。できるのなら、どうやって?と思いますよね。地道にfor文等を使って、代入するしかないんです。
関数とは
関数とは、ある機能をひとまとめにしたものです。mainも関数ですし、printfやscanfも関数です。
関数を上手に作成すると、同じ処理を何度も書かずに済むので、ぜひ活用しましょう。
自分で作る場合は、自由に関数名を決めることができます。ただし、予約語と言われるC言語で決められたもの、例えば、ifやwhileとかは関数名に使用できません。
関数の宣言の仕方は次のようになります。
関数の戻り値の型 関数名(引数1の型 引数1, 引数2の型 引数2 …) { 処理 }
もう少し具体的に書くと一例ですが、
int Calculation(int a, int b) { int sum; sum = a + b; return sum; }
このようになります。
戻り値のない関数も作成可能です。その場合は、関数の戻り値の型に「void」を指定します。
引数はいくつでも持てますが、4つまでにしましょう。それ以上になる場合は、別の方法を考えましょう。
関数はすべて値で渡されるので、関数内部で引数の値を変更しても呼び出し元には影響がありません。影響をさせるには、戻り値を返す、呼び出し元からポインタを引数に渡して、それを変更するということをしなくてはいけません。
また、引数や戻り値に配列は使えません。使えれば、便利かもしれませんが、残念ながら、そんなうまいこといきません。記述してもコンパイルエラーになります。
どうするのかというと、ポインタというものを使うのですが、ここでは解説せず、別のページで解説したいと思います。
関数の使い方
関数は、ある機能をひとまとめにしたものであると説明しました。では、そのひとまとめにした関数を使うにはどうしたらいいかを、プログラムを例に解説していきます。
(例) #include <stdio.h> /* 足し算をするための関数 */ int Calculation( int x, int y ) { int sum; sum = x + y; return sum; } main() { int x, y; /* 算術演算させるための変数 */ int ans; /* 算術演算の結果 */ /* 初期化 */ ans = 0; /* 算術演算させる数値の格納(ユーザがキーボードで入力) */ /* ここでは文字入力されたときの処理を入れてないので */ /* 数字以外のものを入力するとプログラムは暴走する。 */ /* また、整数のみしか扱っていない。 */ printf( "x = " ); scanf( "%d", &x ); printf( "y = " ); scanf( "%d", &y ); /* 足し算実行 */ ans = Calculation( x, y ); /* 結果を出力 */ printf( "x + y = %d\n", ans ); } 入力 x = 7 Enter y = 3 Enter 出力結果 x + y = 10
簡単な関数を作ってみました。足し算をする関数です。これを応用して、引き算、掛け算、割り算の関数も作れますよね?
これを1つ作っておけば、もう一度、足し算をしたいときに、関数だけをmainの中に記述すれば、いいことがわかりますよね。同じ処理を書かなくてもいいのです。
この程度の関数なら、ありがたみはありませんが、実際に作るときはもっと大きな処理になりますので、ありがたみがわかると思います。今は、こうやって使うんだと言うことを覚えておいてください。
また、Calculation関数をmain関数よりも先に記述しているため、main関数の中で使用することができました。もし、main関数より後にCalculation関数を記述する場合は、次のように関数を定義しておく必要があります。
(例) #include <stdio.h> int Calculation( int x, int y ); main() { ・ ・ ・ } int Calculation( int x, int y ) { ・ ・ ・ }
先に関数の形だけ宣言しておきます。そして、関数そのものをmain関数の後を記述します。
なぜ、そうしないといけないかというと、コンパイラはプログラムの上から順番に解析していきます。そのとき、急に宣言もないものが現れたら、それが何を表すかわからないですよね。人間みたいに最後まで見て、ここにあるということはできないんです。
だから、こういう名前のものを使いますよ。ということを、教えてあげておく必要があるのです。
まとめ
C言語のプログラムを3か月で身につけるための第2週でやるべきことを解説しました。
・配列
・関数
本当はもっと奥が深いですが、まずは最低限このくらいは、始めに身につけておく必要があるものに限定しました。あんまり多くを語っても、パンクしちゃいますからね。
プログラムを作っていくうちに、いろんな場面に遭遇し、その時々で対応の仕方が異なってきます。これは経験を積んでいけば、自然と身につきますので、まずはこのページに書いてある内容は理解しましょう。
これらを1週間でマスターし、C言語のプログラムを3か月で身につけるための第3週でやるべきことへ進んでください。