if(strcmp(a[i].num,b)==0){p=a[i];f=1;}/*通过字符串比较函数将指定的学号与每一个学生的学号进行比较,若相同,则返回指定的学生数据*/
if(f==0)/*判断是否找到指定学号*/
{p.num[0]='\0';/*若没找到指定学号,在结构体变量中给学号置空串*/
p.s=-1;/*若没找到指定学号,在结构体变量中给成绩置-1*/
}
returnp;/*返回学号和成绩*/
}
五、循环类
51、编写函数fun,它的功能是:
求Fibonacci数列中大于s的最小的一个数,结果由函数返回。
其中Fibonacci数列F(n)的定义为:
F(0)=0,F
(1)=1
F(n)=F(n-1)+F(n-2)
例如:
当s=1000时,函数值为:
1597
解题思路:
在Fibonacci数列中,每一项的值都是前两项之和。
设置一个中间变量m,用来置放推出的最小数,所以可以用递推法求出大于s的最小的一个数。
intfun(ints)
{
intx1=0,x2=1,m=0;
/*假如当前项的值小于指定值s,但是下一项的值又大于指定值s,即下一项值即为大于s的最小的一个数*/
while(s>m)
{
m=x1+x2;
x1=x2;
x2=m;
}
returnm;
}
六、按位置取整类
3、函数fun的功能是:
将a、b中的两个两位正整数合并形成一个新的整数放在c中。
合并的方式是:
将a中的十位和个位数依次放在变量c的百位和个位上,b中的十位和个位数依次放在变量c的千位和十位上。
例如,当a=45,b=12。
调用该函数后,c=1425
解题思路:
可用整除和求余的运算求取整数各位上的数值。
方法是整除相应位上的位权值,再对其求余,余数即为相应位上的数值。
voidfun(inta,intb,long*c)
{
inta_up,a_low,b_up,b_low;
a_up=a/10;/*求正整数a的十位数*/
a_low=a%10;/*求正整数a的个位数*/
b_up=b/10;/*求正整数b的十位数*/
b_low=b%10;/*求正整数b的个位数*/
*c=b_up*1000+a_up*100+b_low*10+a_low;/*将a数的十位和个位数依次放在c数的百位和个位上,b数的十位和个位数依次放在c数的千位和十位上*/
}
9、函数fun的功能是:
将两个两位数的正整数a、b合并形成一个整数放在c中。
合并的方式是:
将a数的十位和个位数依次放在c数的百位和个位上,b数的十位和个位数依次放在c数的十位和千位上。
例如,当a=45,b=12。
调用该函数后,c=2415。
解题思路:
可用整除和求余的运算求取整数各位上的数值。
方法是整除相应位上的位权值,再对其求余,余数即为相应位上的数值。
voidfun(inta,intb,long*c)
{
inta_up,a_low,b_up,b_low;
a_up=a/10;/*求正整数a的十位数*/
a_low=a%10;/*求正整数a的个位数*/
b_up=b/10;/*求正整数b的十位数*/
b_low=b%10;/*求正整数b的个位数*/
*c=b_low*1000+a_up*100+b_up*10+a_low;/*将a数的十位和个位数依次放在c数的百位和个位上,b数的十位和个位数依次放在c数的十位和千位上*/
七、素数类
24、请编写函数fun,其功能是:
计算并输出3到n之间所有素数的平方根之和。
例如,在主函数中从键盘给n输入100后,
输出为:
sum=148.874270
解题思路:
从3到指定数n,找出所有的素数,素数的判断方法是:
只能被1和其自身整除,而不能被其它任何数整除的数;sqrt(x)函数是计算x的平方根。
doublefun(intn)
{
inti,j=0;/*定义两个整型变量*/
doubles=0;/*定义变量s为双精度型*/
for(i=3;i<=n;i++)
{for(j=2;j
if(i%j==0)break;/*如果i能被j整除就说明i不是素数,继而退出循环体*/
if(j==i)s=s+sqrt(i);/*sqrt(i)函数是计算i的平方根*/
}
returns;/*返回结果*/
}
28、编写函数intfun(intlim,intaa[MAX]),该函数的功能是求出小于或等于lim的所有素数并放在aa数组中,该函数返回求出素数的个数。
解题思路:
从2到指定数lim,找出所有的素数,素数的判断方法是:
只能被1和其自身整除,而不能被其它任何数整除的数。
intfun(intlim,intaa[MAX])
{inti,j=0,k=0;
for(i=2;i<=lim;i++)/*判断i是否小于或等于lim,如果i小于等于lim执行循环*/
{for(j=2;j
if(i%j==0)break;/*假如i能被整除,则退出该层循环*/
if(j==i)aa[k++]=i;/*假如i不能被比它小的整数整除,则将i存入aa数组中*/
}
returnk;
}
34、请编写函数fun,函数的功能是:
将所有大于1小于整数m的非素数存入xx所指数组中,非素数的个数通过k传回。
例如,若输入:
17,则应输出:
9和46891012141516。
本题的考核点是求2到m-1之间的非素数算法。
解题思路:
非素数的判断方法与素数的判断方法正好相反,它除了能被1和自身整除外,还可被其它的数整除。
用求余的方法来判断整除。
voidfun(intm,int*k,intxx[])
{inti,j;*k=0;
for(i=2;i{for(j=2;j
if(i%j==0)break;
if(j
}
八、链表
12、N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。
请编写函数fun,它的功能是:
求出平均分,由函数值返回。
例如,若学生的成绩是:
85,76,69,85,91,72,64,87;则平均分应当是:
78.625
解题思路:
从链表首结点开始,累计成绩之和,再除以学生人数,得出平均值并返回。
doublefun(STREC*h)
{STREC*p;
doubleaver=0;
p=h->next;
while(p!
=0)
{aver=aver+p->s;/*从链表首结点开始累计成绩之和*/
p=p->next;/*p后移一个结点*/
}
aver=aver/N;/*求成绩的平均值aver*/
returnaver;/*返回结果*/
}
其他类
某学生的记录由学号、8门课程成绩和平均分组成,学号和8门课程的成绩已在主函数中给出。
请编写函数fun,它的功能是:
求出该学生的平均分放在记录的ave成员中。
请自己定义正确的形参。
例如,学生的成绩是:
85.5,76,69.5,85,91,72,64.5,87.5,他的平均分应当是:
78.875
解题思路:
先统计8门课程的总分数,然后再除8,求学生的平均分。
voidfun(STREC*p)
{inti;
doubleaver=0;/*将平均分赋初值0*/
for(i=0;i{aver=aver+(*p).s[i];}/*求和*/
(*p).ave=aver/N;/*计算平均值*/
}