C言語における多次元配列操作の実践的実験

実験課題1

ソースコード:

 1 #include <stdio.h>
 2 #define ROWS 4
 3 #define COLS 2
 4 
 5 void test1() {
 6     int data[ROWS] = {1, 9, 8, 4};          
 7     int index;
 8 
 9     // 配列dataが占めるメモリバイト数を出力
10     printf("sizeof(data) = %d\n", sizeof(data));
11 
12     // 各要素のアドレスと値を出力
13     for (index = 0; index < ROWS; ++index)
14         printf("%p: %d\n", &data[index], data[index]);
15 
16     // 配列名dataに対応する値を出力 
17     printf("data = %p\n", data); 
18 }
19 
20 void test2() {
21     int matrix[COLS][ROWS] = {{1, 9, 8, 4}, {2, 0, 4, 9}};
22     int row, col;
23 
24     // 2次元配列matrixが占めるメモリバイト数を出力
25     printf("sizeof(matrix) = %d\n", sizeof(matrix));
26 
27     // 各要素のアドレスと値を出力 
28     for (row = 0; row < COLS; ++row)
29         for (col = 0; col < ROWS; ++col)
30             printf("%p: %d\n", &matrix[row][col], matrix[row][col]);
31     printf("\n");
32 
33     // 2次元配列名matrix、およびmatrix[0], matrix[1]の値を出力
34     printf("matrix = %p\n", matrix);
35     printf("matrix[0] = %p\n", matrix[0]);
36     printf("matrix[1] = %p\n", matrix[1]);
37     printf("\n");
38 }
39 
40 int main() {
41     printf("テスト1: int型1次元配列\n");
42     test1();
43 
44     printf("\nテスト2: int型2次元配列\n");
45     test2();
46     getchar();
47     return 0;
48 }

コード表示実行結果スクリーンショット:

問題1:

1次元配列dataはメモリ上で連続して格納されています;

dataと&data[0]の値は同じです。

問題2:

2次元配列matrixはメモリ上で行単位で連続して格納されています;

matrixと&matrix[0][0]の値は同じ;

matrixと&matrix[1][0]の値は16バイト異なります;

これは1行の要素が占めるバイト数を意味します。

実験課題2

ソースコード

 1 #include <stdio.h>
 2 #define MAX_SIZE 100
 3 
 4 // 関数宣言
 5 void read_array(int values[], int size);
 6 double calculate_average(int values[], int size);
 7 
 8 int main() {
 9     int numbers[MAX_SIZE];
10     int size, index;
11     double result;
12 
13     while(printf("要素数を入力: "), scanf("%d", &size) != EOF) {
14         read_array(numbers, size);            // 関数呼び出し
15         result = calculate_average(numbers, size);    // 関数呼び出し
16         printf("平均値 = %.2f\n\n", result);
17     }
18 
19     return 0;
20 }
21 
22 // 関数定義
23 void read_array(int values[], int size) {
24     int index;
25 
26     for(index = 0; index < size; ++index)
27         scanf("%d", &values[index]);
28 }
29 
30 // 関数定義
31 double calculate_average(int values[], int size) {
32     int index, max_val, min_val;
33     double average;
34 
35     max_val = min_val = values[0];
36     average = 0;
37 
38     for(index = 0; index < size; ++index) {
39         average += values[index];
40 
41         if(values[index] > max_val)
42             max_val = values[index];
43         else if(values[index] < min_val)
44             min_val = values[index];
45     }
46 
47     average = (average - max_val - min_val)/(size-2);
48 
49     return average;
50 }

コード表示実行結果スクリーンショット

問題1:

仮引数の書き方はvoid read_array(int values[], int size);

実引数の書き方はread_array(numbers, size)。

問題2:

関数read_arrayの機能は配列を入力して格納することです;

関数calculate_averageの機能は配列の最大値と最小値を除いて平均値を計算することです。

実験課題3

ソースコード

 1 #include <stdio.h>
 2 #define DIMENSION 100
 3 
 4 // 関数宣言
 5 void display_matrix(int grid[][DIMENSION], int size);
 6 void initialize_matrix(int grid[][DIMENSION], int size, int init_value);
 7 
 8 int main() {
 9     int grid[DIMENSION][DIMENSION];
10     int size, init_value;
11 
12     while(printf("サイズと初期値を入力: "), scanf("%d%d", &size, &init_value) != EOF) {
13         initialize_matrix(grid, size, init_value);  // 関数呼び出し
14         display_matrix(grid, size);       // 関数呼び出し
15         printf("\n");
16     }
17 
18     return 0;
19 }
20 
21 // 関数定義
22 void display_matrix(int grid[][DIMENSION], int size) {
23     int row, col;
24 
25     for(row = 0; row < size; ++row) {
26         for(col = 0; col < size; ++col)
27             printf("%d ", grid[row][col]);
28         printf("\n");
29     }
30 }
31 
32 // 関数定義
33 void initialize_matrix(int grid[][DIMENSION], int size, int init_value) {
34     int row, col;
35 
36     for(row = 0; row < size; ++row)
37         for(col = 0; col < size; ++col)
38             grid[row][col] = init_value;
39 }

コード表示実行結果スクリーンショット

問題1:

仮引数の書き方はvoid display_matrix(int grid[][DIMENSION], int size) ;

実引数の書き方はdisplay_matrix(grid, size)。

問題2:

いいえ、コンパイラはエラーを出します。

問題3:

関数display_matrixの機能は2次元配列を出力することです;

関数initialize_matrixの機能は2次元配列の各要素に値を設定することです。

実験課題4

ソースコード

 1 #include <stdio.h>
 2 #define ARRAY_SIZE 100
 3 void read_data(int values[],int size);
 4 double find_median(int values[],int size);
 5 
 6 
 7 int main() {
 8     int data[ARRAY_SIZE];
 9     int size;
10     double median_value;
11 
12     while(printf("要素数を入力: "), scanf_s("%d", &size) != EOF) {
13         read_data(data, size);        // 関数呼び出し
14         median_value = find_median(data, size); // 関数呼び出し
15         printf("中央値 = %g\n\n", median_value);
16     }
17 
18     return 0;
19 }
20 void read_data(int values[],int size){
21     int index,pos;
22     for(index=0;index<size;++index)
23         scanf_s("%d",&values[index]);
24 
25 
26 }
27 double find_median(int values[],int size){
28     int i,j,temp;
29     double median;
30     for(i=0;i<size-1;++i)
31         for(j=i+1;j<size;++j)
32             if(values[j]<values[i])
33             {temp=values[i];
34     values[i]=values[j];
35     values[j]=temp;}
36     if(size%2==0)median=(values[size/2]+values[size/2-1])/2.0;
37     if(size%2!=0)median=values[(size-1)/2];
38     return median;}
39     
40         

コード表示実行結果スクリーンショット

実験課題5 ソースコード

 1 #include <stdio.h>
 2 #define SIZE 100
 3 void read_matrix(int grid[][SIZE], int dimension);
 4 void print_matrix(int grid[][SIZE], int dimension);
 5 void shift_right(int grid[][SIZE], int dimension);
 6 int main() {
 7     int matrix[SIZE][SIZE];
 8     int dimension;
 9 
10     printf("次元を入力: "); 
11     scanf_s("%d", &dimension);
12     read_matrix(matrix, dimension);
13 
14     printf("元の行列:\n");
15     print_matrix(matrix, dimension);
16     getchar();
17     shift_right(matrix, dimension);
18     printf("変換後の行列:\n");
19     print_matrix(matrix, dimension);
20     getchar();
21     return 0;
22 }
23 void read_matrix(int grid[][SIZE], int dimension) {
24     int row, col;
25     
26     for (row = 0; row < dimension; ++row) {
27         for (col = 0; col < dimension; ++col)
28             scanf_s("%d", &grid[row][col]);
29     }
30 }
31 void print_matrix(int grid[][SIZE], int dimension) {
32     int row, col;
33 
34     for (row = 0; row < dimension; ++row) {
35         for (col = 0; col < dimension; ++col)
36             printf("%4d", grid[row][col]);
37 
38         printf("\n");
39     }
40 }
41 void shift_right(int grid[][SIZE], int dimension){
42     int row,col,last_element;
43     
44     
45     
46     for(row=0;row<dimension;++row)
47         {last_element=grid[row][dimension-1];
48     for(col=dimension-1;col>0;--col)
49     grid[row][col]=grid[row][col-1];
50     grid[row][0]=last_element;
51     }
52 }

コード表示実行結果スクリーンショット

実験課題6

ソースコード

 1 #include <stdio.h>
 2 #define DIGITS 100
 3 void decimal_base(int num, int base); // 関数宣言
 4 
 5 int main() {
 6     int decimal_num;
 7 
 8     while(printf("十進整数を入力: "), scanf("%d", &decimal_num) != EOF) {
 9         decimal_base(decimal_num, 2);  // 関数呼び出し: 十進数を二進数に変換して出力
10         decimal_base(decimal_num, 8);  // 関数呼び出し: 十進数を八進数に変換して出力
11         decimal_base(decimal_num, 16); // 関数呼び出し: 十進数を十六進数に変換して出力
12 
13         printf("\n");
14     }
15 
16     return 0;
17 }
18 void decimal_base(int num, int base){
19     int digits[DIGITS],index,position;
20     if(num==0)
21     {    printf("0\n");
22     return;}
23     else{
24     for( index=0;num>0;++index)
25         {digits[index]=num%base;
26           num/=base;}
27     for( position=index-1;position>=0;--position)
28 {        if(digits[position]>=10)
29 printf("%c",'A'+(digits[position]-10));
30 else
31     printf("%d",digits[position]);}
32     printf("\n");}}

コード表示実行結果スクリーンショット

実験課題7

ソースコード

 1 #include <stdio.h>
 2 #define MAX_DIM 100
 3 
 4 // 関数宣言
 5 void fill_matrix(int square[][MAX_DIM], int size);
 6 void print_matrix(int square[][MAX_DIM], int size);
 7 int check_magic(int square[][MAX_DIM],int size);
 8 // 関数check_magicの宣言を補足
 9 // xxx
10 
11 int main() {
12     int magic_square[MAX_DIM][MAX_DIM];
13     int dimension;
14 
15     while(printf("次元を入力: "), scanf("%d", &dimension) != EOF) {
16         printf("正方行列を入力:\n");  
17         fill_matrix(magic_square, dimension); 
18 
19         printf("正方行列を出力:\n");  
20         print_matrix(magic_square, dimension);   
21 
22         if(check_magic(magic_square, dimension))
23             printf("魔方陣です\n\n");
24         else
25             printf("魔方陣ではありません\n\n");
26     }
27 
28     return 0;
29 }
30 
31 // 関数定義
32 // 機能: n*nの行列squareを入力
33 void fill_matrix(int square[][MAX_DIM], int size) {
34     int row, col;
35     
36     for (row = 0; row < size; ++row) {
37         for (col = 0; col < size; ++col)
38             scanf("%d", &square[row][col]);
39     }
40 }
41 
42 // 機能: n*nの行列squareを出力
43 void print_matrix(int square[][MAX_DIM], int size) {
44     int row, col;
45 
46     for (row = 0; row < size; ++row) {
47         for (col = 0; col < size; ++col)
48             printf("%4d", square[row][col]);
49 
50         printf("\n");
51     }
52 }
53 int check_magic(int square[][MAX_DIM],int size){
54     int row,col,row_sum,col_sum,diag1,diag2,magic_constant;
55     magic_constant=size*(size*size+1)/2;
56     for(row=0;row<size;++row){
57         row_sum=0;
58         for(col=0;col<size;++col)
59     {row_sum+=square[row][col];}
60         if(row_sum!=magic_constant)
61         return 0;}
62         for(col=0;col<size;++col){col_sum=0;
63             for(row=0;row<size;++row)
64             {col_sum+=square[row][col];}
65             if(col_sum!=magic_constant)
66             return 0;}
67         diag1=0;
68     for(row=0;row<size;++row)
69     {diag1+=square[row][row];}
70     if(diag1!=magic_constant)
71     return 0;
72     diag2=0;
73     for(row=0;row<size;++row)
74     {diag2+=square[row][size-1-row];}
75     if(diag2!=magic_constant)
76     return 0;
77             return 1;
78         }
79         
80 
81 // 機能: n次元正方行列が魔方陣か判定し、もし魔方陣なら1を、そうでなければ0を返す
82 // 関数check_magicの定義を補足
83 // xxx

コード表示実行結果スクリーンショット

タグ: C言語 配列 多次元配列 行列演算 魔方陣

6月22日 19:21 投稿