实验 4 C 语⾔数组应⽤编程
1.

问题1:
是一样的,int型一维数组x在内存中是连续存放的。数组名x对应的值和&x[0]在数值上是相同的,因为数组名在表达式中会被隐式转换为指向数组首元素的指针。
问题二:
-
内存布局:
int型二维数组x在内存中是按行连续存放的。每一行的元素依次连续存储,存储完第一行后,紧接着存储第二行。 -
数组名的值:
-
x(二维数组名)的值是二维数组的首地址,类型为int (*)[N](指向长度为N的一维数组的指针)。 -
x[0]是第一行一维数组的首地址,类型为int *。 -
&x[0][0]是第一行第一个元素的地址,类型为int *。
在字面上(数值上),x、x[0]和&x[0][0]是相同的,但它们的类型不同。
-
-
x[0]和x[1]的差值:-
x[1]的地址比x[0]大N * sizeof(int)字节(假设N=4,sizeof(int)=4,则差值为4*4=16字节)。 -
这一差值表示二维数组中每一行所占的内存空间大小,即一行包含
N个int元素的总字节数。 -
-
二维数组按行连续存储,x、x[0]和&x[0][0]地址值相同但类型不同,x[0]和x[1]的差值表示一行占用的内存大小。
-
input函数的功能:从标准输入(键盘)读取n个整数,并将它们依次存储到数组x中。 -
compute函数的功能:计算数组x中n个元素的“去掉一个最高分和一个最低分后的平均值”。具体逻辑如下:-
遍历数组,累加所有元素的总和
ans。 -
同时记录最高分
high和最低分low。
-
不知哪里出了问题,无法运行程序
3.

-
二维数组作为形参的书写形式:
-
形参:
int x[][N](必须明确指定第二维的大小N)。 -
实参:直接传递数组名(如
init(x, n, value)),无需指定维度。
-
-
问题1的答案:
-
二维数组作为函数形参时,第二维的大小不能省略(即列数必须明确指定,如
N)。
-
问题2的答案
-
函数
output的功能:-
输出二维数组
x的前n行、前n列的内容。 -
具体逻辑:遍历数组的
n x n区域,逐行打印每个元素的值,每行末尾换行。
-
-
函数
init的功能:-
将二维数组
x的前n行、前n列的所有元素初始化为value。 -
具体逻辑:通过双重循环遍历
n x n区域,将每个元素赋值为value。
-
代码关键点说明
-
二维数组的传递:
-
形参必须指定列数(如
int x[][N]),因为编译器需要根据列数计算内存偏移量。 -
实参直接传递数组名
x,无需指定维度(如init(x, n, value))。
-
-
函数设计合理性:
-
init和output均通过n控制实际操作的数组范围(仅前n行、前n列),而非整个N x N数组。 -
这种设计使得函数可以灵活处理不同规模的二维数组(要求
n ≤ N)。
-
总结
-
形参要求:二维数组作为形参时,必须指定列数(第二维大小)。
-
函数功能:
-
init:初始化二维数组的指定区域为固定值。 -
output:输出二维数组的指定区域内容
-
#include <stdio.h>
#include <stdlib.h> // 用于qsort函数
#define N 100
// 函数声明
void input(int arr[], int n);
double median(int arr[], int n);
// 比较函数,用于qsort
int compare(const void* a, const void* b) {
return (*(int*)a - *(int*)b);
}
// 输入函数
void input(int arr[], int n) {
printf("Enter %d integers: ", n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
}
// 计算中值函数
double median(int arr[], int n) {
// 先对数组进行排序
qsort(arr, n, sizeof(int), compare);
if (n % 2 == 1) {
// 奇数个元素,返回中间值
return arr[n / 2];
}
else
#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;
}
// 函数定义:输入n*n矩阵
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]);
}
}
// 函数定义:输出n*n矩阵
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 temp[N][N];
int i, j;
// 将原矩阵按列右移后的结果存入临时矩阵
for (i = 0; i < n; ++i) {
for (j = 0; j < n; ++j) {
int new_col = (j - 1 + n) % n;
temp[i][j] = x[i][new_col];
}
}
// 将临时矩阵复制回原矩阵
for (i = 0; i < n; ++i) {
for (j = 0; j < n; ++j) {
x[i][j] = temp[i][j];
}
}
}
6.

#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); // 函数调用: 把x转换成二进制输出
dec_to_n(x, 8); // 函数调用: 把x转换成八进制输出
dec_to_n(x, 16); // 函数调用: 把x转换成十六进制输出
printf("\n");
}
return 0;
}
void dec_to_n(int x, int n) {
char digits[] = "0123456789ABCDEF"; // 用于十六进制的字符表示
char result[N];
int i = 0;
// 处理0的特殊情况
if (x == 0) {
printf("0\n");
return;
}
// 如果是负数,先输出负号,然后转为正数处理
if (x < 0) {
printf("-");
x = -x;
}
// 通过除n取余法得到各位数字
while (x > 0) {
result[i++] = digits[x % n];
x /= n;
}
// 逆序输出结果
for (int j = i - 1; j >= 0; j--) {
printf("%c", result[j]);
}
// 输出进制标识
switch (n) {
case 2: printf("(B)\t"); break;
case 8: printf("(O)\t"); break;
case 16: printf("(H)\t"); break;
}
}
浙公网安备 33010602011771号