if(strcmp(a[i].num,b)==0) /*找到指定学号的学生数据*/
str=a[i];
return str; /*返回学生记录*/
}
【考点分析】
本题考查:结构体类型;字符串比较函数strcmp()的应用。
【解题思路】
本程序一开始先使结构体变量str中的学号为空串,成绩为-1。循环体的功能是搜索所有学生的学号,并判断是否有学号与b所指字符串相同(即找到),若找到则给str重新赋值(str=a[i]),若没找到则str成员的值还是原有值(即未找到时学号返回空串,成绩返回-1)。【解题宝典】
常见的字符串处理函数总结如下:
调用形式
作用
说明
puts
(字符数组)
将一个字符串(以′\0′结束)输出到终端设备
用该函数输出的字符串中可以包含转义字符
gets
(字符数组)
从终端输入一个字符串到字符数组中,并且得到一个函数值
puts()和gets()函数一次只能输入或输出一个字符串,不能写成puts(字符数组1,字符数组2)或gets(字符数组1,字符数组2)
strcpy(字符数组1,字符数组2)
把字符数组2所指字符串的内容复制到字符数组1所指存储空间中。函数返回字符数组1的值,即目的串的首地址
为保证复制的合法性,字符数组1必须指向一个足够容纳字符数组2的存储空间
strcat(字符数组1,字符数组2)
该函数将字符数组2所指字符串的内容连接到字符数组1所指的字符串后面,并自动覆盖字符数组1串末尾的′\0′,该函数返回字符数组1的地址值
字符数组1所指定字符串应有足够的空间容纳两串合并后的内容
strlen(字符数组)
此函数计算出以字符数组为起始地址的字符串的长度,并作为函数值返回
这一长度不包括串尾的结束标志′\0′
strcmp(字符数组1,字符数组2)
该函数用来比较字符数组1和字符数组2所指字符串的大小。若字符数组1>字符数组2,函数值大于0(正数);若字符数组1=字符数组2,函数值等于0;若字符数组1<字符数组2,函数值小于0(负数)
根据字符的ASCII码值依次对字符数组1和字符数组2所指字符串对应位置上的字符两两进行比较,当出现第一对不同的字符时,即由这两个字符决定所在串的大小
17.函数fun的功能是:将s所指字符串中除下标为偶数同时ASCII码值也为偶数的字符外,其余的全部删除;字符串中剩余字符所形成的新串放在t所指的数组中。
例如,若s所指字符串中的内容为"ABCDEFG123456",其中字符A的ASCII码值为奇数,因此应当删除;字符B的ASCII码值为偶数,但在数组中的下标为奇数,因此也应当删除;字符2的ASCII码值为偶数,在数组中的下标也为偶数,因此不应当删除,其他依此类推。最后t所指的数组中的内容应是"246"。
【参考答案】
void fun(char *s, char t[])
{
int i,j=0;
for(i=0;s[i]!='\0';i++)
if(i%2==0 && s[i]%2==0) /*将s所指字符串中下标和ASCII码值都为偶数
的字符放入数组t 中*/
t[j++]=s[i];
t[j]='\0'; /*在字符串最后加上结束标识*/
}
【考点分析】
本题考查:循环判断结构;字符串的操作;逻辑运算符的使用。
【解题思路】
本题要求删除除了下标为偶数同时ASCII 码值也为偶数的字符,即保留下标为偶数同时ASCII 码值也为偶数的字符。循环语句用于遍历字符串,条件语句用于判断当前字符是否符合要求。注意判断条件是下标为偶数,同时ASCII 码值也为偶数,所以应使用逻辑与"&&"运算符。
18编写函数fun ,其功能是:利用下面的简单迭代方法求方程cos(x)-x =0的一个实根。 1cos()n n x x +=
迭代步骤如下:
(1)取x1初值为0.0;
(2)x0=x1,将x1的值赋给x0;
(3)x1=cos(x0),求出一个新的x1;
(4)若x0-x1的绝对值小于0.000001,执行步聚(5),否则执行步聚(2);
(5)所求x1就是方程cos(x)-x =0的一个实根,作为函数值返回。
程序将输出结果Root =0.739086。
double fun()
{
double x0,x1;
x1=0.0;
do
{
x0=x1;
x1=cos(x0);
}while(fabs(x0-x1)>=1e-6);
return x1;
}
19.规定输入的字符串中只包含字母和*号。请编写函数fun,其功能是:将字符串中的前导*号全部移到字符串的尾部。
例如,字符串中的内容为:"*******A*BC*DEF*G****",移动后,字符串中的内容应当是:"A*BC*DEF*G***********"。在编写函数时,不得使用C语言提供的字符串函数。
void fun( char *a )
{
int i=0,n=0;
char *p;
p=a;
while (*p=='*')
{
n++;p++;
}
while(*p)
{
a[i]=*p;i++;p++;
}
while(n!=0)
{
a[i]='*';i++;n--;
}
a[i]='\0';
}
20.学生记录由学号和成绩组成,N名学生的数据已放入主函数中的结构体数组中,请编写函数fun,其功能是:把分数最低的学生数据放入b所指的数组中,注意:分数最低的学生可能不止一个,函数返回分数最低的学生人数。
【参考答案】
int fun( STREC *a, STREC *b )
{
int i,j=0,min=a[0].s;
for(i=0;iif(min>a[i].s)
min=a[i].s; /*找出最小值*/
for(i=0;iif(min==a[i].s)
b[j++]=a[i]; /*找出成绩与min相等的学生的记录,存入结构体b中*/
return j;
}
【考点分析】
本题考查:查找结构体数组中的最小数据,需要通过for循环语句和if条件语句来完成。【解题思路】
本题中第一个循环语句的作用是遍历数组求出最低分数,第二个循环语句的作用是将数组中的元素与最低分比较,查找是否存在与最低分相等的成绩。
21.编写函数fun,其功能是计算:
s=作为函数值返回。
在C语言中可调用log(n)函数求ln(n)。log函数的引用说明为:double log(double x)。【参考答案】
double fun( int m )
{
int i;
double s=0.0;
for(i=1;i<=m;i++)
s=s+log(i); /*计算s=ln(1)+ln(2)+ln(3)+…+ln(m)*/
return sqrt(s); /*对s求平方根并返回*/
}
【考点分析】
本题考查:计算表达式的值运用for循环语句通过累加操作求和;平方根函数sqrt()的使用。【解题思路】
首先计算从1到m的对数的和,因此循环变量的范围是1~m,每次循环都进行一次累加求和。该题需要注意的是,log()函数的形式参数应当为double型变量,而用于循环的基数变量为整数,需要进行强制转换。在返回的时候求出平方根。
22.规定输入的字符串中只包含字母和*号。请编写函数fun,其功能是:只删除字符前
导和尾部的*号,串中字母间的*号都不删除。形参n给出了字符串的长度,形参h给出了字符串中前导*号的个数,形参e给出了字符串中尾部*号的个数。在编写函数时,不得使用C 语言提供的字符串函数。
例如,字符串中的内容为:"****A*BC*DEF*G*******",删除后,字符串中的内容应当是:"A*BC*DEF*G"。
void fun( char *a, int n,int h,int e )
{
int i,j=0;
for(i=h;ia[j++]=a[i];
a[j]='\0';
}
【参考答案】
void fun(char *s, char t[])
{
int i,j=0,k=strlen(s); /*k为字符串的长度*/
for(i=1;it[j++]=s[i];
t[j]='\0';
}
【考点分析】
本题考查:删除字符串中指定字符,采用保留非指定字符的方法操作。
【解题思路】
本题使用了一种i永远是奇数的循环方法,即for(i=1;i21.适用于数字.
int fun(char *str)
{ int i,n=0,fg=1;
char *p=str;
while (*p) /*将指针p置位到字符串末尾,并统计字符数*/
{n++;
p++;}
for(i=0;iif(str[i]==str[n-1-i]) ; /*相同,什么都不作*/
else /*不同,直接跳出循环*/
{fg=0;
break;}
return fg;}
22适用于字符串.
int fun(char *s)
{ char *lp,*rp;
/**********found**********/
lp= s ;
rp=s+strlen(s)-1;
while((toupper(*lp)==toupper(*rp)) && (lp