实验4
实验1
问题1:一维数组x在内存中是否连续存放?x和&x[0]的值相同吗?
一维数组在内存中是连续存放的。数组的所有元素在内存中占据一段连续的地址空间,元素按下标顺序依次排列,相邻元素的地址差等于单个元素的字节大小;
两者的值完全相同
问题2:二维数组x在内存中是否按行连续存放?x、x[0]和&x[0][0]的值相同吗?x[0]和x[1]相差多少?该差值的 含义是什么?
二维数组在内存中是按行连续存放的。C 语言的二维数组本质是 “数组的数组”,先存储第 0 行的所有元素(x[0][0] 到 x[0][3]),再存储第 1 行的所有元素(x[1][0] 到 x[1][3]),整体是一段连续的内存空间
三者的值完全相同;相差 16 字节
实验二
问题1:一维数组作为参数时(以 input 函数为例),形参、实参书写形式分别是什么?
形参 数组形式:void input(int x[], int n);指针形式:void input(int *x, int n);
实参直接传递数组名即可,数组名会隐式转换为指向数组首元素的指针。
问题2:函数 input 的功能是?函数 compute 的功能是?
input 从标准输入读取 n 个整数,并依次存入一维数组 x 中
compute 计算数组 x 中去掉最大值和最小值后的平均值
实验三
问题1:两维数组作为函数参数时(以函数 output 为例),形参、实参书写形式分别是什么?
形参 数组名[ ][第二维大小]
实参 直接写数组名
问题2:两维数组作为函数形参时,第二维大小能省略吗?(以函数 output 为例,试着把形参 x[][N] 写成 x[] [] ,编译代码,观察编译器是否报错)
不能省略,会报错
问题3:函数 output 的功能是?函数 init 的功能是?
按行列格式输出 n×n 二维数组的所有元素;
将 n×n 二维数组的所有元素赋值为指定的 value。
实验四
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #define N 100 void input(int x[], int n); double median(int x[], int n); int main() { int x[N]; int n; double ans; while (printf("Enter n: "), scanf("%d", &n) != EOF) { input(x, n); ans = median(x, n); printf("ans = %g\n\n", ans); } return 0; } void input(int x[], int n) { int i; for (i = 0; i < n; ++i) { scanf("%d", &x[i]); } } double median(int x[], int n) { int i, j, temp; for (i = 0; i < n - 1; ++i) { for (j = 0; j < n - 1 - i; ++j) { if (x[j] > x[j + 1]) { temp = x[j]; x[j] = x[j + 1]; x[j + 1] = temp; } } } if (n % 2 == 1) { return x[n / 2]; } else { return (x[n / 2 - 1] + x[n / 2]) / 2.0; } }

实验五
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #define N 100 void input(int x[][N], int n); void output(int x[][N], int n); void rotate_to_right(int x[][N], int n); int main() { int x[N][N]; int n; printf("Enter n: "); scanf("%d", &n); input(x, n); printf("原始矩阵:\n"); output(x, n); rotate_to_right(x, n); printf("变换后矩阵:\n"); output(x, n); return 0; } void input(int x[][N], int n) { int i, j; for (i = 0; i < n; ++i) { for (j = 0; j < n; ++j) { scanf("%d", &x[i][j]); } } } void output(int x[][N], int n) { int i, j; for (i = 0; i < n; ++i) { for (j = 0; j < n; ++j) { printf("%4d", x[i][j]); } printf("\n"); } } void rotate_to_right(int x[][N], int n) { int i, j; int temp; for (i = 0; i < n; ++i) { temp = x[i][n - 1]; for (j = n - 1; j > 0; --j) { x[i][j] = x[i][j - 1]; } x[i][0] = temp; } }

实验六
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #define N 100 void dec_to_n(int x, int n); int main() { int x; while (printf("输入十进制整数: "), scanf("%d", &x) != EOF) { dec_to_n(x, 2); dec_to_n(x, 8); dec_to_n(x, 16); printf("\n"); } return 0; } void dec_to_n(int x, int n) { int arr[N]; int i = 0, j; int remainder; if (x == 0) { printf("0\n"); return; } while (x != 0) { remainder = x % n; arr[i] = remainder; i++; x = x / n; } for (j = i - 1; j >= 0; j--) { if (arr[j] < 10) { printf("%d", arr[j]); } else { printf("%c", 'A' + (arr[j] - 10)); } } printf("\n"); }

实验七
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #define N 100 void input(int x[][N], int n); void output(int x[][N], int n); int is_magic(int x[][N], int n); int main() { int x[N][N]; int n; while (printf("输入n: "), scanf("%d", &n) != EOF) { printf("输入方阵:\n"); input(x, n); printf("输出方阵:\n"); output(x, n); if (is_magic(x, n)) printf("是魔方矩阵\n\n"); else printf("不是魔方矩阵\n\n"); } return 0; } void input(int x[][N], int n) { int i, j; for (i = 0; i < n; ++i) { for (j = 0; j < n; ++j) { scanf("%d", &x[i][j]); } } } void output(int x[][N], int n) { int i, j; for (i = 0; i < n; ++i) { for (j = 0; j < n; ++j) { printf("%4d", x[i][j]); } printf("\n"); } } int is_magic(int x[][N], int n) { int magic_sum = n * (n * n + 1) / 2; int i, j, sum; for (i = 0; i < n; ++i) { sum = 0; for (j = 0; j < n; ++j) { sum += x[i][j]; } if (sum != magic_sum) return 0; } for (j = 0; j < n; ++j) { sum = 0; for (i = 0; i < n; ++i) { sum += x[i][j]; } if (sum != magic_sum) return 0; } sum = 0; for (i = 0; i < n; ++i) { sum += x[i][i]; } if (sum != magic_sum) return 0; sum = 0; for (i = 0; i < n; ++i) { sum += x[i][n - 1 - i]; } if (sum != magic_sum) return 0; return 1; }

浙公网安备 33010602011771号