C基礎6 配列
C基礎6 配列
「配列」を勉強します。配列は、同じデータの集まりです。プログラムでデータを扱いやすい様に一定の形式にまとめたものを「データ構造」と言いますが、配列は、このデータ構造の1つになります。C言語基礎編では、データ構造のはじめの一歩として、この配列を学びます。C言語の応用編に入ると、様々のデータ構造を勉強します。
動画は、Windows10とVisualStudio2019を使った説明になっていますが、WIndows11とVisualStudio2022を使った場合の操作方法と同じです。ただ、VisulStudio2022を使っている人は、サンプルプログラム通りにプログラムを作成すると、警告メッセージ(ワーニング)がでる場合があります。この理由と対処法については、「[追加情報]size_t型について」で説明していますので、これで対応してください。
配列宣言すると、指定した個数の箱が用意されます。この指定した個数を要素数、1つひとつの箱を要素と呼びます。要素には、0から始まる番号が付けられます。この番号を要素番号またはインデックスと呼びます。
配列では [ ] の記号を使います。[ ] の記号が出てきたら配列と思ってください。( ) や { } は、使い方によって文法的な意味が異なりますが、[ ] は配列だけで使う記号になります。
配列の各要素に、データを入力したり、データを参照したり、といったプログラムを書く場合、for文を使います。このfor文の繰返しは、要素番号が0から始まることから、0からスタートの要素数分繰返すfor文の書き方になります。
配列宣言、配列を使った基本的なプログラミングを学びます。
for文は「0からスタートカウントアップ方式」の書き方が基本です。
・同じ意味のデータの集まりは配列を使う
配列宣言では、用意する箱の種類を示すデータ型と、箱の個数を示す要素数を書きます。
配列の要素番号は0からスタートします。
・配列の要素数はマクロ化する
配列の要素数は、配列宣言する時だけでなく、配列の要素を扱うfor文で使う事になります。後で、要素数を変更し易くするため、要素数を事前にマクロ定義し、要素数はマクロ名で書く様にします。
・配列の初期化データは{ }で囲む
配列宣言する時に、1つひとつの要素に初期値をセットすることができます。{ } の中に書いたデータが、0番目の要素から順にセットされていきます。データの数が少ない場合は、残りの箱には0がセットされます。
・配列の要素数はsizeof演算子で計算する
配列宣言した時に初期値を指定すると、要素数を省略することができます。
要素数を省略した場合でも、要素数はsizeof演算子を使った式で求めることができます。
・終わりの印でない間繰返す
for文は「0からスタートカウントアップ方式」の書き方が基本ですが、配列に終わりの印の要素がある場合、「終わりの印でない間繰返す方式」の書き方になります。
a配列、b配列、c配列を初期化付き宣言します。d配列は初期化なしで宣言します。a配列の初期化データは要素数分書きます。b配列の初期化データは要素数より少なく書きます。c配列は要素数を省略します。
最初に、d配列の各要素に、キーボードからデータ入力し、その後、4つの配列の各要素を表示するプログラムを作成しましょう。
アルゴリズムとは、よく登場する処理の手順を、計算や条件の組み合わせとして定型化したもので、ここでは初歩的なアルゴリズムを、C言語で書いたプログラムで紹介します。
ここで紹介するアルゴリズムは以下の5つです。2~5については、配列を使ったプログラムにして、配列の復習をします。
入替え
合計と平均
最大値と最小値
サーチ(線形サーチ)
ソート(バブルソート)
新しい文法は登場しません。
初歩的なアルゴリズムをC言語で書くことで、配列やfor文の復習をします。
あるクラスのテストの点数を配列で初期化付きで宣言し、クラスの平均点と最高点と最低点を求めるプログラムを作成しましょう。
「3.5 文字列とchar型配列」の所で、文字列を入力する時にはchar型配列を使うことを説明しました。ここで文字配列と言っているのはchar型配列の事です。「文字と文字列は違う」という事は、何度か繰返していますが、文字配列と文字列配列も違います。
文字列は最後の要素がヌル文字の文字配列のことです。文字列配列は複数の文字列が入った配列になります。文字列配列の実体は、C言語応用編で勉強するポインタですが、ここではポインタについての説明はしません。複数の文字列を扱うプログラムの書き方を説明します。
文字と文字列の違いの復習を行いながら、文字配列と文字列配列について説明しています。
複数の文字列を扱う文字列配列を使ったプログラムの書き方を学びます。
・文字列ではない文字配列もある
文字列は、最後の要素がヌル文字の文字配列です。最後の要素がヌル文字でない文字配列は文字列ではありません。
・文字列でない文字配列を%s表示すると文字化け
printfで書式指定子に%sを指定して文字配列を表示した時、ヌル文字がセットされていないと、ヌル文字を見つけるまで表示されてしまい、自分がセットした文字以降のデータが、文字として表示されてしまいます。
・文字列定数で初期化した文字列配列のデータ型は「const char *」を使う
データ型に「const」や「*」が使えることは説明していませんが、ここでは書き方だけを覚えてください。詳しくはC言語応用編で説明します。
・文字列配列の終わりの印はNULLを使う
文字列は、文字配列の終わりの印としてヌル文字('¥0')をセットします。文字列配列で終わりの印をセットする場合、NULL(ヌルポインタ)をセットします。
・文字列配列表示関数を作る
文字列配列の初期化された文字列を全て表示する関数を作っておくと便利です。
仮引数宣言の書き方が、少し難しいですが、ここも今は、この様に書くと覚えてください。
テキストアドベンチャーを作成した時に使ったアスキーアートを表示するprintf文だけをまとめたソースファイルが用意してあります(右記)。
このプログラムを、文字列配列を表示する関数を使って、関数呼び出しでアスキーアートを表示するプログラムに書き換えてみましょう。
文字列を代入したり比較したりする場合、=演算子や、比較のための演算子を使う事はできません。このため、C言語は、文字列を代入したり比較するための標準関数を用意しています。「str」から始まる名前を持つ関数です。
この章では、以下の代表的な7つの関数を説明します。
strcpy関数(文字列複写)
strncpy関数(文字数指定の文字列複写)
strcat関数(文字列結合)
strncat関数(文字数指定の文字列結合)
strcmp関数(文字列比較)
strncmp関数(文字数指定の文字列比較)
strlen関数(文字数取得)
上記の7つの関数の説明をします。
プログラムでは、文字列を扱うことが多いです。しっかり、文字列関数を使える様になりましょう。
練習問題25で表示したアスキーアートを、色付けして画面の中央に表示するように、プログラムを書き換えてみましょう。
拡張問題として、右記からダウンロードできる1文字ずつの絵文字のアスキーアートを使って、「GAME CLEAR」と「GAME OVER」を表示してみまましょう。なお、1文字ずつ色を変えて表示するようにしましょう。
Visual Studio 2022を使っている人は、練習問題26のサンプルプログラム通りに書いてビルドすると警告メッセージ(ワーニング)が出ます。警告が出ても、エラーではないので、プログラムを実行できますし、実行結果に何も問題がありません。ただ、ワーニングの中には致命的な問題を指摘するものもあるため、出来るだけワーニングを除去する習慣をつけることをお勧めします。今回のワーニングの原因と、その対処法を以下の動画で説明しています。
Visual Studio 2019とVisual Studio 2022では、ビルドするときの最初の設定が異なります。Visual Studio 2019はx86モード(32ビットアプリ)、Visual Studio 2022はx64モード(64ビットアプリ)です。
この違いが、size_tの実体の違いに影響しています。少し難しい説明になっていますが、Visual Studio 2022を使っている人は、右下の設定を変更すればワーニングが無くなります。
次の章では、練習問題12で作成したテキストアドベンチャーゲームのバージョンアップ版を作成します。その準備として「道の選択」と「扉の選択」という2つの選択場面を、背景色を使ったアスキーアートを表示するようにします。この2つの場面での、選択のプログラムを作成しましょう。
どの様な道や扉にするのかを、事前に画面設計する必要があります。
下記のスライドや動画では、サンプルプログラムを作るための画面設計をどのようにしたのかの説明を最初に行っています。プログラムは、その設計に基づいて書いていくことになります。
テスト実施フォーム ← テストチャレンジできます
上記テストの解説と解答