c语言机试上级答案解析(61-80)

更新时间:2023-03-11 03:57:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第六十一套

一、请补充main函数,该函数的功能是求方程ax2+bx+c=0的两个实数根。方程的系数a、b、c从键盘输

入,如果判别式(disc=b2-4ac)小于0,则要求重新输入a、b、c的值。

例如,当a=1,b=2,c=1时,方程的两个根分别是x1=-1.00, x2=-1.00。 注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。 试题程序:

#include #include #include void main() {

float a,b,c, disc,x1,x2; system(\ do {

printf(\

scanf(\disc=b*b-4*a*c; if(disc<0)

printf(\

\\n\

}while(【1】);

printf(\ x1=【2】; x2=【3】;

printf(\

}

答案:【1】disc<0

件是disc<0。

【2】(-b+sqrt(disc))/(2*a)

【3】(-b-sqrt(disc))/(2*a)

【解析】填空1:题目要求当判别式disc小于0时,重新输入a、b、c的值,所以do-while循环的执行条

?b?b2?4ac填空2:方程2的一个实数根是:x?填空3:方程2的另

2aax?bx?c?0ax?bx?c?0。?b?b2?4ac一个实数根是:x?2a。

二、下列给定程序中,函数fun的功能是:给定n个实数,输出平均值,并统计平均值以上(含平均值)

的实数个数。例如,n=8时,输入193.199,195.673,195.757,196.051,196.092,196.596,196.579,196.763,所得平均值为195.838745,在平均值以上的实数个数应为5。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include #include #include

int fun(float x[], int n)

/*************found**************/ int j, c=0;float xa=0.0; for (j=0; j

printf(\ for (j=0; j=xa) c++; return c; }

void main()

{ float x[100]={ 193.199,195.673,195.757,

196.051,196.092,196.596, 196.579,196.763};

system(\

printf(\

}

答案:(1)错误:缺{

(1)求出n个数的平均值。

(2)将大于平均值的数字个数计算出来。可利用循环和条件选择语句对x数组进行遍历,若某个值大于平均成绩,则将该元素累加计入c中。我们先来搞清楚一个简单的求10个整数平均值的例子。 #include \void main() {

int i,a[10],s=0; float aver=0.0; for (i=0;i<10;i++) {

scanf(\s=s+i; }

aver=s/10.0;

printf(\这十整数中的平均值为:%f\

}

其实,n个整数求和也就是10个整数的拓展,没什么难的!

三、学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:把指定分数范围内的学生数据放在b所指的数组中,分数范围内的学生人数由函数值返回。

例如,输入的分数是60和69,则应当把分数在60到69的学生数据进行输出,包含60分和69分的学生数据。主函数中把60放在low中,把69放在heigh中。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include #define N 16 typedef struct { char num[10]; int s ; }STREC;

int fun (STREC *a, STREC *b, int l, int h ) { }

void main () {

STREC s[N]={{ \ {\ {\ {\ {\ {\ STREC h[N];

int i, n, low, heigh, t;

printf(\

heigh: \

scanf(\ if(heigh

{t=heigh;heigh=low; low=t;} n=fun(s,h,low, heigh);

正确:加{

【解析】本题我们可以拆分成两个简单的C语言试题:

printf(\

%d--%d:\\n \

for(i=0;i

printf(\ /*输出指定分数范围内的学生记录*/ printf(\

}

答案:int fun (STREC *a, STREC *b, int l, int h )

{

int i,j=0;

for(i=0;i

if(a[i].s>=l&&a[i].s<=h) /*将分数高于l,低于h的学生记录存于结

构体数组b中*/

b[j++]=a[i];

return j; /*返回分数范围

内的学生人数*/

}

【解析】处理此类分段统计问题,可采用多分支选择语句或条件选择语句。此处采用条件选择语句解答,具体见参考答案。使用条件选择语句进行分段统计时,应当注意分段范围。 第六十二套:

一、请补充函数fun,该函数的功能是:寻找两个整数之间的所有素数(包括这两个整数),把结果保存在数组bb中,函数返回素数的个数。

例如,输入6和21,则输出为:7 11 13 17 19。 注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。 试题程序:

#include #include #include #define N 1000

int fun(int n,int m,int bb[N]) { int I,j,k=0,flag; for(j=n;j<=m;j++) { 【1】; for(I=2;I

void main() { int n=0,m=0,i,k; int bb[N]; system(\ printf(\ scanf(\ printf(\ scanf(\ for(i=0;i

}

答案:【1】flag=1

【2】j%I==0

【3】flag==1

【解析】填空1:由flag决定当前判断的数是否为素数,先置flag为1,如果判断出当前数不是素数,则将flag置零。填空2:如果一个数能被除了1和其自身之外的数整除(即余数为0),则这个数不是素数。填空3:如果flag等于1,则说明当前数是素数,并把它存入数组bb中。

二、下列给定的程序中,函数fun的功能是:为一个偶数寻找两个素数,这两个素数之和等于该偶数,并将这两个素数通过形参指针传回主函数。

请改正函数fun中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include #include

void fun(int a, int *b, int *c) { int i,j,d,y;

for (i=3;i<=a/2;i=i+2)

/*************found**************/ {y=0;

for (j=2;j<=sqrt((double)i );j++) if (i%j==0) y=0; if (y==1)

/*************found**************/ { d=i-a;

for (j=2;j<=sqrt((double)d );

j++)

if (d%j==0) y=0; if (y==1)

{*b=i; *c=d;} } } }

void main() { int a,b,c; do

{ printf(\ a: \

scanf(\

while(a%2); fun(a,&b,&c);

printf(\

}

答案:(1)错误:y=0;

(2)错误:d=i-a;

正确:y=1; 正确:d=a-i;

【解析】这道题是历年的经典考题。也就是验证哥德巴赫猜想之变体,原来的思路是(任意一个大于等于6的偶数都可以分解为两个素数之和)n为大于等于6的任一偶数,可分解为n1和n2两个数,分别检查n1和n2是否为素数,如都是,则为一组解。如n1不是素数,就不必再检查n2是否为素数。先从n1=3开始,检验n1和n2(n2=N-n1)是否为素数。然后使n1+2 再检验n1,n2是否为素数,…直到n1=n/2为止。该题思路是与\经典猜想\是相同的。

三、请编写函数fun,该函数的功能是:统计一行字符串中单词的个数,作为函数值返回。一行字符串在主函数中输入,规定所有单词由小写字母组成,单词之间有若干个空格隔开,一行的开始没有空格。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include #include #define N 80

int fun(char *s) {

}

void main() {

char line[N]; int num=0;

printf(\ gets(line); num=fun(line);

printf(\

num);

}

答案:int fun(char *s)

{

int i,j=0;

for(i=0;s[i]!='\\0';i++)

if(s[i]!=' '&&(s[i+1]==' '||s=='\\0')) /*如果一个字母的下一个字符为空格或者结

束标记,则表示一个单词结束*/

j++;

return j; /*

返回单词个数*/

}

【解析】判断单词的个数,我们首先想到的是程序怎样识别是一个单词,也即循环语句中的for(i=0;s[i]!=′\\0′;i++),本题重点是if语句中的条件表达方式。 第六十三套:

一、人员的记录由编号和出生年、月、日组成,N名人员的数据已在主函数中存入结构体数组std中,且编号唯一。函数fun的功能是:找出指定编号人员的数据,作为函数值返回,由主函数输出,若指定编号不存在,返回数据中的编号为空串。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。 试题程序:

#include

#include #define N 8 typedef struct {

char num[10];

int year,month,day; } STU;

【1】fun(STU *std,char *num) {

int i;

STU a = {\}; for (i=0;i

if (strcmp(【2】,num)==0)

return(【3】);

return a;

}

main ( ) {

STU std[N] = {

{\{\{\44444\},{\},{\},{\777\{\} };

STU p\

char n[10]=\p = fun(std,n); if (p.num[0] == 0) {

printf(\}

else {

printf(\

printf(\ %d-%d-%d\\n\,p.year,p.month,p.day); }

}

答案:【1】STU

【2】std[i].num

【3】std[i]

【解析】填空1:根据函数fun的返回值类型,函数也应该是结构体类型的,所以填入STU。填空2:根据题目说明可知,找出制定编号人员,并将其数据返回。通过strcmp函数比较编号,所以填入std[i].num。填空3:由题目可知,假如编号对应,则返回其编号对应数据,所以填入数据std[i]。

二、下列给定程序中,函数fun的功能是:计算并输出high以内最大的10个素数之和。high由主函数传给函数fun。例如high的值为100,则函数的值为732。

请改正程序中的错误,使程序能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include

#include #include int fun (int high) {

int sum=0, n=0, j, yes; while ((high>=2) && (n<10)) {

yes=1;

for (j=2; j<=high/2; j++) /********found********/ if (high%j== 0) {

yes = 0; break }

if (yes) {

sum += high; n++; }

high--; }

return sum; }

main ( ) {

printf(\

}

答案:(1)错误:break

正确:break;

【解析】(1)很简单的一个程序语法错误,没有加分号。

三、程序定义了N×N的二维数组,并在主函数中自动赋值。请编写函数fun(int a[][N],intn),该函数

的功能是:使数组左下半三角元素中的值乘以n。例如:若n的值为3,a数组中的值为

197238a=

则返回主程序后a数组中的值应为

456

369978。

121518注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include #include #include #define N 5

void fun (int a[ ][N] ,int n) { }

main ( ) {

int a[N][N],n,i,j;

printf(\for(i=0;i

for(j=0;j

a[i][j]=rand ( ); printf(\}

printf(\}

n = rand ( )%4;

printf(\fun(a,n);

printf(\for(i=0;i

for (j=0;j

printf(\printf(\}

}

答案:fun(int a[][N],int n)

{

int i,j;

for(i=0;i

for(j=0;j<=i;j++)

a[i][j]=a[i][j]*n;

}

【解析】首先从数组中找出要被乘以n的那部分元素,找的过程其实就是找出将被挑出的元素在原数组中

的分布规律的过程。通过观察得出,要被处理的那部分元素的下标值的范围是每行中从第一个元素开始,直到列数等于该行行数时为止。找到这个规律后,依次从数组中取得合乎要求的元素,然后乘以n。 第六十四套:

一、请补充函数fun,该函数的功能是:求100(不包括100)以内能被2或5整除,但不能同时被2和5整除的自然数。结果保存在数组bb中,函数fun返回数组bb元素的个数。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。 试题程序:

#include #include #define N 100

int fun(int bb[]) { int I, j; for(【1】; I<100; I++) if((I%2!=0&&I%5==0)||(I%2==

0&&I%5!=0))

【2】; 【3】; }

void main() { int i, n; int bb[N]; system(\ n=fun(bb); for(i=0; i

答案:【1】I=1,j=0 【2】bb[j++]=I 【3】return j

【解析】填空1:题目要求找100以内的自然数,而自然数是从1开始的,所以I的初始值为1。变量j声明时没有初始化,所以在这里初始化为0,用来记录满足条件的自然数的个数。填空2:将满足条件的自然数存于数组bb中,下标加1是为下一次存储做准备。填空3:题目要求函数fun返回数组bb元素的个数,所以函数返回j。

二、下列给定程序中,函数fun的功能是:从整数1到55之间,选出能被3整除且有一位上的数是5的数,

并把这些数放在b所指的数组中,这些数的个数作为函数值返回。规定,函数中a1放个位数,a2放十位数。

请改正程序中的错误,使程序能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include

/********found********/ int fun(int *b); {

int k, a1, a2, i=0; /********found********/ for (k=10; k<=55; k++) {

a2=k/10;

a1=k-a2*10;

if ((k%3==0&& a2==5)||(k%3==0 && a1==5)) {

b[i]=k;i++; }

}

/********found********/ return k;

}

main ( ) {

int a[100],k,m; m=fun(a);

printf(\:\\n\for (k=0; k

printf(\printf(\\\n\

}

答案:(1)错误:int fun(int *b)

(2)错误:for (k=10; k<=55; k++) (3)错误:return k

正确: int fun(int *b) 正确: for(k=1; k<=55; k++) 正确: return i;

【解析】(1)简单语法错误。(2)从题目可知,选取的是1至55之间的数,所以应该从1开始判断。(3)根据题意,要返回能被3整除的数的个数,程序中由i来计算的,所以返回的是i。

三、请编写函数fun,其功能是:将两个两位数的正整数a、b合并形成一个整数放在c中。合并的方式是:将a数的十位和个位数依次放在c数的百位和个位上,b数的十位和个位数依次放在c数的千位和十位上。 .

例如,当a=45,b=12,调用该函数后,c=1425。 注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include

#include

void fun (int a,int b,long *c) { }

main ( ) {

int a ,b; long c;

printf (\:\scanf (\fun(a,b,&c);

printf(\:%ld\\n\

}

答案:void fun(int a,int b,long *c)

{

*c=(b/10) *1000+(a/10)*100+(b)*10+a;

}

【解析】本题中主要的问题是怎么取出a和b的个位数和十位数,取出后怎么表示成c中相应的位数。由于a和b都是只有两位的整数,所以分别对他们除10可得到他们的十位数,分别用10对他们求余可得到他们的个位数。得到后对应乘以1000、100、10、1就可得到c的千位数、百位数、十位数和个位数。注意

要使用c时要进行指针运算。 第六十五套:

一、给定程序功能是:计算S=f(-n)+f(-n+1)+…+f(0)+f(1)+ f(2)+…+f(n)的值。

例如,当n为5时,函数值应为:10.407143。

?(x?1)/(x?2)x?0?x?0或x?2f(x)??0??(x?1)/(x?2)x?0

注意:部分源程序给出如下。

请勿改动main函数中的任何内容,仅在f函数和函数fun的横线上填入所编写的若干表达式或语句。 试题程序:

#include #include double f(double x) {

if(fabs(x-0.0)<1e-6||fabs(x-2.0)<1e-6)

return 【1】;

else if (x<0.0) return (x-1)/(x-2);

else

return (x+1)/(x一2);

}

double fun(int n) {

int i;

double s=0.0,y;

for (i=-n; i<=【2】; i++) {

y = f(1.0*i); s += y;

}

return 【3】;

}

main ( ) {

printf(\,fun(5));

}

答案:【1】0.0或0或(double)0 【2】n 【3】s

【解析】填空1:根据函数f(x)中的条件可以知道,当x=0或2时,返回值为0,所以填入0.0或0或(double)0。填空2:由题意可知,s要计算f(-n)到f(n)的和,所以for循环的范围为-n到n。填空3:计算的结果要返回输出,所以返回值是总和s。

二、下列给定程序中,函数fun的功能是:计算n的5次方的值(规定n的值大于2、小于8),通过形参指

针传回主函数;并计算该值的个位、十位、百位上数字之和作为函数值返回。例如,7的5次方是1 6807,其低3位数的和值是15。

请改正函数fun中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include #include

int fun(int n,int *value) {

int d,s,i;

/********found********/ d=0;

/********found********/ s=1;

for(i=1; i<=5; i++)

d=d*n;

*value=d;

for(i=1; i<=3; i++)

{

s=s+d;

/********found********/ s=s/10;

}

return s;

}

main ( ) {

int n, sum , v; do {

printf(\:\scanf(\,&n); } while (n<=2||n>=8); sum = fun (n, &v);

printf(\:\\n value=%d sum=%d\\n\\n\

}

答案:(1)错误:d=0

(2)错误:s=1 (3)错误:s=s/10

正确:d=1; 正确:s=0; 正确:d=d/10

【解析】(1)分析题目,这里属于逻辑错误,假如d=0,则d=d*n就不能计算n的5次方。(2)在for循环中,如果s=1,就改变了d的个位数的值。(3)s用来求个位、十位、百位的和,d是n的5次方的值,除以10,用来求十位、百位的值。

三、请编写函数fun,其功能是:计算并输出给定10个数的方差。

10S?[(?(Xx?X')2)/10]0.5x?1

其中

X'?(?Xx)/10x?110

例如,给定的10个数为95.0,89.0,76.0,65.0,88.0,72.0,85.0,81.0,90.0,56.0,则输出为S=11.730729。 注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include #include

double fun(double x[10]) { }

void main() {

double s,x[10]={95.0,89.0,76.0,65.0,

88.0,72.0,85.0,81.0,90.0,56.0};

int i;

printf(\ for(i=0;i<10;i++)

printf(\ printf(\ s=fun(x);

printf(\

}

答案:double fun(double x[10])

{

double x1=0.0,s=0.0; int i;

for(i=0;i<10;i++) x1=x1+x[i];

x1=x1/10; /*求10

个数的平均值*/

for(i=0;i<10;i++)

s=s+(x[i]-x1)*(x[i]-x1);

return sqrt(s/10); /*求

10个数的方差*/

}

【解析】又是一道算式表达题,程序中用第1个循环来完成求10个数的总和,接着再用x1=x1/10来求出平均值。 第六十六套:

一、给定程序中,函数fun的功能是:把形参s所指字符串中下标为奇数的字符右移到下一个奇数位置,

最右边被移出字符串的字符绕回放到第一个奇数位置,下标为偶数的字符不动 (注:字符串的长度不小于2)。

例如,形参s所指的字符串为:abcdefgh,执行结果为:ahcbedgf。 注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。 试题程序:

#include void fun(char *s) {

int i, n, k; char c; n=0;

for (i=0; s[i]!='\\0'; i++)

n++;

if (n%2==0) k=n-【1】;

else k=n-2; c=【2】;

for (i=k-2;i>=1;i=i-2)

s[i+2]=s[i];

s[1]= 【3】; }

main ( ) {

char s[80] = \

printf(\:%s\\n\,s); fun(s);

printf(\ %s\\n\

}

答案:【1】1

【2】s[k]或*(s+k)

【3】c

【解析】填空1:函数fun中n统计字符的长度,假如长度为偶数,则k=n-1;假如长度为基数,则k=n-2,使得下标为奇数的最后一个元素有效(不是'\\0')。填空2:了解了k的作用后,则将最右边的奇数位置的数赋值给c。填空3:将最后一个下标为奇数的元素移到第一个奇数位置。

二、下列给定的程序中,函数fun的功能是:将s所指字符串中出现的t1所指字符串全部替换成t2所指字符串,所形成的新的字符串放在w所指的数组中。在此处,要求t1和t2所指字符串的长度相同。例如:当s所指字符串中所指的内容为abcdabfab,t1所指字符串中的内容为ab,t2所指字符串中的内容为99时,结果在w所指的数组中的内容应为99cd99f99。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include #include #include #include

/*************found**************/

int fun (char *s,char *t1, char *t2, char *w) {

char *p,*r,*a; strcpy(w,s); while (*w)

{p=w; r=t1;

/*************found**************/ while (r)

if (*r==*p){r++;p++;} else break; if (*r=='\\0') {a=w; r=t2;

/*************found**************/ while (*r){*a=*r;a++;r++} w+=strlen(t2); }

else w++; } }

void main()

{char s[100],t1[100],t2[100],w[100]; system(\

printf(\ S: \ scanf(\

printf(\ t1: \ scanf(\

printf(\ t2: \ scanf(\

if (strlen(t1)==strlen(t2)) {

fun (s,t1,t2,w);

printf(\ }

else printf(\

}

答案:(1)错误:int fun(char *s,char *t1,char *t2, char *w) 正确:void fun(char *s,char *t1,char *t2, char *w)

(2)错误:while( r) (3)错误:r++

正确:while( *r) 正确:r++;

【解析】在int fun(char *s,char *t1,char *t2, char *w)中,用int型定义指针数组。ANSI标准要求动态分配系统返回void指针。void指针具有一般性,它们可以指向任何类型的数据。但目前绝大多数C编译所提供的这类函数都返回char指针。无论以上两种情况的哪一种,都需要用强制类型转换的方法把char指针转换成所需的类型。该程序段应该是void fun (char *s,char *t1, char *t2, char *w),另外,while( r)和r++都是简单的逻辑和语法错误,只要加强了C语言的基础,这样的错误是很明显的。

三、编写函数fun,该函数的功能是:从字符串中删除指定的字符。同字母的大、小写按不同字符处理。 例如:若程序执行时输入字符串为: turbo c and borland c++

从键盘上输入字符n,则输出为:

turbo c ad borlad c++

如果输入的字符在字符串中不存在,则字符串照原样输出。 注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include #include

void fun(char s[ ] ,int c) { }

main ( )

{

static char str[ ]=\char ch;

printf(\原始字符串:%s\\n\printf(\输入一个字符:\scanf(\fun(str,ch);

printf(\

strcpy (str,\fun(str,'a'); }

答案:void fun(char s[], int c)

{

int i=0; char *p; p=s;

while(*p) /*判

断是否为结束符*/

{

if(*p!=c) /*判断字符串中字符是否

与指定字符相同*/

{

s[i]=*p; /*不同将重

新组合字符串,*/

i++;

}

p++; /*相同则处

理下一个字符。*/

}

s[i]='\\0';

}

【解析】该程序先将字符串s的首地址付给了指针p,经过判断后,将重新组合的字符存入s。 第六十七套:

一、str为一个字符序列。请补充函数fun,该函数的功能是:查找str中值为x的元素,返回该字符序列中值为x的元素个数,并把这些值为x的元素下标依次保存在数组bb中。例如,在\abcdefahij\中查找'a',结果为:2个'a',下标依次为0、6。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。 试题程序:

#include #include

#include #define N 20 int bb[N];

int fun(char *str,char ch) { int I=0, n=0; char t=ch; char *p=str; while(*p) { if (【1】) 【2】; p++; I++; } return 【3】; }

void main() { char str[N]; char ch; int i,n; system(\ printf(\

***\\n\

gets(str); printf(\ puts(str); printf(\ scanf(\ n=fun(str,ch); printf(\

%d\\n\

printf(\

***\\n\

for(i=0;i

}

答案:【1】*p==t

【2】bb[n++]=I

【3】n

【解析】填空1:通过指针p的移动来依次访问字符串的各个字符,如果指针p所指的字符等于待查找的字符,即表示找到了满足条件的字符。填空2:将找到的字符在字符数组中的下标值保存在数组bb中。填空3:变量n记录在字符串中找到待查找字符的个数。由main函数的调用可知函数fun()的返回值为n。

二、下列给定程序中函数fun的功能是:求出字符串中最后一次出现的子字符串的地址,通过函数值返回,在主函数中输出从此地址开始的字符串;若未找到,则函数值为NULL。例如,当字符串中的内容为abcdabfabcdx,t中的内容为ab时,输出结果应是abcdx。当字符串中的内容为abcdabfabcdx,t中的内容为abd时,则程序输出未找到的信息:Not found!

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include #include #include #include

char *fun(char *s,char *t)

{

char *p,*r,*a;

/*************found**************/ a=Null; while(*s) { p=s;r=t; while(*r)

/*************found**************/ if(r= =p) {r++;p++;} else break; if(*r=='\\0') a=s; s++; }

return a; }

void main()

{char s[100],t[100],*p; system(\

printf(\ scanf(\

printf(\ scanf(\ p=fun(s,t);

if(p) printf(\ else printf(\

}

答案:(1)错误:a=NuLL;

(2)错误:if(r==p) { r++;p++;}

正确:a=NULL;

正确:if(*r==*p) { r++;p++;}

【解析】题目要求将最后一次出现的输入字符后面的字符串做一复制处理,并在主函数中输出从该地址开始的字符串。a=NuLL;是个明显的错误。题目中已经定义了指针变量char *p,*r,*a;,循环条件应该是if(*r==*p) { r++;p++;},而非if(r==p) { r++;p++;}。

三、请编写一个函数fun,它的功能是:将ss所指字符串中所有下标为奇数位置的字母转换为大写(若该位置上不是字母,则不转换)。

例如,若输入abc4Efg,则应输出aBc4EFg。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include #include #include #include void fun(char *ss) { }

void main() {

char tt[81]; system(\

printf(\ 80 characters:\\n\ gets(tt);

printf(\

\\n %s\

fun(tt);

printf(\

}

答案:void fun(char *ss)

{

int i;

for(i=0;ss[i]!='\\0';i++) /*将ss所指字符串中所有下标为奇数位置的字

母转换为大写*/

if(i%2==1&&ss[i]>='a'&&ss[i]<='z') ss[i]=ss[i]-32; }

【解析】从C语言的学习中我们知道,只要将小写字母减去32即转成大写字母,将大写字母加上32即转成小写字母。该程序是用if语句实现该功能转化的。 第六十八套:

一、给定程序中,函数fun的功能是:将s所指字符串中的所有数字字符移到所有非数字字符之后,并保持数字字符串和非数字字符串原有的次序。

例如,形参s所指的字符串为:def35adh3kjsdf7。执行结果为:defadhkjsdf3537。 注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。 试题程序:

#include void fun(char *s) {

int i,j = 0,k = 0; char t1[80] ,t2[80]; for(i=0;s[i]!='\\0';i++)

if(s[i]>='0' && s[i]<='9') {

t2[j]=s[i]; 【1】;

}

else {

t1[k++] = s[i];

}

t2[j] = 0; t1[k] = 0;

for (i=0;i

【2】;

for (i=0;i<【3】;i++)

s[k+i] = t2[i]; }

main ( ) {

char s[80] = \

printf(\\\nThe original string is: %s\\n\fun(s);

printf(\\\nThe result is:%s\\n\

}

答案:【1】j++或j+=1或++j或j=j+1

【2】s[i]=t1[i] 【3】j

【解析】填空1:根据函数fun中的内容可知,t1存储了s中的非数字字符,t2存储了s中的数字字符,为了存储下一个数字,j要加1。填空2:分开s中的数字与非数字后,要先将非数字放入字符串s中,那么填入s[i]=t1[i]。填空3:将数字字符加到s之后,并且i要小于数字的个数j。

二、下列给定程序中,函数fun的功能是:在字符串的最前端加入n个*号,形成新串,并且覆盖原串。注意:字符串的长度最长允许为79。

请改正函数fun中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include #include #include

void fun(char s[],int n) {

char a[80] ,*p; int i;

/********found********/ s=p;

for (i=0 ; i

a[i] = '*';

do {

a[i]=*p; i++;

/********found********/ ____填空____

} while (*p); /********found********/ a [i] = '0'; strcpy (s,a); }

main ( ) {

int n;

char s[80];

printf(\gets (s);

printf(\

printf(\scanf(\fun(s,n);

printf(\

}

答案:(1)错误:s=p;

(2)应填p++;或++p;或p+=1;或p=p+1; (3)错误:a[i]= '0';

正确: a[i]= '\\0';或a[i]=0;

【解析】(1)在本题中,s是数组名,代表数组首地址,在编译时对s数组分配了一段内存单元,因此在程序运行期间s是一个常量,不能被赋值。因此s=p是错误的,应改为p=s,它将字符串的首地址付给指针变量p。应当弄清楚字符数组与字符指针变量用法的区别。(2)指针的地址也要变化,因此填入p++。(3)字符串最后的结束符是\\0。

三、请编写函数fun,其功能是:将s所指字符串中除了下标为奇数,同时ASCII值也为奇数的字符之外,其余的字符全部删除,串中剩余字符所形成的一个新串放在t所指的数组中。

例如,若s所指字符串中的内容为ABCDEFG12345,其中字符A的ASCII码值虽为奇数,但所在元素的下标为偶数,因此必需删除;而字符1的ASCII.码值为奇数,所在数组中的下标也为奇数,因此不应当删除,其他依此类推。最后t所指的数组中的内容应是135。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include #include #include

void fun(char *s, char t[ ]) { }

main ( ) {

char s[100] ,t [100];

printf(\:\scanf(\fun(s,t);

正确:p=s;

printf(\:s\\n\

}

答案:void fun(char *s,char t[])

{

int i,j=0,n; n=strlen(s);

for(i=0;i

if(i%2!=0&&s[i]%2!=0) {

t[j]=s[i]; /*将下标为偶数同时ASCII码值为偶数的字

符放入数组t中*/

j++; }

t[j]='\\0'; /*最后加

上结束标志符*/

}

【解析】本题要求除了下标为奇数,同时ASCII码值也为奇数的字符之外,其余的所有字符都删除。即要留下下标为偶数同时ASCII码值也为偶数的字符。所以if的条件语句中应使用if(i2!=0&&s[i]%2!=0)。 第六十九套:

一、请补充函数fun,该函数的功能是:把从主函数中输入的由数字字符组成的字符串转换成一个无符号长整数,并且逆序输出。结果由函数返回。

例如,输入:123456,结果输出:654321。 注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。 试题程序:

#include #include #include #include

unsigned long fun(char *s) { unsigned long t=0; int k; int I=0; I=strlen(s); for(【1】; I>=0; I--) { k=【2】; t=【3】; } return t; }

void main() { char str[8]; system(\ printf(\

'9' digital character: \\n\

gets(str); printf(\ if(strlen(str)>8) printf(\ else printf(\

fun(str));

}

答案:【1】--I

【2】s[I]- ′0′

【3】t*10+k

【解析】填空1:程序中将字符串s的长度赋给了变量I,为了将数字字符转换为无符号长整数,并倒序输出,应该从字符串的最后一个字符开始处理,而最后一个字符的下标等于字符串长度减1。填空2:将数字字符转换为数字的方法是:将该数字字符的ASCII码减去字符'0'的ASCII码,即得到相应的数字。填空3:由各位上的数字得到整数的方法,以1234为例,1234=1*1000+2*100+3*10+4= 10*(10*(10*1+2)+3)+4。

二、下列给定程序中,函数fun的功能是:将s所指字符串中的字母转换为按字母序列的后续字母(但Z转化为A,z转化为a),其他字符不变。

请改正函数fun中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include #include #include #include void fun(char *s)

/*************found**************/ { while(*s!= ′@′)

{ if(*s>='A'&&*s<='Z'||*s>='a'

&&*s<='z')

{if(*s=='Z') *s='A';

else if(*s=='z') *s='a'; else *s+=1; }

/*************found**************/ (*s)++; } }

void main() { char s[80]; system(\

printf(\

<80:\\n\\n\

printf(\ fun(s);

printf(\

}

答案:(1)错误:while(*s!='@')

(2)错误:(*s)++;

正确:while(*s) 正确:s++;

【解析】根据题目要求,可对字符串所有字母进行遍历。对每一个字母,若该字母为'z'或'Z',则将该字母改成'a'或'A',即ASCII码值减25,当然也可以用题目中的if语句来实现转换。若该字母不是'z'或'Z',则该字母的ASCII码值加1;对字符串所有字符重复以上步骤即可得到题目要求的结果,可用循环语句和条件语句来实现。

三、假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:使字符串中前部的*号不得多余n个;若多余n个,则删除多余的*号;若少于或等于n个,则什么也不做,字符串中间和尾部的*号不删除。

例如,字符串中的内容为****A*BC*DEF*G*******,若n的值为2,删除后,字符串中的内容则应当是**A*BC*DEF*G*******;若n的值为4,则字符串中的内容仍为****A*BC*DEF*G*******。n的值在主函数中输入。在编写函数时,不得使用C语言提供的字符串函数。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include #include

void fun(char *a,int n) {

}

void main()

{ char s[81];int n;

printf(\\\n\printf(\fun( s,n );

printf(\\\n\ puts(s);

}

答案:void fun(char *a,int n )

{

int i=0, k=0; char *p, *t;

p=t=a; /*开始时,p与t同时指

向数组的首地址*/

while(*t=='*') /*用k来统计

前部星号的个数*/

{k++; t++;}

if(k>n) /*如果k大于n,则使p的前部保留n个星号,其后的字符依

次存入数组a中*/

{ while(*p)

{a[i]=*(p+k-n); i++; p++; }

a[i]='\\0'; /*在字符串最后

加上结束标志位*/

} }

【解析】while()循环的作用是计算出字符串中前部星号的个数;if()的作用是判断星号个数是否大于n个,若是则只保留n个星号,即从字符串前部的倒数第n个星号到最后一个字符都存入数组a中,最后记得在字符串最后加上结束标志位。 第七十套:

一、str是一个由数字和字母字符组成的字符串,由变量num传入字符串长度。请补充函数fun,该函数

的功能是:把字符串str中的数字字符转换成数字并存放到整型数组bb中,函数返回数组bb的长度。

例如:str=\Bcd123e456hui890\,结果为:123456890。 注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。 试题程序:

#include #define N 80 int bb[N];

int fun(char s[],int bb[],int num) { int i,n=0; for(i=0;i

void main() { char str[N]; int num=0,n,i; printf(\ gets(str); while(str[num])

num++; n=fun(str,bb,num); printf(\ for(i=0;i

【2】s[i]- ′0′

【3】n

}

答案:【1】s[i]>= ′0′ &&s[i]<= ′9′

【解析】填空1:如果当前字符的ASCII码大于字符'0'的ASCII码,而小于字符'9'的ASCII码,则说明当前字符是数字字符。填空2:将数字字符转换为数字的方法是,用当前数字字符的ASCII码减去字符'0'的ASCII码。填空3:题目要求函数返回数组bb的长度,而变量n记录了数字字符的个数,也就是数组bb的长度,所以函数应该返回n。

二、下列给定的程序中,fun函数的功能是:将p所指字符串中每个单词的最后一个字母改成大写(这里

的\单词\是指有空格隔开的字符串)。例如,若输入:

I am a student to take the examination

则应输出:I aM A studenT tO takE thE examinatioN 请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include #include #include #include #include void fun(char *p) {

int k=0;

for ( ;*p;p++) if (k) {

/*************found**************/ if (p==' ') { k=0;

/*************found**************/ *p=toupper( *(p-1)); } } else k=1; }

void main()

{char chrstr[64]; int d;

system(\

printf(\ sentence within 63 letters: \ gets(chrstr);

d=strlen(chrstr); chrstr[d]=' '; chrstr[d+1]=0;

printf(\ %s\ fun(chrstr);

printf(\ %s\

}

答案:(1)错误:if(p==′ ′)

(2)错误:*p=toupper( *(p-1));

正确:if(*p==′ ′) 正确:*(p-1)=toupper( *(p-1));

【解析】本题比较简单,重点考查toupper函数的用法,该函数是将ch字符转换成大写字母,较多地应用了字符串处理函数。

三、请编写一个函数,用来删除字符串中的所有空格。

例如:输入asd af aa z67,则输出为asdafaaz67。 注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

试题程序:

#include #include #include void fun (char *str) { }

main() {

char str[81];

char Msg[]=\ int n;

FILE *out; printf(Msg); gets(str); puts(str); fun(str);

printf(\ out=fopen(\ fun(Msg);

printf(out,\ fclose(out);

}

答案:Void fun(char *str)

{

int i=0;

char *p=str; while(*p) {

if(*p!=' ')

/*删除空格*/

{

str[i]=*p; i++; } p++;

}

str[i]='\\0';

/*加上结束符*/

}

【解析】本题要求删除所有空格,即保留除了空格以外的其它所有字符。由于c语言中没有直接删除字符的操作,所以我们对不需删除的字符采用\保留\的操作。用*p从串头到串尾逐一遍历,每走到一个字符都判断其是否为空格,若不是空格则保存到str[i]。 第七十一套:

请补充main函数,该函数的功能是:从一个字符串中截取前面若干个给定长度的子字符串。其中,str1指向原字符串,截取后的字符存放在str2所指的字符数组中,n中存放需截取的字符个数。

例如:当str1=\cdefghij\,然后输入4,则str2=\cdef\。 注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。 试题程序:

#include #include #include #define LEN 80 void main() { char str1[LEN],str2[LEN];

int n,I; system(\ printf(\ gets(str1); printf(\

deleted:\

scanf(【1】); for(I=0;I

【2】str2[I]=str1[I];

【3】str2

}

答案:【1】″%d″,&n

【解析】填空1:本题考查标准输入函数scanf()的调用格式,由后面的程序可以知道,变量n保存了要截取的字符数,注意在n前面不要忘了取址符'&'。填空2:截取前n个字符,就是将字符串str1的前n个字符依次赋给字符串str2的前n个字符。填空3:本题考查标准输出函数printf()的调用格式,根据题意,应输出截取后的字符串,即字符串str2。

二、下列给定程序中,函数fun的功能是:将s所指字符串的正序和反序进行连接,形成一个新串放在t所指的数组中。例如,当s所指字符串为ABCD时, t所指字符串中的内容应为ABCDDCBA。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include #include #include #include

/*************found**************/ void fun (char s, char t ) {

int I,s1; s1=strlen(s); for (I=0;I

/*************found**************/ t[2*s1-1]='\\0'; } main()

{char s[100], t[100]; system(\

printf(\ scanf(\ fun(s,t);

printf (\ }

答案:(1)错误:void fun ( char s , char t )

正确:void fun ( char *s , char *t )

(2)错误:t[2*s1 - 1]= '\\0'; t[2*s1]=0; 或 t[s1+I]=0;

正确:t[2*s1]= '\\0'; 或 t[s1+I]= '\\0'; 或

【解析】(1)从程序来看,函数传递的是数组,所以用指针。(2)t[2*s1]才是结束符存放的位置。

三、假定输入的字符串中只包含字母和*号,请编写函数fun,它的功能是:将字符串中的前导*号全部移到字符串的尾部。

例如,若字符串中的内容为*******A*BC*DEF*G****,移动后,字符串中的内容应当是A*BC*DEF*G***********。在编写函数时,不得使用C语言提供的字符串函数。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include #include void fun ( char *a) { }

main ( ) {

char, s[81],*p;

char test[4][80] = {\

F*G****\\

int i;

printf(\\\n:); gets(s); fun(s);

printf(\\\n\puts(s);

}

答案:void fun(char *a)

{

int i=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';

}

【解析】函数fun的功能是将字符串中的前导*号全部移到字符串的尾部。本题解题思路:1、定义一个指针并指向字符串的首地址;2、利用循环语句找出字符串的前导*号的个数n;3、利用循环语句把剩余的字符拷贝到另一个字符串中;4、在字符串的末尾接上n个*号。

第七十二套:

一、请补充main函数,该函数的功能是:从键盘输入一个字符串并保存在字符str1中,把字符串str1中

下标为偶数的字符保存在字符串str2中并输出。例如,当str1=\cdefghij\,则str2=\cegi\。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。 试题程序:

#include #include #include #define LEN 80 void main() { char str1[LEN],str2[LEN]; char *p1=str1,*p2=str2; int i=0,j=0; system(\ printf(\ scanf(【1】); printf(\ while(*(p1+j)) { printf(\【2】\ j++; } for(i=0;i

}

答案:【1】″%s″,str1

【2】%c

【3】str2

【解析】填空1:本题考查标准输入函数scanf()的调用格式,当输入字符串时,格式控制字符串为\%s\,题目要求输入的字符串保存在str1中,所以地址表列应为字符串的首地址,即为str1。填空2:本题考查标准输出函数printf()的调用格式,当输出为字符型变量时,格式控制字符串为\%c\。填空3:题目要求将str1中下标为偶数的字符保存在字符串str2中并输出,所以printf()函数的输出表列是str2。

二、下列给定程序是建立一个带头结点的单向链表,并用随机函数为各结点赋值。函数fun的功能是将单向链表结点(不包括头结点)数据域为偶数的值累加起来,并且作为函数值返回。

请改正函数fun中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include #include #include 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

s =(NODE*)malloc(sizeof(NODE)); s->data = rand( ); s->next = p->next; p->next = s; p = p->next;

}

p->next = NULL; return h; }

outlink(NODE *h) {

NODE *p;

p = h->next;

printf(\\\n\\nTHE LIST:\\n\\n HEAD\while (p) {

printf(\,p->data); p = p->next;

}

printf(\\\n\}

main ( ) {

NODE *head; int sum;

head = creatlink (10); outlink (head); sum = fun (head);

printf(\\\nSUM=%d\,sum);

}

答案:(1)错误:while (p->next) (2)错误:p=h->next

正确:while (p!=NULL) 正确:p=p->next;

【解析】本题考查的这种链表的数据结构中,必须利用指针变量才能实现。即一个节点中应包含一个指针变量,用以存放下一结点的地址。建立单项链表的一般步骤是:建立头指针→建立第一个节点→头指针指向第一个节点→建立第二个节点→第一个节点的指针与指向第二个节点→……→最后一个节点的指针指向null。本题重点是:了解链表的基本思想和相关算法,理解有关链表插入及删除时指针移动的先后顺序问题,注意指针的保存和归位。while循环条件是判断链表是否结束,所以改为while (p!=NULL)。要指向下个节点所以改为p=p->next。

三、请编写函数fun,该函数的功能是:移动一维数组中的内容,若数组中有n个整数,要求把下标从

0到p(p≤n-1)的数组元素平移到数组的最后。

例如,一维数组中的原始内容为1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,p的值为3。移动后,一维数组中的内容应为5,6,7,8,9,10,11,12,13,14,15,1,2,3,4。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include #define N 80

void fun(int *w, int p, int n) { }

void main() {

int a[N]={1,2,3,4,5,6,7,8,9,10,11,

12,13,14,15};

int i, p, n=15;

printf(\ for(i=0;i

printf(\ printf(\ scanf(\ fun(a,p,n);

printf(\ for(i=0;i

printf(\ printf(\

}

答案:void fun(int *w, int p, int n)

{

int i,j,t;

for(i=0;i<=p;i++) /*

循环左移p+1次*/

{t=w[0];

for(j=1;j

实现循环左移*/

w[j-1]=w[j]; w[j-1]=t; } }

【解析】本题采用\循环左移\的算法,即从第2个字符开始以后的每个字符都依次前移一个字符,而原来的第1个字符放在串中的最后一个字符。当要平移p个字符时,则要进行p次的循环左移。 第七十三套:

一、请补充函数fun,该函数的功能是:逐个比较a、b两个字符串对应位置中的字符,把ASCII值大或

相等的字符依次存放在到c数组中,形成一个新的字符串。

例如,若a中的字符串为aBCDeFgH,b中的字符串为:ABcd,则c中的字符串应为:aBcdeFgH。 注意:部分源程序给出如下。

请勿改动上函数main和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语言。

试题程序:

#include #include

void fun(char *p,char *q,char *c) {

int k=【1】; while(*p【2】*q)

{

if (*p<*q) c[k]= *q; else

c[k]= *p; if (*p) p++; if(*q) q++; k++;

} }

main ( ) {

char a[10]=\,b[10]=\,c[80]={ '0'}; fun(a,b,c);

printf(\:\ puts(a);

printf(\:\ puts(b);

printf(\:\ puts(c);

}

答案:【1】0 【2】||

【解析】函数fun的功能是输出一个矩阵,并要求对角线上的元素赋值1,其它元素赋值0。本题的关键是如何通过下标确定对角线上的元素。对角线上元素的下标有两种情况:一是行列下标相等,二是列下标等于最大下标减去行下标。

二、下列给定程序中,函数fun的功能是:将字符串s中的位于奇数位置的字符或ASCII码为偶数的字

符依次放入字符串t中。例如,字符串中的数据为AABBCCDDEEFF,则输出应当是ABBC DDEFF。 请改正函数fun中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include #include #include #define N 80

void fun (char *s,char t[ ]) {

int i,j = 0;

/********found********/

for (i=0; i<(int)strlen(s); i++)

if (i%2 && s[i]%2==0)

t[j++] = s[i];

/********found********/ t[i] = '\\0'; }

main ( ) {

char s[N] ,t[N];

printf(\\\nPlease enther string s:\ gets(s); fun(s,t);

printf(\\\nThe result is:%s\\n\}

答案:(1)错误:if (i%2 && s[i]%2 ==0) s[i]%2==0)

(2)错误:t[i] ='\\0'

正确: t[j]='\\0'; 或 t[j]=0;

【解析】(1)根据题意,将字符串s中位于奇数位置的字符或ASCII码为偶数的字符,依次放入字符串t

正确:if(i%2 || s[i]%2==0) 或 if(i%2 !=0 ||

中,所以要用\或\运算。(2)j 变量一直控制字符串t,所以是t[j]。

三、请编写函数fun,该函数的功能是:移动字符串中的内容,移动的规则是把第1到第m个字符,平移到字符串的最后,把第m+1到最后的字符移到字符串的前部。

例如,字符串中原有的内容为ABCDEFGHIJK,m的值为3,移动后,字符串中的内容应该是DEFGHIJKABC。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include #include #define N 80

void fun (char *w,int m) { }

void main() {

char a[N]= \ int m;

printf(\ puts(a);

printf(\ m: \ scanf(\ fun(a,m);

printf(\ puts(a);

printf(\

}

答案:void fun (char *w,int m)

{

int i,j; char t;

for(i=1;i<=m;i++) /*进行m

次的循环左移*/

{t=w[0];

for(j=1;w[j]!='\\0';j++) /*从第2个字符开始以后的每个字符都依次

前移一个字符*/

w[j-1]=w[j];

w[j-1]=t; /*将第1个字符放到

最后一个字符中*/

} }

【解析】我们在学习C语言的时候,应该广泛地应用到循环的方法,本题应采用\循环左移\的算法。内嵌循环的作用是完成从第2个字符以后的每个字符都依次前移一个字符,w[j-1]=t的作用是将第1个字符放到最后一个字符中。 第七十四套:

一、请补充函数fun,该函数的功能是:先将在字符串s中的字符按逆序存放到字符串t中,然后把s中的字符按正序连接到t串的后面。

例如:s中的字符串为ABCDE时,则t中的字符串应为EDCBAABCDE。 注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。 试题程序:

#include

#include #include

void fun(char *s,char *t) {

int s1,i;

s1 =strlen(s);

for(i=0;i

for (i=0; i

main ( ) {

char s[100] ,t[100];

printf(\\\nPlease enter string s:\ scanf(\ fun(s,t);

printf(\:%s\\n\}

答案:【1】s1-i-1或s1-1-i 【2】2*s1或s1×2

【解析】填空1:根据题意可知,第一个for循环的目的是逆序字符串,则填入s1-i-1。填空2:第二个for循环,将字符串s再次以正序方式存入t中,最后给t加上字符串结束标志'\\0',这个位置正好是s长度的2倍,故应填入2*s1。

二、下列给定程序中,函数fun的功能是:将s所指字符串中最后一次出现的t1所指子串替换成t2所指子

串,所形成的新串放在w所指的数据中。在此处,要求t1和t2所指字符串的长度相同。例如,当s所指字符串中的内容为abcdabfabc,t1所指子串中的内容为ab,t2所指子串中的内容为99时,结果,在w所指的数组中的内容为abcdabf99c。请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include #include #include /********found********/ void fun(char *s,t1,t2,w) {

char *p,*r,*a; strcpy(w,s);

/********found********/ while (w) {

p=w; r=t1;

while (*r)

if(*r=*p) {

r++; p++; }

else {

break; }

if(*r='\\0')

a=w;

w++;

}

r = t2; while (*r)

{

*a = *r; a++; r++;

}

}

main ( ) {

char s[100] ,t1[100] ,t2[100] ,w[100]; printf(\:\scanf(\

print f(\:\scanf(\

printf(\:\scanf(\

if (strlen(t1) ==strlen(t2)) {

fun (s,t1,t2,w);

printf(\: %s\\n\}

else {

printf(\:strlen(t1)!1= strlen(t2)\\n\} }

答案:(1)错误:void fun(char *s,t1,t2,w)

(2)错误:while (w) 址,所以改为while (*w)。

正确:void fun( char *s,char *t1,char *t2,char *w) 正确:while (*w)

【解析】(1)从程序来看,函数传递的是数组,所以用指针。(2)这里要判断的是值的真假,而不是地

三、请编写函数fun,其功能是:将s所指字符串中除了下标为奇数、同时ASCII值为偶数的字符外,其余的全部删除,串中剩余字符所形成的一个新串放在t所指的数组中。

例如,若s所指字符串中的内容为edB2A4Dsdg,其中字符A的ASCII码值为奇数,因此应当删除;其中字符B的ASCII码值为偶数,但在数组中的下标为偶数,因此也应当删除;而字符2的ASCII码值为偶数,所在数组中的下标为奇数,因此不应当删除,其他依此类推。最后t所指的数组中的内容应是d24。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include

#include #include #include

void fun(char*s, char t[]) { }

void main() {

char s[100] ,t[100]; system(\

printf(\ scanf(\ fun(s,t);

printf(\

}

答案: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值为偶数的字符。C语言中并没有直接删除字符的算法,请大家在做题的时候注意。 第七十五套:

一、请补充函数fun,该函数的功能是:在字符串的最前端加入n个*号,形成新串,并且覆盖。注意:字符串的长度最长允许为79。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编若干表达式或语句。 试题程序:

#include #include #include

void fun(char s[],int n) {

char a[80] ,*p; int i; p=【1】;

for(i=0;i

a[i]= 【2】; i++;

} while(【3】); a[i]=0;

strcpy(s,a); }

main ( ) {

int n;

char s[80];

printf (\:\ gets (s);

printf (\,s); printf (\:\ scanf (\ fun (s,n);

printf (\:\\\

}

答案:【1】s

【2】*p++

【3】*(p)或*p或*p!=0

【解析】填空1:一般情况下,指针都与数组有关联,根据下文可见,应填入数组的首地址。填空2:由题意可知,当加完*后,就要付值字符串了,将p的值赋给a数组。填空3:这里是一个判断条件,显然与字符串的结束有关,当是结束符时,判断条件为假,退出循环。

二、下列给定程序中,函数fun的功能是:将m(1≤m≤10)个字符串连接起来,组成一个新串,放入pt所指字符串中,例如:把3个串abc,CD,EF串联起来,结果是abcCDEF。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include

#include #include #include

/*************found**************/ int fun(char str[][10],int m,char *pt) { int k,q,I,j=0; for(k=0;k

{ q=strlen(str[k]); j+=q;

for(I=0;I

/*************found**************/ pt[I]=str[k,I]; pt+=q; pt[0]=0; } pt-=j; }

void main() { int m, h;

char s[10][10],p[120]; system(\

printf(\ scanf(\ gets(s[0]);

printf(\ for(h=0;h

printf(\

}

答案:(1)错误:int fun(char str[][10],int m,char *pt)

(2)错误:pt[I]=str[k,I];

正确:void fun(char str[][10],int m,char *pt) 正确:pt[I]=str[k][I];

【解析】本题中的两例错误我们已经在前面的讲解中详细阐述了,一般这样的字符串连接函数在C语言的考试中肯定不让使用strcat函数,但是,直接用if和while的循环嵌套也是很容易解决问题的。

三、假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:除了尾部的*号之外,将字符串中其他*号全部删除。形参p已指向字符串中最后一个字母。在编写函数时,不得使用C语言的字符串函数。

例如,若字符串中的内容为****A*BC*DEF*G******,删除后,字符串中的内容应当是ABCDEFG******。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include #include

void fun(char *a,char *p) { }

void main() {

char s[81],*t;

printf(\ gets(s); t=s;

while(*t) t++;

t--; /*指针t指向字符串尾部*/ while(*t=='*')

t--; /*指针t指向最后一个字母*/ fun(s,t);

printf(\ puts(s);

}

答案:void fun(char *a,char *p)

{

char *t=a;

for(;t<=p;t++) if(*t!='*')

*(a++)=*t; /*将p以前所有不是星号

的字符保留下来*/

for(;*t!='\\0';t++)

*(a++)=*t; /*将p以后的所

有星号保留下来*/

*a='\\0'; /*在字符串最后加

上结束标记位*/

}

【解析】本题曾在历年上机考试及模拟试题中多次出现,一般用两个循环语句来实现。第1个循环的作用是将p以前所有不是*号的字符保留下来,即删除p以前所有的*号。第2个循环的作用是将p以后的所有*号保留下来。 第七十六套:

一、请补充main函数,该函数的功能是:把字符串str1中的非空格字符拷贝到字符串str2中。 例如,若str1=\glad to see you!\, 则str2=\gladtoseeyou!\。 注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。 试题程序:

#include #include #define N 80 void main() { static char str1[N]=\ char str2[N]; int I=0,j=0; system(\ printf(\ puts(str1); while(str1[I]) { if(【1】) str2[j++]=str1[I]; 【2】; } printf(\ for(I=0;I

}

答案:【1】str1[I]!= ' '

【2】I++

【解析】填空1:如果当前字符不为空格,则将它保存在字符串str2中。填空2:在while循环中,通过i++取得字符串str1中当前字符的下一个字符,继续判断是否为空格。

二、下列给定程序中,函数fun的功能是:将字符串p中所有字符复制到字符串b中,要求每复制3个字符之后插入一个空格。例如,在调用fun函数之前给字符串a输入ABCDEFGHIJK,调用函数之后,字符串b中的内容则为ABC DEF GHI JK。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include

void fun(char *p,char *b) { int i, k=0; while(*p)

/*************found**************/ { i=1;

/*************found**************/ while(i<3||*p) {

b[k]=*p;

k++;p++;i++; } if(*p)

/*************found**************/ { b[k]= ' ';} }

b[k]= '\\0'; }

void main()

{ char a[80],b[80];

printf(\ \ gets(a);

printf(\ \ puts(a); fun(a,b);

printf(\

space: \

puts(b);

printf(\

}

答案:(1)错误:i=1;

(2)错误:while(i<3||*p) (3)错误:b[k]=' ';

正确:i=0;

正确:while(i<3&&*p) 正确:b[k++]=' ';

【解析】该题考查字符串复制程序的构造方法,题中插入空格字符的定义条件是while(i<3||*p),要同时满足i<3和*p这两个条件后才能执行{ b[k++]=' ';}这个语句,该语句的含义是在输出结果中置入空格字符。

三、请编写函数fun,其功能是:将两个两位数的正整数a、b合并成一个整数放在c中。合并的方式是:

将a数的十位和个位数依次放在c数的百位和个位上,b数的十位和个位数依次放在c数的十位和千位上。

例如,当a=45,b=12,调用该函数后,c=2415。 注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include #include

void fun (int a, int b,long *c) { }

main ( ) {

int a,b; long c;

printf (\ scanf(\fun(a,b,&c);

printf(\:%ld\\n\}

答案:void fun(int a,int b,long *c)

{

*c=(b)*1000+(a/10)*100+(b/10)*10+a;

}

【解析】本题中主要的问题是怎么取出a和b的个位数和十位数,取出后怎么表示成c中相应的位数。由于a和b都是只有两位的整数,所以分别对他们除10可得到他们的十位数,分别用10对他们求余可得到他们的个位数。得到后对应乘以1000、100、10、1就可得到c的千位数、百位数、十位数和个位数。注意要使用c时要进行指针运算。 第七十七套:

一、请补充main函数,该函数的功能是:把一个二维字符数组每行字符串最大的字符拷贝到字符数组s中。

例如,如果str[3]={\,\,\,则s=\。 注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。 试题程序:

#include

#include void main() { int I=0; char *str[3]={\

\

char **p; char s[8]; system(\ 【1】; for(I=0;I<3;I++) { s[I]=*p[I]; while(*p[I]) { if(s[I]<*p[I]) s[I]=*p[I]; 【2】; } } 【3】; printf(\ puts(s);

}

答案:【1】p=str

【2】p[I]++

【3】s[I]= ′ \\0′

【解析】填空1:str是一个大小为3的指针数组,每个指针指向一个字符串,p是指向指针的指针,首先要使指针p指向数组str的首地址。填空2:通过p[I]++使p[I]指向第I个字符串的下一个字符。填空3:将每行字符串的最大字符都拷贝到字符数组s中后,不要忘了在数组s最后加上字符串结束标记符'\\0'。

二、下列给定程序中,函数fun的功能是:将大写字母转换为对应小写字母之后的第5字母;若小写字母

为v~z,使小写字母的值减21。转换后的小写字母作为函数值返同。例如,若形参是字母A,则转换为小写字母f。形参是字母W,则转换为小写字母b。

请改正函数fun中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

试题程序:

#include #include char fun(char c) {

/********found********/ if (c>= 'A' && c<='Z')

c = c-32;

/********found********/ if (c>='a' && c<='u')

c = c-5;

else if (c>='v' && c<='z')

c = c-21;

return c; }

main ( ) {

char cl, c2;

printf(\\\nEnter a letter(A-Z):\cl = get char( ); if (isupper(cl)) {

c2 = fun(cl);

printf(\\\n k nThe letter %c change to %c\\n\

}

else {

printf(\\\nEnter (A-Z) !\\n\}

}

答案:(1)错误:c=c-32

(2)错误:c=c-5

正确:c=c+32; 正确:c=c+5;

【解析】从ASCII码表中可以看出,小写字母的ASCII码值比对应大写字母的ASCII值大32,所以大写字母转换成小写字母要加32。将大写字母转换成对应小写字母之后的第五个字母,所以要加5。

三、学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:函数返回指定学号的学生数据,指定的序号在主函数中输入。若没找到指定的学号,在结构体变量中给学号置空串,给成绩置-1,作为函数值返回(用于字符串比较的函数是strcmp)。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include

#include #include #define N 16 typedef struct { char num[10]; int s; }STREC;

STREC fun(STREC *a, char *b) { }

void main() {

STREC s[N]={{ \ {\

91},{\A012\}};

STREC h; char m[10]; int i;

printf(\ for(i=0;i

printf(\

/*每行输出4个学生记录*/

printf(\ }

printf(\ gets(m); h=fun(s,m);

printf(\

printf(\ printf(\

}

答案:STREC fun(STREC *a, char *b)

{

int i; STREC str={\ /*若没找到指定的学号,在结构体变量中给学号置空串,

给成绩置-1*/

for(i=0;i

if(strcmp(a[i].num,b)==0) /*找到指定

学号的学生数据*/

str=a[i];

return str; /*

返回学生记录*/

}

【解析】本程序一开始先使结构体变量str的学号为空串,成绩为-1。题中循环体的功能是搜索所有学生的学号,并判断是否有学号与b所指字符串相同(即找到),若找到则给str重新赋值(str=a[i]),若没找到则str成员的值还是原有值(即未找到时学号返回空串,成绩返回-1)。

题中已经给出字符串的比较只能用strcmp()函数,而不能直接进行比较,我们在改错题分析中已经详细讲述了字符串操作函数,如strcmp(),strcat(),strcpy()和strlen()等,希望学习者能熟练掌握。 第七十八套:

一、请补充main函数,该函数的功能是:从键盘输入两个字符串并分别保存在字符数组str1和str2中,用字符串str2替换字符串str1前面的所有字符,注意,str2的长度不大于str1,否则需要重新输入。

例如,如果输入str1=\abced\,str2=\fk\,则输出\fkced\。 注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。 试题程序:

#include

#include #include void main() { char str1[81],str2[81]; char *p1=str1,*p2=str2; system(\

do { printf(\ gets(str1); printf(\ gets(str2); }while(【1】); while(【2】) *p1++=*p2++; printf(\ puts(【3】);

【2】*p2 【3】str1

}

答案:【1】strlen(str1)

【解析】填空1:如果字符串str2的长度大于字符串str1的长度,则要重新输入,即继续执行do-while循环。填空2:如果p2所指的字符不为′\\0′,即还没有执行到str2的最后一个字符,则将这个字符赋给字符串str1的对应字符。填空3:函数puts()的功能是将一个字符串输出到终端设备,由程序可知,此时应该输出字符串str1。

二、下列给定程序中,函数fun的功能是:删除字符串s中所有空白字符(包括Tab字符、回车符及换行符)。输入字符串时用'#'结束输入。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include #include #include fun(char *p)

{ int i, t; char c[80]; for(i=0,t=0;p[i];i++) if(!isspace(*(p+i))) c[t++]=p[i]; /*************found**************/ c[t]=\ strcpy(p,c); }

void main() {char c,s[80]; int i=0; printf(\ c=getchar(); while(c!='#') { s[i]=c;i++;c=getchar();} s[i]='\\0'; fun(s); puts(s);

}

答案:(1)错误:c[t]= \

正确:c[t]= '\\0';

【解析】该程序的if条件中应用了isspace函数,该函数的功能是检查ch是否空格、跳格符(制

表符)或换行符。

三、请编写函数fun,该函数的功能是:将两个两位数的正整数a,b合并形成一个整数放在c中。合并

的方式是:将a数的十位和个位数依次放在c数的十位和千位上,b数的十位和个位数依次放在c数的百位和个位上。

例如,当a=45时,b=12,调用到该函数后,c=5142。 注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include #include #include

void fun(int a ,int b,long *c) { }

void main() { int a,b; long c; system(\ printf(\ scanf(\ fun(a,b,&c); printf(\

}

答案:void fun(int a ,int b,long *c)

{

*c=a*1000+b/10*100+a/10*10+b; /*将a数的十位和个位数依次放在c数的十位和千

位上,b数的十位和个位数依次放在c数的百位和个位上*/

}

【解析】本题中主要的问题是怎么取出a和b的个位数和十位数,取出后怎么表示成c中相应的位数。由于a和b都是只有两位的整数,所以分别对它们除10可得到它们的十位数,分别用10对它们求余可得到它们的个位数。如45/10结果为4,而不是4.5(这是由于两个数都为整型,所以结果也为整型),45结果为5。若a为45,则a/10*10的结果为40而非45。乘1000,乘100和乘10的作用是使对应的数成为*c的千位数、百位数和十位数。注意使用c时要注意进行指针运算,即*c,不能少了*号。 第七十九套:

一、从键盘输入一组小写字母,保存在字符数组str中。请补充函数fun,该函数的功能是:把字符数

组str中字符下标为奇数的小写字母转换成对应的大写字母,结果仍保存在原数组中。

例如,输入\acegikm\,输出\aCeGiKm\。 注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。 试题程序:

#include #include #define N 80

void fun (char s[]) { int I=0; while (【1】) { if(I%2!=0) s[I]-=【2】; 【3】; } }

void main() { char str[N];

system(\ printf(\ gets(str); printf(\ puts(str); fun(str); printf(\ puts(str);

【2】32或′a′-′A′

}

答案:【1】s[I]!= ′\\0′或s[I]

【3】I++

【解析】填空1:while循环的条件是当前参加判断的字符不为'\\0',即还没有到字符串的结尾。填空2:将小写字母转换为对应的大写字母的方法是,将小写字母的ASCII码减去32,如'a'-'A'的结果就是32。填空3:通过I++依次访问字符串s中的各个字符。

二、下列给定程序中,函数fun的功能是:给一维数组a输入任意4个整数,并按如下的规律输出。例如输入1,2,3,4,程序运行后输出以下方阵:

4 1 2 3 3 4 1 2 2 3 4 1 1 2 3 4

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include #define M 4

/*************found**************/ void fun(int a) { int I,j,k,m;

printf(\

for(I=0;I0;I--) { k=a[M-1];

for(j=M-1;j>0;j--)

/*************found**************/ a[j]=a[j+1]; a[0]=k;

for(m=0;m

void main() { int a[M];

fun(a); printf(\

}

答案:(1)错误:void fun(int a)

(2)错误:a[j]=a[j+1];

正确:void fun(int *a) 正确:a[j]=a[j-1];

【解析】其实,该题中题目信息已经告诉我们按\如下规律\,这就需要去认真分析矩阵的\规律\了,在第1列中,数列以4开始递减,直至1,在该数列中,行和列都是递减循环排列,所以题目在循环的时候有循环条件for(I=M;I>0;I--)和for(j=M-1;j>0;j--),当然每次循环结束后在列中的赋值语句应该是a[j]=a[j-1];。

三、请编写函数fun,其功能是:将s所指字符串中下标为偶数的字符删除,串中剩余字符形成的新串放

在t所指数组中。

例如,当s所指字符串中的内容为ABCDEFGHIJK,则在t所指数组中的内容应是BDFHJ。 注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include #include #include #include

void fun(char *s,char t[]) { }

void main() { char s[100],t[100]; system(\ printf(\ scanf(\ fun(s,t); printf(\

}

答案:void fun(char *s,char t[]) {

int i,j=0,k=strlen(s); /*k为

字符串的长度*/

for(i=1;i

所指字符串中*/

t[j++]=s[i];

t[j]='\\0'; /*在字符串最后

加上结束标志*/

}

【解析】本题使用了一种i永远是奇数的循环方法,即for(i=1;i

一、请补充main函数,该函数的功能是:把字符串str中的字符向前移动一位,原来的第一个字符移动到字符串尾,结果仍然保存在原字符串中。

例如,输入\how do you do?\,则结果输出\ow do you do?h\。 注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。 试题程序:

#include

#include #define N 80 void main() { char str[N], ch; int I; system(\ printf(\ gets(str); printf(\ puts(str); ch=str[0]; for(I=0;【1】;I++)

str[I]=str[I+1]; 【2】; printf(\ puts(str);

【2】str[I]=ch

}

答案:【1】str[I+1]

【解析】填空1:for循环的条件是要移动的字符不为′0′,即还没有到字符串的结尾。填空2:ch中保存了字符串的第一个字符,按题目要求移动到字符串尾,而str[i]是′\\0′的前一个字符,也就是字符串尾,故将ch赋给str[I]。

二、下列给定程序中,函数fun的功能是:求整数x的y次方的低3位值。例如,整数5的6次方为15625,此值的低3位值为625。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:

#include

long fun(int x, int y, long *p) { int i; long t=1;

/*************found**************/ for(i=1;i

/*************found**************/ t=t/1000; return t; }

void main()

{ long t, r; int x, y;

printf(\ (\ t=fun(x,y,&r);

printf(\ %ld\\n\\n \

}

答案:(1)错误:for(i=1;i

(2)错误:t=t/1000;

正确:for(i=1;i<=y;i++) 正确:t=t00;

【解析】我们先用简单的思想理解一下该程序,如果当x=y=1时,程序的问题出在哪儿?很简单吧,所以for()的循环条件应该是for(i=1;i<=y;i++),另外,t=t/1000中的错误是混淆了\/\和\%\的定义,对这样的细节问题务必注意。

三、请编写函数fun,其实现的功能是:将两个两位数的正整数a、b合并形成一个整数放在c中。合并的方式是:将a数的十位和个位数依次放在c数的个位和百位上,b数的十位和个位数依次放在c数的十位和千位上。

例如,当a=45,b=l2,调用该函数后,c=2514。 注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include

#include

void fun(int a,int b,long *c) {

}

main ( ) {

int a,b; long c;

printf(\:\scanf(\fun(a,b,&c);

printf(\:%ld\\n\

}

答案:void fun(int a,int b,long *c) {

*c=(b)*1000+(a)*100+(b/10)*10+a/10;

}

【解析】本题中主要的问题是怎么取出a和b的个位数和十位数,取出后怎么表示成c中相应的位数。由于a和b都是只有两位的整数,所以分别对他们除10可得到他们的十位数,分别用10对他们求余可得到他们的个位数。得到后对应乘以1000、100、10、1就可得到c的千位数、百位数,十位数和个位数。注意要使用c时要进行指针运算。

本文来源:https://www.bwwdw.com/article/fpow.html

Top