数组操作与算法实现指南
任务1:一维与二维数组内存分析
程序代码
1 #include <stdio.h>
2 #define SIZE 4
3 #define ROWS 2
4 #include <stdlib.h>
5
6 void demonstrate_1d_array() {
7 int data[SIZE] = {1, 9, 8, 4};
8 int index;
9
10 // 显示数组data占用的内存大小
11 printf("数组data占用的字节数: %d\n", sizeof(data));
12
13 // 显示每个元素的内存地址和值
14 for (index = 0; index < SIZE; ++index)
15 printf("地址 %p: 值 %d\n", &data[index], data[index]);
16
17 // 显示数组名data对应的地址
18 printf("数组名data的地址: %p\n", data);
19 }
20
21 void demonstrate_2d_array() {
22 int matrix[ROWS][SIZE] = {{1, 9, 8, 4}, {2, 0, 4, 9}};
23 int row, col;
24
25 // 显示二维数组matrix占用的内存大小
26 printf("二维数组matrix占用的字节数: %d\n", sizeof(matrix));
27
28 // 显示每个元素的地址和值
29 for (row = 0; row < ROWS; ++row)
30 for (col = 0; col < SIZE; ++col)
31 printf("地址 %p: 值 %d\n", &matrix[row][col], matrix[row][col]);
32 printf("\n");
33
34 // 显示二维数组名matrix, 以及matrix[0], matrix[1]的地址
35 printf("matrix地址: %p\n", matrix);
36 printf("matrix[0]地址: %p\n", matrix[0]);
37 printf("matrix[1]地址: %p\n", matrix[1]);
38 printf("\n");
39 }
40
41 int main() {
42 printf("演示1: 整型一维数组\n");
43 demonstrate_1d_array();
44
45 printf("\n演示2: 整型二维数组\n");
46 demonstrate_2d_array();
47 system("pause");
48 return 0;
49 }
问题与解答
-
是;是
-
是;是;相差16字节,表示该二维数组中一行元素总共占用16字节内存空间
任务2:去除极值后平均值计算
程序代码
1 #include <stdio.h>
2 #define MAX_SIZE 100
3
4 // 函数声明
5 void read_values(int values[], int count);
6 double calculate_average(int values[], int count);
7
8 int main() {
9 int numbers[MAX_SIZE];
10 int count, i;
11 double result;
12
13 while(printf("请输入元素个数: "), scanf("%d", &count) != EOF) {
14 read_values(numbers, count); // 调用函数读取数据
15 result = calculate_average(numbers, count); // 调用函数计算结果
16 printf("计算结果: %.2f\n\n", result);
17 }
18
19 return 0;
20 }
21
22 // 函数定义:读取用户输入的数据
23 void read_values(int values[], int count) {
24 int index;
25
26 for(index = 0; index < count; ++index)
27 scanf("%d", &values[index]);
28 }
29
30 // 函数定义:计算去除最大值和最小值后的平均值
31 double calculate_average(int values[], int count) {
32 int index, max_val, min_val;
33 double sum;
34
35 max_val = min_val = values[0];
36 sum = 0;
37
38 for(index = 0; index < count; ++index) {
39 sum += 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 sum = (sum - max_val - min_val)/(count-2);
48
49 return sum;
50 }
问题与解答
-
形参写法:int a[] 或 int a[M](M为元素个数);实参写法:直接使用数组名,如array
-
read_values函数功能:根据用户指定的元素个数,将输入的数字存入数组中
calculate_average函数功能:计算数组中去除最大值与最小值后剩余元素的平均值,并将结果返回
任务3:二维数组初始化与输出
程序代码
1 #include <stdio.h>
2 #define DIMENSION 100
3
4 // 函数声明
5 void print_matrix(int matrix[][DIMENSION], int size);
6 void fill_matrix(int matrix[][DIMENSION], int size, int initial_value);
7
8 int main() {
9 int grid[DIMENSION][DIMENSION];
10 int size, value;
11
12 while(printf("请输入矩阵大小和初始值: "), scanf("%d%d", &size, &value) != EOF) {
13 fill_matrix(grid, size, value); // 调用函数初始化矩阵
14 print_matrix(grid, size); // 调用函数输出矩阵
15 printf("\n");
16 }
17
18 return 0;
19 }
20
21 // 函数定义:输出二维矩阵
22 void print_matrix(int matrix[][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 ", matrix[row][col]);
28 printf("\n");
29 }
30 }
31
32 // 函数定义:用指定值初始化矩阵
33 void fill_matrix(int matrix[][DIMENSION], int size, int initial_value) {
34 int row, col;
35
36 for(row = 0; row < size; ++row)
37 for(col = 0; col < size; ++col)
38 matrix[row][col] = initial_value;
39 }
问题与解答
-
二维数组作为函数参数时,第二维大小不能省略
-
print_matrix函数功能:按行输出二维矩阵的所有元素
fill_matrix函数功能:将矩阵中的所有元素设置为指定的初始值
任务4:数组中位数计算
程序代码
1 #include <stdio.h>
2 #define CAPACITY 100
3
4 void read_data(int data[], int count);
5 double find_median(int data[], int count);
6
7 int main() {
8 int values[CAPACITY];
9 int count;
10 double median_value;
11
12 while(printf("请输入元素个数: "), scanf("%d", &count) != EOF) {
13 read_data(values, count);
14 median_value = find_median(values, count);
15 printf("中位数: %g\n\n", median_value);
16 }
17
18 return 0;
19 }
20
21 void read_data(int data[],int count) {
22 int index;
23 for (index=0; index< count;index++) {
24 scanf("%d",&data[index]);
25 }
26 }
27
28 double find_median(int data[], int count) {
29 int i, j;
30 int temporary;
31
32 // 使用冒泡排序对数组进行排序
33 for (i=0;i<count-1;++i){
34 for(j=0;j<count-i-1;++j){
35 if(data[j]>data[j+1]){
36 temporary = data[j];
37 data[j] = data[j+1];
38 data[j+1]=temporary;}
39 }
40 }
41
42 // 计算中位数
43 if(count%2==0){
44 return ((double)data[count/2-1]+(double)data[count/2])/2;
45 }
46 else{
47 return (double)data[count/2];
48 }
49 }
任务5:矩阵右旋操作
程序代码
1 #include <stdio.h>
2 #define MAX_DIM 100
3 #include <stdlib.h>
4
5 // 函数声明
6 void populate_matrix(int matrix[][MAX_DIM], int size);
7 void display_matrix(int matrix[][MAX_DIM], int size);
8 void shift_columns_right(int matrix[][MAX_DIM], int size);
9
10 int main() {
11 int square[MAX_DIM][MAX_DIM];
12 int dimension;
13
14 printf("请输入矩阵大小: ");
15 scanf("%d", &dimension);
16 populate_matrix(square, dimension);
17
18 printf("原始矩阵:\n");
19 display_matrix(square, dimension);
20
21 shift_columns_right(square, dimension);
22
23 printf("变换后矩阵:\n");
24 display_matrix(square, dimension);
25 system("pause");
26 return 0;
27 }
28
29 // 函数定义:填充矩阵数据
30 void populate_matrix(int matrix[][MAX_DIM], int size) {
31 int row, col;
32
33 for (row = 0; row < size; ++row) {
34 for (col = 0; col < size; ++col)
35 scanf("%d", &matrix[row][col]);
36 }
37 }
38
39 // 函数定义:显示矩阵内容
40 void display_matrix(int matrix[][MAX_DIM], int size) {
41 int row, col;
42
43 for (row = 0; row < size; ++row) {
44 for (col = 0; col < size; ++col)
45 printf("%4d", matrix[row][col]);
46
47 printf("\n");
48 }
49 }
50
51 // 函数定义:将矩阵各列向右移动一位
52 void shift_columns_right(int matrix[][MAX_DIM], int size) {
53 int temp[MAX_DIM][MAX_DIM];
54 int row, col, i, j;
55
56 // 将最后一列保存到临时矩阵的第一列
57 for(row=0;row<size;++row){
58 temp[row][0]=matrix[row][size-1];}
59
60 // 将其他列向右移动一位
61 for(col=1;col<size;++col){
62 for(row=0;row<size;++row){
63 temp[row][col]=matrix[row][col-1];}
64 }
65
66 // 将结果复制回原矩阵
67 for( row=0;row<size;++row){
68 for( col=0;col<size;++col){
69 matrix[row][col]=temp[row][col];}
70 }
71 }
任务6:进制转换程序
程序代码
1 #include <stdio.h>
2 #define DIGITS 100
3
4 void convert_decimal(int number, int base); // 函数声明
5
6 int main() {
7 int decimal_num;
8
9 while(printf("请输入十进制整数: "), scanf("%d", &decimal_num) != EOF) {
10 convert_decimal(decimal_num, 2); // 转换为二进制
11 convert_decimal(decimal_num, 8); // 转换为八进制
12 convert_decimal(decimal_num, 16); // 转换为十六进制
13
14 printf("\n");
15 }
16
17 return 0;
18 }
19
20 void convert_decimal(int number, int base) {
21 int digits[DIGITS];
22 int index = 0;
23 int remainder;
24
25 // 将十进制数转换为指定进制的各位数字
26 while (number > 0) {
27 digits[index] = number % base;
28 number = number / base;
29 index++;
30 }
31
32 // 从高位到低位输出结果
33 index--;
34 while (index >= 0) {
35 if (base == 16 && digits[index] >= 10) {
36 printf("%c", 'A' + digits[index] - 10);}
37 else {
38 printf("%d", digits[index]);}
39 index--;}
40 printf("\n");
41 }