C プログラミング言語は、コンピューター プログラムを作成するために人気があり、広く使用されているプログラミング言語です。 C はプログラマーに最大限の制御と効率を提供するため、世界中のプログラマーが C を採用しています。
あなたがプログラマーである場合、またはプログラマーになることに興味がある場合、C を学ぶことで得られるメリットがいくつかあります。
- 多数のプラットフォームのコードを読み書きできるようになります。マイクロコントローラーから最先端の科学システムに至るまで、あらゆるものを C で記述することができ、最新のオペレーティング システムの多くは C で記述されています。
- オブジェクト指向 C++ 言語への移行がはるかに簡単になります。 C++ は C の拡張であり、最初に C を学習せずに C++ を学習することはほぼ不可能です。
この記事では、言語全体を説明し、C プログラマーになる方法を最初から説明します。 C を理解すると、さまざまなものを作成できることに驚かれるでしょう。
Cって何ですか?
C はコンピュータ プログラミング言語です。つまり、C を使用して、コンピューターが従うべき命令のリストを作成できるということです。 C は、現在使用されている何千ものプログラミング言語の 1 つです。 C は数十年前から存在しており、プログラマーに最大限の制御と効率を提供するため、広く受け入れられています。 C は習得しやすい言語です。他の言語に比べてスタイルが少し難解ですが、それをすぐに乗り越えることができます。
C はいわゆるコンパイル言語です。つまり、C プログラムを作成したら、それをC コンパイラで実行して、プログラムをコンピュータが実行 (実行) できる実行可能ファイルに変換する必要があります。 C プログラムは人間が読める形式ですが、コンパイラーから出力される実行可能ファイルは機械が読み取り可能で実行可能な形式です。これは、C プログラムを作成して実行するには、C コンパイラにアクセスする必要があることを意味します。 UNIX マシンを使用している場合 (たとえば、ホストの UNIX コンピュータで C で CGI スクリプトを作成している場合、または研究室の UNIX マシンで作業している学生の場合)、C コンパイラは無料で利用できます。これは「cc」または「gcc」と呼ばれ、コマンド ラインで使用できます。あなたが学生の場合は、学校がコンパイラを提供してくれるでしょう。学校が使用しているものを調べて、それについて学びましょう。自宅で Windows マシンを使用して作業している場合は、無料の C コンパイラをダウンロードするか、商用コンパイラを購入する必要があります。広く使用されている商用コンパイラは、Microsoft の Visual C++ 環境です (C プログラムと C++ プログラムの両方をコンパイルします)。残念ながら、このプログラムには数百ドルの費用がかかります。商用コンパイラに何百ドルも費やす余裕がない場合は、Web 上で入手できる無料のコンパイラのいずれかを使用できます。検索の開始点として を参照してください。
最初は非常に単純な C プログラムから始めて、そこから構築していきます。これらの例では、環境として UNIX コマンド ラインと gcc を使用していると仮定します。そうでない場合でも、コードはすべて正常に動作します。利用可能なコンパイラを理解して使用するだけで十分です。
始めましょう!
最も単純な C プログラム
可能な限り単純な C プログラムから始めて、それを使用して C の基本と C コンパイル プロセスを理解しましょう。標準のテキスト エディタ (UNIX の vi または emacs、Windows のメモ帳、または Macintosh の TeachText) に次のプログラムを入力します。次に、プログラムをsamp.cという名前のファイルに保存します。 .c を省略した場合、コンパイル時に何らかのエラーが発生する可能性があるため、 .cを必ず覚えておいてください。また、エディターがファイル名に余分な文字 (.txt など) を自動的に追加しないことを確認してください。最初のプログラムは次のとおりです。
#include <stdio.h>
int main()
{
printf("これは私の最初のプログラムからの出力です!\n");
0を返します。
}
このプログラムを実行すると、「これは最初のプログラムからの出力です!」という行を出力するようにコンピュータに指示します。 — その後、プログラムは終了します。これ以上簡単なことはありません。
このコードをコンパイルするには、次の手順を実行します。
- UNIX マシンでは、 「gcc samp.c -o samp」と入力します (gcc が機能しない場合は、cc を試してください)。この行は、 gcc という C コンパイラを呼び出し、 samp.c をコンパイルするように依頼し、作成した実行可能ファイルをsampという名前で配置するように依頼します。プログラムを実行するには、 samp (または、一部の UNIX マシンでは./samp ) と入力します。
- DOS または Windows マシンで を使用し、MS-DOS プロンプトでgcc samp.c -o samp.exe と入力します。この行は、 gcc という C コンパイラを呼び出し、 samp.c をコンパイルするように依頼し、作成した実行可能ファイルをsamp.exeという名前で配置するように依頼します。プログラムを実行するには、 「 samp 」と入力します。
- 他のコンパイラまたは開発システムを使用している場合は、プログラムのコンパイルと実行に使用しているコンパイラの指示を読み、その指示に従ってください。
「これは私の最初のプログラムからの出力です!」という出力が表示されるはずです。プログラムを実行するとき。プログラムをコンパイルしたときに何が起こったかは次のとおりです。
プログラムの入力を間違えると、コンパイルされないか、実行されません。プログラムがコンパイルされない場合、または正しく実行されない場合は、プログラムを再度編集して、入力のどこが間違っているかを確認してください。エラーを修正して再試行してください。
このプログラムを入力するときは、ポンド記号が列 1 (一番左側) にくるように#include を配置します。それ以外の場合は、間隔とインデントを自由に設定できます。一部の UNIX システムには、コードをフォーマットする C Beautifier であるcbというプログラムがあります。上に示した間隔とインデントは、従うべき良い例です。
最も単純な C プログラム: 何が起こっているのでしょうか?
このプログラムをざっと見て、さまざまな行が何をしているのか見てみましょう (ここをクリックすると、別のウィンドウでプログラムが開きます)。
- この C プログラムは#include <stdio.h>で始まります。この行には、プログラムに「標準 I/O ライブラリ」が含まれています。標準 I/O ライブラリを使用すると、キーボードからの入力の読み取り (「標準入力」と呼ばれます)、画面への出力の書き込み (「標準出力」と呼ばれます)、ディスクに保存されているテキスト ファイルの処理などが可能になります。非常に便利なライブラリです。 C には、文字列ライブラリ、時間ライブラリ、数学ライブラリなど、stdio などの標準ライブラリが多数あります。ライブラリは、作業を容易にするために他の人が書いたコードのパッケージにすぎません (ライブラリについては後で説明します)。
- int main()行は main 関数を宣言します。すべての C プログラムには、コード内のどこかにmainという名前の関数が必要です。関数については、すぐに詳しく学びます。実行時、プログラムの実行は main 関数の最初の行から開始されます。
- C では、 {および}記号はコード ブロックの始まりと終わりを示します。この場合、main 関数を構成するコード ブロックには 2 行が含まれています。
- C のprintfステートメントを使用すると、出力を標準出力 (ここでは画面) に送信できます。引用符で囲まれた部分はフォーマット文字列と呼ばれ、印刷時にデータがどのようにフォーマットされるかを記述します。フォーマット文字列には、「これは私の最初のプログラムからの出力です!」などの文字列リテラル、キャリッジ リターンの記号 (\n)、および変数のプレースホルダーとしての演算子を含めることができます (以下を参照)。 UNIX を使用している場合は、 「man 3 printf」と入力すると、printf 関数の完全なドキュメントを取得できます。そうでない場合は、printf 関数の詳細についてコンパイラに付属のドキュメントを参照してください。
- 戻り値は 0;この行により、関数は実行を開始したシェルにエラー コード 0 (エラーなし) を返します。この機能については後ほど詳しく説明します。
変数
プログラマは、プログラムに値を「記憶」させたいと思うことがよくあります。たとえば、プログラムがユーザーに値を要求する場合、またはプログラムが値を計算する場合、後で使用できるようにその値をどこかに記憶しておきたいと思うでしょう。プログラムが物事を記憶する方法は、変数を使用することです。例えば:
int b;
この行は、「1 つの整数値を保持できる b というスペースを作成したい」と述べています。変数には名前(この場合は b) と型(この場合は int、整数) があります。次のように言うことで、 b に値を格納できます。
b = 5;
次のようにして b の値を使用できます。
printf("%d", b);
C には、変数の標準型がいくつかあります。
- int – 整数 (整数) 値
- float – 浮動小数点値
- char – 単一の文字値 (「m」や「Z」など)
これらの他のタイプの例については、今後見ていきます。
プリントフ
printf ステートメントを使用すると、出力を標準出力に送信できます。私たちにとって、標準出力は通常画面です (ただし、標準出力をテキスト ファイルまたは別のコマンドにリダイレクトすることもできます)。
printf についてさらに学ぶのに役立つ別のプログラムを次に示します。
#include <stdio.h>
int main()
{
int a、b、c;
a = 5;
b = 7;
c = a + b;
printf("%d + %d = %d\n", a, b, c);
0を返します。
}
このプログラムをファイルに入力し、 add.cという名前で保存します。 gcc add.c -o addという行を使用してコンパイルし、 add (または./add ) と入力して実行します。出力として「5 + 7 = 12」という行が表示されます。
このプログラムのさまざまな行については次のとおりです。
- 行int a, b, c; a 、 b 、およびcという名前の 3 つの整数変数を宣言します。整数変数は整数を保持します。
- 次の行では、 aという名前の変数を値 5 に初期化します。
- 次の行ではb を7 に設定します。
- 次の行では、 aとbを追加し、結果をcに「代入」します。コンピューターはa (5) の値をb (7) の値に加算して結果 12 を形成し、その新しい値 (12) を変数cに入れます。変数cには値 12 が割り当てられます。このため、この行の = は「代入演算子」と呼ばれます。
- 次に、 printfステートメントは「5 + 7 = 12」という行を出力します。 printf ステートメント内の%dプレースホルダーは、値のプレースホルダーとして機能します。 %d プレースホルダーが 3 つあり、 printf 行の最後に 3 つの変数名a 、 b 、 c があります。 C は最初の %d を a と照合し、そこに 5 を代入します。 2 番目の %d を b と照合し、7 に置き換えます。3 番目の %d を c と照合し、12 に置き換えます。次に、完成した行を画面に表示します: 5 + 7 = 12。 + 、 = 、およびスペースは a です。フォーマット行の一部であり、プログラマの指定に従って %d 演算子の間に自動的に埋め込まれます。
Printf: ユーザー値の読み取り
前のプログラムは優れていますが、定数を使用するのではなく、ユーザーから値 5 と 7 を読み込む方が良いでしょう。代わりにこのプログラムを試してください。
#include <stdio.h>
int main()
{
int a、b、c;
printf("最初の値を入力してください:");
scanf("%d", &a);
printf("2 番目の値を入力してください:");
scanf("%d", &b);
c = a + b;
printf("%d + %d = %d\n", a, b, c);
0を返します。
}
このプログラムを実行すると、次のように動作します。
変更を加えてからプログラムをコンパイルして実行し、動作することを確認します。 scanf は printf と同じ種類のフォーマット文字列を使用することに注意してください (詳細については「man scanf」と入力してください)。 a と b の前の & にも注意してください。これは C のアドレス演算子です。変数のアドレスを返します (ポインターについて説明するまでは意味がわかりません)。 scanf の & 演算子は、char、int、または float 型の変数、および構造体型 (これについてはすぐに説明します) に対して使用する必要があります。 & 演算子を省略すると、プログラムの実行時にエラーが発生します。この種の実行時エラーがどのようなものかを確認するために試してください。
printf を完全に理解するために、いくつかのバリエーションを見てみましょう。最も単純な printf ステートメントは次のとおりです。
printf("こんにちは");
printf へのこの呼び出しには、printf に「Hello」という単語を標準出力に送信するよう指示するフォーマット文字列が含まれています。これと比べてみてください:
printf("こんにちは\n");
2 つの違いは、2 番目のバージョンでは、単語「Hello」とそれに続くキャリッジ リターンが標準出力に送信されることです。
次の行は、 printf を使用して変数の値を出力する方法を示しています。
printf("%d", b);
%d は、 printf ステートメントの実行時に変数bの値に置き換えられるプレースホルダーです。多くの場合、値を他の単語に埋め込みたい場合があります。それを実現する 1 つの方法は次のようなものです。
printf("気温は ");
printf("%d", b);
printf(" 度\n");
もっと簡単な方法は、次のように言うことです。
printf("気温は %d 度です\n", b);
1 つの printf ステートメントで複数の %d プレースホルダーを使用することもできます。
printf("%d + %d = %d\n", a, b, c);
printf ステートメントでは、フォーマット文字列内の演算子の数が、それに続く変数の数および型と正確に一致することが非常に重要です。たとえば、書式指定文字列に 3 つの %d 演算子が含まれる場合、その後に 3 つのパラメータが続く必要があり、それらのパラメータは演算子で指定されたものと同じ順序で同じ型を持つ必要があります。
さまざまなプレースホルダーを使用することで、 printf で通常の C 型をすべて出力できます。
- int (整数値) は%d を使用します
- float (浮動小数点値) は%f を使用します
- char (単一文字値) は%c を使用します
- 文字列(後述する文字の配列) は%s を使用します
UNIX マシンでの printf の微妙な違いについて詳しくは、 「 man 3 printf 」と入力してください。使用している他の C コンパイラには、おそらく、printf の説明を含むマニュアルまたはヘルプ ファイルが付属しています。
- 大文字と小文字が間違っている – C では大文字と小文字が重要なので、Printf または PRINTF と入力できません。 printf である必要があります。
- scanf で & を使用するのを忘れた
- printf または scanf の format ステートメントに続くパラメーターが多すぎる、または少なすぎる
- 変数名を使用する前に宣言するのを忘れる
スキャンフ
scanf 関数を使用すると、標準入力 (通常はキーボード) からの入力を受け入れることができます。 scanf 関数はさまざまな機能を実行できますが、人的エラーをうまく処理できないため、信頼性が低い場合があります。しかし、単純なプログラムの場合はこれで十分であり、使いやすいです。
scanfの最も単純なアプリケーションは次のようになります。
scanf("%d", &b);
プログラムは、ユーザーがキーボードで入力した整数値を読み取り (%d は printf と同様に整数を表すため、b は int として宣言する必要があります)、その値を b に置きます。
scanf 関数は、printf と同じプレースホルダーを使用します。
- int は%d を使用します
- float は%f を使用します
- char は%c を使用します
- 文字列(後述) は%s を使用します
scanf で使用される変数の前に& を置く必要があります。その理由は、ポインタについて学ぶと明らかになります。 & 記号は忘れがちで、忘れるとプログラムを実行するとほとんどの場合クラッシュします。
一般に、キーボードから単一の値を読み取るには、ここに示すように scanf を使用するのが最善です。複数の値を読み取るには、scanf を複数回呼び出します。実際のプログラムでは、テキストを一度に 1 行ずつ読み取る代わりに、 gets関数またはfgets関数を使用します。次に、その行を「解析」して値を読み取ります。そうする理由は、入力内のエラーを検出し、適切と思われるように処理できるようにするためです。
printf 関数と scanf 関数を完全に理解するには少し練習が必要ですが、一度習得すると非常に便利です。
これを試してみてください!
このプログラムを変更して、2 つの値ではなく 3 つの値を受け入れ、3 つすべてを加算するようにします。
#include <stdio.h>
int main()
{
int a、b、c;
printf("最初の値を入力してください:");
scanf("%d", &a);
printf("2 番目の値を入力してください:");
scanf("%d", &b);
c = a + b;
printf("%d + %d = %d\n", a, b, c);
0を返します。
}
また、上記のプログラムの最初の行にある b 変数を削除して、変数の宣言を忘れた場合にコンパイラが何を行うかを確認することもできます。セミコロンを削除して、何が起こるかを確認してください。中括弧の 1 つを省略します。 main 関数の横にある括弧の 1 つを削除します。それぞれのエラーを単独で発生させ、コンパイラーを通してプログラムを実行して何が起こるかを確認します。このようなエラーをシミュレートすることで、さまざまなコンパイラ エラーについて学ぶことができ、実際にエラーを作成するときにタイプミスを見つけやすくなります。
以前のプログラムのいずれかでランダムな文字や単語を削除または追加してみて、コンパイラがこれらのエラーにどのように反応するかを観察してください。
分岐とループ
C では、 ifステートメントとwhileループの両方がブール式の考え方に依存しています。 if ステートメントを示す簡単な C プログラムを次に示します。
#include int main() { int b; printf(“値を入力してください:”); scanf(“%d”, &b); if (b < 0) printf(“値は負ですn”); 0を返します。 }
このプログラムはユーザーから番号を受け取ります。次に、if ステートメントを使用して数値をテストし、0 より小さいかどうかを確認します。0 より小さい場合、プログラムはメッセージを出力します。それ以外の場合、プログラムは沈黙します。プログラムの(b < 0)部分はブール式です。 C はこの式を評価して、メッセージを出力するかどうかを決定します。ブール式がTrueと評価された場合、C は if ステートメントの直後の 1 行 (または if ステートメントの直後の中括弧内の行ブロック) を実行します。ブール式がFalse の場合、C は if ステートメントの直後にある行または行のブロックをスキップします。
もう少し複雑な例を次に示します。
#include <stdio.h>
int main()
{
int b;
printf("値を入力してください:");
scanf("%d", &b);
if (b < 0)
printf("値が負です\n");
0を返します。
}
この例では、 else ifおよびelseセクションはゼロと正の値も評価します。
より複雑なブール式は次のとおりです。
if ((x==y) && (j>k))
z=1;
それ以外
q=10;
このステートメントは、「変数 x の値が変数 y の値と等しく、変数 j の値が変数 k の値より大きい場合、変数 z を 1 に設定し、それ以外の場合は変数 q を 10 に設定します。」 」意思決定を行うために、C プログラム全体でこのような if ステートメントを使用します。一般に、行う決定のほとんどは、最初の例のような単純なものになります。しかし場合によっては、状況がより複雑になることがあります。
C は等しいかどうかをテストするために== を使用し、変数に値を代入するために= を使用することに注意してください。 C の&&は、ブール AND 演算を表します。
C のすべてのブール演算子は次のとおりです。
等価 == < 未満 >より大きい <= <= >= >= 不等号 != そして && または || ない !
whileステートメントは if ステートメントと同じくらい簡単に使用できることがわかります。例えば:
一方 (a < b)
{
printf("%d\n", a);
a = a + 1;
}
これにより、 aがb以上になるまで、中括弧内の 2 行が繰り返し実行されます。 while ステートメントは一般に、右に示すように機能します。
C にはdo-while構造も用意されています。
#include <stdio.h>
int main()
{
int a;
printf("数値を入力してください:");
scanf("%d", &a);
もし(a)
{
printf("値は True\n");
}
0を返します。
}
C のfor ループは、while ステートメントを簡単に表現する方法にすぎません。たとえば、C で次のコードがあるとします。
x=1;
一方 (x<10)
{
何とか何とか何とか
x++; /* x++ は x=x+1 と言うのと同じです */
}
次のようにこれを for ループに変換できます。
for(x=1; x<10; x++)
{
何とか何とか何とか
}
while ループには、初期化ステップ ( x=1 )、テスト ステップ ( x<10 )、および増分ステップ ( x++ ) が含まれていることに注意してください。 for ループを使用すると、3 つの部分すべてを 1 行に入れることができますが、これら 3 つの部分には何でも入れることができます。たとえば、次のループがあるとします。
a=1;
b=6;
一方 (a < b)
{
a++;
printf("%d\n",a);
}
これを for ステートメントに置くこともできます。
for (a=1,b=6; a < b; a++,printf("%d\n",a));
少しややこしいですが、可能です。カンマ演算子を使用すると、 for ループの初期化セクションとインクリメント セクションで複数の異なるステートメントを区切ることができます (ただし、テスト セクションでは分離できません)。多くの C プログラマは、1 行の C コードに多くの情報を詰め込むことを好みます。しかし、多くの人はコードが理解しにくくなると考え、コードを分割します。
C では==記号が問題になります。忘れてブール式に=だけを入力してしまうことがあるためです。これは間違いやすいミスですが、コンパイラにとっては非常に重要な違いがあります。 C はブール式で=と== のいずれかを受け入れますが、プログラムの動作はこの 2 つの間で大きく異なります。
C ではブール式は整数として評価され、整数はブール式内で使用できます。 C の整数値 0 は False ですが、その他の整数値は True です。 C では次のことが有効です。
aが 0 以外の場合、printf ステートメントが実行されます。
C では、 if (a=b)のようなステートメントは、「 b をaに代入し、 aのブール値をテストする」ことを意味します。したがって、 a が0 になると、if ステートメントは False になります。それ以外の場合は True です。 aの値はプロセス中に変化します。 ==と入力するつもりだった場合、これは意図された動作ではないため (ただし、この機能は正しく使用すると便利です)、 =と== の使用には注意してください。
ループ: 実際の例
華氏から摂氏への変換テーブルを出力するプログラムを作成するとします。これは、for ループまたは while ループを使用して簡単に実現できます。
#include <stdio.h>
int main()
{
int a;
a = 0;
while (a <= 100)
{
printf("%4d 度 F = %4d 度 C\n",
a、(a - 32) * 5 / 9);
a = a + 10;
}
0を返します。
}
このプログラムを実行すると、0 °F で始まり 100 °F で終わる値のテーブルが生成されます。出力は次のようになります。
0°F = -17°C 10°F = -12°C 20°F = -6°C 30 °F = -1 °C 40°F = 4°C 50°F = 10°C 60°F = 15°C 70°F = 21°C 80°F = 26°C 90°F = 32°C 100 °F = 37 °C
表の値は 10 度刻みです。プログラムが生成するテーブルの開始値、終了値、増分値を簡単に変更できることがわかります。
値をより正確にしたい場合は、代わりに浮動小数点値を使用できます。
#include <stdio.h>
int main()
{
float a;
a = 0;
while (a <= 100)
{
printf("%6.2f 華氏 = %6.2f 摂氏\n",
a、(a - 32.0) * 5.0 / 9.0);
a = a + 10;
}
0を返します。
}
aの宣言が float に変更され、printf ステートメント内の % dシンボルが % fシンボルに置き換えられていることがわかります。さらに、%f 記号にはいくつかの書式設定が適用されます。値は、小数点の前に 6 桁、小数点の後に 2 桁で出力されます。
ここで、温度 98.6 がテーブルの適切な位置に挿入されるようにプログラムを変更したいとします。つまり、表を 10 度ごとに増加させる必要がありますが、人間の通常の体温である 98.6 度 F を示す追加の行も表に含める必要があります。次のプログラムは目的を達成します。
#include <stdio.h>
int main()
{
float a;
a = 0;
while (a <= 100)
{
if (a > 98.6)
{
printf("%6.2f 華氏 = %6.2f 摂氏\n",
98.6、(98.6 - 32.0) * 5.0 / 9.0);
}
printf("%6.2f 華氏 = %6.2f 摂氏\n",
a、(a - 32.0) * 5.0 / 9.0);
a = a + 10;
}
0を返します。
}
このプログラムは終了値が 100 の場合は動作しますが、終了値を 200 に変更すると、プログラムにバグがあることがわかります。 98.6 度の線が何度も印刷されます。この問題はいくつかの異なる方法で解決できます。ここに 1 つの方法があります:
#include <stdio.h>
int main()
{
浮動小数点 a、b;
a = 0;
b = -1;
while (a <= 100)
{
if ((a > 98.6) && (b < 98.6))
{
printf("%6.2f 華氏 = %6.2f 摂氏\n",
98.6、(98.6 - 32.0) * 5.0 / 9.0);
}
printf("%6.2f 華氏 = %6.2f 摂氏\n",
a、(a - 32.0) * 5.0 / 9.0);
b = a;
a = a + 10;
}
0を返します。
}
C 避けるべきエラー
- if または while ステートメントで == を意味するときに = を置く
- while ループ内でカウンタをインクリメントするのを忘れる – カウンタをインクリメントするのを忘れると、無限ループが発生します (ループは決して終了しません)。
- 誤って ; を入れてしまうfor ループまたは if ステートメントの最後でステートメントが影響を及ぼさないようにする – 例: for (x=1; x<10; x++); printf(“%d\n”,x); for ステートメントの後のセミコロンが for ループを実行する 1 行として機能するため、1 つの値のみが出力されます。
- 華氏から摂氏へのプログラムを変更して、scanf を使用してテーブルの開始値、終了値、増分値をユーザーから受け入れるようにしてください。
- 作成された表に見出し行を追加します。
- 前の例で修正されたバグに対する別の解決策を見つけてください。
- ポンドからキログラム、またはマイルからキロメートルに変換するテーブルを作成します。
配列
このセクションでは、10 個の乱数を生成して並べ替える小さな C プログラムを作成します。これを行うには、配列と呼ばれる新しい変数の配置を使用します。
配列を使用すると、同じ型の値のコレクションを宣言して操作できます。たとえば、5 つの整数のコレクションを作成するとします。これを行う 1 つの方法は、5 つの整数を直接宣言することです。
int a、b、c、d、e;
これは問題ありませんが、1,000 個の整数が必要な場合はどうなるでしょうか?より簡単な方法は、5 つの整数の配列を宣言することです。
int a[5];
この配列内の 5 つの個別の整数には、インデックスによってアクセスされます。 C では、すべての配列はインデックス 0 から始まり、n-1 まで進みます。つまり、 int a[5]; となります。 5つの要素が含まれています。例えば:
int a[5]; a[0] = 12; a[1] = 9; a[2] = 14; a[3] = 5; a[4] = 1;
配列のインデックス付けの優れた点の 1 つは、ループを使用してインデックスを操作できることです。たとえば、次のコードは配列内のすべての値を 0 に初期化します。
int a[5];
int i;
for (i=0; i<5; i++)
a[i] = 0;
次のコードは、配列内の値を順番に初期化し、それらを出力します。
#include <stdio.h>
int main()
{
int a[5];
int i;
for (i=0; i<5; i++)
a[i] = i;
for (i=0; i<5; i++)
printf("a[%d] = %d\n", i, a[i]);
}
配列は C で常に使用されます。一般的な使用法を理解するには、エディターを起動して次のコードを入力します。
#include <stdio.h>
#最大10を定義
int a[MAX];
int rand_seed=10;
/* K&R より
- 0 ~ 32767 の範囲の乱数を返します。*/
int ランド()
{
ランドシード = ランドシード * 1103515245 +12345;
return (unsigned int)(rand_seed / 65536) % 32768;
}
int main()
{
int i,t,x,y;
/* 配列を埋める */
for (i=0; i < MAX; i++)
{
a[i]=ランド();
printf("%d\n",a[i]);
}
/* すぐにさらに多くの内容がここに表示されます */
0を返します。
}
このコードには、いくつかの新しい概念が含まれています。 #define行は、 MAXという名前の定数を宣言し、それを 10 に設定します。定数名は、コード内でわかりやすいように、伝統的にすべて大文字で書かれています。行int a [MAX] ;は、C で整数の配列を宣言する方法を示しています。配列の宣言の位置により、配列はプログラム全体に対してグローバルであることに注意してください。
int rand_seed=10行は、今回はrand_seedという名前のグローバル変数も宣言します。この変数は、プログラムが開始されるたびに 10 に初期化されます。この値は、後続の乱数コードの開始シードになります。実際の乱数ジェネレータでは、シードはシステム時間などの乱数値として初期化する必要があります。ここで、 rand関数はプログラムを実行するたびに同じ値を生成します。
int rand()行は関数宣言です。 rand 関数はパラメータを受け入れず、整数値を返します。関数については後で詳しく学びます。続く 4 行は rand 関数を実装します。今のところ無視します。
主な機能は正常です。 4 つのローカル整数が宣言され、for ループを使用して配列に 10 個のランダムな値が入力されます。配列a には10 個の個別の整数が含まれていることに注意してください。角括弧を使用して、配列内の特定の整数を指します。したがって、 a[0] は配列内の最初の整数を指し、 a[1] は2 番目の整数を指します。 /*で始まり*/で終わる行をコメントと呼びます。コンパイラはその行を完全に無視します。自分自身または他のプログラマへのメモをコメントに記入できます。
次に、 more things …コメントの代わりに次のコードを追加します。
/* 配列をバブルソートします */
for (x=0; x < MAX-1; x++)
for (y=0; y < MAX-x-1; y++)
if (a[y] > a[y+1])
{
t=a[y];
a[y]=a[y+1];
a[y+1]=t;
}
/* ソートされた配列を出力します */
printf("-------------------\n");
for (i=0; i < MAX; i++)
printf("%d\n",a[i]);
このコードは、ランダムな値をソートし、ソートされた順序で出力します。実行するたびに同じ値が得られます。ソートされる値を変更したい場合は、プログラムを実行するたびに rand_seed の値を変更します。
このコードが何をしているのかを本当に理解する唯一の簡単な方法は、コードを「手動で」実行することです。つまり、もう少し扱いやすくするためにMAXが 4 であると仮定し、紙を取り出して、自分がコンピューターであるふりをします。紙に配列を描き、その配列に 4 つのランダムな未ソートの値を入れます。コードの並べ替えセクションの各行を実行し、何が起こったのかを正確に引き出します。内側のループを通過するたびに、配列内の大きな値が配列の底部に向かって押し出され、小さな値が上部に向かって盛り上がっていることがわかります。
- 最初のコード部分で、配列にデータを入力する for ループを 1 行のコードに変更してみてください。結果が元のコードと同じであることを確認してください。
- バブル ソート コードを取り出して、それを独自の関数に組み込みます。関数ヘッダーはvoid bubble_sort()になります。次に、バブル ソートで使用される変数も関数に移動し、そこでローカルにします。配列はグローバルであるため、パラメーターを渡す必要はありません。
- 乱数シードを別の値に初期化します。
- C には範囲チェックがないため、配列の末尾を超えてインデックスを付けても、それについては通知されません。最終的にはクラッシュするか、ゴミデータが生成されます。
- パラメータが渡されない場合でも、関数呼び出しには() を含める必要があります。たとえば、C はx=rand を受け入れます。 , しかし、通話はできません。代わりに、rand 関数のメモリ アドレスがxに配置されます。 x=rand(); と言う必要があります。 。
配列の詳細
変数の型
C には 3 つの標準変数タイプがあります。
- 整数: int
- 浮動小数点: float
- 文字: 文字
int は 4 バイトの整数値です。 float は 4 バイトの浮動小数点値です。 char は 1 バイトの単一文字 (「a」や「3」など) です。文字列は文字の配列として宣言されます。
多数の派生型があります。
- double (8バイト浮動小数点値)
- short (2バイト整数)
- unsigned shortまたはunsigned int (正の整数、符号ビットなし)
演算子と演算子の優先順位
C の演算子は、ほとんどの言語の演算子と似ています。
+ - 加算 - - 引き算 / - 分割 * - 乗算 % - モッド
/演算子は、両方のオペランドが整数の場合は整数の除算を実行し、そうでない場合は浮動小数点の除算を実行します。例えば:
ボイドメイン()
{
float a;
a=10/3;
printf("%f\n",a);
}
このコードは、 a がfloat型として宣言されているため、浮動小数点値を出力しますが、コードは整数の除算を実行したため、 a は3.0 になります。
C の演算子の優先順位も、他のほとんどの言語と同様です。除算と乗算が最初に行われ、次に加算と減算が行われます。 C では * 演算子の方が + よりも優先順位が高いため、計算 5+3*4 の結果は 32 ではなく 17 になります。括弧を使用して通常の優先順位を変更できます ((5+3)*4 は 32 です)。 5+3 は括弧内にあるため、最初に評価されます。優先順位については後ほど説明します。C ではポインタが導入されるとやや複雑になります。
タイプキャスト
C を使用すると、その場で型変換を実行できます。これは、ポインターを使用するときに特に頻繁に行われます。型キャストは、特定の型の代入操作中にも発生します。たとえば、上記のコードでは、整数値が自動的に浮動小数点数に変換されました。
C で型キャストを行うには、型名をかっこで囲み、変更する値の前に置きます。したがって、上記のコードでは、行a=10/3;を置き換えます。 a=(float)10/3; 10 は除算の前に浮動小数点値に変換されるため、結果として 3.33333 が生成されます。
Typedef
C では、 typedefステートメントを使用して、名前付きのユーザー定義型を宣言します。次の例は、C コードでよく使用される型を示しています。
#define TRUE 1
#define FALSE 0
typedef int ブール値;
ボイドメイン()
{
ブール値 b;
b=偽;
何とか何とか何とか
}
このコードを使用すると、C プログラムでブール型を宣言できます。
実数に対する「float」という言葉が気に入らない場合は、次のように言えます。
typedef 浮動小数点実数;
そして後で言います:
REAL R1、R2、R3;
Typedefステートメントは、コードで最初に使用する前に来る限り、Cプログラムのどこにでも配置できます。
構造物
Cの構造を使用すると、変数をパッケージにグループ化できます。これが例です:
struct rec
{
int a、b、c;
フロートD、E、F;
};
struct rec r;
ここに示すように、タイプのrecの構造を宣言したいときはいつでも、 struct rec 。この行は非常に簡単に忘れがちであり、構造体を除外しないため、多くのコンパイラエラーが発生します。コードをフォームに圧縮できます。
struct rec
{
int a、b、c;
フロートD、E、F;
} r;
RECのタイプ宣言と変数Rが同じステートメントで宣言されている場合。または、構造名のtypedefステートメントを作成できます。たとえば、レコードを宣言したいたびにstruct rec rを言うのが好きではない場合は、次のように言うことができます。
typedef struct rec_type;
次に、次のように言って、型rec_typeのレコードを宣言します。
rec_type r;
たとえば、 RA = 5など、期間を使用して構造のフィールドにアクセスします。 。
配列
以下に示すように、通常の宣言の後に配列サイズを挿入して配列を宣言します。
int a [10]; / *整数の配列 */
char s [100]; /*文字の配列
(c文字列) */
フロートF [20]; / *実在の配列 */
struct rec r [50]; / *レコードの配列 */
増分
長い道のり i = i+1; i ++; i = i-1;私 - ; i = i+3; i += 3; i = i*j; i *= j;
- タイプキャストと優先順位を調査するために、さまざまなコードを試してください。 int、char、floatなどを試してみてください。
- 一連のレコードを作成し、1つの整数フィールドにその配列をソートするためのコードを記述します。