C言語における配列操作の実験

実験課題1

ソースコード

 1 #include <stdio.h>
 2 #define SIZE 4
 3 #define ROWS 2
 4 
 5 void demonstrate_1d_array() {
 6     int data[SIZE] = {1, 9, 8, 4};          
 7     int index;
 8 
 9     printf("sizeof(data) = %d\n", sizeof(data));
10 
11     for (index = 0; index < SIZE; ++index)
12         printf("%p: %d\n", &data[index], data[index]);
13 
14     printf("data = %p\n", data); 
15 }
16 
17 void demonstrate_2d_array() {
18     int matrix[ROWS][SIZE] = {{1, 9, 8, 4}, {2, 0, 4, 9}};
19     int row, col;
20 
21     printf("sizeof(matrix) = %d\n", sizeof(matrix));
22 
23     for (row = 0; row < ROWS; ++row)
24         for (col = 0; col < SIZE; ++col)
25             printf("%p: %d\n", &matrix[row][col], matrix[row][col]);
26     printf("\n");
27 
28     printf("matrix = %p\n", matrix);
29     printf("matrix[0] = %p\n", matrix[0]);
30     printf("matrix[1] = %p\n", matrix[1]);
31     printf("\n");
32 }
33 
34 int main() {
35     printf("テスト1: int型一次元配列\n");
36     demonstrate_1d_array();
37 
38     printf("\nテスト2: int型二次元配列\n");
39     demonstrate_2d_array();
40 
41     return 0;
42 }

実行結果

問題1:配列は連続して格納されており、変数data自体の値と&data[0]はdata[0]のメモリアドレスを指します。

問題2:行優先で連続して格納されています。アドレスの差は10で、これはおそらくdata[0]が占有するメモリサイズの差によるものです。

実験課題2

ソースコード

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

実行結果

観察:引数として渡された配列は、関数内では配列として扱われます。

問題:read_values関数はn個の数値を配列として読み込み、calculate_average関数は最大値と最小値を除いた残りの数値の平均値を計算します。

実験課題3

ソースコード

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

実行結果

問題1:二次元配列を関数の引数として渡す際、第二次元のサイズは省略できません。

問題2:print_matrixは二次元配列を出力し、initialize_matrixは二次元配列を指定されたサイズで初期化し、すべての要素に指定された値を設定します。

実験課題4

ソースコード

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

実行結果

実験課題5

ソースコード

 1 #include <stdio.h>
 2 #define MAX_DIM 100
 3 
 4 void read_matrix(int matrix[][MAX_DIM], int dimension);
 5 void display_matrix(int matrix[][MAX_DIM], int dimension);
 6 int shift_matrix_right(int matrix[][MAX_DIM],int dimension);
 7 int main() {
 8     int square[MAX_DIM][MAX_DIM];
 9     int dimension;
10 
11     printf("次元を入力: "); 
12     scanf("%d", &dimension);
13     read_matrix(square, dimension);
14 
15     printf("元の行列:\n");
16     display_matrix(square, dimension);
17 
18     // shift_matrix_right関数の呼び出し
19     square[dimension][dimension]=shift_matrix_right(square,dimension);
20 
21     printf("変換後の行列:\n");
22     display_matrix(square, dimension);
23 
24     return 0;
25 }
26 
27 
28 void read_matrix(int matrix[][MAX_DIM], int dimension) {
29     int row, col;
30     
31     for (row = 0; row < dimension; ++row) {
32         for (col = 0; col < dimension; ++col)
33             scanf("%d", &matrix[row][col]);
34     }
35 }
36 
37 void display_matrix(int matrix[][MAX_DIM], int dimension) {
38     int row, col;
39 
40     for (row = 0; row < dimension; ++row) {
41         for (col = 0; col < dimension; ++col)
42             printf("%4d", matrix[row][col]);
43 
44         printf("\n");
45     }
46 }
47 
48 int shift_matrix_right(int matrix[][MAX_DIM],int dimension){
49     int row,col,temp;
50     for(row=0;row<dimension;++row){
51         temp=matrix[row][dimension-1];
52         for(col=dimension;col>0;--col){
53            matrix[row][col]=matrix[row][col-1];
54         }
55     matrix[row][0]=temp;
56     }
57 return matrix[row][col];
58 }

実行結果

実験課題6

ソースコード

 1 #include<stdio.h>
 2 #define BUFFER_SIZE 100
 3 
 4 void convert_decimal(int number,int base);
 5 int main(){
 6     int decimal_number;
 7 
 8     while(printf("十進整数を入力:"),scanf("%d",&decimal_number)!=EOF){
 9     convert_decimal(decimal_number,2);
10     convert_decimal(decimal_number,8);
11     convert_decimal(decimal_number,16);
12     printf("\n");
13     }
14     return 0;
15 }
16 void convert_decimal(int number,int base){
17     char digits[]="0123456789ABCDEF";
18     int quotient,remainder;
19     char result[BUFFER_SIZE];
20     int position=0;
21     while(1){
22         remainder=number%base;
23         quotient=number/base;
24         result[position++]=digits[remainder];
25         if(quotient==0)
26             break;
27         number=quotient;
28 }
29     for(--position;position>=0;--position)
30         printf("%c",result[position]);
31     printf("\n");
32 }
33  

実行結果

タグ: C言語 配列 アルゴリズム メモリ管理

7月13日 21:07 投稿