实验4

#include <stdio.h>
实验任务1:
#define N 4
#define M 2
 
void test1() {
    int x[N] = {1, 9, 8, 4};          
    int i;
 
    // 输出数组x占用的内存字节数
    printf("sizeof(x) = %d\n", sizeof(x));
 
    // 输出每个元素的地址、值
    for (i = 0; i < N; ++i)
        printf("%p: %d\n", &x[i], x[i]);
 
    // 输出数组名x对应的值
      printf("x = %p\n", x);
}
 
void test2() {
    int x[M][N] = {{1, 9, 8, 4}, {2, 0, 4, 9}};
    int i, j;
 
    // 输出二维数组x占用的内存字节数
    printf("sizeof(x) = %d\n", sizeof(x));
 
    // 输出每个元素的地址、值
    for (i = 0; i < M; ++i)
        for (j = 0; j < N; ++j)
            printf("%p: %d\n", &x[i][j], x[i][j]);
    printf("\n");
 
    // 输出二维数组名x, 以及,x[0], x[1]的值
    printf("x = %p\n", x);
    printf("x[0] = %p\n", x[0]);
    printf("x[1] = %p\n", x[1]);
    printf("\n");
}
 
int main() {
    printf("测试1: int型一维数组\n");
    test1();
 
    printf("\n测试2: int型二维数组\n");
    test2();
 
    return 0;
}
问题1:是的,是连续存放,不同,一个是int型,另一个是地址。
问题2:是连续存放,不同,x0与x1相差16字节,差值是以行连续存放间相差的地址位数。
 

image

 

实验任务2:
#include <stdio.h>
#define N 100
 
// 函数声明
void input(int x[], int n);
double compute(int x[], int n);
 
int main() {
    int x[N];
    int n, i;
    double ans;
 
    while(printf("Enter n: "), scanf("%d", &n) != EOF) {
        input(x, n);            // 函数调用
        ans = compute(x, n);    // 函数调用
        printf("ans = %.2f\n\n", ans);
    }
 
    return 0;
}
 
// 函数定义
void input(int x[], int n) {
    int i;
 
    for(i = 0; i < n; ++i)
        scanf("%d", &x[i]);
}
 
// 函数定义
double compute(int x[], int n) {
    int i, high, low;
    double ans;
 
    high = low = x[0];
    ans = 0;
 
    for(i = 0; i < n; ++i) {
        ans += x[i];
 
        if(x[i] > high)
            high = x[i];
        else if(x[i] < low)
            low = x[i];
    }
 
    ans = (ans - high - low)/(n-2);
 
    return ans;
}

image

 

问题1:
形参的书写形式是数组与int类型,实参是char与int类型。
问题2:
input用来给数组赋值与初始化,compute用来找出数组中的最大最小值。
 
实验任务3:
#include <stdio.h>
#define N 100
 
// 函数声明
void output(int x[][N], int n);
void init(int x[][N], int n, int value);
 
int main() {
    int x[N][N];
    int n, value;
 
    while(printf("Enter n and value: "), scanf("%d%d", &n, &value) != EOF) {
        init(x, n, value);  // 函数调用
        output(x, n);       // 函数调用
        printf("\n");
    }
 
    return 0;
}
 
// 函数定义
void output(int x[][N], int n) {
    int i, j;
 
    for(i = 0; i < n; ++i) {
        for(j = 0; j < n; ++j)
            printf("%d ", x[i][j]);
        printf("\n");
    }
}
 
// 函数定义
void init(int x[][N], int n, int value) {
    int i, j;
 
    for(i = 0; i < n; ++i)
        for(j = 0; j < n; ++j)
            x[i][j] = value;
}

image

问题1:
output形参是intx【】【N】,实参是x
问题2:

image

 很明显不行,所以无法省略。

问题3:

output是输出数组里的所有元素;init是将整数value赋值给数组中的所有元素。

实验任务4:

#include <stdio.h>
#define N 100

// 函数声明
// 待补足
// xxx
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){
for(int t = 0;t<n;++t){
scanf("%d",&x[t]);
}
}
double median(int x[],int n){
int change;
for(int k = 0;k<n*(n-1)/2;++k){ //可能的所有情况
for(int i = 0;i<n;++i){
if(x[i]>x[i+1]){ //冒泡大小排序
change = x[i];
x[i] = x[i+1];
x[i+1] = change;
}
}
}
if(n%2!=0){
return x[n/2+1];
}
else
return (x[n/2+1]+x[n/2])/2.0;

}
// 函数定义
// 待补足
// xxx

屏幕截图 2025-11-16 141926

 

实验任务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("输入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的矩阵x
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的矩阵x
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");
}
}

// 函数rotate_to_right定义
// 功能: 把一个n*n的矩阵x,每一列向右移, 最右边一列绕回左边
void rotate_to_right(int x[][N],int n){
int i,j;
int t[N];
for (i = 0; i < n; i++) {
t[i] = x[i][n-1];
}

for (j = n-1; j > 0; j--) {
for (i = 0; i < n; i++) {
x[i][j] = x[i][j-1];
}
}

for (i = 0; i < n; i++) {
x[i][0] = t[i];
}
}

 屏幕截图 2025-11-16 163534

实验任务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;
}

// 函数定义
// 功能:把十进制数x转换成n进制,打印输出
void dec_to_n(int x, int n) {
char digits[] = "0123456789ABCDEF";
char result[N]; // 存储转换结果
int index = 0;
int is_negative = 0;
int temp;


if (x == 0) {
printf("0\n");
return;
}

// 处理负数情况
if (x < 0) {
is_negative = 1;
temp = -x;
} else {
temp = x;
}

while (temp > 0) {
result[index++] = digits[temp % n];
temp = temp / n;
}

// 如果是负数,输出负号
if (is_negative) {
printf("-");
}

// 逆序输出
for (int i = index-1; i >= 0; i--) {
printf("%c", result[i]);
}
printf("\n");
} 屏幕截图 2025-11-16 203931

实验任务7:

#include <stdio.h>
#define N 100

// 函数声明
void input(int x[][N], int n);
void output(int x[][N], int n);
// 待补足函数is_magic声明
int is_magic(int[][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;
}

// 函数定义
// 功能: 输入一个n*n的矩阵x
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的矩阵x
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");
}
}


// 功能: 判断一个n阶方阵是否为魔方矩阵,如果是,返回1,否则,返回0
// 待补足函数is_magic定义
int is_magic(int x[][N], int n) {
int used[N*N+1] = {0}; // 标记数组,检查1到n^2是否都出现且不重复
int sum, temp_sum;
int i, j;

// 检查是否包含1到n^2的所有数字且不重复
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
int num = x[i][j];
if (num < 1 || num > n*n || used[num]) {
return 0; // 数字不在1到n^2范围内或重复出现
}
used[num] = 1;
}
}

// 计算第一行的和作为基准值
sum = 0;
for (j = 0; j < n; j++) {
sum += x[0][j];
}

// 检查每行的和
for (i = 1; i < n; i++) {
temp_sum = 0;
for (j = 0; j < n; j++) {
temp_sum += x[i][j];
}
if (temp_sum != sum) return 0;
}

// 检查每列的和
for (j = 0; j < n; j++) {
temp_sum = 0;
for (i = 0; i < n; i++) {
temp_sum += x[i][j];
}
if (temp_sum != sum) return 0;
}

// 检查主对角线
temp_sum = 0;
for (i = 0; i < n; i++) {
temp_sum += x[i][i];
}
if (temp_sum != sum) return 0;

// 检查副对角线
temp_sum = 0;
for (i = 0; i < n; i++) {
temp_sum += x[i][n-1-i];
}
if (temp_sum != sum) return 0;

return 1;
}屏幕截图 2025-11-16 211657

屏幕截图 2025-11-16 211755

 

 

 

 
 
 
posted @ 2025-11-16 21:19  呼-  阅读(0)  评论(0)    收藏  举报