计算机二级C语言上机题库(六)
187、在形参ss所指字符串数组中查找与形参t所指字符串相同的串,找到后返回该串在字符串数组中的位置(下标值),未找到则返回-1。 ss所指字符串数组中共有N个内容不同的字符串,且串长小于M。
Int fun(char (*ss)[M],char *t)
{int i;for(i=0;i<N;i++)if(strcmp(ss[i],t) = =0)return i;return -1;}
main()
{char ch[N][M]={---};t[M];int n,i;printf(--);for(i=0;i<N;i++)puts(ch[i]); printf(--);printf(--);gets(t);n=fun(ch,t);if(n= =-1) printf(--);
else printf(--);}
188、在形参ss所指字符串数组中查找含有形参substr所指字符串并输出,若没找到则输出相应信息,ss所指字符串数组中共有N个字符串,且串长小于M。程序中库函数strstr(s1,s2)的功能是在s1串中查找s2子串,若没有,函数值为0,若有为非0.
Void fun(char (*ss)[M],char *substr)
{int i,find=0;for(i=0;i<N;i++)if(strsrr(ss[i],substr)l=NULL){ find=1; puts(ss[i]); printf(--);if(find= =0) printf(--);}}
189、求ss所指字符串数组中长度最长的字符串所在的行小标,作为函数值返回,并把其串长放在形参n所指变量中。ss所指字符串数组中共有M个字符串,且串长小于N。
int fun(char (*ss)[N],int *n)
{int i,k=0,len=0; for(i=0;i<M;i++){len=strlen(ss[i]);if(i= =0)*n=len;if(len >*n){ *n=len ;k=i;}}return (k);}
190、求ss所指字符串数组中长度最短的字符串所在的行小标,作为函数值返回,并把其串长放在形参n所指变量中。ss所指字符串数组中共有M个字符串,且串长小于N。
int fun(char (*ss)[N],int *n)
{int i,k=0,len=N; for(i=0;i<M;i++){len=strlen(ss[i]);if(i= =0)*n=len;if(len <*n){ *n=len ;k=i;}}return (k);}
191、在形参ss所指字符串数组中,删除所有串长超过K的字符串,函数返回所剩字符串的个数,ss所指字符串数组中共有N个字符串,且串长小于M。
int fun(char (*ss)[M],int k)
{int i,j=0,len; for(i=0;i<N;i++){len=strlen(ss[i]);if(len<=k)strcpy(ss[j++],ss[i]);}return j;}
192、在形参ss所指字符串数组中,将所有串长超过K的字符串右边的字符删除,只保留左边的K个字符串,数组中共有N个字符串,且串长小于M。
int fun(char (*ss)[M],int k)
{int i;while(i<N){ss[i][k]
}=0;i++;}}
193、计算出形参s所指字符串中包含的单词个数作为函数值返回。为便于统计,规定各单词之间用空格隔开。例如:形参s所指字符串为:This is a C language program,函数的返回值为6。
int fun(char *s)
{int n=0,flag=0;while(*s!=’\0’){if(*s!=’ ’&&flag= =0){n++;flag=1;} if(*s!=’ ’) flag=0;s++;}return n;}
四、结构体
194、将形参s所指字符串所有ASCII码值小于97的字符存入形参t所指字符数组中,形成新串,并统计出符合条件的字符个数作为函数值返回,例如,形参s所指字符串为:Abc@1X56*,程序执行后t所指字符数组中的字符串应为:A@156*。
int fun(char *s, char *t)
{ int n=0; while(*s){*(t+n)=*s;n++;}s++;}*(t+n)=0; return n;}
四、结构体
195、建立一个带头结点的单向链表并输出到文件“out98.dat”和屏幕上,各结点的值为对应下标,链表的结点数及输出的文件名作为参数传入。
Void fun(int n,char *filename)
{NODE *h,*p,*s;FILE *pf;int i;h=p=(NODE *)malloc(sizeof(NODE));h->data=0;for(i=1;i<n;i++){ s=(NODE *)malloc
sizeof(NODE)); s->data=i; p->next=s; p=p->next; p->next=NULL;if((pf=fopen(filename,”w”))= =NULL)printf(---);exit(0);}
fprintf(pf,”--”); printf(---);while(p)(fprintf(pf,”%3d”,p->data);if(p->next!=NULL){fprintf(pf,”>”);printf(“->”);}p=p->next);}
fprintf(pf,”\n”);printf(“\n”);fclose(pf);p=h;while(p){s=p;p=p->next;free(s);}
196、给定程序中已建立一个带有头结点的单向链表,链表中的各结点按结点数据域中的数据从小到大顺序链接。函数的功能是:把形参x的值放入一个新结点并插入到链表中,插入后各结点仍保持从小到大顺序排列。
Void fun(SLIST *h,int x)
{ SLIST *p,*q,*s;s=( SLIST *)malloc(sizeof(SLIST ));s->data=x;q=h;p=h->next;while(p!=NULL&&x>p->data){q=p;p=p->next;}
s->next=p;q->next=s;}}
197、对N名学生的学习成绩,按从高到底的顺序找出前m(m≤10)名学生来,并将这些学生数据存放在一个动态分配的连续存储区中,此存储区的首地址作为函数值返回。
STU *fun(STU a[],int m)
{ STU b[N],*tt;int I,j,k;tt=( STU *)malloc(sizeof(STU)*m);for(i=0;i<N;i++)b[i]=a[i];for(k=0;k<m;k++)
{for(i=j=0;i<N;i++)if(b[i].order> b[j].order)j=i;tt[k]=b[j]; b[j].order =0;}return tt;}
198、函数的功能是将存学生数据的结构体数组,按照姓名的字典序(从小到大排序)。
Void fun(struct student a[],int n)
{ struct student t;int i,j;for(i=0; i<n-1;i++) for(j=i+1; j<n;j++)if(strcmp(a[i].name, a[j].name))>0
t= a[i]; a[i]= a[j]; a[j]=t;}
199、给定程序中已建立一个带有头结点的单向链表,在main函数中将多次调用,每调用一次fun函数,输出链表尾部结点中的数据,并释放该结点,使链表缩短。
Void fun(SLIST *p)
{ SLIST *t, *s; t=p->next;s=p;while(t->next!=NULL){s=t;t=t->next;}printf(“%d”, t->data); t->next =NULL;free(t);}
200、已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体中,给定程序的功能是找出成绩最低的学生记录,并通过形参返回主函数。
fun(STU a[],STU s)
{ STU h;int I;h=a[0];for(i=1;i<N;i++)if(a[i].s<h.s)h=a[i];*s=h;}
201、给定程序中已建立一个带有头结点的单向链表,链表中的各结点按数据域递增有序链接。删除链表中的数据域相同的结点,使之只保留一个。
Void fun(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; free(q); q=p->next;}
Else{p=q; q=q->next;}}}
202、建立一个带有头结点的单向链表,并用随机函数为各结点赋值。函数fun的功能是将单向链表结点(不包括头结点)数据域为偶数的值累加起来,并且作为函数值返回。
Int fun(NODE *h)
{int sum=0; NODE *p;p=h->next;while(p){if(p->data%2= =0)sum+=p->data ;p= p->next ;}return sum; }
203、在带有头结点的单向链表中,查找数据域值为ch的结点。找到后通过函数值返回该结点在链表中所处的顺序号;若不存在值为ch的结点,函数返回0值。
Void outlist(SLIST *)
Int fun(SLIST *h,char ch )
{ SLIST *p;int n=0;p=h->next;while(p!=0){n++;if(p->data= =ch)return n;else p= p->next ;}return 0;}
main()
{ SLIST *head;int k;char ch;char a[N]={---};head=creatlist(a);outlist(head);printf(---);scanf(“%c”,&ch);k=fun(head,ch);if(k= =0)
printf(---);else printf(---);}
204、统计出带有头结点的单向链表中的结点个数,存放在形参n所指的存储单元中。
void fun(SLIST *h,int *n )
{ SLIST *p;(*n)=0; p=h->next; while(p){ (*n)++; p=p->next;}}
main()
{ SLIST *head;int a[N]={---},num;head= creatlist(a); outlist(head); fun(head,&num); printf(---);}
205、计算出带有头结点的单向链表中各结点数据域之和作为函数值返回。
int fun(SLIST *h)
{ SLIST *p;int s=0; p=h->next; while(p){ s+=p->data; p=p->next;}return s;}
main()
{ SLIST *head;int a[N]={---},num;head= creatlist(a); outlist(head); printf“\nsum=%d\n”, fun(head); }
206、人员的记录由编号和出生年、月、日组成,N名人员的数据已在主函数中存入结构体数组str中,且编号唯一函数fun的功能是;找出指定编号人员的数据,作为函数值返回,由主函数输出,若指定编号不存在,返回数据中的编号为空串。
STU fun(STU *std,char *num)
{int I;STU a={"",9999,99,99};for(i=0;i<N;i++)if(strcmp(std[i].num,num)=0}return (std[i]);return a;}
207、人员的记录由编号和出生年、月、日组成,N名人员的数据已在主函数中存入结构体数组std中。函数fun的功能是:找出指定出生年份的人员,将其数据放在形参k所指的数组中。
int fun(STU*std,STU*k,int year)
{int i,n=0;
for(i=0;j<N;i++)if(std[i].year==year)k[n++]=std[i];return (n);}
208、通过定义并赋初值的方式,利用结构体变量存储了一名学生的学号、姓名和3门课的成绩。函数fun的功能是将该学生的各科成绩都乘以一个系数a。
void modify(STU*ss,float a)
{int i;for(i=0;i<3;i++)
ss->score[i]*=a;}
main()
{STU std={…}float a;printf("…");show(std);printf("\nInput a number:");scanf("%f",&a);modify(&std,a);
printf("\nA result of modifying:\n");show(std);}
209、将形参指针所指结构体数组中的二个元素按num成员进行升序排列。Void fun(PERSON std[3])
void fun(PERSON std[3])
{PERSON temp;if(std[0];num>std[1].num){temp=std[0];std[0]=std[1];std[1]=temp;}if(std[0].num>std[2].num){temp=std[0];std[0]=std[2];
std[2]=temp;}if(std[1].num>std[2].num){temp=std[1];std[1]=std[2];std[2]=temp;}}
main()
{PERSON std[]={…};int i;fun(std);printf("\nThe result is :\n");for(i=0;i<3;i++)printf("%d,%s\n",std[i].num,std[i].name);}
210、将形参std所指结构体数组中年龄最大者的数据作为函数值返回。
STD fun(STD std[],int n){STD max;int i;max= *std;for(i=1;i<n;i++)if(max.age<std[i].age)max=std[i];return max;}
main()
{STD std[5]={…};STD max;max=fun(std,5);printf("\nThe result :\n");printf("…",max.name,max.age);}
211、程序通过定义学生结构体变量,存储了学生的学员、姓名和3门课的成绩。函数fun的功能是将形参a所指结构体变量中的数据赋给函数中的结构体变量中的数据赋给函数中的结构体变量b,并修改b中的学号和姓名,最后输出修改后的数据。例如:a所指变量中的学号、姓名、和三门课的成绩依次是:10002、”LiSi”、95、80、88。
void fun(struct student a)
{struct student b;int i;b=a;b.sno=10002;strcpy(b.name,"Lisi");printf(…);printf(…);for (i=0;i<3;i++)
printf("%6.0f",b.score[i]);}
212、程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。函数fun的功能是将形参a所指结构体变量S中的数据进行修改,并把a中地址和为函数值返回主函数,在主函中输出修改后的数据。例如:a所指变量S的学号、姓名和三门课的成绩依次是:10001、“ZhangSan”、95、80、88,修改后输出t中的数据应为:10002、“LiSi”、96、81、89。
struct student *fun(struct student*a)
{int i;a->sno=10002;
strcpy(a->name,"LiSi");for(i=0;i<3;i++)a->score[i]+=1;return a;}
213、程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。函数fun的功能是将形参b所指结构体变量中的数据进行修改,最后在主函数中输出修改后的数据。例如:b所指变量t的学号、姓名和三门课的成绩依次是:10002、“ZhangQi”、95、85、87,修改后输出t中的数据应为:10004、“Lijie”、93、85、87。
void fun(struct student b)
{b->sno=10004;strcpy(b->name,“Lijie”);}
main()
{struct student t={1002…87};int i;
printf(…);printf(…);for(i=0;i<3;i++)printf(…);fun(&t);……
214、将不带头节点的单向链表结点数据域中的数据从小到大排序,即若原链表结点数据为:10,4,2,8,6,排序后链表结点数据域从头数据域从头尾的数值为2,4,6,8,10。
void fun(NODE *h)
{NODE *p,*q;int t;p=h->next;
while(p)
{q=p->next;while(q){if(p->data>=q->data){t=p->data;p->data=q->data;q->data=t;}q=q->next;}p=p->next;}}
215、将不带并没有节点的单向链表结点数据域中的数据从小到大排序,即若朱链表结点数据为:10,4,2,8,6,排序后链表结点数据域从头尾的数值为:2,4,6,8,10。
void fun(NODE *h)
{NODE *p,*q;int t;while(p){q=p->next;while(q){if(p->data>q->data){t=p->data;p->data=q->data;
q->data=t;}q=q->next;}p=p->next;}}
216、将不带头节点的单向链表逆置,即若原链表中从头至尾结点数据域依次为2,4,6,8,10;逆置后,从头至尾结点数据域依次为:10,8,6,4,2。
void fun(NODE *h)
{Node *p,*q,*r;p=h->next;if(p= =0)return 0;q=p->next;p->next=NULL;while(q){r=q->next;q->next=p;p=q;q=r;}h->next=p;})
五、文件题
217、把文本文件B中的内容追加到文本文件A的内容之后。例如,文件B的内容为“I’mten.”,文件A的内容为“I’mastudent!”,追加之后文件A的内容为“I’mastudent!”,追加之后文件A的内容为“I’m a student!I’m ten.”
main()
{FILE *fp,*fp1,*fp2;int i;char c[N],t,ch;if((fp=fopen("A.dat","r"))==NULL){printf("fileA cannot be opened\n");exit(0);}printf("\n A contents are:\n\n");for(i=0;(ch=fgetc(fp))!=EOF;i++){c[i]=ch;putchar(c[i]);}
fclose(fp);if((fp=fopen("B.dat","r"))==NULL){printf("file B cannot be opened\n");
exit(0);}printf("\n\n\nB contents are:\n\n");for(i=0;(ch=fgetc(fp))!=EOF;i++)
{c[i]=ch;putchar(c[i]);}fclose(fp);if((fp=fopen("B.dat","r"))==NULL){printf("file B cannot be opened\n");
exit(0);}printf("\n\n\nB contents are:\n\n");for(i=0;(ch=fgetc(fp))!=EOF;i++)
{c[i]=ch;putchar(c[i];}fclose(fp);if((fp1=fopen("A.dat","a"))&&(fp2=fopen("B.dat","r")))
{while((ch=fgetc(fp2))!=EOF)fputc(ch,fp1);}else
{printf("Can not open A B !\n");}fclose(fp2);fclose(fp1);printf("\n***new A contents***\n\n");
if((fp=fopen("A.dat","r"))==NULL){printf("file A cannot be opened\n");exit(0);}
for(i=0;(ch=fgetc(fp))!=EOF;i++){c[i]=ch;put char(c[i]);}fclose(fp);}
218、先以只写方式打开文件“out99.dat”,再把字符串str中的字符保存到这个磁盘文件中。
main()
{FILE *fp;int i=0;char ch;char str[N]="I'm a student!";
if((fp=fopen("out99.dat","w"))= =NULL){printf(cannot open out99.dat\n");exit(0);}while(str[i]){ch=str[i];
fputc(ch,fp);puthcar(ch);i++;}fclose(fp);}
219、从键盘输入若干行文件(每行不超过80个字符),写到文件myfile4.txt中,用-1作为字符串输入结束的标志。然后将文件的内容读显示在屏幕上。
void WriteText(FILE *fw)
{char str[81];printf("\nEnter string with -1")!=0){fputs(str,fw);fputs("\n",fw);gets(str);}}
void ReadText(FILE *fr){char str[81];printf("\nEnter string with -1 to end :\n");
gets(str);while(strcmp(str,"-1")!=0){fputs(str,fw);fputs("\n",fw);gets(str);}}
void ReadText(FILE *fr)
{char str,81,fr);
while(!feof(fr)){printf("%s",str);
fgets(str,81,fr);}}
220、将自然数1~10以及它们的平方根写到名为myfile3.txt的文本文件中,然后再顺序读出显示在屏幕上。
int fun(char *fname)
{FILE *fp;int i,n;float x;if((fp=fopen(fname,"r"))==NULL)return 0;
for(i=1;i<=10;i++)fprintf(fp,"%d%f\n",i,sqrt((double)i));printf("\nSucceed!\n");fclose(fp);
printf("\nThe data in file:\n");if((fp=fopen(fname,"r"))==NULL)return0;fscanf(fp,"%d%f",&n,&x);
while(!feof(fp)){printf("%d %f\n",n,x);fscanf(fp,"%d%f",&n,&x);}fclose(fp);return 1;}
221、将指定源文件中的内容复制到指定的目标文件中,复制成功时函数返回值是1,失败时返回值为0。在复制的过程中,把复制的内容输出到终端屏幕。主函数中源文件名放在变量sfname中,目标文件名放在变量tfname中。
int fun(char *source,char*target)
{FILE *fs,*ft;char ch;if((fs=fopen(source,"r"))==NULL)return 0;if((fs=fopen(target,"w"))==NULL)
return 0;printf("\nThe data in file:\n");ch=fgetc(fs);while(!feof(fs)){putchar(ch);fputc(ch,ft);ch=fgetc(fs);}
fclose(fs);fclose(ft);printf("\n\n");return 1;}
222、建立班级通讯录、通讯录中记录每位学生的编号、姓名和电话号码。班级的人数和学生的信息从键盘读入,每个人的信息作为一个数据块写到名为myfile5.dat的二进制文件中。
int fun(STYPE *std)
{FILE *fp;int i;if((fp=fopen("myfile5.dat","wb"))==NULL)return(0);printf("\noutput data to file!\n");
for(i=0;i<N;i++)fwrite(&std[i].sizeof(STYPE),1,fp);fclose(fp);return (1);}
223、将形参给定的字符串、整数、浮点数写到文本文件中,再用字符方式从此文本文件中逐个读入并显示在终端屏幕上。
void fun(char *s,int a,double f)
{FILE *fp;char ch;fp=fopen("file1.txt","w");fprintf(fp,"%s %d %f\n",s,a,f);
fclose(fp);fp=fopen("file1.txt","r");printf("\nThe result :\n\n");ch=fgetc(fp);while(!feof(fp))
{putchar(ch);ch=fgetc(fp);}putchar(‘\n’);fclose(fp);}
224、将形参给定的字符串、整数、浮点数写到文本文件中,再用字符串方式从此文本文件中逐个读入,并调用库函数atoi和atof将字符串转换成相应的整数、浮点数,然后将显示在屏幕上。
void fun(char *s,int a,double f)
{FILE *fp;int a1;double f1;charstr[100],str1[100],str2[100];fp=fopen("file1.txt","w");
fprintf(fp,"%s%d%f\n",s,a,f);fclose(fp);fp=fopen("file1.txt","r");fscanf(fp,"%s%s%s",str,str1,str2);
fclose(fp);a1=stoi(str1);f1=atof(str2);printf("%s%d%f",str,a1,f1);}
225、程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。所有学生数据均以二进制方式输出到文件中。函数fun的功能是从形参filename所指的文件中读入学生数据,并按照学号从小到大排序后,再用二进制方式把排序后的学生数据输出到filename所指的文件中读入学生数据,并按照学号从小到大排序后,再用二进制方式把排序后的学生数据输出到filename所指的文件中,覆盖原来的文件内容。
void fun(char *filename)
{FILE *fp;int i,j;STU s[N],t;fp=fopen(filename,"rb");fread(s,sizeof(STU),N,fp);
fclose(fp);for(i=0;i<N-1;i++)for(j=i+1;j<N;j++)if(s[i].sno>s[j]);s[j]=t;}
fp=fopen(filename,"wb");fwrite(s,sizeof(STU),N,fp);fclose(fp);}
226、程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。所有学生数据均以二进制方式输出到student.dat文件中。函数fun的功能是从指定文件中找出指定学号的学生数据,读入此学生数据,对该生的分数进行修改,使每门课的分数加3分,修改后重写文件中该学生的数据,即用该学生的新数据覆盖原数据,其它学生数据不变,若找不到,则什么都做。
Void fun(char *filename,long sno)
{FILE *fp;STU n;int i;fp=fopen(filename,"rb+");while(!feof(fp)}{fread(&n,sizeof(STU),1,fp);if(n.sno= =sno)break;}
if(!fcof(fp)){for(i=0;i<3;i++)n.score[i]+=3;fseek(fp,-(long)sizeof(STU),SEEK CUR);fwrite(&n,sizeof(STU),1,fp);}fclose(fp);数字题