实验4

任务一
源代码
`

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;
}
`
运行测试

任务1运行测试结果

问题1:是连续存放的。相同
问题2:是连续存放的。相同,相差16字节,含义是一行元素所占的内存大小。

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

}
`
运行测试

任务2运行测试

问题1:形参书写形式:int x[] 和int*n;实参书写形式:input (x,n)
问题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:形参书写形式:int x[][N];实参书写形式:output(x, n)
问题2:不能,报错了
问题3:函数output的功能:按方阵格式打印n×n的二维数组,元素间用空格分隔,行末换行;函数int的功能:将n×n的二维数组中所有元素初始化为输入的value值。

任务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("%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(i = 0; i < n; ++i) {
scanf("%d", &x[i]);
}
}

double median(int x[], int n) {

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


if(n % 2 != 0) {  
    return (double)x[n/2];
} else {  
    return (x[n/2-1] + x[n/2]) / 2.0;
}

}
`

运行测试

任务4运行测试

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

}

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

}

`
运行测试

任务5运行测试

任务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);
dec_to_n(x, 8);
dec_to_n(x, 16);
printf("\n");
}
return 0;
}

void dec_to_n(int x, int n) {
int t[N];
int i = 0;
if (x == 0) {
printf("0\n");
return;
}

while (x != 0) {
    t[i] = x % n;
    x = x / n;
    i++;
}

for (int j = i - 1; j >= 0; j--) {
    if (t[j] >= 10) {
        printf("%c", 'A' + t[j] - 10);
    } else {
        printf("%d", t[j]);
    }
}
printf("\n");

}
`
运行测试

任务6运行测试

任务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("%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 hang, lie, sum1, sum2;
int sum;

if (x[0][0]=x[0][1]) 
{
return 0;
}



sum = 0;
for (j = 0; j < n; ++j) {
    sum += x[0][j];
}


for (i = 1; i < n; ++i) {
    hang= 0;
    for (j = 0; j < n; ++j) {
        hang += x[i][j];
    }
    if (hang != hang) {
        return 0;
    }
}


for (j = 0; j < n; ++j) {
    lie= 0;
    for (i = 0; i < n; ++i) {
        lie += x[i][j];
    }
    if (lie != lie) {
        return 0;
    }
}

sum1 = 0;
for (i = 0; i < n; ++i) {
    sum1 += x[i][i];
}
if (sum1 != sum) {
    return 0;
}


sum2 = 0;
for (i = 0; i < n; ++i) {
    sum2 += x[i][n - 1 - i];
}
if (sum2 != sum) {
    return 0;
}


return 1;

}
`
运行测试

任务7运行测试

posted @ 2025-11-17 09:39  梁宜萱  阅读(4)  评论(0)    收藏  举报