【C言語】実行時に2次元配列を操作する!全要素の和と積を計算する方法
問題
実行時(ランタイム)にキーボードから値を入力し、2つの2次元配列の全要素について「和」と「積」を計算して表示するCプログラムを作成します。
解決策のポイント
プログラムの実行時に必要なメモリを確保する方式は「動的メモリ割り当て(dynamic memory allocation)」と呼ばれます。コンパイル時にサイズを固定せず、実行時に柔軟に配列を扱いたい場合に用いられる手法です。
C言語では、
calloc()やmalloc()といった関数を使うことで、ヒープ領域に動的にメモリを確保できます。本記事のサンプルでは、配列サイズをあらかじめ宣言した上で、実行時に
scanf()で各要素へ値を読み込む方法を紹介します。
このプログラムでは、実行時に入力された2次元配列A・Bの対応する要素同士を足し合わせた「和の配列」と、掛け合わせた「積の配列」をそれぞれ計算して画面に表示します。
2次元配列の和を求めるロジック
printf("Sum array is : \n");
for(i=0;i<2;i++){
for(j=0;j<3;j++){
sum[i][j]=A[i][j]+B[i][j];
printf("%d\t",sum[i][j]);
}
printf("\n");
}外側のループで行(i)を、内側のループで列(j)を制御しながら、配列AとBの同じ位置にある要素同士を加算し、結果を順番に出力していきます。
2次元配列の積を求めるロジック
printf("Product array is : \n");
for(i=0;i<2;i++){
for(j=0;j<3;j++){
product[i][j]=A[i][j]*B[i][j];
printf("%d\t",product[i][j]);
}
printf("\n");
}和を求める場合と構造はまったく同じで、演算子を + から * に変更するだけで、対応する要素同士の積が計算できます。
サンプルプログラム
#include<stdio.h>
int main(void){
/* 配列の宣言 */
int A[2][3], B[2][3];
int sum[2][3], product[2][3];
int i, j;
/* 実行時に配列Aへ要素を読み込む */
printf("Enter elements into the array A: \n");
for(i=0;i<2;i++){
for(j=0;j<3;j++){
printf("A[%d][%d] :",i,j);
scanf("%d",&A[i][j]);
}
printf("\n");
}
/* 実行時に配列Bへ要素を読み込む */
for(i=0;i<2;i++){
for(j=0;j<3;j++){
printf("B[%d][%d] :",i,j);
scanf("%d",&B[i][j]);
}
printf("\n");
}
/* 和を計算して出力 */
printf("Sum array is : \n");
for(i=0;i<2;i++){
for(j=0;j<3;j++){
sum[i][j]=A[i][j]+B[i][j];
printf("%d\t",sum[i][j]);
}
printf("\n");
}
/* 積を計算して出力 */
printf("Product array is : \n");
for(i=0;i<2;i++){
for(j=0;j<3;j++){
product[i][j]=A[i][j]*B[i][j];
printf("%d\t",product[i][j]);
}
printf("\n");
}
return 0;
}注意: 元のコードでは sum[i][j] や product[i][j] を、ループ変数 i・j の初期化前に宣言しており、これは未定義動作となります。上記のサンプルでは sum[2][3]、product[2][3] と明示的にサイズを指定し、安全な形に修正しています。
実行例
以下は、配列Aに {1, 2, 3} と {4, 5, 6}、配列Bに {2, 2, 2} と {1, 1, 1} を入力した場合の実行例です。
Enter elements into the array A: A[0][0] :1 A[0][1] :2 A[0][2] :3 A[1][0] :4 A[1][1] :5 A[1][2] :6 B[0][0] :2 B[0][1] :2 B[0][2] :2 B[1][0] :1 B[1][1] :1 B[1][2] :1 Sum array is : 3 4 5 5 6 7 Product array is : 2 4 6 4 5 6
まとめ
このように、二重のforループと scanf() を組み合わせることで、実行時に2次元配列へ値を入力し、要素ごとの和や積を簡単に計算できます。より大きな配列や、実行時までサイズが確定しない配列を扱いたい場合は、malloc() や calloc() による動的メモリ割り当てを活用するとよいでしょう。
-
C言語入門:ポインタ配列とポインタへのポインタ(二重ポインタ)の基本をわかりやすく解説
はじめにC言語において、ポインタはメモリを直接扱える強力な機能です。本記事では、その応用形である「ポインタ配列」と「ポインタへのポインタ(二重ポインタ)」について、宣言方法・初期化方法・値へのアクセス方法を、サンプルコードと実行結果とともに順を追って解説します。 ポインタ配列とは通常の変数と同様に、ポインタも配列として宣言することができます。これを「ポインタ配列」と呼びます。各要素がそれぞれ別のアドレスを保持できるため、複数のデータを間接的に扱う際に便利です。 宣言方法データ型 *ポインタ名 [サイズ];例えば、次のように宣言します。int *p[5]; // int型の要素アドレスを5つ格納
-
Linuxシェルスクリプトで配列を操作する方法 – パート8
配列という概念がないプログラミング言語は考えられません。実装方法は言語ごとに異なりますが、配列は類似したデータも異なるデータも、ひとつのシンボリックな名前のもとにまとめて管理できる強力な仕組みです。 本記事はシリーズ第8回として、シェルスクリプトにおける配列の使い方を、実際に動かせるサンプルスクリプトとともにわかりやすく解説します。 配列の初期化と使い方 最近のバージョンのbashは1次元配列をサポートしています。配列はシェル組み込みコマンドのdeclareを使って明示的に宣言できます。 declare -a var ただし、必ずしも上記のように宣言する必要はありません。次のように、個々の要素