实验四

task1
#include <stdio.h>
#define N 4
#define M 2
void test1() {
int x[N] = {1, 9, 8, 4};
int i;
printf("sizeof(x) = %d\n", sizeof(x));
for (i = 0; i < N; ++i)
printf("%p: %d\n", &x[i], x[i]);
printf("x = %p\n", x);
}
void test2() {
int x[M][N] = {{1, 9, 8, 4}, {2, 0, 4, 9}};
int i, j;
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");
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;
}

05455c4fde303e9c7f21dd9879190d51

q1:一维数组连续存放,按照定义顺序依次排列;x代表数组首元素的地址和&x[0]的值相同

q2:二维数组按照行优先连续存放,地址连续;x、x[0]和&x[0][0]的值相同,都表示二维数组的起始地址;x[0]和x[1]差N*sizeof(int)即16字节,表示二维数组一行元素占用的总内存字数

task2

#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

 q1:形参:int x[];实参:x

q2:input:从键盘读取n个整数,存入数组x;compute:计算数组x中去掉最大最小值后的平均值

task3

#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

 q1:形参:int x[][N];实参:x

q2:不能省略,编译器需要知道每一行的长度才能正确计算二维数组元素的地址,否则会报错

q3:output:按行输出n*n二维数组的所有元素;init:将n*n二维数组的所有元素初始化为指定的value值

task4

#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 (int i = 0; i < n; i++) {
scanf("%d", &x[i]);
}
}
double median(int x[], int n) {
int i,j;
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-1-i; j++) {
if (x[j] > x[j+1]) {
int 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;
}
}

image

 task5

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

image

task6
#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 remainders[N];
int i=0;
int j;
if(x==0){
printf("0\n");
return;
}
while(x!=0){
remainders[i]=x%n;
x=x/n;
i++;
}
for ( int j = i-1;j>=0;j--){
if(remainders[j]<10){
printf("%d",remainders[j]);
}else{
printf("%c",remainders[j]-10+'A');
}
}
printf("\n");
}

7d4f0050d37d4743834c5bc52b2a9d07_720

 task7

#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 i, j;
int sum;
int magic_sum = n * (n * n + 1) / 2;
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;
}

image

image

 魔方矩阵核心逻辑:

1. 计算幻和:根据阶数  n  计算标准幻和  magic_sum = n*(n²+1)/2 。
2. 行校验:遍历每一行,求和并与幻和对比,有一行不符则不是魔方矩阵。
3. 列校验:遍历每一列,求和并与幻和对比,有一列不符则不是魔方矩阵。
4. 对角线校验:分别计算主、副对角线的和,与幻和对比,不符则不是魔方矩阵。
5. 返回结果:若以上所有校验均通过,则为魔方矩阵,返回1;否则返回0。

posted @ 2026-05-05 23:19  刘君瑞  阅读(0)  评论(0)    收藏  举报