C/C++ · 4 min read · Oct 12, 2025
C/C++を段階的に学ぶ - ページ 7
07. 段階的C/C++ — Cプログラミング - 配列
| 1. 配列の紹介 | |
| 2. 配列について | |
| 3. 配列要素 | |
| 4. 配列を関数に渡す |
| | 5. 配列の種類 | | - 一次元配列 1. 要素の追加
- 要素の挿入
- 要素の削除
- 要素の置換
- 要素の検索
- 配列の削除
- 配列のソート - 多次元配列
多次元配列を使用した行列演算 | |
1. 配列の紹介
変数は定数値を保持できます。変数には単一の定数値しか保持できず、複数の値を保持することはできません。
以下の例は変数のスコープを示しています。
| | int main()
{
int sno;
sno = 1001;
sno = 1008;
sno = 1005;
printf(“%d”, sno);
return 0;
} | | | 出力:
1005 |
上記のプログラムは1005のみを表示できますが、すべての値(つまり1001、1008、1005)は表示できません。
次のプログラムを上記のプログラムの代わりに使用できますか。
| | int main()
{
int sno;
sno 0 = 1001;
sno 1 = 1008;
sno 2 = 1005;
printf(“%d”, sno);
return 0;
} | | | 出力:
何も表示されません、
上記のプログラムはエラーのリストを表示します。アプローチが間違っているためです。 |
次のプログラムを続けて、エラーのないプログラムを取得しましょう。
| | int main()
{
int sno[3];
sno[0] = 1001;
sno[1] = 1008;
sno[2] = 1005;
printf(“%d”, sno[2] );
return 0;
} | / 3つの値を挿入する /
/ 最初の位置に1001を挿入 /
/ 次の位置に1008を挿入 /
/ 次の位置に1005を挿入 /
/ 2番目の位置の値を表示 / | | | | | 出力:
何も表示されません | |
上記のプログラムはエラーのリストを表示します。アプローチが間違っているためです。
上記のプログラムに基づいて、変数snoは複数の学生番号を保持できます。これは、マルチロケーション技術を使用することで簡単に実現でき、これを配列と呼びます。
2. 配列について
配列は同じ型のデータ項目の数を含みます。この型は単純なデータ型、構造体、またはクラスである可能性があります。配列内の項目は要素と呼ばれます。数は要素にアクセスします。この数はインデックスと呼ばれます。配列が定義されるときに、要素は特定の値に初期化できます。
配列は複数の次元を持つことができます。
二次元配列は配列の配列です。配列のアドレスは関数への引数として使用できます。配列自体はコピーされません。配列はクラスのメンバーデータとして使用できます。配列の外部にデータが配置されないように注意する必要があります。
/ 次のプログラムは4人の年齢を読み取り、表示します /
| | / 47_arrays.c /
#include
int main()
{
int age[4], i;
for( i=0; i<4; i++)
{
printf(“年齢を入力してください “); scanf(“%d”, &age[i]);
}
for(i=0; i<4; i++)
printf(“\nあなたが入力した年齢は %d”, age[i]);
return 0;
} |
| |
|
Cの他の変数と同様に、配列は情報を保存するために使用される前に定義する必要があります。そして、他の定義と同様に、配列の定義は変数の型と名前を指定します。
しかし、もう1つの特徴が含まれています:サイズ。サイズは配列が含むデータ項目の数を指定します。これは名前の直後に続き、角括弧で囲まれています。
3. 配列要素
配列内の項目は要素と呼ばれます。一次元配列は行方向または列方向に値を受け入れます。これは1セットの値しか保存できません。
最初の配列要素は0、2番目は1、以下同様です。
| |
|
配列の値は設計時に直接初期化できます。
配列の初期化は次のようになります。。
| |
|
4. 配列を関数に渡す
配列は関数への引数として使用できます。
関数宣言では、データ型と配列のサイズが配列引数を表します。
void display(float [DISPLAY][MONTHS]);
関数が呼び出されるとき、引数として配列の名前のみが使用されます。
display(sales); 10要素の配列を受け入れて印刷するプログラム
| | / 48_ ele10.c /
#define MAX 10
display(int a[MAX])
{
int i;
for(i = 0;i
}
int main()
{
int x[MAX], i;
for(i=0;i
display(x);
return 0;
} |
関数から値の配列を返すことも可能ですが、ポインタの概念を明確にする必要があります。詳細についてはポインタのトピックを参照してください。
5. 配列の分類
配列には2つのタイプがあります。
| | 1. 一次元配列
- 多次元配列 |
1. 一次元配列
一次元配列は、行または列の形式で要素のコレクションです。
一次元配列は以下の操作を受け入れることができます。
| | 1. 要素の追加
- 要素の挿入
- 要素の削除
- 要素の置換
- 要素の検索
- 配列の削除
- 配列のソート |
以下のプログラムは、上記のすべてのタスクを実行できます。
| | / 配列関数 /
/ 49_sarray.c /
#define N 100
#define M 10
int i,j,r,c,r1,r2,c1,c2; / 配列要素を読み取る /
int accept_values(int a[N])
{
int n;
printf(“\nいくつの値を入力したいですか..? “);
scanf(“%d”,&n);
printf(“\nデータ要素を入力してください.. “);
for(i=0;i
return n;
} / 配列要素を表示する /
void display(int a[N],int n)
{
printf(“\n 配列要素は…”);
for(i=0;i
} / 配列要素を削除する /
int delete_cell(int a[N],int n)
{
int pos;
char ch;
printf(“\n削除する要素の位置を入力してください: “);
scanf(“%d”,&pos);
for(i=pos-1;i
n–;
printf(“\n 続行しますか..(y/n)?”);
ch = getche();
if(ch == ‘y’) delete_cell(a,n);
return n;
} / 配列要素を挿入する /
int insert_cell(int a[N],int n)
{
int pos, new;
char ch;
printf(“\n挿入する要素を入力してください: “); scanf(“%d”, &new);
printf(“\n挿入位置を入力してください: “); scanf(“%d”, &pos);
for(i=n;i>=pos;i–)
a[i] = a[i-1];
a[pos-1] = new;
n++;
printf(“\n 続行しますか..(y/n)?”);
ch = getche();
if(ch==’y’) insert_cell(a,n);
return n;
} / 既存の配列に要素を追加する /
int append_cell(int a[N],int n)
{
int pos, new;
char ch;
printf(“\n追加する要素を入力してください: “);
scanf(“%d”,&new);
a[n] = new;
n++;
printf(“\n 続行しますか..(y/n)?”);
ch = getche();
if(ch==’y’)append_cell(a,n);
return n;
} / 配列の要素を降順にソートする /
void sort_list_descend(int a[N],int n)
{
int temp;
for(i=0;i
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
printf(“\n降順にソートされた要素は…”);
} / 配列の要素を昇順にソートする /
void sort_list_ascend(int a[N],int n)
{
int temp;
for(i=0;i
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
printf(“\n昇順にソートされた要素は…”);
} / 既存の配列の最小値と最大値を見つける /
void small_big(int a[N],int n)
{
int temp;
for(i=0;i
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
printf(“\n最小の要素は : %d”,a[n-1]);
printf(“\n最大の要素は : %d”,a[0]);
} / 配列内の要素を検索する /
void search(int a[N],int n)
{
int target, temp=0;
printf(“\n 検索する要素を入力してください: “);
scanf(“%d”,&target);
for(i=0;i
{
printf(“\n位置 %d で見つかりました”,i+1);
temp = 1;
}
if(temp == 0)
printf(“\n 見つかりませんでした”);
} / メインプログラム / / 簡単な配列操作を示す /
#include
#include
int main()
{
int a[m],n; char ch;
clrscr();
n = accept_values(a);
do
{
printf(“\n 1 - append_cell”);
printf(“\n 2 - delete_cell”);
printf(“\n 3 - insert_cell”);
printf(“\n 4 - sort_list_descend”);
printf(“\n 5 - sort_list_ascend”);
printf(“\n 6 - small_big”);
printf(“\n 7 - search”);
printf(“\n 8 - remove_list”);
printf(“\n 9 - exit”);
printf(“\n あなたの選択を入力してください: “); ch = getche();
printf(“\n”);
switch(ch)
{
case ‘1’: n = append_cell(a,n); break;
case ‘2’: n = delete_cell(a,n); break;
case ‘3’: n = insert_cell(a,n); break;
case ‘4’: sort_list_descend(a,n); break;
case ‘5’: sort_list_ascend(a,n); break;
case ‘6’: small_big(a,n); break;
case ‘7’: search(a,n); break;
case ‘8’: n = 0; break;
case ‘9’: printf(“\nこれによりプログラムが終了します。”); break;
}
display(a,n);
printf(“\n再度実行しますか..(y/n)?”);
ch = getche();
}
while(ch!=’9’);
return 0;
} |
2. 二次元配列
二次元配列は、行と列の形式で要素のコレクションです。
多次元配列は以下の操作を受け入れることができます。
多次元配列は、行列の分野で全体のタスクを最も簡単なアプローチで理解するために一般的に使用されます。
行列関数
| | / 50_menumat.c /
#define N 100
#define M 10
int i, j, r, c, r1, r2, c1, c2; / 行列の値を読み取る /
void read_matrix(int A[M][M])
{
printf(“\n行数はいくつですか? “);
scanf(“%d”,&r);
printf(“\n列数はいくつですか? “);
scanf(“%d”,&c);
for(i=0;i
} / 行列の値を書く /
void disp_matrix(int A[M][M])
{
for(i=0;i
for(j=0;j
printf(“\n”);
}
} / 任意の順序の行列の転置を見つける /
void tra_matrix_1(int T[M][M],int A[M][M])
{
printf(“\nAの転置は “);
for(i=0;i
for(j=0;j
T[i][j] = A[j][i];
printf(“%5d”,T[i][j]);
}
printf(“\n”);
}
} / 2つの行列を加算する (等しい順序の場合のみ可能) /
void add_matrix(int C[M][M],int A[M][M],int B[M][M])
{
for(i=0;i
printf(“\nAとBの合計は”);
} / 任意の順序の行列を乗算する (行列乗算のルールに従う場合) /
void mul_matrix_1(int C[M][M],int A[M][M],int B[M][M])
{
int k;
printf(“\nAとBの積は.. “);
printf(“\n行列C “);
for(i=0;i
for(j=0;j
C[i][j]=0;
for(k=0;k
printf(“%5d”,C[i][j]);
}
printf(“\n”);
}
} / 2つの行列を減算する (等しい順序の場合のみ可能) /
void sub_matrix(int C[M][M],int A[M][M],int B[M][M])
{
for(i=0;i
printf(“\nAとBの差は”);
} / 行列操作を実行するためのメニュー駆動プログラム */
#include
#include
int main()
{
int A[M][M],B[M][M],C[M][M],T[M][M]; char ch;
clrscr( );
printf(“\n行列Aの要素を入力してください.. “); read_matrix(A); r1=r; c1=c;
printf(“\n 行列A “); disp_matrix(A);
printf(“\n行列Bの要素を入力してください.. “); read_matrix(B); r2=r; c2=c;
printf(“\n 行列B “);disp_matrix(B);
do {
printf(“\n1:加算”);
printf(“\n2:減算”);
printf(“\n3:乗算”);
printf(“\n4:転置”);
printf(“\n5:終了”);
printf(“\nあなたの選択を入力してください..”); ch = getche();
switch(ch)
{
case ‘1’:
if(r1==r2 && c1==c2)
{
add_matrix(C,A,B);printf(“\n行列C “);
disp_matrix(C);
}
else
{
printf(“\nあなたが入力したr1、r2およびc1、c2の値は等しくありません、”);
printf(“\nしたがって、私はこの行列の加算を行うことができません。”);
printf(“\n正しい行列を入力してください。”);
} break;
case ‘2’:
if(r1==r2 && c1==c2)
{
sub_matrix(C,A,B);printf(“\n行列C “);
disp_matrix(C);
}
else
{
printf(“\nあなたが入力したr1、r2およびc1、c2の値は等しくありません、”);
printf(“\nしたがって、私はこの行列の減算を行うことができません。”);
printf(“\n正しい行列を入力してください。”);
} break;
case ‘3’:
if(c1==r2)
mul_matrix_1(C,A,B);
else
{
printf(“\n行列Aの列(c1)は行列Bの行(r2)と等しくありません。”);
printf(“\nしたがって、私はこの行列の乗算を行うことができません。”);
printf(“\n行列c1 == r2となるように行列を入力してください。”);
} break;
case ‘4’: printf(“\n行列Aの順序は %d x %d”,r1,c1);
tra_matrix_1(T,A);
printf(“\nAの転置の順序は %d x %d”,c1,r1); break;
case ‘5’: printf(“\nこれによりプログラムが終了します。”); break;
}
printf(“\n再度実行しますか…[y/n]? “); ch=getche();
}while(ch!=’5’);
return 0;
}
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。