实验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("测试2:int型二维数组\n"); test2(); return 0; }
代码运行结果:

实验问题回答:
问题一:连续;x[0]和&x[0]的值相同
问题二:是按行连续存放;两者的值相同;差10字节;差值表示该二维数组一行占用的总字节
实验任务二:
源代码:
#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; }
代码运行结果:

实验问题回答:
问题一:形参:int x[],实参:x
问题二:input的功能是将输入的n个数(n小于等于100且n为整数)从x[0]开始依次赋值给x[i];compute的功能是通过循环判断出n个数中的最大值和最小值,并求出n个数字的平均值
实验任务三:
源代码:
#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; }
代码运行结果:

实验问题回答:
问题一:形式参数:x[][N];实际参数:x
问题二:不可以,编译器报错

问题三:output的功能是打印n行输入的数(value),每行有n个value,及打印n*n个value
Init的功能是通过循环令x[][N]的值等于value
实验任务四:
源代码:
#include <stdio.h> #define N 100 void input(int x[N],int n); double median(int x[N],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[N],int n) { int i; for(i = 0;i < n;++i) scanf("%d",&x[i]); } double median(int x[N],int n) { int i,j,t; double ans = 0.0; for(j = 0;j < n-1;j++) for(i = 0;i < n-j-1;i++) if(x[i]>x[i+1]) { t = x[i]; x[i] = x[i+1]; x[i+1] = t; } if(n%2 != 0) ans = x[(n-1)/2]; else ans = (x[n/2]+x[n/2-1])/2.0; return ans; }
代码运行结果:

实验任务五:
源代码:
#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("Enter 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 a,i,j; for(i = 0;i < n;++i) { a = x[i][n-1]; for(j = n - 1;j > 0;--j) { x[i][j] = x[i][j-1]; } x[i][0] = a; } }
代码运行结果:

实验任务六:
源代码:
#include <stdio.h> #include <stdlib.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) { char num[] = "0123456789ABCDEF"; char result[100]; int i = 0; if(x == 0) { printf("0\n"); return; } while(x > 0) { int remain = x % n; result[i] = num[remain]; i++; x = x / n; } for(int j = i-1;j >= 0;j--) printf("%c",result[j]); printf("\n"); }
代码运行结果:

实验任务七:
源代码:
#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"); } } is_magic(int x[][N],int n) { int num = n*n; int i,j; for(i = 0;i < n;i++) for(j = 0;j < n;j++) { int a = x[i][j]; if(a < 1||a > num) return 0; } for(i = 0;i < n;i++) for(j = 0;j < n;j++) { int compare = x[i][j]; for(int k = i;k < n;k++) { int b = (k ==i) ? j + 1 : 0; for(int chongfu = b;chongfu < n;chongfu++) if(compare == x[k][chongfu]) return 0; } } int right_sum = n * (n * n + 1) / 2; int hang_sum; for (int i = 0; i < n; i++) { hang_sum = 0; for (int j = 0; j < n; j++) hang_sum =hang_sum + x[i][j]; if (hang_sum != right_sum) return 0; } int lie_sum; for (int j = 0; j < n; j++) { lie_sum = 0; for (int i = 0; i < n; i++) lie_sum =lie_sum + x[i][j]; if (lie_sum != right_sum) return 0; } int djx1 = 0; int djx2 = 0; for (int i = 0; i < n; i++) { djx1 = djx1 + x[i][i]; djx2 = djx2 + x[i][n - 1 - i]; } if (djx1!= right_sum || djx2!= right_sum) return 0; return 1; }
代码运行结果:




浙公网安备 33010602011771号