实验4

任务1

点击查看代码
#include <stdio.h>

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

屏幕截图 2026-05-05 161143

问题1:是连续存放;x和&x[0]的值相同。
问题2:是按行存放的;三者的值相同。

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

屏幕截图 2026-05-05 170909

问题1:一维数组作为参数时(以 input 函数为例),形参书写形式是int arr[]或者int*arr,实参书写形式是直接写数组名,例如input(arr,n)
问题2:函数 input 的功能是用于读取n个整数存入一维数组;函数 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;
}

屏幕截图 2026-05-05 172754

问题1:形参为int x[][N],实参为二维数组名;
问题2:第二维大小不能省略,写成x[][]编译器会报错。
问题3:output按行打印二维数组元素,init将二维数组所有元素初始化为指定值。

任务4

点击查看代码
#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_s("%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 = 0;
    for (; i < n; i++) {
        scanf_s("%d", &x[i]);

	}

}
double median(int x[], int n) {
    double ans;
    if (n % 2 == 0) {
        ans = (x[(n - 2) / 2] + x[n / 2]) / 2;

	}
	else
    ans = x[(n - 1) / 2];
    return ans;

}

屏幕截图 2026-05-05 231140

任务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_s("%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_s("%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 y[N][N];
    int i, j;
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            y[i][j] = x[i][j];
        }
    }
    int m, e;
    for (m = 0; m < n; m++) {
        for (e = 0; e < n - 1; e++) {
            x[m][e + 1] = y[m][e];
        }
        x[m][0] = y[m][n - 1];
    }
}

image

任务6

点击查看代码
#include <stdio.h>
#define N 100

void dec_to_n(int x, int n);

int main() {
    int x;

    while (printf("输入十进制整数: "), scanf_s("%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 y[N];
    int i = 0, j;
    while (x != 0) {
        y[i++] = x % n;
        x = x / n;
    }
    for (j = i - 1; j >= 0; j--) {
        if (y[j] < 10)
            printf("%d", y[j]);
        else
            printf("%c", 'A' - 10 + y[j]);
    }
    printf("\n");
}

屏幕截图 2026-05-05 231935

任务7

点击查看代码
#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_s("%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_s("%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 sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0;
    int i, j, a = 0, b = 0, c, d;
    int standard = n * (n * n + 1) / 2;

    // 检查每一行
    for (i = 0; i < n; i++) {
        sum1 = 0;
        for (j = 0; j < n; j++) {
            sum1 += x[i][j];
        }
        if (sum1 == standard)
            a++;
    }

    // 检查每一列
    for (i = 0; i < n; i++) {
        sum2 = 0;
        for (j = 0; j < n; j++) {
            sum2 += x[j][i];
        }
        if (sum2 == standard)
            b++;
    }

    // 主对角线
    sum3 = 0;
    for (i = 0, j = 0; i < n; i++, j++) {
        sum3 += x[i][j];
    }
    c = (sum3 == standard);

    // 副对角线
    sum4 = 0;
    for (i = n - 1, j = 0; i >= 0; i--, j++) {
        sum4 += x[i][j];
    }
    d = (sum4 == standard);

    if (a == n && b == n && c && d)
        return 1;
    else
        return 0;
}

屏幕截图 2026-05-05 233002

该算法的核心逻辑如下:
根据魔方矩阵性质,n阶魔方的每行/列/对角线和固定为  standard = n*(n²+1)/2 。遍历矩阵每一行,计算元素和并与标准值比较,统计符合条件的行数。遍历矩阵每一列,计算元素和并与标准值比较,统计符合条件的列数。分别计算主、副对角线的元素和,判断是否等于标准值。当所有行、列及两条对角线的和均等于标准值时,判定为魔方矩阵。

posted @ 2026-05-05 23:34  大咸鱼半条  阅读(8)  评论(0)    收藏  举报