实验4
test_1
#include<stdio.h> #define N 4 #define M 2 void test_1() { int x[N] = {1, 9, 8, 4}; int i; printf("sizeof(x) = %d\n", sizeof(x));//数组x占用的内存字节数 for(i=0;i<N;i++) { printf("%p: %d\n", &x[i], x[i]); } printf("x = %p\n", x); } void test_2() { 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"); test_1(); printf("\n测试2: int型二维数组\n"); test_2(); return 0; }
问题1:连续存放。一样。
问题2:按行连续存放。x的值、x[0]、&x[0][0]其值在字面上是一样的。相差16。差值的意义是每一行所占字节数。
test_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; int i; double answer; while(printf("Enter n: "), scanf("%d",&n)!=EOF) { input(x, n); answer = compute(x, n); printf("answer = %.2f\n\n", answer); } 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; int high, low; double answer; high = low = x[0]; answer = 0; for(i=0; i<n; i++) { answer += x[i]; if(x[i] > high) { high = x[i]; } else if(x[i] < low) { low = x[i]; } } answer = (answer - high - low)/(n-2); return answer; }
观察:形参是int x[], 实参是x。
问题:input功能是为数组元素赋值。compute的功能是求数组去最大值和最小值后的平均值。
test_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(" "); } 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; } } }
观察: 形参是int x[][N]&int x[N][N](主函数)。实参是x。
问题1:第二维的大小不可省略。
问题2:output功能是按矩阵格式输出数组。init的功能是为数组的每一个元素赋值。
task_4
#include<stdio.h> #define N 100 void input(int x[], int n); double median(int x[], int n); void sort(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) { double ans; sort(x, n); if(n%2 == 0) { ans = (x[n/2] + x[n/2-1])/2.0; return ans; } else if(n%2 == 1) { ans = x[(n-1)/2]; return ans; } } void sort(int x[], int n) { int i, t; int m = 0; for(i=0; i<n; i++) { for(t=0; t<n; t++) { if(x[i]<x[t]) { m = x[i]; x[i] = x[t]; x[t] = m; } } } }
task_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("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 i,j; int t[N][1]; for(i=0; i<n; i++) { t[i][1] = 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][1]; } }
task_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 num[100]; int i; int t = 0; for(i=0; x!=0 ;i++) { num[i] = x%n; x = x/n; t++; } for(i=t-1;i>=0;i--) { if(num[i]>=10) { printf("%c", num[i]-10+'A'); } else { printf("%d", num[i]); } } printf("\n"); }
task_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 sum_row(int x[][N], int n); int sum_colunm(int x[][N], int n); int sum_diagonal(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) { if(sum_row(x, n) && sum_colunm(x, n) && sum_diagonal(x, n)) { return 1; } else { return 0; } } int sum_row(int x[][N], int n) { int row[N]; int i, j; int count = 0; for(i=0;i<n;i++) { row[i] = 0; } for(i=0;i<n;i++) { for(j=0;j<n;j++) { row[i] += x[i][j]; } if(row[i] == n*(n*n+1)/2) { count++; } } if(count == n) return 1; else return 0; } int sum_colunm(int x[][N], int n) { int colunm[N]; int i, j; int count = 0; for(j=0;j<n;j++) { colunm[j] = 0; } for(j=0;j<n;j++) { for(i=0;i<n;i++) { colunm[j] += x[i][j]; } if(colunm[j] == n*(n*n+1)/2) { count++; } } if(count == n) return 1; else return 0; } int sum_diagonal(int x[][N], int n) { int p = 0, m = 0; int i, j; for(i=0,j=0;i<n,j<n;i++,j++) { p += x[i][j]; } for(i=0,j=n-1;i<n,j>=0;i++,j--) { m += x[i][j]; } if(p == n*(n*n+1)/2 && m == n*(n*n+1)/2) return 1; else return 0; }
实验8不会
问了同学之后再做