C语言必会100题(16)。偶数求1/2+1/4+...+1/n /填空练习/找到年龄最大的人,并输出/字符串排序/猴子分桃子
特此鸣谢:鱼C_小甲鱼(B站up主)不二如是(鱼C论坛大佬)
题目来源:https://fishc.com.cn
注:这些题在网上都可以搜到,题下面的代码大多是流传下来的答案(我重新排了一下版,增加了可读性),部分是本人经过深思熟虑后编写的。
76,偶数求1/2+1/4+…+1/n
- 题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+…+1/n,当输入n为奇数时,调用函数1/1+1/3+…+1/n
- 要求:利用指针函数
- 程序源代码:
- 第一种解
#include <stdio.h> #include <stdlib.h> // 偶数 float *num_even(int num); // 奇数 float *num_odd(int num); int main(void) { int num; printf("请输入一个大于零的正整数:"); scanf("%d", &num); if (num % 2 == 0) { printf("%f ", *num_even(num)); }else { printf("%f ", *num_odd(num)); } return 0; } float *num_even(int num) { float i = 2; float sum = 0; float *ptr1 = ∑ while (i <= num) { sum = sum + 1/i; i = i + 2; } return ptr1; } float *num_odd(int num) { float i = 1; float sum = 0; float *ptr2 = ∑ while (i <= num) { sum = sum + 1/i; i = i + 2; } return ptr2; }
- 第二种解:
#include <stdio.h> int main() { float peven(), podd(), dcall(); float sum; int n; while(1) { printf("请输入一个大于1的正整数:"); scanf("%d", &n); if(n > 1) { break; } } if(n % 2 == 0) { printf("Even(偶数) ="); sum = dcall(peven, n); } else { printf("Odd(奇数) ="); sum = dcall(podd, n); } printf("%f", sum); return 0; } float peven(int n) { float s = 0; int i; for(i = 2; i <= n; i += 2) { s += 1 / (float)i; } return (s); } float podd(int n) { float s = 0; int i; for(i = 1; i <= n; i += 2) { s += 1 / (float)i; } return (s); } float dcall(float (*fp)(), int n) { float s; s = (*fp)(n); return (s); }
77,填空练习
- 题目:填写下面的代码(指向指针的指针)
- 问题:
#include <stdio.h> int main() { char *s[] = {"man", "woman", "girl", "boy", "sister"}; char **q; int k; for (k = 0; k < 5; k++) { //这里填写什么语句 printf("%s\n", *q); } }
- 答案:
#include <stdio.h> int main() { char *s[] = {"man", "woman", "girl", "boy", "sister"}; char **q; int k; for (k = 0; k < 5; k++) { *q = s[k]; printf("%s\n", *q); } }
78,找到年龄最大的人,并输出
- 题目:找到年龄最大的人,并输出
- 要求:找到程序的错误
- 程序源代码:
#include <stdio.h> #define N 4 static struct man { char name[20]; int age; } person[N] = {"li", 18, "wang", 19, "zhang", 20, "sun", 22}; int main() { struct man *q, *p; int i, m = 0; p = person; for (i = 0; i < N; i++) { if(m < p -> age) { q = p++; } m = q -> age; } printf("%s,%d", (*q).name, (*q).age); return 0; }
- 修改后的程序源代码:
#include <stdio.h> #define N 4 static struct man { char name[20]; int age; } person[N] = { {"li", 18}, {"wang", 19}, {"zhang", 20}, {"sun", 22} }; int main() { struct man *q, *p; int i, m = 0; p = person; for (i = 0; i < N; i++) { if(m < p -> age) { q = p++; } m = q -> age; } // q -> name == (*q).age printf("%s,%d", q -> name, (*q).age); return 0; }
79,字符串排序
- 题目:字符串排序
- 程序源代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> char swap(char *p1, char *p2); int main(void) { // 指针数组,[]优先级高,这是一个整型指针数组,它有n个指针类型的数组元素 char *str1[20], *str2[20], *str3[20]; printf("please input three strings\n"); scanf("%s", str1); scanf("%s", str2); scanf("%s", str3); // strcmp函数,比较两个字符串,第一个字符串大于第二个字符串则返回值大于0; if(strcmp(str1, str2) > 0) swap(str1, str2); if(strcmp(str1, str3) > 0) swap(str1, str3); if(strcmp(str2, str3) > 0) swap(str2, str3); printf("after being sorted\n"); printf("%s\n%s\n%s\n", str1, str2, str3); return 0; } char swap(char *p1, char *p2) { char *p[20]; // strcpy函数,将第二个值赋值给第一个 strcpy(p, p1); strcpy(p1, p2); strcpy(p2, p); }
80,猴子分桃子
- 题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
- 程序源代码:
// https://www.itbiancheng.com/article/57.html #include <stdio.h> int main() { int i; //循环次数 int j = 1; //第5只猴子分的桃子数,假设为1个 int x; //剩余 while(1) { x = 4 * j; //剩余桃子数 for(i = 0; i < 5;) { if(x % 4 != 0) break; //必须连续五次x都能被4整除才符合条件. else { x = (x / 4) * 5 + 1; i++; } } j++; if(i == 5) //连续5次满足,跳出while循环 break; } printf( "num is %d",x ); return 0; }