实验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:是连续存放的。相同
问题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;
}
`
运行测试

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

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

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

任务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");
}
`
运行测试

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


浙公网安备 33010602011771号