C语言必会100题(16)。偶数求1/2+1/4+...+1/n /填空练习/找到年龄最大的人,并输出/字符串排序/猴子分桃子

特此鸣谢:鱼C_小甲鱼(B站up主)不二如是(鱼C论坛大佬)
题目来源:https://fishc.com.cn
注:这些题在网上都可以搜到,题下面的代码大多是流传下来的答案(我重新排了一下版,增加了可读性),部分是本人经过深思熟虑后编写的。

76,偶数求1/2+1/4+…+1/n

1.题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+…+1/n,当输入n为奇数时,调用函数1/1+1/3+…+1/n
2.要求:利用指针函数
3.程序源代码:

  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 = &sum;

    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 = &sum;

    while (i <= num) {

        sum = sum + 1/i;
        i = i + 2;
    }

    return ptr2;
}

  1. 第二种解
#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,填空练习

1.题目:填写下面的代码(指向指针的指针)
2.问题:

#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);
    }
}

3.答案:

#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,找到年龄最大的人,并输出

1.题目:找到年龄最大的人,并输出
2.要求:找到程序的错误
3.程序源代码:

#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;
}



4.修改后的程序源代码:

#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,字符串排序

1.题目:字符串排序
2.程序源代码:

#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,猴子分桃子

1.题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
2.程序源代码:

// 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;
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值