実験課題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
実行結果