实验文档4
关于第四次实践课作业
实验结论
task1.c
验证数组的特性:类型相同、有序存放
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #define N 4 4 #define M 2 5 void test1(); 6 void test2(); 7 int main() 8 { 9 printf("测试1:int型一维数组\n"); 10 test1(); 11 12 printf("\n测试2:int型二维数组\n"); 13 test2(); 14 15 return 0; 16 } 17 void test1() { 18 int x[N] = { 1,9,8,4 }; 19 int i; 20 //输入数组x占用的内存字节数 21 printf("sizeof(x)=%d\n", sizeof(x)); 22 //输入每个元素的地址,值 23 for (i = 0; i < N; i++) { 24 printf("%p;%d\n", &x[i], x[i]); 25 } 26 //输入数组名x对应的值 27 printf("x=%p\n", x); 28 29 } 30 void test2() { 31 int x[M][N] = { 32 {1,9,8,4}, 33 {2,0,4,9} 34 }; 35 int i,j; 36 //输入二维数组x占用的内存字节数 37 printf("sizeof(x)=%d\n", sizeof(x)); 38 //输入每个元素的地址,值 39 for (i = 0; i < M; i++) { 40 for (j = 0; j < N; j++) { 41 printf("%p:%d\n", &x[i][j], x[i][j]); 42 } 43 printf("\n"); 44 } 45 //输入二维数组x,以及,x[0],x[1]的值 46 printf("x=%p\n", x); 47 printf("x[0]=%p\n", x[0]); 48 printf("x[1]=%p\n", x[1]); 49 printf("\n"); 50 }
question1:int型一维数组x,在内存中是否是连续存放的?数组名x对应的值,和&x[0]是一样的吗?
answer1:是,是
question2:int型二维数组x,在内存中是否是"按行连续存放"的?数组名x的值、x[0]、&x[0][0],其 值,在字面上,是一样的吗?x[0]和x[1]相差多少?你能猜测/推断出这个差值的意义吗?
answer2:是,是;x[0]和x[1]相差16个字节,
这个差值代表着列数N*sizeof(数据类型)
task2.c
验证一维数组作为函数形参的用法
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #define N 100 4 void input(int x[], int n); 5 double compute(int x[], int n); 6 int main() 7 { 8 int x[N]; 9 int n,i; 10 double ans; 11 while (printf("Enter n:"), scanf("%d", &n) != EOF) { 12 input(x, n); 13 ans=compute(x, n); 14 printf("ans = %.2f\n\n", ans); 15 } 16 17 return 0; 18 } 19 void input(int x[], int n) { 20 int i; 21 for (i = 0; i < n; i++) { 22 scanf("%d", &x[i]); 23 } 24 } 25 double compute(int x[], int n) { 26 int i, high, low; 27 double ans; 28 high = low = x[0]; 29 ans = 0; 30 for (i = 0; i < n; i++) { 31 ans += x[i]; 32 33 if (x[i] > high) { 34 high = x[i]; 35 } 36 else if (x[i] < low) { 37 low = x[i]; 38 } 39 40 } 41 ans = (ans - high - low) / (n - 2); 42 return ans; 43 }
question1:一维数组作为形参时,其书写形式?实参的书写形式?
answer1:形参的书写形式是x[]([]必须存在)
实参的书写形似是x([]不必存在)
question2:函数input的功能是?函数compute的功能是?
answer2:函数input的功能是从用户端读入数值
函数compute的功能是在去掉最大值,最小值的情况下
计算读入数据的平均值
task3.c
验证二维数组作为函数形参的用法
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #define N 100 4 void output(int x[][N], int n); 5 void init(int x[][N], int n, int value); 6 int main() 7 { 8 int x[N][N]; 9 int n, value; 10 while (printf("Enter n and value:"), scanf("%d %d", &n, &value) != EOF){ 11 init(x, n, value); 12 output(x, n); 13 printf("\n"); 14 } 15 return 0; 16 } 17 void output(int x[][N], int n) { 18 for (int i = 0; i < n; i++) { 19 for (int j = 0; j < n; j++) { 20 printf("%d ", x[i][j]); 21 } 22 printf("\n"); 23 } 24 } 25 void init(int x[][N], int n, int value) { 26 for (int i = 0; i < n; i++) { 27 for (int j = 0; j < n; j++) { 28 x[i][j] = value; 29 } 30 } 31 }
question1:两维数组作为函数形参时,形参的书写形式?实参的书写形式?
answer1: 形参的书写形式是x[][N](必须写出列数)
实参的书写形式是x(直接给出函数名即可)
question2:两维数组作为函数形参时,哪一维的大小不能省略?
answer2: 第二维(即列数)不能省略
question3:函数output功能是?函数init的功能是?
answer3: 函数output功能是以矩阵的形式逐个输出数组中的值
函数init的功能是给数组中的每一个元素都赋以value的值
task4.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #define N 100 4 void input(int x[], int n); 5 double median(int x[], int n); 6 7 int main() { 8 int x[N],n; 9 double ans; 10 while (printf("Enter n:"), scanf("%d", &n) != EOF) { 11 input(x, n); 12 for (int i = 0; i < n; i++) { 13 for (int j = 0; j < n -1 -i; j++) { 14 if (x[j] > x[j + 1]) { 15 int temp = x[j]; 16 x[j] = x[j + 1]; 17 x[j + 1] = temp; 18 } 19 } 20 } 21 ans = median(x, n); 22 printf("ans=%g\n\n", ans); 23 } 24 return 0; 25 } 26 void input(int x[], int n) { 27 int i ; 28 for (i = 0; i < n; i++) { 29 scanf("%d", &x[i]); 30 } 31 } 32 double median(int x[], int n) { 33 double ans; 34 if (n % 2) { 35 ans = x[(n - 1) / 2]; 36 } 37 else { 38 ans = (x[n / 2 - 1] + x[n / 2]) *1.0/ 2; 39 } 40 return ans; 41 }
task5.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #define N 100 4 5 void input(int x[][N], int n); 6 void output(int x[][N], int n); 7 void rotate_to_right(int x[][N], int n); 8 int main() 9 { 10 int x[N][N],n; 11 printf("Enter n:"); 12 scanf("%d", &n); 13 input(x, n); 14 printf("原始矩阵:\n"); 15 output(x, n); 16 rotate_to_right(x, n); 17 printf("变换后矩阵:\n"); 18 output(x, n); 19 return 0; 20 } 21 void rotate_to_right(int x[][N], int n) { 22 for (int i = 0; i < n; i++) { 23 int temp = x[i][n - 1]; 24 for (int j = n-1; j > 0; j--) { 25 x[i][j] = x[i][j - 1]; 26 } 27 x[i][0] = temp; 28 } 29 } 30 void input(int x[][N], int n) { 31 for (int i = 0; i < n; i++) { 32 for (int j = 0; j < n; j++) { 33 scanf("%d", &x[i][j]); 34 } 35 } 36 } 37 void output(int x[][N], int n) { 38 for (int i = 0; i < n; i++) { 39 for (int j = 0; j < n; j++) { 40 printf("%4d", x[i][j]); 41 } 42 printf("\n"); 43 } 44 } 45
task6.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #define N 100 4 void dec_to_n(int x, int n); 5 int main() 6 { 7 int x; 8 while (printf("输入十进制整数:"), scanf("%d", &x) != EOF) { 9 dec_to_n(x, 2); 10 printf("\n"); 11 dec_to_n(x, 8); 12 printf("\n"); 13 dec_to_n(x, 16); 14 printf("\n\n"); 15 } 16 return 0; 17 } 18 void dec_to_n(int x, int n) { 19 int num[N]; 20 int i = 0,cnt=0; 21 while (x != 0) { 22 int r = x % n; 23 num[i++] = r; 24 x /= n; 25 cnt++; 26 } 27 for (int i = cnt-1; i >= 0; i--) { 28 if (num[i] < 10) { 29 printf("%d", num[i]); 30 } 31 else { 32 printf("%c", 'A' + num[i] - 10); 33 } 34 } 35 }
Tips: 1. 十进制整数 --> n进制数,算法层面:除以n, 取余数,直到商为0。 算法思路如下图所示。
task7.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #define N 100 4 void input(int x[][N], int n); 5 void output(int x[][N], int n); 6 int magic(int x[][N], int n); 7 int main() 8 { 9 int x[N][N]; 10 int n; 11 while (printf("Enter n:"), scanf("%d", &n) != EOF) { 12 printf("输入方阵:\n"); 13 input(x, n); 14 15 printf("输出方阵:\n"); 16 output(x, n); 17 18 if (magic(x, n)) { 19 printf("是魔方矩阵\n\n"); 20 } 21 else { 22 printf("不是魔方矩阵\n\n"); 23 } 24 } 25 return 0; 26 } 27 void input(int x[][N], int n) { 28 for (int i = 0; i < n; i++) { 29 for (int j = 0; j < n; j++) { 30 scanf("%d", &x[i][j]); 31 } 32 } 33 } 34 void output(int x[][N], int n) { 35 for (int i = 0; i < n; i++) { 36 for (int j = 0; j < n; j++) { 37 printf("%4d", x[i][j]); 38 } 39 printf("\n"); 40 } 41 } 42 int magic(int x[][N], int n) { 43 int sum[N]; 44 int k = 0; 45 for (int i = 0; i < n; i++) { 46 for (int j = 0; j < n; j++) { 47 sum[k] += x[i][j]; 48 } 49 k++; 50 } 51 for (int j = 0; j < n; j++) { 52 for (int i = 0; i < n; i++) { 53 sum[k] += x[i][j]; 54 } 55 k++; 56 } 57 for (int i = 0; i < n; i++) { 58 sum[k++] += x[i][i]; 59 } 60 for (int i = n-1; i >= 0; i--) { 61 sum[k] += x[i][i]; 62 } 63 for (int i = 0; i < 2 * n - 2; i++) { 64 if (sum[i] != sum[i + 1]) { 65 return 0; 66 } 67 } 68 return 1; 69 }
task8.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include<math.h> 4 #define N 100 5 int line(int m); 6 int main() 7 { 8 for (int m = 2;; ++m) { 9 int ans=line(m); 10 if (ans) { 11 printf("%d", m); 12 return 0; 13 } 14 } 15 16 } 17 int line(int m) { 18 int x = pow(m, 2); 19 int y = pow(m, 3); 20 int j = 0; 21 int all[N]; 22 do { 23 all[j++] = x % 10; 24 x /= 10; 25 } while (x != 0); 26 do { 27 all[j++] = y % 10; 28 y /= 10; 29 } while (y != 0); 30 for (int i = 0; i < j; ++i) { 31 for (int k = 0; k < j - 1 - i; ++k) { 32 if (all[k] > all[k + 1]) { 33 int temp = all[k]; 34 all[k] = all[k + 1]; 35 all[k + 1] = temp; 36 } 37 } 38 } 39 for (int i = 0; i < j; i++) { 40 if (all[i] != i) { 41 return 0; 42 } 43 } 44 return 1; 45 46 }
实验总结
1.编程时可以通过编写函数使代码的实现更加简单
2.利用sizeof输出变量占用的内存字节数;
利用%p输出变量所在的地址(记得加上取地址符&)
数组中的元素在内存中连续存放,且数组名x对应的值和X[0]的地址一致
3.将16进制中的10~15转换为对应字符‘A’~‘F’可以采用‘A’+x-10的方式