「人々を傷つけるのは事件そのものではなく、事件に対する彼の見解です。」デール・カーネギー-「人間性の弱さ」
今日、私たちは上司を招待しました。彼は単なる人ではなく、あなたよりも多くのものを保持することができます。
上司の名前は何ですか、ちょっと待ってください、あなたは上司の名前をさりげなく言うことはできません
上司の紹介:
(配列)は、順番に格納された一連の同一の値であり、10個のcharタイプの文字または15個のintタイプの値にすることができます。そうです、ボスはアレイです。上司にはまだたくさんの弟がいますが、これらの弟の姓は何ですか?エレメントと呼ばれる特別な名前があります。そうです、配列全体に配列名があり、配列内の個々の項目または要素は整数の添え字を介してアクセスされます。
配列を定義する方法:
****
int name[10];//说明可存储10个int类型整数的数组
char name[10];//说明可存储10个字符的数组
****
上司はほぼ完成しているので、次は弟(配列の要素)を紹介します。子供は非常に強力で、どのデータタイプでもかまいません。
配列要素を添え字、インデックス(インデックス)、またはオフセット(オフセット)として識別するために使用される番号を参照します。添え字は整数である必要があることに注意してください。添え字の整数は、配列に存在する要素の数も表し、0から数える必要があります。実行速度に影響を与える恐れがあるため、Cコンパイラは配列の添え字が正しいかどうかをチェックしないため、添え字にも落とし穴があります。また、アレイの要素は、メモリ内の隣接する場所に順番に格納されます。
****
int name[10];//元素为name[0]~name[9]
name[10]=55;//这个便是错的,该数组元素不存在
****
注:各intは2バイト、charは1バイトです。ちなみに、ビット、ワード、バイト、KBの関係を拡張してください。
KB 1KB = 1024B
MB 1MB = 1024KB
GB 1GB = 1024MB
TB 1TB = 1024GB
int型配列要素の使用法は、int型変数の使用法と似ています。たとえば、int型変数名を読み取るには、次のように記述します。
****
scanf("%d",&name);//读取变量
scanf("%d",&name[n]);//读取数组
****
昨日はたくさんのforループを使っていましたが、たくさんのforを独立して書くことができると言う友達もいましたが、個人的には独立したforループはお勧めしません。forループを1つのループに組み合わせると、プログラムをよりコンパクトにすることができますが、モジュール性の原則にも従う必要があります。モジュール化は主にプログラムをいくつかの独立したユニットに分割することであり、各ユニットはタスクを実行します。これにより、プログラムの読みやすさも向上します。さらに重要なことに、モジュール化により、プログラムのさまざまな部分が互いに独立します。これは、プログラムの将来の変更に便利です。
配列を定義するとき、それを割り当てる方法:
****
int name[5]={
1,2,3,4,5};
int name[5]={
1,2,3,4};
****
注意深く見ると、1行目と2行目の違いがわかります.1行目は名前に5つの値を割り当てていますが、2行目は4つの値しかありません.1つ欠けている場合はどうなりますか?恐れることはありません。コンパイラは0を追加しますが、追加できるのは0のみです。
次に、アレイについて詳しく説明します。
配列を初期化します
配列は通常、プログラムに必要なデータを格納するために使用されます。たとえば、12個の整数要素を含む配列は、12か月の日数を格納できます。この場合、プログラムの最初に配列を初期化することをお勧めします。スカラー変数とは何か知っていますか?簡単に言えば、単一の値のみを格納する変数です。次に、この変数を初期化します。
****
float flax=PI*2;/*PI已定义为宏*/
初始化数组:
int main()
{
int name[5]={
1,2,3,4,5};
...}
****
上に示したように、値のコンマ区切りリスト(中括弧で囲まれています)で配列を初期化し、各値はコンマで区切られ、コンマと値の間にスペースを入れることができます。上記の初期化では、配列の最初の要素(name [0])に1を割り当てます。
簡単なプログラムを紹介しましょう。
****
#include<stdio.h>
int main()
{
const int days[]={
31,28,31,30,31,30,31,31,30,31};
int index;
for(index=0;index<sizeof day/sizeof days[0];index++)
printf("Month %2d has %d days.\n",index+1,days[index]);
return 0;
}
****
操作の結果を図に示します。
ここで次の点に注意してください。
NO.1上記の配列を初期化する場合、角括弧内の数字を省略し、コンパイラーが初期化リストの項目数に応じて配列のサイズを決定します。
NO.2 Sizeof演算子は、オペランドのサイズ(バイト単位)を指定します。Sizeof daysを使用すると、配列全体のサイズになり、Sizeof day [0]は配列内の要素のサイズになります。アレイ全体のサイズを単一の要素のサイズで割ったものが、アレイ要素の数です。
イニシャライザを指定
C99には、指定されたイニシャライザーという新機能があります。この機能を使用して、指定した配列要素を初期化します。
たとえば、初期化リストで角括弧を使用して、初期化する要素を示すことができます。
int shu[6]={[5]=55};//把shu[5]初始化为55
一般的に、要素を初期化した後、初期化されていない要素は0に設定されます。例として次のプログラムを取り上げます。
****
#include<stdio.h>
#define months 12
int main ()
{
int days[months]={
31,28,[4]=31,30,31,[1]=29};
int i;
for(i=0;i<months;i++)
{
printf("%2d %d\n",i+1,days[i]);}
return 0;
}
****
次のように実行します。
プログラムは次の点に注意を払う必要があります(もっと考える必要があります):
NO.1この例の初期化リストのフラグメントなど、指定された初期化子の後にさらに値がある場合:[4] = 31,30,31、これらの後者の値は30と31を初期化するために使用されます。
NO.2指定した要素を再度初期化すると、前回の初期化が前回の初期化に置き換わります。たとえば、上記のプログラムの初期化リストの先頭では、days [1]は28に初期化されますが、days [1]は次の指定された初期化[1] = 29によって29に初期化されます。
NO.3といえば、要素サイズが指定されていない場合はどうなりますか?次のように:
****
int shu[]={1,[6]=2};//该数组有7个元素
int shu[]={1,[6]=2,3};//该数组有8个元素
****
つまり、コンパイラは配列のサイズを初期化するのに十分な大きさの値に設定します。
配列境界
配列を使用するときは、配列の添え字が境界を越えないようにする必要があります。簡単に言えば、添え字が有効な値であることを確認することです。といった:
int you[20];
この配列を使用する場合、プログラムで使用される0〜19の範囲の配列添え字に注意する必要があり、コンパイラーはこのエラーを検出しません。私も前にそれについて言及しました。
したがって、範囲外の配列インデックスを使用すると、プログラムは他の変数の値を変更します。コンパイラが異なれば、プログラムを実行しても結果が異なる場合があり、プログラムが異常終了する原因となる場合もあります。
覚えておくべきことの1つは、配列要素の番号付けは0から始まるということです。配列を宣言するときは、記号定数を使用して配列のサイズを示すのが最適です。
配列添え字
C99標準では、新しいタイプの宣言が許可されています。
int a1 [n]; //これはc99より前では許可されていませんでした。
これにより、可変長配列と呼ばれる新しいタイプの配列が作成されました。VLAと呼ばれます(C11はこのイニシアチブを放棄し、VLAをオプションとして設定し、言語が必要な機能ではありません)
C99は、主にCをより優れた数値計算言語にするために可変長配列を導入しました。
注:可変長配列とは、整数変数または式で宣言または定義された配列を指します。配列の長さがいつでも変更されることを意味するわけではありません。可変長配列の存続期間中の長さも固定されています。
多次元配列
上記のアレイの紹介はほとんど同じなので、以下では2次元および多次元のアレイを紹介します。1次元配列をデータの行として、2次元配列をデータテーブルとして、3次元配列をデータテーブルのスタックとして想像することができます。
次に、プロジェクトを使用して2次元配列を説明します。
気象予報士が5年間、毎月の降水量データを収集したい場合、彼はどのようにデータを表現しますか?1つの解決策は、60個の変数を作成し、各変数にデータ項目を格納することです。明らかに、この方法は面倒です。次に、2次元配列を使用して解決できます。つまり、メイン配列を作成します。メイン配列には5つの要素が含まれ、各要素は12の要素を含む配列です(各要素は月を表します)。
次のように配列を宣言します。
float rain[5][12];
//内含5个数组元素的数组,每个数组元素内含12个float类型的元素
float rain[5][12] //颜色部分是指rain是一个内含5个元素的数组;非颜色部分则是指一个含有12个float类型元素的数组。
これは、各要素のタイプがfloat [12]であることを示しています。簡単に言えば、rainの各要素は、12個のfloatタイプ値を含む配列です。次に、rain [0]は配列、最初の要素はrain [0] [0]、2番目の要素はrain [0] [1]というように続きます。
プロジェクトコードは次のとおりです。
#include<stdio.h>
#define months 12//12个月
#define years 5//年数
int main()
{
const float rain[years][months]={
{
4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
{
4.1,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
{
4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
{
4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
{
4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
};//初始化时可省略内部的花括号,只要保证初始化的数值个数正确
int year,month;
float subtot,total;
printf("year rainfall (inches)\n");
for (year=0,total=0;year<years;year++)//每一年,各月的降水量总和
{
for(month=0,subtot=0;month<months;month++)
subtot+=rain[year][month];
printf("%5d %15.1f\n",2015+year,subtot);
total+=subtot;} //5年的总降水量
printf("\nThe yearly average is %.1f inches.\n\n",total/years);
printf("monthly averages:\n\n");
printf("Jan Feb Mar Apr May Jun Jul Aug Sep Oct");
printf("Nov Dec\n");
for(month=0;month<months;month++){
for(year=0,subtot=0;year<years;year++)
subtot+=rain[year][month];
printf("%4.1f",subtot/years);
}
printf("\n");
return 0;
}
結果は次のとおりです。
このプログラムは、年間総降水量、年間平均降水量、および月間平均降水量を計算します。
このプログラムは、ネストされたforループを2つ使用します。最初のループは、ネストされたforループの内側のループです。年が変更されていない場合、月をトラバースして特定の年の総降水量を計算します。外側のループは、yearの値を変更します。 、月を繰り返しトラバースし、5年間の総降水量を計算します。
ここで、2次元配列の処理には、2つ折りの入れ子ループが必要であることがわかります。一般的に、3次元配列には、3つ折りの入れ子ループが必要であり、4次元配列には、4つ折りの入れ子ループが必要です。
ここで説明する2次元配列の内容の多くは、3次元または多次元配列に適用できます。たとえば、次のように3次元配列を宣言します。
int name [3][3][3];
最后的话
アレイについては多かれ少なかれ学んだと思いますが、アレイをよりよく理解したい場合は、何度か読むことをお勧めします。これは、本を何度も読んだ後の配列の中で最も重要な知識ポイントでもあります。この記事を読んだ後、誰もが配列をよりよく理解することを願っています。
パブリックアカウント:プログラマーのボブ
は勉強中の大学生です。注意を払い、私とコミュニケーションをとることを歓迎します。
いいねしてフォロー〜ありがとう