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

1.

问题1:
是一样的,int型一维数组x在内存中是连续存放的。数组名x对应的值和&x[0]在数值上是相同的,因为数组名在表达式中会被隐式转换为指向数组首元素的指针。

问题二:

    • 内存布局int型二维数组x在内存中是按行连续存放的。每一行的元素依次连续存储,存储完第一行后,紧接着存储第二行。

    • 数组名的值

      • x(二维数组名)的值是二维数组的首地址,类型为int (*)[N](指向长度为N的一维数组的指针)。

      • x[0]是第一行一维数组的首地址,类型为int *

      • &x[0][0]是第一行第一个元素的地址,类型为int *
        在字面上(数值上),xx[0]&x[0][0]是相同的,但它们的类型不同。

    • x[0]x[1]的差值

      • x[1]的地址比x[0]大 N * sizeof(int) 字节(假设N=4sizeof(int)=4,则差值为 4*4=16 字节)。

      • 这一差值表示二维数组中每一行所占的内存空间大小,即一行包含Nint元素的总字节数。

      •  

 

二维数组按行连续存储,xx[0]&x[0][0]地址值相同但类型不同,x[0]x[1]的差值表示一行占用的内存大小。

2.
  • input 函数的功能:从标准输入(键盘)读取 n 个整数,并将它们依次存储到数组 x 中。

  • compute 函数的功能:计算数组 x 中 n 个元素的“去掉一个最高分和一个最低分后的平均值”。具体逻辑如下:

    • 遍历数组,累加所有元素的总和 ans

    • 同时记录最高分 high 和最低分 low

不知哪里出了问题,无法运行程序

3.

 
  1. 二维数组作为形参的书写形式:

    • 形参:int x[][N](必须明确指定第二维的大小 N)。

    • 实参:直接传递数组名(如 init(x, n, value)),无需指定维度。

  2. 问题1的答案:

    • 二维数组作为函数形参时,第二维的大小不能省略(即列数必须明确指定,如 N)。

问题2的答案

  1. 函数 output 的功能:

    • 输出二维数组 x 的前 n 行、前 n 列的内容。

    • 具体逻辑:遍历数组的 n x n 区域,逐行打印每个元素的值,每行末尾换行。

  2. 函数 init 的功能:

    • 将二维数组 x 的前 n 行、前 n 列的所有元素初始化为 value

    • 具体逻辑:通过双重循环遍历 n x n 区域,将每个元素赋值为 value

代码关键点说明

  1. 二维数组的传递:

    • 形参必须指定列数(如 int x[][N]),因为编译器需要根据列数计算内存偏移量。

    • 实参直接传递数组名 x,无需指定维度(如 init(x, n, value))。

  2. 函数设计合理性:

    • init 和 output 均通过 n 控制实际操作的数组范围(仅前 n 行、前 n 列),而非整个 N x N 数组。

    • 这种设计使得函数可以灵活处理不同规模的二维数组(要求 n ≤ N)。

总结

  • 形参要求:二维数组作为形参时,必须指定列数(第二维大小)。

  • 函数功能:

    • init:初始化二维数组的指定区域为固定值。

    • output:输出二维数组的指定区域内容

4. 
 

#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

5.

#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;
}
}

posted @ 2025-04-21 11:45  awfasf  阅读(31)  评论(0)    收藏  举报