はじめに
この実験では、C言語における二次元配列の作成と操作方法を学びます。まず二次元配列を宣言し、次にそれを初期化するさまざまな方法を探ります。次に、配列の要素にアクセスして操作する方法を学びます。最後に、2科目の平均点を計算し、二次元配列の機能を拡張するために知識を適用します。この実験は、C言語における二次元配列の操作に関する包括的な理解を提供します。
この実験では、C言語における二次元配列の作成と操作方法を学びます。まず二次元配列を宣言し、次にそれを初期化するさまざまな方法を探ります。次に、配列の要素にアクセスして操作する方法を学びます。最後に、2科目の平均点を計算し、二次元配列の機能を拡張するために知識を適用します。この実験は、C言語における二次元配列の操作に関する包括的な理解を提供します。
このステップでは、C言語における二次元配列の宣言方法を学びます。二次元配列は、基本的に配列の配列であり、行と列のグリッド状の構造でデータを格納することができます。
まず、二次元配列の宣言を示す新しいCファイルを作成しましょう。
touch ~/project/two_dimensional_arrays.c
次に、最初の二次元配列の宣言を書きましょう。
#include <stdio.h>
int main() {
// 3行4列の整数型の二次元配列を宣言する
int grades[3][4];
return 0;
}
この例では、grades
は3行4列の二次元配列です。これは、合計12個の整数値(3 × 4 = 12)を格納できることを意味します。
二次元配列の宣言方法をさらに探ってみましょう。以下のコードをファイルに追加します。
// 方法1: 初期化付き宣言
int matrix[2][3] = {
{1, 2, 3}, // 1行目
{4, 5, 6} // 2行目
};
// 方法2: 部分的な初期化
int scores[3][3] = {
{10, 20, 30},
{40, 50} // 残りの要素は0になる
};
// 方法3: フラットな初期化
int simple_matrix[2][3] = {1, 2, 3, 4, 5, 6};
コンパイルしてプログラムを実行して確認しましょう。
gcc two_dimensional_arrays.c -o two_dimensional_arrays
./two_dimensional_arrays
出力例は、何も表示されない空のプログラム実行になります。なぜなら、print文を追加していないからです。
二次元配列宣言に関する要点:
このステップでは、前のステップで学んだ宣言のスキルを基に、C言語における二次元配列の初期化方法を学びます。
前のファイルを修正して、さまざまな初期化手法を調べましょう。
次に、既存のコードを次の初期化方法に置き換えます。
#include <stdio.h>
int main() {
// 方法1: 完全初期化
int scores[3][4] = {
{85, 92, 78, 90}, // 1行目
{76, 88, 95, 82}, // 2行目
{63, 71, 89, 93} // 3行目
};
// 方法2: 部分的な初期化
int temperatures[2][3] = {
{25, 30, 22}, // 1行目
{28} // 2行目の一部
};
// 方法3: フラットな初期化
int matrix[2][3] = {1, 2, 3, 4, 5, 6};
// 方法4: すべての要素を0に初期化
int zeros[3][3] = {0};
// 最初の方法を表示して確認する
printf("Student Scores:\n");
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", scores[i][j]);
}
printf("\n");
}
return 0;
}
コンパイルしてプログラムを実行します。
gcc two_dimensional_arrays.c -o two_dimensional_arrays
./two_dimensional_arrays
出力例:
Student Scores:
85 92 78 90
76 88 95 82
63 71 89 93
重要な初期化方法:
重要なポイント:
このステップでは、C言語においてインデックス付けとネストしたループを使って二次元配列の個々の要素にアクセスする方法を学びます。
要素アクセスを示すために、前のファイルを更新しましょう。
配列要素にアクセスするさまざまな方法を調べるために、次のコードを追加します。
#include <stdio.h>
int main() {
// 3行4列の学生の成績配列を作成する
int grades[3][4] = {
{85, 92, 78, 90}, // 1番目の学生の成績
{76, 88, 95, 82}, // 2番目の学生の成績
{63, 71, 89, 93} // 3番目の学生の成績
};
// 方法1: 要素への直接アクセス
printf("1番目の学生の1科目目の成績: %d\n", grades[0][0]);
printf("2番目の学生の3科目目の成績: %d\n", grades[1][2]);
// 方法2: ネストしたループを使った要素のアクセス
printf("\nネストしたループを使ったすべての成績:\n");
for (int student = 0; student < 3; student++) {
for (int subject = 0; subject < 4; subject++) {
printf("学生 %d, 科目 %d: %d\n",
student + 1, subject + 1, grades[student][subject]);
}
}
// 方法3: 配列要素の変更
grades[2][3] = 95; // 3番目の学生の最終成績を更新する
printf("\n更新後の3番目の学生の最終成績: %d\n", grades[2][3]);
return 0;
}
コンパイルしてプログラムを実行します。
gcc two_dimensional_arrays.c -o two_dimensional_arrays
./two_dimensional_arrays
出力例:
1番目の学生の1科目目の成績: 85
2番目の学生の3科目目の成績: 95
ネストしたループを使ったすべての成績:
学生 1, 科目 1: 85
学生 1, 科目 2: 92
学生 1, 科目 3: 78
学生 1, 科目 4: 90
学生 2, 科目 1: 76
学生 2, 科目 2: 88
学生 2, 科目 3: 95
学生 2, 科目 4: 82
学生 3, 科目 1: 63
学生 3, 科目 2: 71
学生 3, 科目 3: 89
学生 3, 科目 4: 95
更新後の3番目の学生の最終成績: 95
二次元配列の要素にアクセスする際の要点:
array[row][column]
このステップでは、二次元配列を使って、複数の学生の異なる科目の平均点を計算する方法を学びます。
科目の平均点を計算するために、前のファイルを更新しましょう。
平均点を計算して表示するために、次のコードを追加します。
#include <stdio.h>
#define STUDENTS 5
#define SUBJECTS 3
int main() {
// 学生の点数を格納する二次元配列を作成する
int marks[STUDENTS][SUBJECTS] = {
{85, 92, 78},
{76, 88, 95},
{63, 71, 89},
{90, 84, 77},
{82, 79, 91}
};
// 科目の平均点を格納する配列
float subject_averages[SUBJECTS];
// 各科目の平均点を計算する
for (int subject = 0; subject < SUBJECTS; subject++) {
int subject_total = 0;
// 現在の科目の点数を合計する
for (int student = 0; student < STUDENTS; student++) {
subject_total += marks[student][subject];
}
// 平均点を計算する
subject_averages[subject] = (float)subject_total / STUDENTS;
}
// 科目の平均点を表示する
printf("Subject Averages:\n");
for (int subject = 0; subject < SUBJECTS; subject++) {
printf("Subject %d: %.2f\n", subject + 1, subject_averages[subject]);
}
// ボーナス: 最高と最低の科目平均点を求める
float highest_avg = subject_averages[0];
float lowest_avg = subject_averages[0];
int highest_subject = 0;
int lowest_subject = 0;
for (int subject = 1; subject < SUBJECTS; subject++) {
if (subject_averages[subject] > highest_avg) {
highest_avg = subject_averages[subject];
highest_subject = subject;
}
if (subject_averages[subject] < lowest_avg) {
lowest_avg = subject_averages[subject];
lowest_subject = subject;
}
}
printf("\nHighest Average: Subject %d (%.2f)\n",
highest_subject + 1, highest_avg);
printf("Lowest Average: Subject %d (%.2f)\n",
lowest_subject + 1, lowest_avg);
return 0;
}
コンパイルしてプログラムを実行します。
gcc two_dimensional_arrays.c -o two_dimensional_arrays
./two_dimensional_arrays
出力例:
Subject Averages:
Subject 1: 79.20
Subject 2: 82.80
Subject 3: 86.00
Highest Average: Subject 3 (86.00)
Lowest Average: Subject 1 (79.20)
示された重要な概念:
この最後のステップでは、二次元配列の機能を拡張する高度な技術を学びます。これには、関数に配列を渡す方法、動的メモリ割り当て、そしてより複雑な配列操作の作成などが含まれます。
これらの高度な概念を示すために、前のファイルを更新しましょう。
前のコードを次の包括的な例に置き換えます。
#include <stdio.h>
#include <stdlib.h>
#define ROWS 3
#define COLS 4
// 二次元配列を表示する関数
void printArray(int arr[ROWS][COLS]) {
printf("Array Contents:\n");
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
printf("%4d ", arr[i][j]);
}
printf("\n");
}
}
// 二次元配列を転置する関数
void transposeArray(int original[ROWS][COLS], int transposed[COLS][ROWS]) {
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
transposed[j][i] = original[i][j];
}
}
}
int main() {
// 静的二次元配列
int matrix[ROWS][COLS] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
// 元の配列を表示する
printf("Original Array:\n");
printArray(matrix);
// 配列を転置する
int transposed[COLS][ROWS];
transposeArray(matrix, transposed);
// 転置した配列を表示する
printf("\nTransposed Array:\n");
for (int i = 0; i < COLS; i++) {
for (int j = 0; j < ROWS; j++) {
printf("%4d ", transposed[i][j]);
}
printf("\n");
}
// 2次元配列の動的メモリ割り当て
int **dynamicMatrix;
dynamicMatrix = (int **)malloc(ROWS * sizeof(int *));
for (int i = 0; i < ROWS; i++) {
dynamicMatrix[i] = (int *)malloc(COLS * sizeof(int));
}
// 動的行列を初期化する
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
dynamicMatrix[i][j] = i * COLS + j + 1;
}
}
// 動的行列を表示する
printf("\nDynamic Matrix:\n");
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
printf("%4d ", dynamicMatrix[i][j]);
}
printf("\n");
}
// 動的に割り当てたメモリを解放する
for (int i = 0; i < ROWS; i++) {
free(dynamicMatrix[i]);
}
free(dynamicMatrix);
return 0;
}
コンパイルしてプログラムを実行します。
gcc two_dimensional_arrays.c -o two_dimensional_arrays
./two_dimensional_arrays
出力例:
Original Array:
1 2 3 4
5 6 7 8
9 10 11 12
Transposed Array:
1 5 9
2 6 10
3 7 11
4 8 12
Dynamic Matrix:
1 2 3 4
5 6 7 8
9 10 11 12
示された重要な高度な概念:
malloc()
と free()
を使ったメモリ管理この実験では、C言語における二次元配列の宣言方法を学びました。二次元配列は、配列の配列であり、行と列を持つグリッド状の構造でデータを格納することができます。宣言と初期化のさまざまな方法を調べました。完全初期化、部分的な初期化、フラットな初期化などです。また、初期化されていない要素は自動的に0に設定され、二次元配列の要素の総数は行数と列数の積によって決まることも学びました。
宣言のスキルを基に、C言語における二次元配列の初期化方法を学びました。行ごと、列ごとに値を割り当てる方法や、フラットなアプローチを使う方法などです。また、二次元配列内の個々の要素にアクセスする方法を調べました。行と列のインデックスを使ってアクセスする方法です。