admin 管理员组

文章数量: 1087139


2024年4月21日发(作者:winform 任务栏)

给定程序中,函数fun的功能是:在带有头结点的单向链表中,查找数据域中值为ch的

结点。找到后通过函数值返回该结点在链表中所处的顺序号:若不存在值为ch的结点,函

数返回0值。

第1处while(p!=0)

第2处 if(p->data==ch)return n;

第3处 k=fun(head,ch);

2程序修改

给定程序MODI1.C中函数fun的功能是:删除p所指字符串的所有空白字符(包括制表符、

回车符及换行符)。输入字符串时用‘#’结束输入。

fun(char *p)

{ int i,t;char c[80];

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

for(i=0,t=0;p[i];i++)

if(!isspace(*(p+i)))

c[t++]=p[i];

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

c[t]=’0’;

strcpy(p,c);

}

3程序设计

请编写一个函数fun,将ss所指字符串中所有下标为奇数位置上的字母转换为大写(若该位置

上不是字母,则不转换)。

void fun(char *ss)

{

int i;

for(i=1;i

{ if(ss[i]>=’a’&&ss[i]<=’z’)

ss[i]-=32;

}

}

第99套

1程序填空

函数fun的功能是:将形参观者工所指数组中的前半部分元素中的值和后半部分元素中

的值对换。形参n中存放数组中数据的个数,若n为奇数,则中间的元素不动。

第1处 p=(n%2==0)?n/2:n/2+1;

第2处 a[i]=a[p+i];

100

第3处 a[p+i]=t;

2程序修改

给定程序MODI1.C中函数fun的功能是:把主函数中输入的3个数,最大的放在a中,最

小的放在c中,中间的放在b中。

void fun(float *a,float *b,float *c)

{

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

float k;

if(*a<*b)

{ k=*a;*a=*b;*b=k;}

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

if(*a<*c)

{ k=*a;*a=*c;*c=k;}

if(*b<*c)

{k=*b;*b=*c;*c=k;}

}

3程序设计

学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写

函数fun,它的功能是:把分数最高的学生数据放在b所指的数组中,注意:分数最高的学

生可能不止一个,函数返回分数最高的学生的人数。

int fun(STREC *a,STREC *b)

{

int i,max=a[0].s,n=0;

for(i=1;i

if(max

for(i=0;i

if(max==a[i].s)b[n++]=a[i];

reutnr n;

}

第100套

1程序填空

给定程序中,函数fun的功能是在形参s所指字符串中寻找与参数c相同的字符,并在

其后插入一个与之相同的字符,若找不到相同的字符则函数不做任何处理。

第1处 for(i=0;s[i]!=’0’;i++)

第2处 n=0;

第3处 s[j+1]=c;

101

2程序修改

在主函数中从键盘输入若干个数放入数组中,用0结束输入并放在最后一个元素中。给定程

序MODI1.C中函数fun的功能是:计算数组元素中值为正数的平均值(不包括0)

double fun(int x[])

{

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

double sum=0.0;

int c=0,i=0;

while(x[i]!=’0’)

{ if(x[i]!=0){

sum+=x[i];c++;}

i++;

}

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

sum/=c;

return sum;

}

3程序设计

编写函数fun,它的功能是:根据以下分工计算s,计算结果作为函数值返回:n通过形参传

入。s=1+1/(1+2)+1/(1+2+3)+…+1/(1+2+3+…+n)例如:若n 的值为11时,函数的值为

1.833333

float fun(int n)

{

int i,j,t;

float s=0;

for(i=1;i<=n;i++){

t=0;

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

t+=j;

s=s+1.0/t;

}

return s;

}

第01套:

给定程序中,函数fun的功能是:将形参n所指变量中,各位上为偶数的数去

102

除,剩余的数按原来从高位到低位的顺序组成一个新的数,并通过形参指针n传回

所指变量。

例如,输入一个数:27638496,新的数:为739。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

voidfun(unsignedlong*n)

{unsignedlongx=0,i;intt;

i=1;

while(*n)

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

{t=*n%__1__;

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

if(t%2!=__2__)

{x=x+t*i;i=i*10;}

*n=*n/10;

}

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

*n=__3__;

}

main()

{unsignedlongn=-1;

while(n>99999999||n<0)

{printf("Pleaseinput(0

fun(&n);

printf("nTheresultis:%ldn",n);

}

解题思路:

第一处:t是通过取模的方式来得到*n的个位数字,所以应填:10。

第二处:判断是否是奇数,所以应填:0。

第三处:最后通形参n来返回新数x,所以应填:x。

***************************************************

给定程序MODI1.C中函数fun的功能是:计算n!。

例如,给n输入5,则输出120.000000。

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

103

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

给定源程序:

#include

doublefun(intn)

{doubleresult=1.0;

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

ifn==0

return1.0;

while(n>1&&n<170)

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

result*=n--

returnresult;

}

main()

{intn;

printf("InputN:");

scanf("%d",&n);

printf("nn%d!=%lfnn",n,fun(n));

}

解题思路:

第一处:条件语句书写格式错误,应改为:if(n==0)。

第二处:语句后缺少分号。

***************************************************

请编写一个函数fun,它的功能是:将一个数字字符串转换为一个整数(不得

调用C语言提供的将字符串转换为整数的函数)。例如,若输入字符串"-1234",则

函数把它转换为整数值-1234。函数fun中给出的语句仅供参考。

注意:部分源程序存在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填

入你编写的若干语句。

给定源程序:

#include

#include

longfun(char*p)

{

/*以下代码仅供参考*/

inti,len,t;/*len为串长,t为正负标识*/

longx=0;

104

len=strlen(p);

if(p[0]=='-')

{t=-1;len--;p++;}

elset=1;

/*以下完成数字字符串转换为一个数字*/

returnx*t;

}

main()/*主函数*/

{chars[6];

longn;

printf("Enterastring:n");

gets(s);

n=fun(s);

printf("%ldn",n);

NONO();

}

NONO()

{/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。*/

FILE*fp,*wf;

inti;

chars[20];

longn;

fp=fopen("c:","r");

wf=fopen("c:","w");

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

fscanf(fp,"%s",s);

n=fun(s);

fprintf(wf,"%ldn",n);

}

fclose(fp);

fclose(wf);

}

解题思路:

本题是将一个数字字符串转换为一个整数。

参考答案:

#include

#include

105

longfun(char*p)

{

/*以下代码仅供参考*/

inti,len,t;/*len为串长,t为正负标识*/

longx=0;

len=strlen(p);

if(p[0]=='-')

{t=-1;len--;p++;}

elset=1;

/*以下完成数字字符串转换为一个数字*/

while(*p)x=x*10-48+(*p++);

returnx*t;

}

main()/*主函数*/

{chars[6];

longn;

printf("Enterastring:n");

gets(s);

n=fun(s);

printf("%ldn",n);

NONO();

}

NONO()

{/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。*/

FILE*fp,*wf;

inti;

chars[20];

longn;

fp=fopen("c:","r");

wf=fopen("c:","w");

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

fscanf(fp,"%s",s);

n=fun(s);

fprintf(wf,"%ldn",n);

}

fclose(fp);

fclose(wf);

106

}

注意:由于NONO()这个函数是改卷人用的,与考生没有什么关系,故下面从第2套试题开

始均省略NONO()

第02套:

给定程序中,函数fun的功能是将形参给定的字符串、整数、浮点数写到文本

文件中,再用字符方式从此文本文件中逐个读入并显示在终端屏幕上。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

voidfun(char*s,inta,doublef)

{

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

__1__fp;

charch;

fp=fopen("","w");

fprintf(fp,"%s%d%fn",s,a,f);

fclose(fp);

fp=fopen("","r");

printf("nTheresult:nn");

ch=fgetc(fp);

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

while(!feof(__2__)){

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

putchar(__3__);ch=fgetc(fp);}

putchar('n');

fclose(fp);

}

main()

{chara[10]="Hello!";intb=12345;

doublec=98.76;

fun(a,b,c);

}

解题思路:

本题是考察先把给定的数据写入到文本文件中,再从该文件读出并显示在屏幕上。

第一处:定义文本文件类型变量,所以应填:FILE*。

107

第二处:判断文件是否结束,所以应填:fp。

第三处:显示读出的字符,所以应填:ch。

***************************************************

给定程序MODI1.C中函数fun的功能是:依次取出字符串中所有数字字符,形

成新的字符串,并取代原字符串。

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

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

给定源程序:

#include

voidfun(char*s)

{inti,j;

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

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

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

s[j]=s[i];

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

s[j]="0";

}

main()

{charitem[80];

printf("nEnterastring:");gets(item);

printf("nnThestringis:"%s"n",item);

fun(item);

printf("nnThestringofchangingis:"%s"n",item);

}

解题思路:

第一处:要求是取出原字符串中所有数字字符组成一个新的字符串,程序中是使用变量j

来控制新字符串的位置,所以应改为:s[j++]=s[i];。

第二处:置新字符串的结束符,所以应改为:s[j]='0';.

***************************************************

请编写函数fun,函数的功能是:将M行N列的二维数组中的字符数据,按列的

顺序依次放到一个字符串中。

例如,二维数组中的数据为:

WWWW

SSSS

HHHH

则字符串中的内容应是:WSHWSHWSH。

108

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

#defineM3

#defineN4

voidfun(chars[][N],char*b)

{

inti,j,n=0;

for(i=0;i

{

}

b[n]='0';

}

main()

{chara[100],w[M][N]={{'W','W','W','W'},{'S','S','S','S'},{'H','H','H','H'}};

inti,j;

printf("Thematrix:n");

for(i=0;i

{for(j=0;j

printf("n");

}

fun(w,a);

printf("TheAstring:n");puts(a);

printf("nn");

NONO();

}

解题思路:

本题是把二维数组中的字符数据按列存放到一个字符串中。

1.计算存放到一维数组中的位置。

2.取出二维数组中的字符存放到一维数组(已计算出的位置)中。

参考答案:

voidfun(chars[][N],char*b)

{

inti,j,n=0;

for(i=0;i

109

{

for(j=0;j

b[n]=s[j][i];

n=i*M+j+1;

}

}

b[n]='0';

}

第03套:

程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。所

有学生数据均以二进制方式输出到文件中。函数fun的功能是重写形参filename所

指文件中最后一个学生的数据,即用新的学生数据覆盖该学生原来的数据,其它学

生的数据不变。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#defineN5

typedefstructstudent{

longsno;

charname[10];

floatscore[3];

}STU;

voidfun(char*filename,STUn)

{FILE*fp;

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

fp=fopen(__1__,"rb+");

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

fseek(__2__,-1L*sizeof(STU),SEEK_END);

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

fwrite(&n,sizeof(STU),1,__3__);

fclose(fp);

}

main()

{STUt[N]={{10001,"MaChao",91,92,77},{10002,"CaoKai",75,60,88},

{10003,"LiSi",85,70,78},{10004,"FangFang",90,82,87},

110

{10005,"ZhangSan",95,80,88}};

STUn={10006,"ZhaoSi",55,70,68},ss[N];

inti,j;FILE*fp;

fp=fopen("","wb");

fwrite(t,sizeof(STU),N,fp);

fclose(fp);

fp=fopen("","rb");

fread(ss,sizeof(STU),N,fp);

fclose(fp);

printf("nTheoriginaldata:nn");

for(j=0;j

{printf("nNo:%ldName:%-8sScores:",ss[j].sno,ss[j].name);

for(i=0;i<3;i++)printf("%6.2f",ss[j].score[i]);

printf("n");

}

fun("",n);

printf("nThedataaftermodifing:nn");

fp=fopen("","rb");

fread(ss,sizeof(STU),N,fp);

fclose(fp);

for(j=0;j

{printf("nNo:%ldName:%-8sScores:",ss[j].sno,ss[j].name);

for(i=0;i<3;i++)printf("%6.2f",ss[j].score[i]);

printf("n");

}

}

解题思路:

本题是考察如何从文件中读出数据,再把结构中的数据写入文件中。

第一处:从指定的文件中读出数据,所以应填:filename。

第二处:读取文件fp的最后一条记录,所以应填:fp。

第三处:再把读出的记录,写入文件fp指定的位置上,所以应填:fp。

***************************************************

给定程序MODI1.C中的函数Creatlink的功能是创建带头结点的单向链表,并

为各结点数据域赋0到m-1的值。

请改正函数Creatlink中指定部位的错误,使它能得出正确的结果。

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

给定源程序:

111

#include

#include

typedefstructaa

{intdata;

structaa*next;

}NODE;

NODE*Creatlink(intn,intm)

{NODE*h=NULL,*p,*s;

inti;

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

p=(NODE)malloc(sizeof(NODE));

h=p;

p->next=NULL;

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

{s=(NODE*)malloc(sizeof(NODE));

s->data=rand()%m;s->next=p->next;

p->next=s;p=p->next;

}

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

returnp;

}

outlink(NODE*h)

{NODE*p;

p=h->next;

printf("nnTHELIST:nnHEAD");

while(p)

{printf("->%d",p->data);

p=p->next;

}

printf("n");

}

main()

{NODE*head;

head=Creatlink(8,22);

outlink(head);

}

解题思路:

112

第一处:指向刚分配的结构指针,所以应改为:p=(NODE*)malloc(sizeof(NODE));

第二处:在动态分配内存的下一行语句是,使用临时结构指针变量h保存p指针的初始位置,

最后返回不能使用p,是因为p的位置已经发生了变化,所以应改为返回h。

***************************************************

请编写函数fun,函数的功能是:统计一行字符串中单词的个数,作为函数值返

回。一行字符串在主函数中输入,规定所有单词由小写字母组成,单词之间由若干

个空格隔开,一行的开始没有空格。

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

#include

#defineN80

intfun(char*s)

{

}

main()

{charline[N];intnum=0;

printf("Enterastring:n");gets(line);

num=fun(line);

printf("Thenumberofwordis:%dnn",num);

NONO();

}

解题思路:

本题是统计字符串中的单词数。

1.利用while循环语句和指针变量,当字符为空格时,则单词数k加1。

2.循环结束返回k。

参考答案:

intfun(char*s)

{

intk=1;

while(*s){

if(*s=='')k++;

s++;

}

returnk;

113

}

第04套:

程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。所

有学生数据均以二进制方式输出到文件中。函数fun的功能是从形参filename所指

的文件中读入学生数据,并按照学号从小到大排序后,再用二进制方式把排序后的

学生数据输出到filename所指的文件中,覆盖原来的文件内容。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#defineN5

typedefstructstudent{

longsno;

charname[10];

floatscore[3];

}STU;

voidfun(char*filename)

{FILE*fp;inti,j;

STUs[N],t;

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

fp=fopen(filename,__1__);

fread(s,sizeof(STU),N,fp);

fclose(fp);

for(i=0;i

for(j=i+1;j

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

if(s[i].sno__2__s[j].sno)

{t=s[i];s[i]=s[j];s[j]=t;}

fp=fopen(filename,"wb");

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

__3__(s,sizeof(STU),N,fp);/*二进制输出*/

fclose(fp);

}

main()

{STUt[N]={{10005,"ZhangSan",95,80,88},{10003,"LiSi",85,70,78},

{10002,"CaoKai",75,60,88},{10004,"FangFang",90,82,87},

114

{10001,"MaChao",91,92,77}},ss[N];

inti,j;FILE*fp;

fp=fopen("","wb");

fwrite(t,sizeof(STU),5,fp);

fclose(fp);

printf("nnTheoriginaldata:nn");

for(j=0;j

{printf("nNo:%ldName:%-8sScores:",t[j].sno,t[j].name);

for(i=0;i<3;i++)printf("%6.2f",t[j].score[i]);

printf("n");

}

fun("");

printf("nnThedataaftersorting:nn");

fp=fopen("","rb");

fread(ss,sizeof(STU),5,fp);

fclose(fp);

for(j=0;j

{printf("nNo:%ldName:%-8sScores:",ss[j].sno,ss[j].name);

for(i=0;i<3;i++)printf("%6.2f",ss[j].score[i]);

printf("n");

}

}

解题思路:

本题是考察把结构中的数据写入文件。

第一处:建立文件的类型,考虑到是把结构中的数据(结构中的数据包含不打印的字符)

从文件中读出,所以应填:"rb"。

第二处:判断当前学号是否大于刚读出的学号进行相比,如果大于,则进行交换,所以应

填:>。

第三处:把已排序的结构数据,重新写入文件,所以应填:fwrite。

***************************************************

给定程序MODI1.C中函数fun的功能是:在字符串的最前端加入n个*号,形成

新串,并且覆盖原串。

注意:字符串的长度最长允许为79。

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

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

给定源程序:

#include

115

#include

voidfun(chars[],intn)

{

chara[80],*p;

inti;

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

s=p;

for(i=0;i

do

{a[i]=*p;

i++;

}

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

while(*p++)

a[i]=0;

strcpy(s,a);

}

main()

{intn;chars[80];

printf("nEnterastring:");gets(s);

printf("nThestring"%s"n",s);

printf("nEntern(numberof*):");scanf("%d",&n);

fun(s,n);

printf("nThestringafterinsert:"%s"n",s);

}

解题思路:

第一处:指针p应指向s,所以应改为:p=s;。

第二处:死循环,当dowhile循环执行一次,临时变量p应该指向字符串的下一位置,所以

应改为:while(*p++);。

***************************************************

请编写函数fun,函数的功能是:统计各年龄段的人数。N个年龄通过调用随机

函数获得,并放在主函数的age数组中;要求函数把0至9岁年龄段的人数放在d[0]

中,把10至19岁年龄段的人数放在d[1]中,把20至29岁年龄段的人数放在d[2]中,

其余依此类推,把100岁(含100)以上年龄的人数都放在d[10]中。结果在主函数

中输出。

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

116

你编写的若干语句。

给定源程序:

#include

#defineN50

#defineM11

voidfun(int*a,int*b)

{

}

doublernd()

{statict=29,c=217,m=1024,r=0;

r=(r*t+c)%m;return((double)r/m);

}

main()

{intage[N],i,d[M];

for(i=0;i

printf("Theoriginaldata:n");

for(i=0;i

printf("nn");

fun(age,d);

for(i=0;i<10;i++)printf("%4d---%4d:%4dn",i*10,i*10+9,d[i]);

printf("Over100:%4dn",d[10]);

NONO(d);

}

解题思路:

本题是统计各年龄段的人数。

1.初始化各年龄段人数为0。

2.使用for循环以及求出各年龄的十位数字作为存放人数的地址,如果大于值大于10,则

存入d[10]中(大于110岁的人)。

参考答案:

voidfun(int*a,int*b)

{

inti,j;

for(i=0;i

for(i=0;i

j=a[i]/10;

if(j>10)b[M-1]++;elseb[j]++;

}

117

}

doublernd()

{statict=29,c=217,m=1024,r=0;

r=(r*t+c)%m;return((double)r/m);

}

第05套:

给定程序中,函数fun的功能是将参数给定的字符串、整数、浮点数写到文本

文件中,再用字符串方式从此文本文件中逐个读入,并调用库函数atoi和atof将

字符串转换成相应的整数、浮点数,然后将其显示在屏幕上。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

voidfun(char*s,inta,doublef)

{

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

__1__fp;

charstr[100],str1[100],str2[100];

inta1;doublef1;

fp=fopen("","w");

fprintf(fp,"%s%d%fn",s,a,f);

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

__2__;

fp=fopen("","r");

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

fscanf(__3__,"%s%s%s",str,str1,str2);

fclose(fp);

a1=atoi(str1);

f1=atof(str2);

printf("nTheresult:nn%s%d%fn",str,a1,f1);

}

main()

{chara[10]="Hello!";intb=12345;

doublec=98.76;

fun(a,b,c);

118

}

解题思路:

本题是考察先把给定的数据写入到文本文件中,再从该文件读出并转换成相应的整数、浮

点数显示在屏幕上。

第一处:定义文本文件类型变量,所以应填:FILE*。

第二处:关闭刚写入的文件,所以应填:fclose(fp)。

第三处:从文件中读出数据,所以应填:fp。

***************************************************

给定程序MODI1.C中函数fun的功能是:对N名学生的学习成绩,按从高到低的

顺序找出前m(m≤10)名学生来,并将这些学生数据存放在一个动态分配的连续存

储区中,此存储区的首地址作为函数值返回。

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

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

给定源程序:

#include

#include

#include

#defineN10

typedefstructss

{charnum[10];

ints;

}STU;

STU*fun(STUa[],intm)

{STUb[N],*t;

inti,j,k;

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

t=(STU*)calloc(sizeof(STU),m)

for(i=0;i

for(k=0;k

{for(i=j=0;i

if(b[i].s>b[j].s)j=i;

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

t(k)=b(j);

b[j].s=0;

}

returnt;

}

119

outresult(STUa[],FILE*pf)

{inti;

for(i=0;i

fprintf(pf,"No=%sMark=%dn",a[i].num,a[i].s);

fprintf(pf,"nn");

}

main()

{STUa[N]={{"A01",81},{"A02",89},{"A03",66},{"A04",87},{"A05",77},

{"A06",90},{"A07",79},{"A08",61},{"A09",80},{"A10",71}};

STU*pOrder;

inti,m;

printf("*****TheOriginaldata*****n");

outresult(a,stdout);

printf("nGivethenumberofthestudentswhohavebetterscore:");

scanf("%d",&m);

while(m>10)

{printf("nGivethenumberofthestudentswhohavebetterscore:");

scanf("%d",&m);

}

pOrder=fun(a,m);

printf("*****THERESULT*****n");

printf("Thetop:n");

for(i=0;i

printf("%s%dn",pOrder[i].num,pOrder[i].s);

free(pOrder);

}

解题思路:

第一处:语句最后缺少分号。

第二处:应该使用方括号,而不是圆括号。

像此类,使用编译,即可发现。

***************************************************

请编写函数fun,函数的功能是:删去一维数组中所有相同的数,使之只剩一

个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。

例如,一维数组中的数据是:2223445666677899101010。

删除后,数组中的内容应该是:2345678910。

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

120

你编写的若干语句。

给定源程序:

#include

#defineN80

intfun(inta[],intn)

{

}

main()

{inta[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10},i,n=20;

printf("Theoriginaldata:n");

for(i=0;i

n=fun(a,n);

printf("nnThedataafterdeleted:n");

for(i=0;i

NONO();

}

解题思路:

本题是删除已排序过数组中的相同数。

1.取出数组中的第1个数存放在临时变量k中,再利用for循环来依次判断所有的数。

2.如果取出的数和k相比,如果不相同,则仍存放在原数组中,其中存放的位置由j来控制,

接着把这个数重新存入k。如果相同,则取下一数。

参考答案:

intfun(inta[],intn)

{

inti,j=1,k=a[0];

for(i=1;i

if(k!=a[i]){

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

k=a[i];

}

a[j]=0;

returnj;

}

第06套:

给定程序中,函数fun的功能是根据形参i的值返回某个函数的值。当调用正

确时,程序输出:

x1=5.000000,x2=3.000000,x1*x1+x1*x2=40.000000

121

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

doublef1(doublex)

{returnx*x;}

doublef2(doublex,doubley)

{returnx*y;}

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

__1__fun(inti,doublex,doubley)

{if(i==1)

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

return__2__(x);

else

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

return__3__(x,y);

}

main()

{doublex1=5,x2=3,r;

r=fun(1,x1,x2);

r+=fun(2,x1,x2);

printf("nx1=%f,x2=%f,x1*x1+x1*x2=%fnn",x1,x2,r);

}

解题思路:

本题是根据给定的公式来计算函数的值。

第一处:程序中使用双精度double类型进行计算,所以函数的返回值类型也为double,所

以应填:double。

第二处:当i等于1时,则返回f1函数的值,所以应填:f1。

第三处:如果i不等于1,则返回f2函数的值,所以应填:f2。

***************************************************

给定程序MODI1.C中函数fun的功能是:比较两个字符串,将长的那个字符串

的首地址作为函数值返回。

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

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

给定源程序:

#include

122

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

charfun(char*s,char*t)

{intsl=0,tl=0;char*ss,*tt;

ss=s;tt=t;

while(*ss)

{sl++;

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

(*ss)++;

}

while(*tt)

{tl++;

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

(*tt)++;

}

if(tl>sl)returnt;

elsereturns;

}

main()

{chara[80],b[80],*p,*q;inti;

printf("nEnterastring:");gets(a);

printf("nEnterastringagain:");gets(b);

printf("nThelongeris:nn"%s"n",fun(a,b));

}

解题思路:

第一处:试题要求返回字符串的首地址,所以应改为:char*fun(char*s,char*t)

第二处:取字符串指针ss的下一个位置,所以应改为:ss++;。

第三处:取字符串指针tt的下一个位置,所以应改为:tt++;。

***************************************************

请编写函数fun,函数的功能是:移动字符串中的内容,移动的规则如下:把第

1到第m个字符,平移到字符串的最后,把第m+1到最后的字符移到字符串的前部。

例如,字符串中原有的内容为:ABCDEFGHIJK,m的值为3,则移动后,字符串

中的内容应该是:DEFGHIJKABC。

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

123

#include

#defineN80

voidfun1(char*w)/*本函数的功能是将字符串中字符循环左移一个位置*/

{

inti;chart;

t=w[0];

for(i=0;i

w[i]=w[i+1];

w[strlen(w)-1]=t;

}

voidfun(char*w,intm)/*可调用fun1函数左移字符*/

{

}

main()

{chara[N]="ABCDEFGHIJK";

intm;

printf("Theoriginalstring:n");puts(a);

printf("nnEnterm:");scanf("%d",&m);

fun(a,m);

printf("nThestringaftermoving:n");puts(a);

printf("nn");

NONO();

}

解题思路:

本题是考察字符串的操作。

1.由于函数fun1是将字符串中字符循环左移一个位置,并通过实参w返回循环左移一个位

置的字符串。

2.利用循环for语句来操作多少个字符(m)需要循环左移。

参考答案:

voidfun1(char*w)/*本函数的功能是将字符串中字符循环左移一个位置*/

{

inti;chart;

t=w[0];

for(i=0;i

w[i]=w[i+1];

w[strlen(w)-1]=t;

}

124

voidfun(char*w,intm)/*可调用fun1函数左移字符*/

{

inti;

for(i=0;i

}

第07套:

程序通过定义并赋初值的方式,利用结构体变量存储了一名学生的信息。函

数fun的功能是输出这位学生的信息。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

typedefstruct

{intnum;

charname[9];

charsex;

struct{intyear,month,day;}birthday;

floatscore[3];

}STU;

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

voidshow(STU___1___)

{inti;

printf("n%d%s%c%d-%d-%d",,,,

,,);

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

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

printf("%5.1f",___2___);

printf("n");

}

main()

{STUstd={1,"Zhanghua",'M',1961,10,8,76.5,78.0,82.0};

printf("nAstudentdata:n");

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

show(___3___);

}

解题思路:

125

本题是利用结构体变量存储了一名学生的信息。

第一处:tt变量在函数体fun已经使用,所以应填:tt。

第二处:利用循环分别输出学生的成绩数据,所以应填:[i]。

第三处:函数的调用,所以应填:std。

***************************************************

给定程序MODI1.C中函数fun的功能是:求出数组中最大数和次最大数,并

把最大数和a[0]中的数对调、次最大数和a[1]中的数对调。

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

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

给定源程序:

#include

#defineN20

intfun(int*a,intn)

{inti,m,t,k;

for(i=0;i<2;i++){

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

m=0;

for(k=i+1;k

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

if(a[k]>a[m])k=m;

t=a[i];a[i]=a[m];a[m]=t;

}

}

main()

{intx,b[N]={11,5,12,0,3,6,9,7,10,8},n=10,i;

for(i=0;i

printf("n");

fun(b,n);

for(i=0;i

printf("n");

}

解题思路:

第一处:外循环每循环一次,把当前位置i赋值给m,所以应改为:m=i;。

第二处:通过内循环来找出最大的一个数的位置k,所以应改为:if(a[k]>a[m])m=k;。

***************************************************

请编写一个函数unsignedfun(unsignedw),w是一个大于10的无符

号整数,若w是n(n≥2)位的整数,函数求出w的低n-1位的数作为函数值返

126

回。

例如:w值为5923,则函数返回923;w值为923则函数返回23。

注意:部分源程序存在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

unsignedfun(unsignedw)

{

}

main()

{unsignedx;

printf("Enteraunsignedintegernumber:");scanf("%u",&x);

printf("Theoriginaldatais:%un",x);

if(x<10)printf("Dataerror!");

elseprintf("Theresult:%un",fun(x));

NONO();

}

解题思路:

本题是考察考生怎样获取一个符合要求的无符号整数。本题是应用if条件语句首先判断给

出的数是几位数,再模相应的值,最后得出的余数就是结果。

参考答案:

unsignedfun(unsignedw)

{

if(w>10000)w%=10000;

elseif(w>1000)w%=1000;

elseif(w>100)w%=100;

elseif(w>10)w%=10;

returnw;

}

第08套:

给定程序通过定义并赋初值的方式,利用结构体变量存储了一名学生的学号、

姓名和3门课的成绩。函数fun的功能是将该学生的各科成绩都乘以一个系数a。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

给定源程序:

127

#include

typedefstruct

{intnum;

charname[9];

floatscore[3];

}STU;

voidshow(STUtt)

{inti;

printf("%d%s:",,);

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

printf("%5.1f",[i]);

printf("n");

}

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

voidmodify(___1___*ss,floata)

{inti;

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

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

ss->___2___*=a;

}

main()

{STUstd={1,"Zhanghua",76.5,78.0,82.0};

floata;

printf("nTheoriginalnumberandnameandscores:n");

show(std);

printf("nInputanumber:");scanf("%f",&a);

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

modify(___3___,a);

printf("nAresultofmodifying:n");

show(std);

}

解题思路:

本题是利用结构体存储学生记录并由实参ss返回。

第一处:实参ss是一个结构型指针变量,所以应填:STU。

第二处:该学生的各科成绩都乘以一个系数a,所以应填:score[i]。

第三处:函数的调用,由于函数定义时使用的指针结构型变量,所以应填:&std。

***************************************************

128

给定程序MODI1.C中函数fun的功能是:求k!(k<13),所求阶乘的值作为函

数值返回。例如:若k=10,则应输出:3628800。

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

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

给定源程序:

#include

longfun(intk)

{

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

ifk>0

return(k*fun(k-1));

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

elseif(k=0)

return1L;

}

main()

{intk=10;

printf("%d!=%ldn",k,fun(k));

}

解题思路:

第一处:条件判断缺少圆括号。

第二处:判断相等的符号是==。

***************************************************

程序定义了N×N的二维数组,并在主函数中自动赋值。请编写函数

fun(inta[][N],intn),函数的功能是:使数组左下三角元素中的值乘以n。

例如:若n的值为3,a数组中的值为

|197||397|

a=|238|则返回主程序后a数组中的值应为|698|

|456||121518|

注意:部分源程序存在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

#include

#defineN5

intfun(inta[][N],intn)

129

{

}

main()

{inta[N][N],n,i,j;

printf("*****Thearray*****n");

for(i=0;i

{for(j=0;j

{a[i][j]=rand()%10;printf("%4d",a[i][j]);}

printf("n");

}

don=rand()%10;while(n>=3);

printf("n=%4dn",n);

fun(a,n);

printf("*****THERESULT*****n");

for(i=0;i

{for(j=0;j

printf("n");

}

NONO();

}

解题思路:

本题是利用两重循环给二维数组左下三角元素中的值乘以n。

参考答案:

intfun(inta[][N],intn)

{

inti,j;

for(i=0;i

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

a[i][j]*=n;

}

第09套:

给定程序中,函数fun的功能是将不带头节点的单向链表结点数据域中的数据从小到大排序。

即若原链表结点数据域从头至尾的数据为:10、4、2、8、6,排序后链表结点数据域从头至

尾的数据为:2、4、6、8、10。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

130

给定源程序:

#include

#include

#defineN6

typedefstructnode{

intdata;

structnode*next;

}NODE;

voidfun(NODE*h)

{NODE*p,*q;intt;

p=h;

while(p){

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

q=__1__;

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

while(__2__)

{if(p->data>q->data)

{t=p->data;p->data=q->data;q->data=t;}

q=q->next;

}

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

p=__3__;

}

}

NODE*creatlist(inta[])

{NODE*h,*p,*q;inti;

h=NULL;

for(i=0;i

{q=(NODE*)malloc(sizeof(NODE));

q->data=a[i];

q->next=NULL;

if(h==NULL)h=p=q;

else{p->next=q;p=q;}

}

returnh;

}

voidoutlist(NODE*h)

131

{NODE*p;

p=h;

if(p==NULL)printf("ThelistisNULL!n");

else

{printf("nHead");

do

{printf("->%d",p->data);p=p->next;}

while(p!=NULL);

printf("->Endn");

}

}

main()

{NODE*head;

inta[N]={0,10,4,2,8,6};

head=creatlist(a);

printf("nTheoriginallist:n");

outlist(head);

fun(head);

printf("nThelistafterinverting:n");

outlist(head);

}

解题思路:

本题是考察使用链表方法,使用两重while循环语句,对链表的结点数据进行升序排列。

第一处:由于外循环变量使用p指针,内循环变量使用q指针,所以q指向必须指向p的

next

指针,因此应填写:。

第二处:判断内循环q指针是否结束,所以应填:q。

第三处:外循环控制变量p指向自己的next指针,所以应填:。

***************************************************

给定程序MODI1.C中函数fun的功能是:将s所指字符串中的字母转换为按字母

序列的后续字母(但Z转换为A,z转换为a),其它字符不变。

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

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

给定源程序:

#include

#include

voidfun(char*s)

132

{

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

while(*s!='@')

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

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

elseif(*s=='z')*s='a';

else*s+=1;

}

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

(*s)++;

}

}

main()

{chars[80];

printf("nEnterastringwithlength<80.:nn");gets(s);

printf("nThestring:nn");puts(s);

fun(s);

printf("nnTheCords:nn");puts(s);

}

解题思路:

第一处:使用while循环来判断字符串指针s是否结束,所以应改为:while(*s)。

第二处:取字符串指针s的下一个位置,所以应改为:s++;。

***************************************************

请编写函数fun,函数的功能是:移动一维数组中的内容;若数组中有n个整

数,要求把下标从0到p(含p,p小于等于n-1)的数组元素平移到数组的最后。

例如,一维数组中的原始内容为:1,2,3,4,5,6,7,8,9,10;p的值为3。移动

后,一维数组中的内容应为:5,6,7,8,9,10,1,2,3,4。

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

#defineN80

voidfun(int*w,intp,intn)

{

}

main()

133

{inta[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

inti,p,n=15;

printf("Theoriginaldata:n");

for(i=0;i

printf("nnEnterp:");scanf("%d",&p);

fun(a,p,n);

printf("nThedataaftermoving:n");

for(i=0;i

printf("nn");

NONO();

}

解题思路:

本题是考察一维数组的操作。

1.定义一维数组中间变量b,把n值后面数组中的内容存入b中。

2.再把m前的数组中的内容存入b中。

3.最后把数组b的内容依次存放到w中。

参考答案:

voidfun(int*w,intp,intn)

{

inti,j=0,b[N];

for(i=p+1;i

for(i=0;i<=p;i++)b[j++]=w[i];

for(i=0;i

}

第10套:

给定程序中,函数fun的功能是:判定形参a所指的N×N(规定N为奇数)的矩

阵是否是"幻方",若是,函数返回值为1;不是,函数返回值为0。"幻方"的判定

条件是:矩阵每行、每列、主对角线及反对角线上元素之和都相等。

例如,以下3×3的矩阵就是一个"幻方":

492

357

816

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

134

#defineN3

intfun(int(*a)[N])

{inti,j,m1,m2,row,colum;

m1=m2=0;

for(i=0;i

{j=N-i-1;m1+=a[i][i];m2+=a[i][j];}

if(m1!=m2)return0;

for(i=0;i

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

row=colum=__1__;

for(j=0;j

{row+=a[i][j];colum+=a[j][i];}

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

if((row!=colum)__2__(row!=m1))return0;

}

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

return__3__;

}

main()

{intx[N][N],i,j;

printf("Enternumberforarray:n");

for(i=0;i

for(j=0;j

printf("Array:n");

for(i=0;i

{for(j=0;j

printf("n");

}

if(fun(x))printf("TheArrayisamagicsquare.n");

elseprintf("TheArrayisn'tamagicsquare.n");

}

解题思路:

第一处:行列变量row和colum的值初始化为0。

第二处:两个条件只要有一个不满足就返回0,所以应填:||。

第三处:如果矩阵是“幻方”,则返回1。

***************************************************

给定程序MODI1.C中fun函数的功能是:根据整型形参m,计算如下公式的值。

135

111

t=1-------------……------

23m

例如,若主函数中输入5,则应输出-0.283333。

请改正函数fun中的错误或在横线处填上适当的内容并把横线删除,使它能

计算出正确的结果。

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

给定源程序:

#include

doublefun(intm)

{

doublet=1.0;

inti;

for(i=2;i<=m;i++)

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

t=1.0-1/i;

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

_______;

}

main()

{

intm;

printf("nPleaseenter1integernumbers:n");

scanf("%d",&m);

printf("nnTheresultis%lfn",fun(m));

}

解题思路:

第一处:在除法运算中,如果除数和被除数都是整数,所么所除结果也是整数,因此应改

为t-=1./i。

第二处:应是返回公式的值,函数中公式的值是存放在临时变量t中,所以应填returnt;。

***************************************************

请编写一个函数,函数的功能是删除字符串中的所有空格。

例如,主函数中输入"asdafaaz67",则输出为"asdafaaz67"。

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

136

#include

#include

intfun(char*str)

{

}

main()

{

charstr[81];

intn;

printf("Inputastring:");

gets(str);

puts(str);

fun(str);

printf("***str:%sn",str);

NONO();

}

解题思路:

本题是考察考生怎样利用字符串指针来删除字符串的空格字符。在函数开始处把指针p先指

向字符串str以及位置变量i置0,然后采用while循环和字符串指针p来处理的,每循环一

次来判

断指针p所指的字符是否为空格,如果不是空格,则把该字符写到str字符串中,位置由i

来控制,

如果是空格,则不处理,继续取下一字符,直至字符串结束为止,最后再把字符串结束符写

位置为i的str上,再通过形参str返回。

参考答案:

intfun(char*str)

{

char*p=str;

inti=0;

while(*p){

if(*p!='')str[i++]=*p;

p++;

}

str[i]=0;

}

第11套:

137

给定程序中,函数fun的功能是将带头结点的单向链表逆置。即若原链表中从

头至尾结点数据域依次为:2、4、6、8、10,逆置后,从头至尾结点数据域依次为:

10、8、6、4、2。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#defineN5

typedefstructnode{

intdata;

structnode*next;

}NODE;

voidfun(NODE*h)

{NODE*p,*q,*r;

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

p=h->__1__;

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

if(p==__2__)return;

q=p->next;

p->next=NULL;

while(q)

{r=q->next;q->next=p;

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

p=q;q=__3__;

}

h->next=p;

}

NODE*creatlist(inta[])

{NODE*h,*p,*q;inti;

h=(NODE*)malloc(sizeof(NODE));

h->next=NULL;

for(i=0;i

{q=(NODE*)malloc(sizeof(NODE));

q->data=a[i];

q->next=NULL;

138

if(h->next==NULL)h->next=p=q;

else{p->next=q;p=q;}

}

returnh;

}

voidoutlist(NODE*h)

{NODE*p;

p=h->next;

if(p==NULL)printf("ThelistisNULL!n");

else

{printf("nHead");

do

{printf("->%d",p->data);p=p->next;}

while(p!=NULL);

printf("->Endn");

}

}

main()

{NODE*head;

inta[N]={2,4,6,8,10};

head=creatlist(a);

printf("nTheoriginallist:n");

outlist(head);

fun(head);

printf("nThelistafterinverting:n");

outlist(head);

}

解题思路:

本题是考察使用链表方法,对链表的结点数据进行降序排列。

第一处:使用结构指针p,来控制链表的结束,p必须指向h结构指针的next指针,来定位

p

的初始位置。所以应填写:h->next。

第二处:判断p指针是否结束,所以应填写:0。

第三处:q指向原q的next指针,所以应填:r。

***************************************************

给定程序MODI1.C中函数fun的功能是:计算s所指字符串中含有t所指字符串

的数目,并作为函数值返回。

139

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

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

给定源程序:

#include

#include

#defineN80

intfun(char*s,char*t)

{intn;

char*p,*r;

n=0;

while(*s)

{p=s;

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

r=p;

while(*r)

if(*r==*p){r++;p++;}

elsebreak;

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

if(*r=0)

n++;

s++;

}

returnn;

}

main()

{chara[N],b[N];intm;

printf("nPleaseenterstringa:");gets(a);

printf("nPleaseentersubstringb:");gets(b);

m=fun(a,b);

printf("nTheresultis:m=%dn",m);

}

解题思路:

第一处:程序中子串是由变量t来实现的,再根据下面while循环体中语句可知,所以应改

为:r=t;。

第二处:是判断相等的条件,所以应改为:if(*r==0)。

***************************************************

请编写函数fun,函数的功能是:将放在字符串数组中的M个字符串(每串的长

140

度不超过N),按顺序合并组成一个新的字符串。函数fun中给出的语句仅供参考。

例如,字符串数组中的M个字符串为

AAAA

BBBBBBB

CC

则合并后的字符串的内容应是:AAAABBBBBBBCC。

提示:strcat(a,b)的功能是将字符串b复制到字符串a的串尾上,成为一个新

串。

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

#defineM3

#defineN20

voidfun(chara[M][N],char*b)

{

/*以下代码仅供参考*/

inti;*b=0;

}

main()

{charw[M][N]={"AAAA","BBBBBBB","CC"},a[100];

inti;

printf("Thestring:n");

for(i=0;i

printf("n");

fun(w,a);

printf("TheAstring:n");

printf("%s",a);printf("nn");

NONO();

}

解题思路:

本题是考察字符串的操作。

使用for循环以及C语言函数strcat依次连接起来。

参考答案:

#include

#defineM3

141

#defineN20

voidfun(chara[M][N],char*b)

{

/*以下代码仅供参考*/

inti;*b=0;

for(i=0;i

strcat(b,a[i]);

}

第12套:

给定程序中,函数fun的功能是将不带头结点的单向链表逆置。即若原链表中

从头至尾结点数据域依次为:2、4、6、8、10,逆置后,从头至尾结点数据域依次

为:10、8、6、4、2。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#defineN5

typedefstructnode{

intdata;

structnode*next;

}NODE;

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

__1__*fun(NODE*h)

{NODE*p,*q,*r;

p=h;

if(p==NULL)

returnNULL;

q=p->next;

p->next=NULL;

while(q)

{

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

r=q->__2__;

q->next=p;

p=q;

142

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

q=__3__;

}

returnp;

}

NODE*creatlist(inta[])

{NODE*h,*p,*q;inti;

h=NULL;

for(i=0;i

{q=(NODE*)malloc(sizeof(NODE));

q->data=a[i];

q->next=NULL;

if(h==NULL)h=p=q;

else{p->next=q;p=q;}

}

returnh;

}

voidoutlist(NODE*h)

{NODE*p;

p=h;

if(p==NULL)printf("ThelistisNULL!n");

else

{printf("nHead");

do

{printf("->%d",p->data);p=p->next;}

while(p!=NULL);

printf("->Endn");

}

}

main()

{NODE*head;

inta[N]={2,4,6,8,10};

head=creatlist(a);

printf("nTheoriginallist:n");

outlist(head);

head=fun(head);

printf("nThelistafterinverting:n");

143

outlist(head);

}

解题思路:

本题是考察使用链表方法,对链表的结点数据进行降序排列,最后通过函数进行返回。

第一处:由于链表中的所有结果要求通过函数进行返回,所以应填:NODE*。

第二处:中间变量r用来保存q的next指针,所以应填:next。

第三处:q指向原q的next指针,所以应填:r。

***************************************************

给定程序MODI1.C中函数fun的功能是:将s所指字符串中位于奇数位置的字符

或ASCII码为偶数的字符放入t所指数组中(规定第一个字符放在第0位中)。

例如,字符串中的数据为:AABBCCDDEEFF,

则输出应当是:ABBCDDEFF。

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

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

给定源程序:

#include

#include

#defineN80

voidfun(char*s,chart[])

{inti,j=0;

for(i=0;i

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

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

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

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

t[i]='0';

}

main()

{chars[N],t[N];

printf("nPleaseenterstrings:");gets(s);

fun(s,t);

printf("nTheresultis:%sn",t);

}

解题思路:

第一处:根据试题分析,两个条件之间应该是“或”的关系,而不是“与”的关系,所以

应改为:if(i%2||s[i]%2==0)。

第二处:当字符串处理结束后,应该补上字符串的结束符,那么字符串t的位置是由i来控

144

制,所以应改为:t[j]=0;。

***************************************************

请编写函数fun,函数的功能是:将M行N列的二维数组中的数据,按列的顺序

依次放到一维数组中。函数fun中给出的语句仅供参考。

例如,二维数组中的数据为:

33333333

44444444

55555555

则一维数组中的内容应是:

334455334455334455334455。

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

voidfun(ints[][10],intb[],int*n,intmm,intnn)

{

/*以下代码仅供参考*/

inti,j,np=0;/*np用作b数组下标*/

*n=np;

}

main()

{intw[10][10]={{33,33,33,33},{44,44,44,44},{55,55,55,55}},i,j;

inta[100]={0},n=0;

printf("Thematrix:n");

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

{for(j=0;j<4;j++)printf("%3d",w[i][j]);

printf("n");

}

fun(w,a,&n,3,4);

printf("TheAarray:n");

for(i=0;i

NONO();

}

解题思路:

本题是把二维数组中的数据按行存放到一维数组中。

1.计算存放到一维数组中的位置。

145

2.取出二维数组中的数据存放到一维数组(已计算出的位置)中。

参考答案:

voidfun(int(*s)[10],int*b,int*n,intmm,intnn)

{

/*以下代码仅供参考*/

inti,j,np=0;/*np用作b数组下标*/

for(i=0;i

for(j=0;j

b[np]=s[j][i];

np=i*mm+j+1;

}

*n=np;

}

第13套:

给定程序中,函数fun的功能是将带头节点的单向链表结点数据域中的数据从

小到大排序。即若原链表结点数据域从头至尾的数据为:10、4、2、8、6,排序

后链表结点数据域从头至尾的数据为:2、4、6、8、10。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#defineN6

typedefstructnode{

intdata;

structnode*next;

}NODE;

voidfun(NODE*h)

{NODE*p,*q;intt;

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

p=__1__;

while(p){

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

q=__2__;

while(q){

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

146

if(p->data__3__q->data)

{t=p->data;p->data=q->data;q->data=t;}

q=q->next;

}

p=p->next;

}

}

NODE*creatlist(inta[])

{NODE*h,*p,*q;inti;

h=(NODE*)malloc(sizeof(NODE));

h->next=NULL;

for(i=0;i

{q=(NODE*)malloc(sizeof(NODE));

q->data=a[i];

q->next=NULL;

if(h->next==NULL)h->next=p=q;

else{p->next=q;p=q;}

}

returnh;

}

voidoutlist(NODE*h)

{NODE*p;

p=h->next;

if(p==NULL)printf("ThelistisNULL!n");

else

{printf("nHead");

do

{printf("->%d",p->data);p=p->next;}

while(p!=NULL);

printf("->Endn");

}

}

main()

{NODE*head;

inta[N]={0,10,4,2,8,6};

head=creatlist(a);

printf("nTheoriginallist:n");

147

outlist(head);

fun(head);

printf("nThelistaftersorting:n");

outlist(head);

}

解题思路:

本题是考察使用链表方法,对链表的结点数据进行升序排列。

第一处:使用结构指针p,来控制链表的结束,p必须指向h结构指针的next指针,来定位

p

的初始位置。所以应填写:h->next。

第二处:使用while循环,对链表中结点的数据进行排序,q必须指向p结构指针的next指

针。

所以应填写:p->next。

第三处:如果当前结点中的数据大于(大于等于)循环中的结点数据,那么进行交换,所

以应填写:>(或>=)。

***************************************************

给定程序MODI1.C是建立一个带头结点的单向链表,并用随机函数为各结点数

据域赋值。函数fun的作用是求出单向链表结点(不包括头结点)数据域中的最大值,

并且作为函数值返回。

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

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

给定源程序:

#include

#include

typedefstructaa

{intdata;

structaa*next;

}NODE;

fun(NODE*h)

{intmax=-1;

NODE*p;

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

p=h;

while(p)

{if(p->data>max)

max=p->data;

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

148

p=h->next;

}

returnmax;

}

outresult(ints,FILE*pf)

{fprintf(pf,"nThemaxinlink:%dn",s);}

NODE*creatlink(intn,intm)

{NODE*h,*p,*s,*q;

inti,x;

h=p=(NODE*)malloc(sizeof(NODE));h->data=9999;

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

{s=(NODE*)malloc(sizeof(NODE));

s->data=rand()%m;s->next=p->next;

p->next=s;p=p->next;

}

p->next=NULL;

returnh;

}

outlink(NODE*h,FILE*pf)

{NODE*p;

p=h->next;

fprintf(pf,"nTHELIST:nnHEAD");

while(p)

{fprintf(pf,"->%d",p->data);p=p->next;}

fprintf(pf,"n");

}

main()

{NODE*head;intm;

head=creatlink(12,100);

outlink(head,stdout);

m=fun(head);

printf("nTHERESULT:n");outresult(m,stdout);

}

解题思路:

程序中是使用while循环语句和结合结构指针p来找到数据域中的最大值。

第一处:p指向形参结构指针h的next指针,所以应改为:p=h->next;。

第二处:p指向自己的下一个结点,所以应改为:p=p->next,

149

***************************************************

请编写函数fun,函数的功能是:将M行N列的二维数组中的数据,按行的顺序

依次放到一维数组中,一维数组中数据的个数存放在形参n所指的存储单元中。

例如,二维数组中的数据为:

33333333

44444444

55555555

则一维数组中的内容应是:

333333334444444455555555。

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

voidfun(int(*s)[10],int*b,int*n,intmm,intnn)

{

}

main()

{intw[10][10]={{33,33,33,33},{44,44,44,44},{55,55,55,55}},i,j;

inta[100]={0},n=0;

printf("Thematrix:n");

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

{for(j=0;j<4;j++)printf("%3d",w[i][j]);

printf("n");

}

fun(w,a,&n,3,4);

printf("TheAarray:n");

for(i=0;i

NONO();

}

解题思路:

本题是把二维数组中的数据按行存放到一维数组中。

1.计算存放到一维数组中的位置。

2.取出二维数组中的数据存放到一维数组(已计算出的位置)中。

参考答案:

voidfun(int(*s)[10],int*b,int*n,intmm,intnn)

{

150

inti,j,k;

for(i=0;i

for(j=0;j

k=i*nn+j;

b[k]=s[i][j];

}

*n=mm*nn;

}

main()

{intw[10][10]={{33,33,33,33},{44,44,44,44},{55,55,55,55}},i,j;

inta[100]={0},n=0;

printf("Thematrix:n");

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

{for(j=0;j<4;j++)printf("%3d",w[i][j]);

printf("n");

}

fun(w,a,&n,3,4);

printf("TheAarray:n");

for(i=0;i

NONO();

}

第14套:

给定程序中,函数fun的功能是用函数指针指向要调用的函数,并进行调用。

规定在__2__处使f指向函数f1,在__3__处使f指向函数f2。当调用正确时,程序

输出:

x1=5.000000,x2=3.000000,x1*x1+x1*x2=40.000000

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

doublef1(doublex)

{returnx*x;}

doublef2(doublex,doubley)

{returnx*y;}

doublefun(doublea,doubleb)

{

151

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

__1__(*f)();

doubler1,r2;

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

f=__2__;/*pointfountionf1*/

r1=f(a);

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

f=__3__;/*pointfountionf2*/

r2=(*f)(a,b);

returnr1+r2;

}

main()

{doublex1=5,x2=3,r;

r=fun(x1,x2);

printf("nx1=%f,x2=%f,x1*x1+x1*x2=%fn",x1,x2,r);

}

解题思路:

本题主要是考察用函数指针指向要调用的函数。程序中共有三处要填上适当的内容,使程

序能运行出正确的结果。

第一处:定义函数指针的类型,所以应填:double。

第二处:使f指向函数f1,所以应填:f1。

第三处:使f指向函数f2,所以应填:f2。

***************************************************

给定程序MODI1.C是建立一个带头结点的单向链表,并用随机函数为各结点赋

值。函数fun的功能是将单向链表结点(不包括头结点)数据域为偶数的值累加起

来,并且作为函数值返回。

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

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

给定源程序:

#include

#include

typedefstructaa

{intdata;structaa*next;}NODE;

intfun(NODE*h)

{intsum=0;

NODE*p;

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

152

p=h;

while(p)

{if(p->data%2==0)

sum+=p->data;

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

p=h->next;

}

returnsum;

}

NODE*creatlink(intn)

{NODE*h,*p,*s,*q;

inti,x;

h=p=(NODE*)malloc(sizeof(NODE));

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

{s=(NODE*)malloc(sizeof(NODE));

s->data=rand()%16;

s->next=p->next;

p->next=s;

p=p->next;

}

p->next=NULL;

returnh;

}

outlink(NODE*h,FILE*pf)

{NODE*p;

p=h->next;

fprintf(pf,"nnTHELIST:nnHEAD");

while(p)

{fprintf(pf,"->%d",p->data);p=p->next;}

fprintf(pf,"n");

}

outresult(ints,FILE*pf)

{fprintf(pf,"nThesumofevennumbers:%dn",s);}

main()

{NODE*head;inteven;

head=creatlink(12);

head->data=9000;

153

outlink(head,stdout);

even=fun(head);

printf("nTheresult:n");outresult(even,stdout);

}

解题思路:

本题是考察如何使用单向链表把数据域的值按条件进行累加。

第一处:试题要求不计算头结点,所以应改为:p=h->next;

第二处:指向p的下一个结点来实现循环,所以应改为:p=p->next;

***************************************************

请编写函数fun,函数的功能是:判断字符串是否为回文?若是,函数返回1,

主函数中输出:YES,否则返回0,主函数中输出NO。回文是指顺读和倒读都一样

的字符串。

例如,字符串LEVEL是回文,而字符串123312就不是回文。

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

#defineN80

intfun(char*str)

{

}

main()

{chars[N];

printf("Enterastring:");gets(s);

printf("nn");puts(s);

if(fun(s))printf("YESn");

elseprintf("NOn");

NONO();

}

解题思路:

本题是考察如何判断一个字符串是回文字符串,回文是指顺读和倒读都一样

的字符串。可以利用for循环语句来判断,如果前后不一致,则不是回文字符串。

参考答案:

intfun(char*str)

{

inti,j=strlen(str);

154

for(i=0;i

if(str[i]!=str[j-i-1])return0;

return1;

}

main()

{chars[N];

printf("Enterastring:");gets(s);

printf("nn");puts(s);

if(fun(s))printf("YESn");

elseprintf("NOn");

NONO();

}

第15套:

程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。所

有学生数据均以二进制方式输出到文件中。函数fun的功能是从指定

文件中找出指定学号的学生数据,读入此学生数据,对该生的分数进行修改,使

每门课的分数加3分,修改后重写文件中该学生的数据,即用该学生的新数据覆盖

原数据,其它学生数据不变;若找不到,则什么都不做。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#defineN5

typedefstructstudent{

longsno;

charname[10];

floatscore[3];

}STU;

voidfun(char*filename,longsno)

{FILE*fp;

STUn;inti;

fp=fopen(filename,"rb+");

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

while(!feof(__1__))

{fread(&n,sizeof(STU),1,fp);

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

155

if(__2__sno)break;

}

if(!feof(fp))

{for(i=0;i<3;i++)[i]+=3;

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

fseek(__3__,-1L*sizeof(STU),SEEK_CUR);

fwrite(&n,sizeof(STU),1,fp);

}

fclose(fp);

}

main()

{STUt[N]={{10001,"MaChao",91,92,77},{10002,"CaoKai",75,60,88},

{10003,"LiSi",85,70,78},{10004,"FangFang",90,82,87},

{10005,"ZhangSan",95,80,88}},ss[N];

inti,j;FILE*fp;

fp=fopen("","wb");

fwrite(t,sizeof(STU),N,fp);

fclose(fp);

printf("nTheoriginaldata:n");

fp=fopen("","rb");

fread(ss,sizeof(STU),N,fp);

fclose(fp);

for(j=0;j

{printf("nNo:%ldName:%-8sScores:",ss[j].sno,ss[j].name);

for(i=0;i<3;i++)printf("%6.2f",ss[j].score[i]);

printf("n");

}

fun("",10003);

fp=fopen("","rb");

fread(ss,sizeof(STU),N,fp);

fclose(fp);

printf("nThedataaftermodifing:n");

for(j=0;j

{printf("nNo:%ldName:%-8sScores:",ss[j].sno,ss[j].name);

for(i=0;i<3;i++)printf("%6.2f",ss[j].score[i]);

printf("n");

}

156

}

解题思路:

本题是考察如何从指定文件中找出指定学号的学生数据,并进行适当的修改,修改后重新

写回到文件中该学生的数据上,即用该学生的新数据覆盖原数据。

第一处:判断读文件是否结束,所以应填:fp。

第二处:从读出的数据中判断是否是指定的学号,其中学号是由形参sno来传递的,所以应

填:==。

第三处:从已打开文件fp中重新定位当前读出的结构位置,所以应填:fp。

***************************************************

给定程序MODI1.C中函数fun的功能是:利用插入排序法对字符串中的字符按

从小到大的顺序进行排序。插入法的基本算法是:先对字符串中的头两个元素进

行排序。然后把第三个字符插入到前两个字符中,插入后前三个字符依然有序;

再把第四个字符插入到前三个字符中,……。待排序的字符串已在主函数中赋予。

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

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

给定源程序:

#include

#include

#defineN80

voidinsert(char*aa)

{inti,j,n;charch;

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

n=strlen[aa];

for(i=1;i

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

c=aa[i];

j=i-1;

while((j>=0)&&(ch

{aa[j+1]=aa[j];

j--;

}

aa[j+1]=ch;

}

}

main()

{chara[N]="QWERTYUIOPASDFGHJKLMNBVCXZ";

inti;

157

printf("Theoriginalstring:%sn",a);

insert(a);

printf("Thestringaftersorting:%snn",a);

}

解题思路:

第一处:函数应该使用圆括号,所以应改为:n=strlen(aa);。

第二处:变量c没有定义,但后面使用的是ch变量,所以应改为:ch=aa[i];。

***************************************************

N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头

节点。请编写函数fun,它的功能是:找出学生的最高分,由函数值返回。

注意:部分源程序在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

#include

#defineN8

structslist

{doubles;

structslist*next;

};

typedefstructslistSTREC;

doublefun(STREC*h)

{

}

STREC*creat(double*s)

{STREC*h,*p,*q;inti=0;

h=p=(STREC*)malloc(sizeof(STREC));p->s=0;

while(i

{q=(STREC*)malloc(sizeof(STREC));

q->s=s[i];i++;p->next=q;p=q;

}

p->next=0;

returnh;

}

outlist(STREC*h)

{STREC*p;

158

p=h->next;printf("head");

do

{printf("->%2.0f",p->s);p=p->next;}

while(p!=0);

printf("nn");

}

main()

{doubles[N]={85,76,69,85,91,72,64,87},max;

STREC*h;

h=creat(s);outlist(h);

max=fun(h);

printf("max=%6.1fn",max);

NONO();

}

解题思路:

本题是考察如何从链表中求出学生的最高分。

我们给出的程序是利用while循环语句以及临时结构指针p变量来求出最高分。

1.将链表中的第1个值赋给变量max。

2.将链表指针p的初始位置指向h的next指针(h->next)。

3.判断p指针是否结束,如果结束,则返回max,否则做下一步。

4.判断max是否小于p->s,如果小于,则max取p->s,否则不替换。

5.取p->next赋值给p(取下一结点位置给p),转3继续。

参考答案:

doublefun(STREC*h)

{

doublemax=h->s;

STREC*p;

p=h->next;

while(p)

{if(p->s>max)

max=p->s;

p=p->next;

}

returnmax;

}

STREC*creat(double*s)

{STREC*h,*p,*q;inti=0;

159

h=p=(STREC*)malloc(sizeof(STREC));p->s=0;

while(i

{q=(STREC*)malloc(sizeof(STREC));

q->s=s[i];i++;p->next=q;p=q;

}

p->next=0;

returnh;

}

outlist(STREC*h)

{STREC*p;

p=h->next;printf("head");

do

{printf("->%2.0f",p->s);p=p->next;}

while(p!=0);

printf("nn");

}

第16套:

给定程序中,函数fun的功能是:求出形参ss所指字符串数组中最长字符串的

长度,将其余字符串右边用字符*补齐,使其与最长的字符串等长。ss所指字符串

数组中共有M个字符串,且串长

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#defineM5

#defineN20

voidfun(char(*ss)[N])

{inti,j,n,len=0;

for(i=0;i

{len=strlen(ss[i]);

if(i==0)n=len;

if(len>n)n=len;

}

for(i=0;i

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

160

n=strlen(___1___);

for(j=0;j

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

ss[i][___2___]='*';

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

ss[i][n+j+___3___]='0';

}

}

main()

{charss[M][N]={"shanghai","guangzhou","beijing","tianjing","cchongqing"};

inti;

printf("Theoriginalstringsare:n");

for(i=0;i

printf("n");

fun(ss);

printf("Theresultis:n");

for(i=0;i

}

解题思路:

第一处:利用for循环语句取当前字符串的长度,所以应填:ss[i]。

第二处:在字符串的右边填字符*,其开始位置是n+j,其中n是该字符串本身的长度,j是

循环控制变量,所以应填:n+j。

第三处:字符串处理结束应置字符串结束符,其位置是n+j+1,所以应填:1。

***************************************************

给定程序MODI1.C中fun函数的功能是:将p所指字符串中每个单词的最后一

个字母改成大写。(这里的“单词”是指由空格隔开的字符串)。

例如,若输入

"Iamastudenttotaketheexamination.",

则应输出"IaMAstudenTtOtakEthEexamination."。

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

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

给定源程序:

#include

#include

voidfun(char*p)

{

intk=0;

161

for(;*p;p++)

if(k)

{

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

if(p=='')

{

k=0;

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

*(p-1)=toupper(*(p-1))

}

}

else

k=1;

}

main()

{

charchrstr[64];

intd;

printf("nPleaseenteranEnglishsentencewithin63letters:");

gets(chrstr);

d=strlen(chrstr);

chrstr[d]='';

chrstr[d+1]=0;

printf("nnBeforechanging:n%s",chrstr);

fun(chrstr);

printf("nAfterchanging:n%s",chrstr);

}

解题思路:

第一处:关键字int错写成INT。

第二处:该行括号没有配对,所以只要加上一个右括号即可。

***************************************************

请编写函数fun,对长度为7个字符的字符串,除首、尾字符外,将其余5个字

符按ASCII码降序排列。

例如,原来的字符串为CEAedca,排序后输出为CedcEAa。

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

162

给定源程序:

#include

#include

#include

intfun(char*s,intnum)

{

}

main()

{

chars[10];

printf("输入7个字符的字符串:");

gets(s);

fun(s,7);

printf("n%s",s);

NONO();

}

解题思路:

本题是考察考生如何对字符串中的字符按降序进行排序。给出的程序是使用双重for循环以

及冒泡法进行排序的,结果仍存放在原先的字符串上。

参考答案:

intfun(char*s,intnum)

{

charch;

inti,j;

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

for(j=i+1;j<6;j++){

if(*(s+i)<*(s+j)){

ch=*(s+j);

*(s+j)=*(s+i);

*(s+i)=ch;

}

}

}

第17套:

程序通过定义学生结构体数组,存储了若干名学生的学号、姓名和3门课的成

绩。函数fun的功能是将存放学生数据的结构体数组,按照姓名的字典序(从小到

大)排序。

163

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

structstudent{

longsno;

charname[10];

floatscore[3];

};

voidfun(structstudenta[],intn)

{

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

__1__t;

inti,j;

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

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

for(j=i+1;j

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

if(strcmp(__3__)>0)

{t=a[i];a[i]=a[j];a[j]=t;}

}

main()

{structstudents[4]={{10001,"ZhangSan",95,80,88},{10002,"LiSi",85,70,78},

{10003,"CaoKai",75,60,88},{10004,"FangFang",90,82,87}};

inti,j;

printf("nnTheoriginaldata:nn");

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

{printf("nNo:%ldName:%-8sScores:",s[j].sno,s[j].name);

for(i=0;i<3;i++)printf("%6.2f",s[j].score[i]);

printf("n");

}

fun(s,4);

printf("nnThedataaftersorting:nn");

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

{printf("nNo:%ldName:%-8sScores:",s[j].sno,s[j].name);

164

for(i=0;i<3;i++)printf("%6.2f",s[j].score[i]);

printf("n");

}

}

解题思路:

本题是对结构体数组中的姓名按升序进行排列。

第一处:t是一个临时变量,主要是存放学生数据的结构变量,所以应填:structstudent。

第二处:利用两重for循环进行排序操作,排序的终止条件应该是总人数减1,所以应填:

n-1。

第三处:对姓名进行比较大小,所以应填:a[i].name,a[j].name。

***************************************************

给定程序MODI1.C中函数fun的功能是:在p所指字符串中找出ASCII码值最大

的字符,将其放在第一个位置上;并将该字符前的原字符向后顺序移动。

例如,调用fun函数之前给字符串输入:ABCDeFGH,

调用后字符串中的内容为:eABCDFGH。

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

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

给定源程序:

#include

fun(char*p)

{charmax,*q;inti=0;

max=p[i];

while(p[i]!=0)

{if(max

TAB{max=p[i];

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

TABq=p+i

TAB}

i++;

}

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

wihle(q>p)

{*q=*(q-1);

q--;

}

p[0]=max;

}

165

main()

{charstr[80];

printf("Enterastring:");gets(str);

printf("nTheoriginalstring:");puts(str);

fun(str);

printf("nThestringaftermoving:");puts(str);printf("nn");

}

解题思路:

第一处:在语句后缺少分号,所应改为:q=p+i;。

第二处:保留字while写错,所应改为:while(q>p)。

***************************************************

学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组

s中,请编写函数fun,它的功能是:把指定分数范围内的学生数据放在b所指的数

组中,分数范围内的学生人数由函数值返回。

例如,输入的分数是6069,则应当把分数在60到69的学生数据进行输出,

包含60分和69分的学生数据。主函数中将把60放在low中,把69放在heigh中。

注意:部分源程序在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

#defineN16

typedefstruct

{charnum[10];

ints;

}STREC;

intfun(STREC*a,STREC*b,intl,inth)

{

}

main()

{STRECs[N]={{"GA005",85},{"GA003",76},{"GA002",69},{"GA004",85},

{"GA001",96},{"GA007",72},{"GA008",64},{"GA006",87},

{"GA015",85},{"GA013",94},{"GA012",64},{"GA014",91},

{"GA011",90},{"GA017",64},{"GA018",64},{"GA016",72}};

STRECh[N],tt;FILE*out;

inti,j,n,low,heigh,t;

printf("Enter2integernumberlow&heigh:");

166

scanf("%d%d",&low,&heigh);

if(heigh

n=fun(s,h,low,heigh);

printf("Thestudent'sdatabetween%d--%d:n",low,heigh);

for(i=0;i

printf("%s%4dn",h[i].num,h[i].s);

printf("n");

out=fopen("c:","w");

n=fun(s,h,80,98);

fprintf(out,"%dn",n);

for(i=0;i

for(j=i+1;j

if(h[i].s>h[j].s){tt=h[i];h[i]=h[j];h[j]=tt;}

for(i=0;i

fprintf(out,"%4dn",h[i].s);

fprintf(out,"n");

fclose(out);

}

解题思路:

本题是把符合条件的学生记录存入到另一个结构体,最后通过主函数进行输出。

1.符合条件的学生人数存在变量j(初始值为0)中,最后返回其值。

2.利用for循环语句,依次判断是否符合条件,如果符合,则存入另一个记录体中,人数j

加1。

参考答案:

intfun(STREC*a,STREC*b,intl,inth)

{

inti,j=0;

for(i=0;i

if(a[i].s>=l&&a[i].s<=h)b[j++]=a[i];

returnj;

}

第18套:

给定程序中,函数fun的功能是:将形参s所指字符串中的所有字母字符顺序

前移,其他字符顺序后移,处理后新字符串的首地址作为函数值返回。

例如,s所指字符串为:asd123fgh543df,处理后新字符串为:asdfghdf123543。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

167

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#include

char*fun(char*s)

{inti,j,k,n;char*p,*t;

n=strlen(s)+1;

t=(char*)malloc(n*sizeof(char));

p=(char*)malloc(n*sizeof(char));

j=0;k=0;

for(i=0;i

{if(((s[i]>='a')&&(s[i]<='z'))||((s[i]>='A')&&(s[i]<='Z'))){

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

t[j]=__1__;j++;}

else

{p[k]=s[i];k++;}

}

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

for(i=0;i<__2__;i++)t[j+i]=p[i];

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

t[j+k]=__3__;

returnt;

}

main()

{chars[80];

printf("Pleaseinput:");scanf("%s",s);

printf("nTheresultis:%sn",fun(s));

}

解题思路:

第一处:函数中申请了两个内存空间,其p是存放字母字符串,t是存放非字母字符串,根

据条件可知,p依次存放字母字符串,其位置由j来控制,所以应填:s[i]。

第二处:利用for循环再把t中的内容依次追加到p中,其中t的长度为k,所以应填:k。

第三处:字符串处理好后必须添加字符串结束符,所以应填:'0'。

***************************************************

给定程序MODI1.C中函数fun的功能是:将s所指字符串中最后一次出现的与

t1所指字符串相同的子串替换成t2所指字符串,所形成的新串放在w所指的数组中。

168

在此处,要求t1和t2所指字符串的长度相同。

例如,当s所指字符串中的内容为:"abcdabfabc",t1所指子串中的内容为:

"ab",t2所指子串中的内容为:"99"时,结果,在w所指的数组中的内容应为:

"abcdabf99c"。

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

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

给定源程序:

#include

#include

intfun(char*s,char*t1,char*t2,char*w)

{

inti;char*p,*r,*a;

strcpy(w,s);

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

while(w)

{p=w;r=t1;

while(*r)

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

IF(*r==*p)

{r++;p++;}

elsebreak;

if(*r=='0')a=w;

w++;

}

r=t2;

while(*r){*a=*r;a++;r++;}

}

main()

{

chars[100],t1[100],t2[100],w[100];

printf("nPleaseenterstringS:");scanf("%s",s);

printf("nPleaseentersubstringt1:");scanf("%s",t1);

printf("nPleaseentersubstringt2:");scanf("%s",t2);

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

{fun(s,t1,t2,w);

printf("nTheresultis:%sn",w);

}

169

elseprintf("nError:strlen(t1)!=strlen(t2)n");

}

解题思路:

第一处:判断w指针所指的值是否是结束符,应改为:while(*w)。

第二处:if错写成If。

***************************************************

函数fun的功能是:将s所指字符串中ASCII值为奇数的字符删除,串中剩余字

符形成一个新串放在t所指的数组中。

例如,若s所指字符串中的内容为:"ABCDEFG12345",其中字符A的ASCII码值

为奇数、…、字符1的ASCII码值也为奇数、…都应当删除,其它依此类推。最后

t所指的数组中的内容应是:"BDF24"。

注意:部分源程序存在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

#include

voidfun(char*s,chart[])

{

}

main()

{

chars[100],t[100];

printf("nPleaseenterstringS:");scanf("%s",s);

fun(s,t);

printf("nTheresultis:%sn",t);

NONO();

}

解题思路:

本题是从一个字符串按要求生成另一个新的字符串。我们使用for循环语句来解决这个问

题。

参考答案:

voidfun(char*s,chart[])

{

inti,j=0;

for(i=0;i

t[j]=0;

170

}

第19套:

程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。函

数fun的功能是将形参a所指结构体变量s中的数据进行修改,并把a中地址作为函数

值返回主函数,在主函数中输出修改后的数据。

例如:a所指变量s中的学号、姓名、和三门课的成绩依次是:10001、

"ZhangSan"、95、80、88,修改后输出t中的数据应为:10002、"LiSi"、96、

81、89。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

structstudent{

longsno;

charname[10];

floatscore[3];

};

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

__1__fun(structstudent*a)

{inti;

a->sno=10002;

strcpy(a->name,"LiSi");

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

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

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

return__3__;

}

main()

{structstudents={10001,"ZhangSan",95,80,88},*t;

inti;

printf("nnTheoriginaldata:n");

printf("nNo:%ldName:%snScores:",,);

for(i=0;i<3;i++)printf("%6.2f",[i]);

printf("n");

t=fun(&s);

171

printf("nThedataaftermodified:n");

printf("nNo:%ldName:%snScores:",t->sno,t->name);

for(i=0;i<3;i++)printf("%6.2f",t->score[i]);

printf("n");

}

解题思路:

本题是利用形参对结构体变量中的值进行修改并通过地址把函数值返回。

第一处:必须定义结构指针返回类型,所以应填:structstudent*。

第二处:分别对成绩增加1分,所以应填:a->score[i]。

第三处:返回结构指针a,所以应填:a。

***************************************************

给定程序MODI1.C中函数fun的功能是:从N个字符串中找出最长的那个串,并

将其地址作为函数值返回。各字符串在主函数中输入,并放入一个字符串数组中。

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

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

给定源程序:

#include

#include

#defineN5

#defineM81

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

fun(char(*sq)[M])

{inti;char*sp;

sp=sq[0];

for(i=0;i

if(strlen(sp)

sp=sq[i];

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

returnsq;

}

main()

{charstr[N][M],*longest;inti;

printf("Enter%dlines:n",N);

for(i=0;i

printf("nTheNstring:n",N);

for(i=0;i

longest=fun(str);

172

printf("nThelongeststring:n");puts(longest);

}

解题思路:

第一处:要求返回字符串的首地址,所以应改为:char*fun(char(*sq)[M])。

第二处:返回一个由变量sp控制的字符串指针,所以应改为:returnsp;。

***************************************************

函数fun的功能是:将a、b中的两个两位正整数合并形成一个新的整数放在c

中。合并的方式是:将a中的十位和个位数依次放在变量c的百位和个位上,b中的

十位和个位数依次放在变量c的十位和千位上。

例如,当a=45,b=12。调用该函数后,c=2415。

注意:部分源程序存在文件PROG1.C中。数据文件中的数据不得修改。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

voidfun(inta,intb,long*c)

{

}

main()

{inta,b;longc;

printf("Inputa,b:");

scanf("%d%d",&a,&b);

fun(a,b,&c);

printf("Theresultis:%ldn",c);

NONO();

}

解题思路:

本题是给出两个两位数的正整数分别取出各位上的数字,再按条件组成一个新数。

取a十位数字的方法:a/10

取a个位数字的方法:a%10

参考答案:

voidfun(inta,intb,long*c)

{

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

}

第20套:

给定程序中,函数fun的功能是:计算形参x所指数组中N个数的平均值(规定

173

所有数均为正数),将所指数组中小于平均值的数据移至数组的前部,大于等于平

均值的数据移至x所指数组的后部,平均值作为函数值返回,在主函数中输出平均

值和移动后的数据。

例如,有10个正数:4634826,平均值为:

30.500000

移动后的输出为:3404548

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#defineN10

doublefun(double*x)

{inti,j;doubleav,y[N];

av=0;

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

for(i=0;i

for(i=j=0;i

if(x[i]

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

y[j]=x[i];x[i]=-1;__2__;}

i=0;

while(i

{if(x[i]!=-1)y[j++]=x[i];

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

__3__;

}

for(i=0;i

returnav;

}

main()

{inti;doublex[N];

for(i=0;i

printf("n");

printf("nTheaverageis:%fn",fun(x));

printf("nTheresult:n",fun(x));

174

for(i=0;i

printf("n");

}

解题思路:

第一处:求出N个数的平均值,所以应填:N。

第二处:利用for循环语句,把数组x中小于平均值的数,依次存放到数组y中,其中位置

变量j来控制,所以应填:j++。

第三处:i是while循环体的控制变量,每做一次循环均要加1。

***************************************************

给定程序MODI1.C中函数fun的功能是:统计字符串中各元音字母(即:A、

E、I、O、U)的个数。注意:字母不分大、小写。

例如:若输入:THIsisaboot,则输出应该是:1、0、2、2、0。

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

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

给定源程序:

#include

fun(char*s,intnum[5])

{intk,i=5;

for(k=0;k

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

num[i]=0;

for(;*s;s++)

{i=-1;

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

switch(s)

{case'a':case'A':{i=0;break;}

case'e':case'E':{i=1;break;}

case'i':case'I':{i=2;break;}

case'o':case'O':{i=3;break;}

case'u':case'U':{i=4;break;}

}

if(i>=0)

num[i]++;

}

}

main()

175

{chars1[81];intnum1[5],i;

printf("nPleaseenterastring:");gets(s1);

fun(s1,num1);

for(i=0;i<5;i++)printf("%d",num1[i]);printf("n");

}

解题思路:

第一处:num初始化错误,应为:num[k]=0;。

第二处:由于s是指针型变量,所以应改为:switch(*s)。

***************************************************

请编写函数fun,函数的功能是求出二维数组周边元素之和,作为函数值返

回。二维数组中的值在主函数中赋予。

例如:二维数组中的值为

13579

29994

69998

13570

则函数值为61。

注意:部分源程序存在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

#defineM4

#defineN5

intfun(inta[M][N])

{

}

main()

{intaa[M][N]={{1,3,5,7,9},

{2,9,9,9,4},

{6,9,9,9,8},

{1,3,5,7,0}};

inti,j,y;

clrscr();

printf("Theoriginaldatais:n");

for(i=0;i

{for(j=0;j

176

printf("n");

}

y=fun(aa);

printf("nThesum:%dn",y);

printf("n");

NONO();

}

解题思路:

本题是统计二维数组周边元素值之和,但要注意的是不要重复计算四个角上的元素值,结

果作为函数值返回。

参考答案:

intfun(inta[M][N])

{

inttot=0,i,j;

for(i=0;i

tot+=a[0][i];

tot+=a[M-1][i];

}

for(i=1;i

tot+=a[i][0];

tot+=a[i][N-1];

}

returntot;

}

第21套:

给定程序中,函数fun的功能是:计算形参x所指数组中N个数的平均值(规定

所有数均为正数),将所指数组中大于平均值的数据移至数组的前部,小于等于平

均值的数据移至x所指数组的后部,平均值作为函数值返回,在主函数中输出平均

值和移动后的数据。

例如,有10个正数:4634826,平均值为:

30.500000

移动后的输出为:4632426

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

177

#include

#defineN10

doublefun(double*x)

{inti,j;doubles,av,y[N];

s=0;

for(i=0;i

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

av=__1__;

for(i=j=0;i

if(x[i]>av){

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

y[__2__]=x[i];x[i]=-1;}

for(i=0;i

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

if(x[i]!=__3__)y[j++]=x[i];

for(i=0;i

returnav;

}

main()

{inti;doublex[N];

for(i=0;i

printf("n");

printf("nTheaverageis:%fn",fun(x));

printf("nTheresult:n",fun(x));

for(i=0;i

printf("n");

}

解题思路:

第一处:计算N个数的平均值,所以应填:s/N。

第二处:利用for循环语句,把数组x中大于平均值的数,依次存放到数组y中,同时把数

x上的该数置为-1,其中位置由变量j来控制,所以应填:j++。

第三处:再利用循环把不是-1的数,依次仍存放到数组y中,所以应填:-1。

***************************************************

给定程序MODI1.C的功能是:读入一个英文文本行,将其中每个单词的第一个

字母改成大写,然后输出此文本行(这里的“单词”是指由空格隔开的字符串)。

例如,若输入:Iamastudenttotaketheexamination.,

178

则应输出:IAmAStudentToTakeTheExamination.。

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

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

给定源程序:

#include

#include

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

include

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

upfst(charp)

{intk=0;

for(;*p;p++)

if(k)

{if(*p=='')k=0;}

elseif(*p!='')

{k=1;*p=toupper(*p);}

}

main()

{charchrstr[81];

printf("nPleaseenteranEnglishtextline:");gets(chrstr);

printf("nnBeforechanging:n%s",chrstr);

upfst(chrstr);

printf("nAfterchanging:n%sn",chrstr);

}

解题思路:

第一处:包含头文件的标识错误,在include前漏写了#。

第二处:由于传入的参数是字符串,所以应为upfst(char*p)。

***************************************************

程序定义了N×N的二维数组,并在主函数中赋值。请编写函数fun,函数的功

能是:求出数组周边元素的平均值并作为函数值返给主函数中的s。

例如:a数组中的值为

|01279|

|19745|

a=|23831|

|45682|

|59141|

则返回主程序后s的值应为:3.375。

179

注意:部分源程序存在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

#include

#defineN5

doublefun(intw[][N])

{

}

main()

{inta[N][N]={0,1,2,7,9,1,9,7,4,5,2,3,8,3,1,4,5,6,8,2,5,9,1,4,1};

inti,j;

doubles;

printf("*****Thearray*****n");

for(i=0;i

{for(j=0;j

{printf("%4d",a[i][j]);}

printf("n");

}

s=fun(a);

printf("*****THERESULT*****n");

printf("Thesumis:%lfn",s);

NONO();

}

解题思路:

本题是统计二维数组周边元素值的平均值,但要注意的是不要重复计算四个角上的元素值。

参考答案:

doublefun(intw[][N])

{

inti,j,n=0;

doublesum=0;

for(i=0;i

sum+=w[0][i]+w[N-1][i];n+=2;

}

for(i=1;i

sum+=w[i][0]+w[i][N-1];

180

n+=2;

}

returnsum/n;

}

第22套:

给定程序中,函数fun的功能是:将自然数1~10以及它们的平方根写到名为

的文本文件中,然后再顺序读出显示在屏幕上。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

intfun(char*fname)

{FILE*fp;inti,n;floatx;

if((fp=fopen(fname,"w"))==NULL)return0;

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

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

fprintf(___1___,"%d%fn",i,sqrt((double)i));

printf("nSucceed!!n");

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

___2___;

printf("nThedatainfile:n");

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

if((fp=fopen(___3___,"r"))==NULL)

return0;

fscanf(fp,"%d%f",&n,&x);

while(!feof(fp))

{printf("%d%fn",n,x);fscanf(fp,"%d%f",&n,&x);}

fclose(fp);

return1;

}

main()

{charfname[]="";

fun(fname);

}

解题思路:

181

本题要求所求出的数写入到指定的文件中保存。程序中共有三处要填上适当的内容,使程

序能运行出正确的结果。

第一处:intfprintf(FILE*stream,constchar*format[,argument,…]);因此本处

只能填写文件流的变量fp。

第二处:由于文件打开写操作,所以必须要关闭,因此,只能填写关闭文件的函数

fclose(fp)。

第三处:由于本题要把刚写入文件中的数据重新显示出来,读方式已经给出,但没有给出

文件名,所以本处只能写文件名变量fname或者直接给出文件名""。

***************************************************

给定程序MODI1.C中fun函数的功能是:将n个无序整数从小到大排序。

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

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

给定源程序:

#include

#include

fun(intn,int*a)

{inti,j,p,t;

for(j=0;j

{p=j;

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

for(i=j+1;i

if(a[p]>a[i])

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

t=i;

if(p!=j)

{t=a[j];a[j]=a[p];a[p]=t;}

}

}

putarr(intn,int*z)

{inti;

for(i=1;i<=n;i++,z++)

{printf("%4d",*z);

if(!(i%10))printf("n");

}printf("n");

}

main()

{intaa[20]={9,3,0,4,1,2,5,6,8,10,7},n=11;

182

printf("nnBeforesorting%dnumbers:n",n);putarr(n,aa);

fun(n,aa);

printf("nAftersorting%dnumbers:n",n);putarr(n,aa);

}

解题思路:

第一处:for循环的终止值应该

第二处:使用临时变量p来保存最小值位置i,所以应改为:p=i;。

***************************************************

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

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

和个位数依次放在c数的十位和千位上。

例如,当a=45,b=12时,调用该函数后,c=2514。

注意:部分源程序存在文件PROG1.C中。数据文件中的数据不得修改。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

voidfun(inta,intb,long*c)

{

}

main()

{inta,b;longc;

printf("Inputa,b:");

scanf("%d,%d",&a,&b);

fun(a,b,&c);

printf("Theresultis:%ldn",c);

NONO();

}

解题思路:

本题是给出两个两位数的正整数分别取出各位上的数字,再按条件组成一个新数。

取a十位数字的方法:a/10

取a个位数字的方法:a%10

参考答案:

voidfun(inta,intb,long*c)

{

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

}

183

第23套:

给定程序中,函数fun的功能是:找出N×N矩阵中每列元素中的最大值,并按

顺序依次存放于形参b所指的一维数组中。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#defineN4

voidfun(int(*a)[N],int*b)

{inti,j;

for(i=0;i

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

b[i]=__1__;

for(j=1;j

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

if(b[i]__2__a[j][i])b[i]=a[j][i];

}

}

main()

{intx[N][N]={{12,5,8,7},{6,1,9,3},{1,2,3,4},{2,8,4,3}},y[N],i,j;

printf("nThematrix:n");

for(i=0;i

{for(j=0;j

printf("n");

}

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

fun(__3__);

printf("nTheresultis:");

for(i=0;i

printf("n");

}

解题思路:

第一处:把每列的第1值赋值给b[i],所以应填:a[0][i]。

第二处:如果b[i]值小于a[j][i]的值,则把a[j][i]重新赋值给b[i]中,保存最大的值,

所以应填:<。

第三处:在主函数中,x是存放矩阵数据,y是存放每列的最大值,所以应填:x,y。

184

***************************************************

给定程序MODI1.C中函数fun的功能是:交换主函数中两个变量的值。例如:

若变量a中的值原为8,b中的值为3。程序运行后a中的值为3,b中的值为8。

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

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

给定源程序:

#include

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

intfun(intx,inty)

{

intt;

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

t=x;x=y;y=t;

}

main()

{

inta,b;

a=8;b=3;

fun(&a,&b);

printf("%d,%dn",a,b);

}

解题思路:

第一处:函数形参定义不正确,在定义第2个形参时,也应加上int。由于通过该函数实现

两数交换,在C语言中,必须交换地址中的值,所以应定义为int*x,int*y。

第二处:要交换地址中的值,不能交换地址,必须指定地址中的值,因此应改为

t=*x;*x=*y;*y=t;。

***************************************************

编写函数fun,函数的功能是求出小于或等于lim的所有素数并放在aa数组中,

函数返回所求出的素数的个数。函数fun中给出的语句仅供参考。

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

#defineMAX100

intfun(intlim,intaa[MAX])

{

185

/*以下代码仅供参考*/

inti,j,k=0;

/*其中变量k用于统计素数个数*/

for(i=2;i<=lim;i++)

{

/*以下完成判断aa数组中小于或等于lim的素数并统计个数*/

}

returnk;

}

main()

{

intlimit,i,sum;

intaa[MAX];

printf("输入一个整数");

scanf("%d",&limit);

sum=fun(limit,aa);

for(i=0;i

if(i%10==0&&i!=0)printf("n");

printf("%5d",aa[i]);

}

NONO();

}

解题思路:

本题是考察考生如何判断一个数是素数,再求出所有小于lim数的素数并存入数组aa中保

存,最后由形参aa返回,素数的个数由函数值返回。

参考答案:

intfun(intlim,intaa[MAX])

{

/*以下代码仅供参考*/

inti,j,k=0;

/*其中变量k用于统计素数个数*/

for(i=2;i<=lim;i++)

{

/*以下完成判断aa数组中小于或等于lim的素数并统计个数*/

for(j=2;j<=(i/2);j++)

if(i%j==0)break;

if(j>(i/2))aa[k++]=i;

186

}

returnk;

}

第24套:

程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。函

数fun的功能是将形参a中的数据进行修改,把修改后的数据作为函数值返回主函数

进行输出。

例如:传给形参a的数据中,学号、姓名、和三门课的成绩依次是:10001、

"ZhangSan"、95、80、88,修改后的数据应为:10002、"LiSi"、96、81、89。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

structstudent{

longsno;

charname[10];

floatscore[3];

};

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

__1__fun(structstudenta)

{inti;

=10002;

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

strcpy(__2__,"LiSi");

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

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

returna;

}

main()

{structstudents={10001,"ZhangSan",95,80,88},t;

inti;

printf("nnTheoriginaldata:n");

printf("nNo:%ldName:%snScores:",,);

for(i=0;i<3;i++)printf("%6.2f",[i]);

printf("n");

187

t=fun(s);

printf("nThedataaftermodified:n");

printf("nNo:%ldName:%snScores:",,);

for(i=0;i<3;i++)printf("%6.2f",[i]);

printf("n");

}

解题思路:

本题是对结构体变量中的值进行修改并通过函数值返回。

第一处:必须定义结构返回类型,所以应填:structstudent。

第二处:对姓名进行修改,所以应填:。

第三处:分别对成绩增加1分,所以应填:[i]。

***************************************************

假定整数数列中的数不重复,并存放在数组中。给定程序MODI1.C中函数fun

的功能是:删除数列中值为x的元素。n中存放的是数列中元素的个数。

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

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

给定源程序:

#include

#defineN20

fun(int*a,intn,intx)

{intp=0,i;

a[n]=x;

while(x!=a[p])

TABp=p+1;

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

if(P==n)return-1;

else

{for(i=p;i

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

TABa[i+1]=a[i];

returnn-1;

}

}

main()

{intw[N]={-3,0,1,5,7,99,10,15,30,90},x,n,i;

n=10;

printf("Theoriginaldata:n");

188

for(i=0;i

printf("nInputx(todelete):");scanf("%d",&x);

printf("Delete:%dn",x);

n=fun(w,n,x);

if(n==-1)printf("***Notbefound!***nn");

else

{printf("Thedataafterdeleted:n");

for(i=0;i

}

}

解题思路:

第一处:条件语句中的小写p错写成大写P了。

第二处:删除元素,应该是后面位置的元素值赋值给前面的位置上,所以应改为:

a[i]=a[i+1];。

***************************************************

学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组

s中,请编写函数fun,它的功能是:把分数最低的学生数据放在b所指的数组中,

注意:分数最低的学生可能不止一个,函数返回分数最低的学生的人数。

注意:部分源程序在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

#defineN16

typedefstruct

{charnum[10];

ints;

}STREC;

intfun(STREC*a,STREC*b)

{

}

main()

{STRECs[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},

TABTAB{"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87},

TABTAB{"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},

TABTAB{"GA011",91},{"GA017",64},{"GA018",64},{"GA016",72}};

STRECh[N];

189

inti,n;FILE*out;

n=fun(s,h);

printf("The%dlowestscore:n",n);

for(i=0;i

printf("%s%4dn",h[i].num,h[i].s);

printf("n");

out=fopen("c:","w");

fprintf(out,"%dn",n);

for(i=0;i

fprintf(out,"%4dn",h[i].s);

fclose(out);

}

解题思路:

本题是把符合条件的学生记录存入到另一个结构体,人数通过函数返回,记录由实参b返回。

1.符合条件的学生人数存在变量j(初始值为0)中,最后返回其值。

2.利用for循环语句,依次判断是否符合条件,如果成绩相等,则把记录存入b中,人数j

加1;如果当前成绩a[i].s小于最低成绩min,那么人数重新初始化为0,把当前成绩存入最

低成

绩中,人数j加1。

3.直至循环结束为止。

参考答案:

intfun(STREC*a,STREC*b)

{

inti,j=0,min=a[0].s;

for(i=0;i

if(min>a[i].s){

j=0;b[j++]=a[i];min=a[i].s;

}

elseif(min==a[i].s)

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

}

returnj;

}

第25套:

人员的记录由编号和出生年、月、日组成,N名人员的数据已在主函数中存入

结构体数组std中,且编号唯一。函数fun的功能是:找出指定编号人员的数据,

作为函数值返回,由主函数输出,若指定编号不存在,返回数据中的编号为空串。

190

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#defineN8

typedefstruct

{charnum[10];

intyear,month,day;

}STU;

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

___1___fun(STU*std,char*num)

{inti;STUa={"",9999,99,99};

for(i=0;i

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

if(strcmp(___2___,num)==0)

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

return(___3___);

returna;

}

main()

{STUstd[N]={{"111111",1984,2,15},{"222222",1983,9,21},{"333333",1984,9,1},

{"444444",1983,7,15},{"555555",1984,9,28},{"666666",1983,11,15},

{"777777",1983,6,22},{"888888",1984,8,19}};

STUp;charn[10]="666666";

p=fun(std,n);

if([0]==0)

printf("nNotfound!n");

else

{printf("nSucceed!n");

printf("%s%d-%d-%dn",,,,);

}

}

解题思路:

本题是要求从给定的人员数据中找出编号相同的记录数据。

第一处:从返回值来看,是返回一个结构型的值,所以应填:STU。

191

第二处:判断结构变量中的编号num是否相等,所以应填:stu[i].num。

第三处:返回编号相等的记录值,所以应填:std[i]。

***************************************************

给定程序MODI1.C中函数fun的功能是:从s所指字符串中,找出与t所指字符

串相同的子串的个数作为函数值返回。

例如,当s所指字符串中的内容为:"abcdabfab",t所指字符串的内容为:

"ab",则函数返回整数3。

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

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

给定源程序:

#include

#include

intfun(char*s,char*t)

{

intn;char*p,*r;

n=0;

while(*s)

{p=s;r=t;

while(*r)

if(*r==*p){

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

r++;p++

}

elsebreak;

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

if(r=='0')

n++;

s++;

}

returnn;

}

main()

{

chars[100],t[100];intm;

printf("nPleaseenterstringS:");scanf("%s",s);

printf("nPleaseentersubstringt:");scanf("%s",t);

m=fun(s,t);

192

printf("nTheresultis:m=%dn",m);

}

解题思路:

第一处:语句后缺少分号。

第二处:判断r的当前字符是否是字符串结束符,所以应改为:if(*r==0)。

***************************************************

函数fun的功能是:将s所指字符串中ASCII值为偶数的字符删除,串中剩余字

符形成一个新串放在t所指的数组中。

例如,若s所指字符串中的内容为:"ABCDEFG12345",其中字符B的ASCII码值

为偶数、…、字符2的ASCII码值为偶数、…都应当删除,其它依此类推。最后t所

指的数组中的内容应是:"ACEG135"。

注意:部分源程序存在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

#include

voidfun(char*s,chart[])

{

}

main()

{

chars[100],t[100];

printf("nPleaseenterstringS:");scanf("%s",s);

fun(s,t);

printf("nTheresultis:%sn",t);

NONO();

}

解题思路:

本题是从一个字符串按要求生成另一个新的字符串。我们使用for循环语句来解决这个问

题。

参考答案:

voidfun(char*s,chart[])

{

inti,j=0;

for(i=0;i

t[j]=0;

193

}

第26套:

给定程序中已建立一个带有头结点的单向链表,链表中的各结点按数据域递

增有序链接。函数fun的功能是:删除链表中数据域值相同的结点,使之只保留一

个。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#defineN8

typedefstructlist

{intdata;

structlist*next;

}SLIST;

voidfun(SLIST*h)

{SLIST*p,*q;

p=h->next;

if(p!=NULL)

{q=p->next;

while(q!=NULL)

{if(p->data==q->data)

{p->next=q->next;

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

free(___1___);

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

q=p->___2___;

}

else

{p=q;

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

q=q->___3___;

}

}

}

}

194

SLIST*creatlist(int*a)

{SLIST*h,*p,*q;inti;

h=p=(SLIST*)malloc(sizeof(SLIST));

for(i=0;i

{q=(SLIST*)malloc(sizeof(SLIST));

q->data=a[i];p->next=q;p=q;

}

p->next=0;

returnh;

}

voidoutlist(SLIST*h)

{SLIST*p;

p=h->next;

if(p==NULL)printf("nThelistisNULL!n");

else

{printf("nHead");

do{printf("->%d",p->data);p=p->next;}while(p!=NULL);

printf("->Endn");

}

}

main()

{SLIST*head;inta[N]={1,2,2,3,4,4,4,5};

head=creatlist(a);

printf("nThelistbeforedeleting:n");outlist(head);

fun(head);

printf("nThelistafterdeleting:n");outlist(head);

}

解题思路:

本题是考察考生对链表的操作,主要是解决删除链表中数据域值相同的结点。程序中共有

三处要填上适当的内容,使程序能运行出正确的结果。

函数fun中使用两个临时结构指针变量p和q对链表进行操作。首先p指向链表开始的next

针,q指向p的next指针,再利用while循环语句来判断指针q是否NULL,如果q指针是

指向NULL,

那么函数结束返回。如果不是NULL,那么就要判断p和q中data值是否相同,如果值相同,

则要

删除该结点,然后继续判断下一结点值是相同,如果还相同,那么继续删除结点,直至不相

195

为止。如果两个结点的值不相同,那么p就指向q,q指向q的next指针再继续操作上述过

程。

删除结点的方法是:先将p的next指针指向q的next指针,再释放q指针指向的内存,最

后把

q指针再指向p的next指针就可以删除一个链表中的结点了。

第一处:释放q指针所指的内存空间,应填q。

第二处:q指针指向p的next指针,重新完成链接,应填next。

第三处:两个结点的值不相同,那么q就指向q的next指针,应填next。

***************************************************

给定程序MODI1.C中函数fun的功能是:用选择法对数组中的n个元素按从小到

大的顺序进行排序。

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

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

给定源程序:

#include

#defineN20

voidfun(inta[],intn)

{inti,j,t,p;

for(j=0;j

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

p=j

for(i=j;i

if(a[i]

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

p=j;

t=a[p];a[p]=a[j];a[j]=t;

}

}

main()

{

inta[N]={9,6,8,3,-1},i,m=5;

printf("排序前的数据:");

for(i=0;i

fun(a,m);

printf("排序后的数据:");

for(i=0;i

196

}

解题思路:

第一处:语句后缺少分号。

第二处:保存最小值的位置,所以应改为:p=i;。

***************************************************

请编写一个函数fun,它的功能是:求出1到m之间(含m)能被7或11整除的所有

整数放在数组a中,通过n返回这些数的个数。例如,若传送给m的值为50,则程序

输出:

7335424449

注意:部分源程序存在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

#defineM100

voidfun(intm,int*a,int*n)

{

}

main()

{intaa[M],n,k;

fun(50,aa,&n);

for(k=0;k

if((k+1)%20==0)printf("n");

elseprintf("%4d",aa[k]);

printf("n");

NONO();

}

解题思路:

本题是考察考生对某个数能被其他的数整除方式,并把符合条件的数存放在数组a中。

我们给出的程序是使用for循环语句以及取模的方式来解决这个问题的。

参考答案:

#include

#defineM100

voidfun(intm,int*a,int*n)

{

inti;

*n=0;

197

for(i=7;i<=m;i++)

if((i%7==0)||(i%11==0))a[(*n)++]=i;

}

第27套:

给定程序中,函数fun的功能是:计算下式前n项的和作为函数值返回。

例如,当形参n的值为10时,函数返回:9.612558。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

doublefun(intn)

{inti;doubles,t;

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

s=__1__;

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

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

{t=2.0*i;

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

s=s+(2.0*i-1)*(2.0*i+1)/__3__;

}

returns;

}

main()

{intn=-1;

while(n<0)

{printf("Pleaseinput(n>0):");scanf("%d",&n);}

printf("nTheresultis:%fn",fun(n));

}

解题思路:

第一处:根据公式可知,累加和变量s,应置0。

第二处:for循环的终止值应为形参n。

第三处:根据公式以及函数体中t变量内容,所以应填:t*t。

***************************************************

给定程序MODI1.C中函数fun的功能是:统计substr所指子字符串在str所指

字符串中出现的次数。

例如,若字符串为aaaslkaaas,子字符串为as,则应输出2。

198

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

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

给定源程序:

#include

fun(char*str,char*substr)

{inti,j,k,num=0;

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

for(i=0,str[i],i++)

for(j=i,k=0;substr[k]==str[j];k++,j++)

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

If(substr[k+1]=='0')

{num++;

break;

}

returnnum;

}

main()

{

charstr[80],substr[80];

printf("Inputastring:");

gets(str);

printf("Inputasubstring:");

gets(substr);

printf("%dn",fun(str,substr));

}

解题思路:

第一处:循环for语句中应有分号。

第二处:if错写成If。

***************************************************

请编写一个函数fun,它的功能是:根据以下公式求π的值(要求满足精度

0.0005,即某项小于0.0005时停止迭代):

π11×21×2×31×2×3×41×2×…×n

─=1+─+─—+────+──────+……+────────

233×53×5×73×5×7×93×5×…×(2n+1)

程序运行后,如果输入精度0.0005,则程序输出为3.14…。

注意:部分源程序存在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填

199


本文标签: 函数 字符串 数据 数组 程序