a->ave=a->ave+a->s[i];/*求各门成绩的总和*/
a->ave/=N;/*求平均分*/
}
【考点分析】
本题考查:
结构体类型成员运算,指向结构体类型的指针变量作函数参数。
【解题思路】
本题考查自定义形参的相关知识点,程序流程是这样的:
在fun()函数中求出平均分后,返回到主函数时平均分也要带回,所以只能定义一个指针类型的形参STREC*a,此时,引用成员的方式可以使用指向运算符,即a->ave和a->s[i],当然也可用(*a).ave和(*a).s[i]。
所属年份:
2011.3累加累乘求和
请编写函数fun,其功能是:
计算并输出下列多项式的值。
例如,在主函数中从键盘为n输入50后,输出为S=1.718282。
注意:
要求n的值在大于1但不大于100之间。
部分源程序在文件PROG1.C中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
【参考答案】
doublefun(intn)
{
doublesum=0,tmp=1;
inti;
for(i=1;i<=n;i++)
{
tmp=tmp*i;
sum+=1.0/tmp;
}
returnsum;
}
【解题思路】
本题要求计算并输出多项式的值,通式为:
1/(1*2*……*n),在给出的参考程序中,由于函数的返回值为双精度型,所以定义sum、tmp为双精度型,再对符合条件的n,使用中间变量tmp求出1到n的累乘值,即题目中每个多项式中分子的值,再通过sum+=1.0/tmp;计算出所有多项式之和,最终返回值。
所属年份:
2010.9;2011.9;删除字符串中指定字符
规定输入的字符串中只包含字母和*号。
编写函数fun,其功能是:
删除字符串中所有的*号。
编写函数时,不得使用C语言提供的字符串函数。
例如,字符串中的内容为:
****A*BC*DEF*G*******,删除后字符串中的内容应当是:
ABCDEFG。
注意:
部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干的语句。
【参考答案】
voidfun(char*a)
{
inti,j=0;
for(i=0;a[i]!
='\0';i++)
if(a[i]!
='*')
a[j++]=a[i];/*若不是要删除的字符'*'则留下*/
a[j]='\0';
}
【考点分析】
要删除字符串中所有*号需要用循环语句遍历字符串,用判断语句判断字符是否为*号,由此可以决定该程序应使用循环判断结构。
【解题思路】
用循环操作从字符串的开始往后逐个进行比较,若不是要删除的字符(用if(a[i]!
=′*′)来控制)则保留。
变量i和j用来表示原字符串的下标和删除*号后新字符串的下标。
注意下标变量j要从0开始,最后还要加上字符串结束标识′\0′。
所属年份:
2012.3数组字符串转整数
请编写函数fun,其功能是:
将一个数字字符串转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数)。
例如,若输入字符串"-1234",则函数把它转换为整数值-1234。
注意:
部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
【参考答案】
longfun(char*p)
{
longn=0;
intflag=1;
if(*p=='-')/*负数时置flag为-1*/
{p++;flag=-1;}
elseif(*p=='+')/*正数时置flag为1*/
p++;
while(*p!
='\0')
{n=n*10+*p-'0';/*将字符串转成相应的整数*/
p++;
}
returnn*flag;
}
【考点分析】
本题考查:
字符串转整数算法。
【解题思路】
if()语句的作用是判断该字符串应当为正数还是负数,while()循环的作用是将字符串转成相应的整数。
注意:
*p是一个字符(如'9'、'4'),并不是一个数,要将其转成相应的数字需令其减去′0′(不是′\0′),即*p-′0′就得到*p这个字符的相应数字,如′0′-′0′=0、′8′-′0′=8等。
必须在程序的前面加#include,函数atol()的作用是将字符串p转成长整型数,它是一个库函数。
【解题宝典】
要实现字符串转整数操作,而且不允许使用相应的字符串函数,因此我们需要通过字符减去′0′来实现,即*p-′0′就得到*p这个字符的相应数字。
掌握以下语句:
while(*p!
==′\0′)
{ n=n*10+*p-′0′;
p++;
}
所属年份:
2010.9;2011.9;2012.3素数判定
编写函数fun,其功能是:
将所有大于1小于整数m的非素数存入xx所指数组中,非素数的个数通过k返回。
例如,若输入17,则应输出:
4 6 8 9 10 12 14 15 16。
注意:
部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
【参考答案】
voidfun(intm,int*k,intxx[])
{
inti,j,n=0;
for(i=4;i{for(j=2;j
if(i%j==0)break;
if(j
}
*k=n;/*返回非素数的个数*/
}
【考点分析】
本题考查:
如何判断非素数;循环判断结构;数组的引用。
【解题思路】
题目要求将1~m之间的非素数存入数组中,应使用循环判断结构。
循环语句用来遍历1~m之间的每个数,判断语句用来判断该数是否素数,若不是素数,则将其存入数组中。
这道题目是考查一个数是否为素数的简单延伸,只要掌握了判断素数的方法,问题便能顺利解决。
【解题宝典】
判定一个数是否为素数,即该数除了能被1和它本身外,不能被任何数整除。
代码实现为:
for(j=2;j
if(i%j==0) /*如余数为0,证明i不是素数*/
……
此语句需要熟记,很多判断素数的题目也可通过此法解决。
所属年份:
2011.3;2011.9统计问题
编写一个函数,该函数可以统计一个长度为2的字符串在另一个字符串中出现的次数。
例如,假定输入的字符串为"asdasasdfgasdaszx67asdmklo",子字符串为"as",则应当输出6。
注意:
部分源程序在文件PROG1.C中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
【参考答案】
intfun(char*str,char*substr)
{
inti,j=0;
for(i=0;str[i+1]!
='\0';i++)/*如果一个长度为2的子字符串在主字符串中出现一次,则j+1,如此循环*/
if(str[i]==substr[0]&&str[i+1]==substr[1])
j++;
returnj;/*返回子字符串在主字符串中出现的次数*/
}
【考点分析】
本题考查:
遍历字符串实现字符串的比较运算。
【解题思路】
该题中substr只有两个字符,所以可以用if语句直接进行判断。
要注意if语句中str数组的下标为i和i+1,即比较当前字符及其后面的一个字符是否分别与substr中的字符对应相同,若都相同则表示出现了一次。
所属年份:
2011.9;2012.3;一维数组元素的筛选
编写函数fun,其功能是:
求ss所指字符串中指定字符的个数,并返回此值。
例如,若输入字符串123412132,输入字符为1,则输出3。
注意:
部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
【参考答案】
intfun(char*ss,charc)
{
inti=0;
for(;*ss!
='\0';ss++)
if(*ss==c)
i++;/*求出ss所指字符串中指定字符的个数*/
returni;
}
【考点分析】
本题考查:
for循环语句遍历字符串,并通过if条件语句,判断字符串是否结束。
【解题思路】
从字符串中查找指定字符,需要使用循环判断结构,循环语句用来遍历字符串,循环条件为字符串没有结束,即当前字符不是′\0′,判断语句用来判断当前字符是否为指定字符。
最后返回指定字符的个数。
所属年份:
2012.3;一维数组最值求解
请编写函数fun,其功能是:
找出一维整型数组元素中最大的值及其所在的下标,并通过形参传回。
数组元素中的值已在主函数中赋予。
主函数中x是数组名,n是x中的数据个数,max存放最大值,index存放最大值所在元素的下标。
注意:
部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
【参考答案】
voidfun(inta[],intn,int*max,int*d)
{
inti;
*max=a[0];
*d=0;
for(i=0;iif(*max{*max=a[i];*d=i;}
}
【考点分析】
本题考查:
查找一维数组中的最大值及其下标,使用循环判断结构实现。
指针变量的应用。
【解题思路】
要查找最大值及其下标需要定义两个变量,该程序直接使用形参max和d,由于它们都是指针变量,所以在引用它所指向的变量时要对它进行指针运算。
循环语句用来遍历数组元素,条件语句用来判断该数组元素是否最大。
【解题宝典】
该程序考查求最大值,需要掌握以下语句:
for(i=0;iif(*max{*max=a[i];*d=i;}
所属年份:
2010.9;2011.3;移动问题
规定输入的字符串中只包含字母和*号。
请编写函数fun,其功能是:
将字符串中的前导*号全部移到字符串的尾部。
例如,字符串中的内容为:
"*******A*BC*DEF*G****",移动后,字符串中的内容应当是:
"A*BC*DEF*G***********"。
在编写函数时,不得使用C语言提供的字符串函数。
注意:
部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
【参考答案】
voidfun(char*a)
{
inti=0,n=0;
char*p;
p=a;
while(*p=='*')/*判断*p是否是*号,并统计*号的个数*/
{
n++;p++;
}
while(*p)/*将前导*号后的字符传递给a*/
{
a[i]=*p;i++;p++;
}
while(n!
=0)
{
a[i]='*';i++;n--;
}
a[i]='\0';
}
【考点分析】
本题考查:
移动字符串中指定字符的位置,一般采用while循环语句,通过指针型变量来完成。
【解题思路】
函数fun的功能:
将字符串中的前导*号全部移到字符串的尾部。
本题解题思路:
(1)定义一个指针并指向字符串的首地址;
(2)利用循环语句找出字符串的前导*号的个数n;(3)利用循环语句把剩余的字符拷贝到另一个字符串中;(4)在字符串的末尾接上n个*号。
所属年份:
2011.3整数合并
编写函数fun,其功能是:
将a、b中的两个两位正整数合并成一个新的整数放在c中。
合并的方式是:
将a中的十位和个位数依次放在变量c的百位和个位上,b中的十位和个位数依次放在变量c的十位和千位上。
例如,当a=45,b=12,调用该函数后c=2415。
注意:
部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
【参考答案】
voidfun(inta,intb,long*c)
{
*c=a%10+(b/10)*10+(a/10)*100+(b%10)*1000;
}
【考点分析】
本题考查:
如何取出数值n的各个位;知道数值n的各个位,又如何表示该数值;指针型变量的使用。
【解题思路】
本题的主要问题如何取出a和b的个位数和十位数,取出后如何表示成c中相应的位数。
由于a和b都是只有两位的整数,所以分别对它们除10可得到它们的十位数(a/10),分别用10对它们求余可得到它们的个位数(a%10)。
得到后对应乘以1000、100、10、1就可得到c的千位数、百位数、十位数和个位数。
注意:
使用c时要进行指针运算。
所属年份:
2011.9字符串计数
请编写函数fun,其功能是:
统计s所指字符串中的数字字符个数,并作为函数值返回。
例如,s所指字符串中的内容是:
2def3