编程练习1
已知函数头为 void avg(void) ,写出函数定义。函数 avg 的功能:输入10个分数,去掉最高分和最低分后求平均分,保留一位小数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| #include <stdio.h> void avg(void); int main(void) { printf("******************************** 编程练习8.1 ********************************\n"); avg( ); } void avg(void) { double score[10], max, min, average, sum = 0.0; int i; for(i = 0;i < 10;i ++) { printf("请输入第%d个分数:", i + 1); scanf("%lf", &score[i]); } max = score[0]; min = score[0]; for(i = 0;i < 10;i ++) { sum += score[i]; if(max < score[i]) { max = score[i]; } if(min > score[i]) { min = score[i]; } } average = (sum - max - min) / 8; printf("平均分:%.1lf\n", average); }
|
运行结果:
1 2 3 4 5 6 7 8 9 10 11 12
| ******************************** 编程练习8.1 ******************************** 请输入第1个分数:95 请输入第2个分数:88 请输入第3个分数:77 请输入第4个分数:86 请输入第5个分数:93 请输入第6个分数:86 请输入第7个分数:79 请输入第8个分数:83 请输入第9个分数:92 请输入第10个分数:99 平均分:87.8
|
编程练习2
已知函数头为void calroot(double a, double b, double c),写出函数定义。函数的功能:求一元二次方程
$$
ax^2+bx+c=0
$$
的根。形参a、b、c是一元二次方程的系数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| #include <stdio.h> #include <math.h> void calroot(double a, double b, double c); int main(void) { double a1,b1,c1; printf("********************************* 编程练习8.2 *********************************\n"); printf("请输入a的值:"); scanf("%lf", &a1); printf("请输入b的值:"); scanf("%lf", &b1); printf("请输入c的值:"); scanf("%lf", &c1); calroot(a1, b1, c1); } void calroot(double a, double b, double c) { double x1, x2, d, e, real, imaginarys; d = b * b - 4 * a * c; if ( 0 == a) { if( 0 == b) { printf("error!\n"); } else { printf("x = %f\n", -c / b); } } else if(0 == d) { x1 = x2 = -b / (2 * a); printf("x1 = x2 = %f\n", x1); } else if(d > 0) { e = sqrt(d); x1 = (-b + e) / (2 * a); x2 = (-b - e) / (2 * a); printf("x1 = %f\n", x1); printf("x2 = %f\n", x2); } else { e = sqrt(-d); real = -b / (2 * a); imaginarys = e / (2 * a); printf("x1 = %f + %fi\n", real, imaginarys); printf("x2 = %f - %fi\n", real, imaginarys); } }
|
运行结果:
1 2 3 4 5
| ********************************* 编程练习8.2 ********************************* 请输入a的值:0 请输入b的值:1.5 请输入c的值:-5.4 x = 3.600000
|
编程练习3
已知函数头为double sum(int n),写出函数定义。函数的功能:返回
$$
1-\frac{1}{2}+\frac{1}{3}-\frac{1}{4}+…+\frac{(-1)^{n+1}}{n}
$$
的值,其中n即为形参n。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include <stdio.h> double sum(int n); int main(void) { int n; printf("请输入n的值:"); scanf("%d", &n); double result = sum(n); printf("********************************* 编程练习8.3 *********************************\n"); printf("result = %.2lf\n", result); } double sum(int n) { int i; double sum = 0.0; for(i = 1;i <= n;i ++) { if(i % 2 == 0) { sum -= 1.0 / i; } else { sum += 1.0 / i; } } return sum; }
|
运行结果:
1 2 3
| 请输入n的值:4 ********************************* 编程练习8.3 ********************************* result = 0.58
|
编程练习4
已知函数头为 int getgcd(int m, int n) ,写出函数定义。函数 getgcd 的功能:返回形参m 、 n 的最大公约数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #include <stdio.h> int getgcd(int m, int n); int main(void) { int a, b; printf("********************************* 编程练习8.4 *********************************\n"); printf("请输入m的值:"); scanf("%d", &a); printf("请输入n的值:"); scanf("%d", &b); int result = getgcd(a, b); printf("最大公约数为:%d\n", result); } int getgcd(int m, int n) { int gcd; if(m > n) { gcd = n; } else { gcd = m; } while(m % gcd || n % gcd) { gcd --; } return gcd; }
|
运行结果:
1 2 3 4
| ********************************* 编程练习8.4 ********************************* 请输入m的值:9 请输入n的值:3 最大公约数为:3
|
编程练习5
已知函数头为 int prime(int n) , 写出函数定义。函数 prime 的功能,如果 n 是质数,返回1;否则,返回0 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #include <stdio.h> #include <math.h> int prime(int n); int main(void) { int a; printf("请输入n的值:"); scanf("%d", &a); int result = prime(a); printf("%d\n", result); } int prime(int n) { int i; if(n == 2) { return 1; } else if(n > 2) { for(i = 2;i < sqrt(n) + 1;i ++) { if(n % i == 0) { return 0; break; } } return 1; } else { printf("error\n"); return 0; } }
|
运行结果:
函数练习6
已知函数头为 void avg(void) ,函数 avg 的功能:输入10个分数,去掉最高分和最低分,求平均分,保留一位小数。编写并调用函数avg。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #include <stdio.h> void avg(void); int main(void) { avg( ); return 0; } void avg(void) { int i; double max, min, sum = 0.0, average, score[10]; for(i = 0;i < 10;i ++) { printf("请输入第%d个成绩:", i + 1); scanf("%lf", &score[i]); } max = score[0]; min = score[0]; for(i = 0;i < 10;i ++) { sum += score[i]; if(max < score[i]) { max = score[i]; } if(min > score[i]) { min = score[i]; } } average = (sum - max - min) / 8; printf("去掉最高分:%.1lf 分\n", max); printf("去掉最低分:%.1lf 分\n", min); printf("平均分为:%.1lf\n", average); }
|
运行结果:
1 2 3 4 5 6 7 8 9 10 11 12 13
| 请输入第1个成绩:95 请输入第2个成绩:99 请输入第3个成绩:78 请输入第4个成绩:85 请输入第5个成绩:93 请输入第6个成绩:85 请输入第7个成绩:86 请输入第8个成绩:91 请输入第9个成绩:87 请输入第10个成绩:91 去掉最高分:99.0 分 去掉最低分:78.0 分 平均分为:89.1
|
编程练习7
已知函数头为void calroot(double a, double b, double c),函数calroot的功能:求一元二次方程
$$
ax^2+bx+c=0
$$
的根。形参a、b、c是一元二次方程的系数,编写并调用函数calroot。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| #include <stdio.h> #include <math.h> void calroot(double a, double b, double c); int main(void) { double a1, b1, c1; printf("请输入a的值:"); scanf("%lf", &a1); printf("请输入b的值:"); scanf("%lf", &b1); printf("请输入c的值:"); scanf("%lf", &c1); calroot(a1, b1, c1); return 0; } void calroot(double a, double b, double c) { double d, e, x1, x2, real, imaginarys; d = b * b - 4 * a * c; if(0 == a) { if(0 == b) { printf("error\n"); } else { printf("x = %lf\n", -c / b); } } else if( 0 == d) { x1 = x2 = -b / (2 * a); printf("x1 = x2 = %lf\n", x1); } else if(d > 0) { e = sqrt(d); x1 = (-b + e) / (2 * a); x2 = (-b - e) / (2 * a); printf("x1 = %lf\n", x1); printf("x2 = %lf\n", x2); } else { e = sqrt(-d); real = -b / (2 * a); imaginarys = e / (2 * a); printf("x1 = %lf + %lfi\n", real, imaginarys); printf("x2 = %lf - %lfi\n", real, imaginarys); } }
|
运行结果:
1 2 3 4
| 请输入a的值:0 请输入b的值:1.5 请输入c的值:-5.4 x = 3.600000
|
编程练习8
已知函数头为 double sum(int n),写出函数定义。函数的功能:返回
$$
1-\frac{1}{2}+\frac{1}{3}-\frac{1}{4}+…+\frac{(-1)^{n+1}}{n}
$$
的值,其中即为形参。编写并调用函数 sum 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #include <stdio.h> double sum(int n); int main(void) { int a; double result; printf("Please input value of n: "); scanf("%d", &a); result = sum(a); printf("result = %.2lf\n", result); return 0; } double sum(int n) { int i; double s; for(i = 1;i <= n;i ++) { if(i % 2 == 0) { s -= 1.0 / i; } else { s += 1.0 / i; } } return s; }
|
运行结果:
1 2
| Please input value of n: 4 result = 0.58
|
编程练习9
已知函数头为 int getgcd(int m, int n) ,写出函数定义。函数 getgcd 的功能:返回形参m 、 n 的最大公约数。编写并调用函数 getgcd 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #include <stdio.h> int getgcd(int m, int n); int main(void) { int a, b, result; printf("请输入m的值:"); scanf("%d", &a); printf("请输入n的值:"); scanf("%d", &b); result = getgcd(a, b); printf("%d 和 %d 的最大公约数为:%d\n", a, b, result); return 0; } int getgcd(int m, int n) { int gcd; if(m > n) { gcd = m; } else { gcd = n; } while(gcd % m || gcd % n) { gcd ++; } return gcd; }
|
运行结果:
1 2 3
| 请输入m的值:9 请输入n的值:6 9 和 6 的最大公约数为:18
|
编程练习10
已知函数头为 int prime(int n) , 写出函数定义。函数 prime 的功能,如果 n 是质数,返回1;否则,返回0 。编写并调用函数 prime 输出 100 以内所有的质数,每行输出5个 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include <stdio.h> #include <math.h> int prime(int n); int main(void) { int i, res, times = 0; for(i = 2;i < 100;i ++) { res = prime(i); if(res == 1) { times ++; if(times % 5 == 0) { printf("%d\n", i); } else { printf("%d\t", i); } } } return 0; } int prime(int n) { int j, flag = 1; if(n == 2) { return 1; } for(j = 2;j < sqrt(n) + 1;j ++) { if(n % j == 0) { flag = 0; break; } } return flag; }
|
运行结果:
1 2 3 4 5
| 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
|
编程练习11
定义两个函数分别计算球体的表面积和体积,在main函数中输入球体的半径,调用这两个函数,在 main 函数中输出球体的表面积和体积。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include <stdio.h> double get_ball_s(double r); double get_ball_v(double r); int main(void) { double a, s, v; printf("请输入球体的半径:"); scanf("%lf", &a); s = get_ball_s(a); v = get_ball_v(a); printf("球体的表面积为:%.2lf\n", s); printf("球体的体积为:%.2lf\n", v); return 0; } double get_ball_s(double r) { return 4 * 3.14 * r * r; } double get_ball_v(double r) { return (4 / 3.0) * 3.14 * r * r * r; }
|
运行结果:
1 2 3
| 请输入球体的半径:5 球体的表面积为:314.00 球体的体积为:523.33
|
编程练习12
已知函数头为 int avg(int n, int t[ ]) ,函数avg的功能:去掉长度为 n 的一维数组 t 中的最大值和最小值,计算并返回平均值。编写并调用函数avg。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #include <stdio.h> int avg(int n,int t[ ]); int main(void) { int s[9] = {52, 99, 33, 44, 20, 13, 14, 9, 101}; int average; average = avg(9, s); printf("average = %d\n", average); return 0; } int avg(int n, int t[ ]) { int max, min, i, sum; max = t[0]; min = t[0]; for(i = 0;i < n;i ++) { sum += t[i]; if(max < t[i]) { max = t[i]; } if(min > t[i]) { min = t[i]; } } return (sum - max - min) / (n - 2); }
|
运行结果:
编程练习13
已知函数头为 int str_cmp(char s1[ ], char s2[ ]) ,函数 str_cmp 的功能:比较数组 s1 和 s2 中字符串的大小,如果 s1 中的字符串大于 s2 中的字符串,返回一个正整数;如果 s1 中的字符串等于 s2 中的字符串,返回0;如果 s1 中的字符串小于 s2 中的字符串,返回一个负整数。输入两个字符串,编写并调用函数 str_cmp,比较两个字符串的大小(要求不调用库函数 strcmp)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| #include <stdio.h> int str_cmp(char s1[ ], char s2[ ]); int main(void) { char ch1[100], ch2[100]; int result; printf("请输入第一段字符:"); scanf("%s", ch1); printf("请输入第二段字符:"); scanf("%s", ch2); result = str_cmp(ch1, ch2); if(result > 0) { printf("%s > %s\n", ch1, ch2); } else if(result == 0) { printf("%s == %s\n", ch1, ch2); } else { printf("%s < %s\n", ch1, ch2); } return 0; } int str_cmp(char s1[ ], char s2[ ]) { int i = 0, length1 = 0, length2 = 0; while(s1[length1] != '\0') { length1 ++; } while(s2[length2] != '\0') { length2 ++; } while(s1[i] != '\0' || s2[i] != '\0') { if(s1[i] > s2[i]) { return 1; } else if(s1[i] < s2[i]) { return -1; } else { if(length1 > length2) { return 1; } else if(length1 == length2) { return 0; } else { return -1; } } i ++; } }
|
运行结果:
1 2 3
| 请输入第一段字符:com 请输入第二段字符:computer com < computer
|
编程练习14
已知函数头为 void output(int row, int t[ ][5]),函数output 的功能:输出行数为row,列数为5的二维数组 t 中所有的数组元素。编写并调用函数 output,输出 3 行 5 列的二位数组,再次调用 output,输出 4 行 5 列的二维数组。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include <stdio.h> void output(int row, int t[ ][5]); int main(void) { int i, j, r = 3; int t1[][5] = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15}}; int t2[][5] = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15}, {16, 17, 18, 19, 20}}; output(3, t1); printf("\n"); output(4, t2); } void output(int row, int t[ ][5]) { int i, j; for(i = 0;i < row;i ++) { for(j = 0;j < 5;j ++) { printf("%6d", t[i][j]); } printf("\n"); } }
|
运行结果:
1 2 3 4 5 6 7 8
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
编程练习15
已知函数头为 int getmin(int n, int r[ ][3]),函数 getmin 的功能:计算并返回行数为 n 列数为 3 的二维数组 t 中的最小值。编写并调用函数 getmin 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| #include <stdio.h> int getmin(int n, int r[ ][3]); void copyright(void); int main(void) { int a[4][3] = {{2, 1, 3}, {4, 6, 5}, {7, 8,9} ,{ 10, 12, 11}}; int min; copyright( ); min = getmin(4, a); printf("最小值为:%d\n", min); return 0; } int getmin(int n, int r[ ][3]) { int i,j, min, b[n]; for(i = 0;i < n;i ++) { for(j = 0;j < 3;j ++) { b[i] = r[i][2]; } } min = b[0]; for(i = 1;i < n;i ++) { if(min > b[i]) { min = b[i]; } } return min; } void copyright(void) { printf("******************************* 编程练习8.15 *******************************\n"); printf("2\t1\t3\n"); printf("4\t6\t5\n"); printf("7\t8\t9\n"); printf("10\t12\t11\n"); }
|
运行结果:
1 2 3 4 5 6
| ******************************* 编程练习8.15 ******************************* 2 1 3 4 6 5 7 8 9 10 12 11 最小值为:3
|
编程练习16
在 main 函数中输入两个整数 m 和 n ,调用函数 change,要求函数 change 调用完成后,整数 m 的值加 5,整数 n 的值减 3,在主函数中输出改变后的 m 和 n。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #include <stdio.h> void change(int *x, int *y); int main(void) { int m, n; printf("请输入m的值:"); scanf("%d", &m); printf("请输入n的值:"); scanf("%d", &n); printf("Before function call:\tm = %d , n = %d\n", m , n); change(&m, &n); printf("After function call:\tm = %d , n = %d\n", m, n); return 0; } void change(int *x, int *y) { *x += 5; *y -= 3; }
|
运行结果:
1 2
| Before function call: m = 5 , n = 3 After function call: m = 10 , n = 0
|
编程练习17
已知函数头及功能如下:
1 2 3
| void input(int n1, int t1[ ]); void sort(int n2, int t2[ ]); void output(int n3, int t3[ ]);
|
编写并调用函数输入10个整数,对这10个整数按升序排序,输出排序后的10个整数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| #include <stdio.h> void input(int n1, int t1[ ]); void sort(int n2, int t2[ ]); void output(int n3, int t3[ ]); int main(void) { int i,s1[10]; input(10, s1); sort(10, s1); output(10, s1); return 0; } void input(int n1, int t1[ ]) { int i; printf("请输入10个整数:\n", i); for(i = 0;i < n1;i ++) { scanf("%d", &t1[i]); } } void sort(int n2, int t2[ ]) { int i, j, temp; for(i = 0;i < n2;i ++) { for(j = 0;j < 9 - i;j ++) { if(t2[j] > t2[j + 1]) { temp = t2[j]; t2[j] = t2[j + 1]; t2[j + 1] = temp; } } } } void output(int n3, int t3[ ]) { int i; for(i = 0;i < n3;i ++) { printf("%d\t", t3[i]); } printf("\n"); }
|
运行结果:
1 2 3 4 5 6 7 8 9 10 11 12
| 请输入10个整数: 95 77 99 36 56 85 19 74 69 88 19 36 56 69 74 77 85 88 95 99
|
编程练习18
已知函数头及功能如下:
1 2 3 4
| void input(int n1, int t1[ ]); void swapmin(int n2, int t2[ ]); void swapmax(int n3, int t3[ ]); void output(int n4, int t4[ ]);
|
编写并调用函数输入10个整数,完成数据交换,输出交换后的10个整数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| #include <stdio.h> void input(int n1, int t1[ ]); void swapmin(int n2, int t2[ ]); void swapmax(int n3, int t3[ ]); void output(int n4, int t4[ ]);
int main(void) { int i, s[10]; input(10, s); swapmin(10, s); swapmax(10, s); output(10, s); return 0; }
void input(int n1, int t1[ ]) { int i; for(i = 0;i < n1; i ++) { printf("请输入第%d个整数:", i + 1); scanf("%d", &t1[i]); } }
void swapmin(int n2, int t2[ ]) { int min = 0; int i, temp; for(i = 0;i < n2;i ++) { if(t2[min] > t2[i]) { min = i; } } if(min != 0) { temp = t2[0]; t2[0] = t2[min]; t2[min] = temp; } }
void swapmax(int n3, int t3[ ]) { int max = 0; int i, temp; for(i = 0;i < n3;i ++) { if(t3[max] < t3[i]) { max = i; } } if(max != n3 - 1) { temp = t3[n3 - 1]; t3[n3 - 1] = t3[max]; t3[max] = temp; } }
void output(int n4, int t4[ ]) { int i; for(i = 0;i < n4;i ++) { printf("%d\t", t4[i]); } printf("\n"); }
|
运行结果:
1 2 3 4 5 6 7 8 9 10 11
| 请输入第1个整数:74 请输入第2个整数:20 请输入第3个整数:99 请输入第4个整数:13 请输入第5个整数:14 请输入第6个整数:52 请输入第7个整数:33 请输入第8个整数:44 请输入第9个整数:66 请输入第10个整数:99 13 20 99 74 14 52 33 44 66 99
|
编程练习19
已知函数头及功能如下:
1 2 3
| void input(int row1, int t1[ ][3]); void change(int row2, int t2[ ][3]); void output(int row3, int t3[ ][3]);
|
编写并调用函数输入6个整数,完成数据处理,输出处理后的6个整数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| #include <stdio.h> void input(int row1, int t1[ ][3]); void change(int row2, int t2[ ][3]); void output(int row3, int t3[ ][3]);
int main(void) { int t[2][3]; input(2, t); change(2, t); output(2, t); return 0; }
void input(int row1, int t1[ ][3]) { int i, j; for(i = 0;i < row1;i ++) { for(j = 0;j < 3;j ++) { scanf("%d", &t1[i][j]); } } }
void change(int row2, int t2[ ][3]) { int i, j; for(i = 0;i < row2;i ++) { for(j = 0;j < 3;j ++) { t2[i][j] += 1; } } }
void output(int row3, int t3[ ][3]) { int i, j; for(i = 0;i < row3;i ++) { for(j = 0;j < 3;j ++) { printf("%d\t", t3[i][j]); } printf("\n"); } }
|
运行结果:
1 2 3
| 1 2 3 4 5 6 2 3 4 5 6 7
|
编程练习21
输入长方形的长和宽,调用同一个函数,第一次调用求长方形的面积,第二次调用求长方形的周长。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #include <stdio.h> int get_s(int x1, int y1); int get_l(int x2, int y2); int get(int x3, int y3, int (*p)(int m, int n)); int main(void) { int a, b, s, l; printf("请输入长方形的长:"); scanf("%d", &a); printf("请输入长方形的宽:"); scanf("%d", &b); s = get(a, b, get_s); l = get(a, b, get_l); printf("长方形的面积为:%d\n", s); printf("长方形的周长为:%d\n", l); return 0; } int get_s(int x1, int y1) { return x1 * y1; } int get_l(int x2, int y2) { return 2 * (x2 + y2); } int get(int x3, int y3, int (*p)(int m, int n)) { return (*p)(x3, y3); }
|
运行结果:
1 2 3 4
| 请输入长方形的长:5 请输入长方形的宽:6 长方形的面积为:30 长方形的周长为:22
|
编程练习22
采用递归的函数调用求 1 + 2 + 3 + … + n 的值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #include <stdio.h> double factorial(int n); int main(void) { int a; double sum; printf("请输入n的值:"); scanf("%d", &a); sum = factorial(a); printf("sum = %.0lf\n", sum); return 0; } double factorial(int n) { double sum; if(n > 1) { sum = n + factorial(n - 1); } else { sum = 1; } return sum; }
|
运行结果:
编程练习23
采用递归的函数调用求x^n的值,x的类型是double,n的类型是int,且n ≥ 0。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include <stdio.h> #include <math.h> double power(double x, int n); int main(void) { int a; double b, result; printf("请输入x的值:"); scanf("%lf", &b); printf("请输入n的值:"); scanf("%d", &a); result = power(b, a); printf("result = %.2lf\n", result); return 0; } double power(double x, int n) { double s; if(n > 0) { s = x * power(x, n - 1); } else { s = 1; } return s; }
|
运行结果:
1 2 3
| 请输入x的值:2 请输入n的值:10 result = 1024.00
|
编程练习24
已知函数头为 int hanoi(int n, char first, char second, char third) , 函数 hanoi 的功能:输出汉诺塔问题中圆盘的移动步骤,计算并返回圆盘移动的总次数。编写并调用函数 hanoi 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #include <stdio.h> #include <math.h> int hanoi(int n, char first, char second, char third); int main(void) { int m, times; printf("请输入圆盘的个数:"); scanf("%d", &m); times = hanoi(m, 'A', 'B', 'C'); printf("共移动了%d次\n", times); return 0; } int hanoi(int n, char first, char second, char third) { if(n > 1) { hanoi(n - 1, first, third, second); printf("将第%d个圆盘从%c移动到%c\n", n, first, third); hanoi(n - 1, second, first, third); } else { printf("将第%d个圆盘从%c移动到%c\n", n, first, third); } return pow(2, n) - 1; }
|
运行结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 请输入圆盘的个数:4 将第1个圆盘从A移动到B 将第2个圆盘从A移动到C 将第1个圆盘从B移动到C 将第3个圆盘从A移动到B 将第1个圆盘从C移动到A 将第2个圆盘从C移动到B 将第1个圆盘从A移动到B 将第4个圆盘从A移动到C 将第1个圆盘从B移动到C 将第2个圆盘从B移动到A 将第1个圆盘从C移动到A 将第3个圆盘从B移动到C 将第1个圆盘从A移动到B 将第2个圆盘从A移动到C 将第1个圆盘从B移动到C 共移动了15次
|