特此鸣谢:鱼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.程序源代码:
- 第一种解
#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,填空练习
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;
}