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
  • 要求:利用指针函数
  • 程序源代码:
  1. 第一种解
    #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;
    }
  2. 第二种解:
    #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;
    }
posted @ 2022-03-20 21:58  炸天帮帮主  阅读(219)  评论(0编辑  收藏  举报