二级C语言题解:函数指针的操作、单链表偶数结点值累加、判断回文
目录
一、程序填空📝 --- 函数指针的操作
题目📃
分析🧐
二、程序修改🛠️ --- 单链表偶数结点值累加
题目📃
分析🧐
三、程序设计💻 --- 判断回文
题目📃
分析🧐
前言
本文讲解:函数指针的操作、单链表偶数结点值累加、判断回文🏠我的主页:我的主页
📚系列专栏:系列专栏
一、程序填空📝 --- 函数指针的操作
难度:⭐⭐
题目📃
在此程序中,函数 fun 的功能:
用函数指针指向要调用的函数,并进行调用。规定在【2】处使 f 指向函数 f1,在【3】处使 f 指向函数 f2。当调用正确时,程序输出:x1 = 5.000000, x2 = 3.000000, x1x1+x1x2=40.000000。注意:部分源程序在文件 blank1.c 中。 不得增行或删行,也不得更改程序的结构!
代码如下:
在1️⃣2️⃣3️⃣处填空
#include <stdio.h>
double f1(double x)
{ return x*x; }
double f2(double x, double y)
{ return x*y; }
double fun(double a, double b)
{
/**********found**********/
1️⃣ (*f)();
double r1, r2;
/**********found**********/
f = 2️⃣;
r1 = f(a);
/**********found**********/
f = 3️⃣ ;
r2 = (*f)(a, b);
return r1 + r2;
}
void main()
{ double x1=5, x2=3, r;
r = fun(x1, x2);
printf("\nx1=%f, x2=%f, x1*x1+x1*x2=%f\n",x1, x2, r);
}
分析🧐
这道题主要是理解指针函数的概念,在这个程序中先定义了函数指针,再通过这个函数指针指向对应的函数
- 填写 double
由代码中可知,函数指针需要double类型的 - 填写 f1
直接将函数名赋给函数指针即可
函数指针就能够调用 - 填写 f2
同理也一样
解答代码如下:
#include <stdio.h>
double f1(double x)
{ return x*x; }
double f2(double x, double y)
{ return x*y; }
double fun(double a, double b)
{
/**********found**********/
1️⃣double (*f)();
double r1, r2;
/**********found**********/
f = 2️⃣f1;
r1 = f(a);
/**********found**********/
f = 3️⃣f2 ;
r2 = (*f)(a, b);
return r1 + r2;
}
void main()
{ double x1=5, x2=3, r;
r = fun(x1, x2);
printf("\nx1=%f, x2=%f, x1*x1+x1*x2=%f\n",x1, x2, r);
}
注:虽然程序里会有红线,但是不用管
二、程序修改🛠️ --- 单链表偶数结点值累加
难度:⭐⭐
题目📃
在此程序中,建立一个带头结点的单向链表,并用随机函数为各结点赋值。函数 fun 的功能是将单向链表结点 (不包括头结点) 数据域为偶数的值累加起来,并且作为函数值返回。请改正函数 fun 中的错误,使它能得出正确的结果。
注意:部分源程序在文件 modi1.c 中。 不要改动 main 函数,不得增行或删行,也不得更改程序的结构!
代码如下:
在代码中找出2个错误并修改
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
typedef struct aa
{ int data;
struct aa *next;
} NODE;
int fun (NODE *h)
{ int sum=0;
NODE *p;
p=h->next;
/*************found**************/
while(p -> next)
{ if(p->data%2==0)
sum+=p->data;
/*************found**************/
p=h->next;
}
return sum;
}
NODE *creatlink(int n)
{
NODE *h,*p,*s;
int i;
h=p=(NODE*)malloc(sizeof(NODE));
for(i=1;i<n;i++)
{
s=(NODE*)malloc(sizeof(NODE));
s->data=rand()%16;
p->next=s;
p=p->next;
}
p->next=NULL;
return h;
}
void outlink(NODE *h)
{ NODE *p;
p=h->next;
printf("\n\n The LIST :\n\n HEAD");
while(p)
{ printf("->%d",p->data);
p=p->next;}
printf("\n");
}
void main()
{ NODE *head; int sum;
system("CLS");
head=creatlink(10);
outlink(head);
sum=fun(head);
printf("\nSUM=%d",sum);
}
分析🧐
这道题虽然是一道链表题,但还是比较容易理解的,这里只要看fun函数即可
- 第13行改成
while(p != NULL)
脑子里要有画面,想象一下
由11行可以知道,p指向的,是当前要判断的 - 第17行改成
p = p -> next;
这里要注意就是当前指针走就可以了,原始的指针不动
动了就没有意义了
解答代码如下:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
typedef struct aa
{ int data;
struct aa *next;
} NODE;
int fun (NODE *h)
{ int sum=0;
NODE *p;
p=h->next;
/*************found**************/
1️⃣while(p != NULL)
{ if(p->data%2==0)
sum+=p->data;
/*************found**************/
//每次只要移动p就可以了
//画图就很清楚了
2️⃣ p=p->next;
}
return sum;
}
NODE *creatlink(int n)
{
NODE *h,*p,*s;
int i;
h=p=(NODE*)malloc(sizeof(NODE));
for(i=1;i<n;i++)
{
s=(NODE*)malloc(sizeof(NODE));
s->data=rand()%16;
p->next=s;
p=p->next;
}
p->next=NULL;
return h;
}
void outlink(NODE *h)
{ NODE *p;
p=h->next;
printf("\n\n The LIST :\n\n HEAD");
while(p)
{ printf("->%d",p->data);
p=p->next;}
printf("\n");
}
void main()
{ NODE *head; int sum;
system("CLS");
head=creatlink(10);
outlink(head);
sum=fun(head);
printf("\nSUM=%d",sum);
}
三、程序设计💻 --- 判断回文
难度:⭐⭐⭐
题目📃
在此程序中,编写函数 fun,该函数的功能是:判断字符串是否为回文,若是,则函数返回 1,主函数中输出 "YES",否则返回 0,主函数中输出 "NO"。回文是指顺读和倒读都一样的字符串。
例如,字符串 LEVEL 是回文,而字符串 123312 就不是回文。
注意:部分源程序在文件 prog1.c 中。 请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。
代码如下:
在fun函数中编写
#include <stdio.h>
#include <string.h>
#define N 80
int fun(char *str)
{
}
main()
{ char s[N] ;void NONO ();
printf("Enter a string: ") ; gets(s) ;
printf("\n\n") ; puts(s) ;
if(fun(s)) printf(" YES\n") ;
else printf(" NO\n") ;
}
分析🧐
这道题就是编写判断是否为回文的程序
- 先定义两个指针,i, j
- i 指向最前面
- j 指向最后面
- 依次进行判断即可
解答代码如下:
#include <stdio.h>
#include <string.h>
#define N 80
int fun(char *str)
{
//先求得字符串总长度
int len = strlen(str);
int i, j;
//i从0开始
//j从len - 1开始,依次进行对比
for(i = 0, j = len - 1; i < j; i++, j--)
{
if(str[i] != str[j])
return 0;
}
return 1;
}
main()
{ char s[N] ;
printf("Enter a string: ") ; gets(s) ;
printf("\n\n") ; puts(s) ;
if(fun(s)) printf(" YES\n") ;
else printf(" NO\n") ;
}
希望本文能够帮助到你😊