秋季学期期末考试.docx

上传人:b****9 文档编号:25195800 上传时间:2023-06-06 格式:DOCX 页数:29 大小:105.12KB
下载 相关 举报
秋季学期期末考试.docx_第1页
第1页 / 共29页
秋季学期期末考试.docx_第2页
第2页 / 共29页
秋季学期期末考试.docx_第3页
第3页 / 共29页
秋季学期期末考试.docx_第4页
第4页 / 共29页
秋季学期期末考试.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

秋季学期期末考试.docx

《秋季学期期末考试.docx》由会员分享,可在线阅读,更多相关《秋季学期期末考试.docx(29页珍藏版)》请在冰豆网上搜索。

秋季学期期末考试.docx

秋季学期期末考试

清华大学《计算机语言与程序设计》

2009年秋季学期期末考试

测试说明:

1.本次期末考试,采用上机编程方式进行考核,时间限制为120分钟。

2.考试形式为开卷考试,允许使用纸质资料,但严禁使用各类电子资料。

注意事项:

3.请服从监考老师安排,严格遵守考试纪律。

4.上机编程结果的上交,要求如下:

●需要提交单一Word文档;

●Word文档以学号+姓名作为文件名称;

●Word文档中需按照顺序提供源程序与运行结果截图。

5.评分时将查看源程序

●请遵守题目中给出的限制,否则将被扣分。

●程序设计质量将影响分数的获得,请使用较少存储空间和较高执行效率的程序实现方法。

●适当的程序说明,有助于分步分数的获得。

6.为防止程序被意外破坏,建议在E或者F盘中创建自己的编程目录,并做好备份。

 

以下为上机编程测试题目:

上机编程必做题(满分100分)

 

1、自我介绍(0分)

请在屏幕上输出你的学号、姓名、班级和院系。

要求:

(1)请填写个人真实信息。

 

1、字符串处理(25分)

请编写程序实现如下的功能。

(1)假设主函数内,存在一个已经初始化的由小写英文字母组成的字符串str1(长度不超过100);

(2)利用递归方法编写函数trans(),该函数对于字符串str1完成如下的处理:

若字符串str1是由

字母组成,trans()函数处理以后将生成新字符串str2,str2由字母

组成。

//20分

(3)在主函数中通过屏幕输出转换后的字符串str2。

//5分

要求:

(1)trans()函数须采用递归方法完成字符串的处理;

(2)处理后的字符串须在主函数中输出。

例如:

假设初始化的str1为abcdefg

屏幕输出:

gafbecddcebfag

#include

#include

#include

voidmain()

{

char*trans(chara[],charb[],intl,intn);//int数组没必要参数用指针

charstr1[100],str2[200],*s=str2;

intl,n;

printf("inputastring\n");

gets(str1);

l=strlen(str1);

n=l;

s=trans(str1,str2,l,n);

printf("thenewstring:

\n");

printf("%s\n",str2);

system("pause");

}

char*trans(chara[],charb[],intl,intn)//a[]整理后为b[],返回b的地址

{

if(n>1)

{

b[2*(l-n)]=a[n-1]-32;

b[2*(l-n)+1]=a[l-n];

trans(a,b,l,n-1);

}

if(n==1)

{

b[2*l-2]=a[0]-32;

b[2*l-1]=a[l-1];

}

b[2*l]='\0';//补个0

return(b);//b是地址

}

2、成绩排名(35分)

假设每个班的同学人数最多不超过10人。

每个同学的档案信息包括:

学号(最大为10个字符)、姓名(最大为20个字符)、班级(最大为6个字符)、成绩1(float型)、成绩2(float型)。

有两个磁盘文件class1.txt和class2.txt,分别存放两个班同学的学习成绩档案。

文件为文本文件,每行存放一位同学的档案信息,各信息项之间用空格间隔。

编写程序,要求实现以下功能:

(1)请从文件中读入两个班同学的档案信息。

//10分

(2)将所有的同学,按照平均成绩进行全部排名。

排名规则如下:

//15分

●按照平均成绩、成绩1、成绩2的优先顺序进行比较排名。

●即:

平均成绩高的同学排名靠前;如果平均成绩相同,则成绩1高的同学排名靠前。

●如果各项成绩都相同,则排名也相同。

●对于同学A,按照上述排序规则,如果有K个同学的排名在其前面,则该同学的总排名则为K+1。

(3)输入一个同学的学号,如果该学号存在,输出该名同学的排名及档案信息;如果该学号不存在,则输出“Error”;输入end,查询结束。

//10分

输入格式:

读入文件。

键盘依次输入学号200911019,200910105,200911005,200911002,最后输入end。

输出格式要求:

输出查询结果,每行输出一个同学的信息,依次为名次,学号,姓名,班级,平均成绩,成绩1,成绩2,各数据项之间用一个逗号“,”隔开。

#include

#include

#include

#include

#defineNULL0//令NULL代表0,用它表示空地址

#defineLENsizeof(structstudent)//令LEN代表structstudent类型数据的长度

structstudent

{

charnumber[10];

charname[20];

charclassname[6];

floatgrade1;

floatgrade2;

floataverage;

intrank;

};

voidmain()

{

voidsort(structstudentstu[],intk);//排序(void类型)

intsearch(structstudentstu[],char*s,intk);//搜查

intrank(structstudentstu[],intk);//第k个的排名

structstudentstu[20];

FILE*fp;

inti,k;

charstr[10];

if((fp=fopen("class1.txt","r"))==NULL)

{

printf("cannotopenfile\n");

exit(0);

}

for(i=0;!

feof(fp);i++)

{

fscanf(fp,"%s%s%s%f%f\n",stu[i].number,stu[i].name,stu[i].classname,&stu[i].grade1,&stu[i].grade2);

stu[i].average=(stu[i].grade1+stu[i].grade2)/2;

}

fclose(fp);

k=i;

if((fp=fopen("class2.txt","r"))==NULL)

{

printf("cannotopenfile\n");

exit(0);

}

for(i=k;!

feof(fp);i++)

{

fscanf(fp,"%s%s%s%f%f\n",stu[i].number,stu[i].name,stu[i].classname,&stu[i].grade1,&stu[i].grade2);

stu[i].average=(stu[i].grade1+stu[i].grade2)/2;

}

fclose(fp);//已完成读数据,并存入class[],个数为0~k-1

k=i;

sort(&stu[0],k);

for(i=0;i

stu[i].rank=rank(stu,i);

for(i=0;i

printf("%4d,%10s,%6s,%8s,%6.2f,%6.2f\n",stu[i].rank,stu[i].number,stu[i].name,stu[i].classname,stu[i].grade1,stu[i].grade2);

while

(1)

{

printf("inputanumberforresearch:

");

scanf("%s",str);

if(strcmp(str,"end")==0)

break;

else

{

i=search(stu,str,k);

if(i==-1)

printf("error\n");

else

printf("%4d,%10s,%6s,%8s,%6.2f,%6.2f\n",stu[i].rank,stu[i].number,stu[i].name,stu[i].classname,stu[i].grade1,stu[i].grade2);

}

}

system("pause");

}

intsearch(structstudentstu[],char*s,intk)//搜查k个元素中s的位置

{

inti,sign;

for(i=0;i

if(strcmp(s,stu[i].number)==0)

{

sign=i;

break;

}

if(i>=k)sign=-1;//没找到返回-1

return(sign);

}

voidsort(structstudentstu[],intk)//k个数据排序

{

intn=0,i,j;

structstudenttemp;

for(i=0;i

for(j=0;j

{

if(stu[j].average

{

temp=stu[j];

stu[j]=stu[j+1];

stu[j+1]=temp;

}

else

if(stu[j].average==stu[j+1].average)

{

if(stu[j].grade1

{

temp=stu[j];

stu[j]=stu[j+1];

stu[j+1]=temp;

}

else

if(stu[j].grade1==stu[j+1].grade1)

{

if(stu[j].grade2

{

temp=stu[j];

stu[j]=stu[j+1];

stu[j+1]=temp;

}

}

}

}

}

intrank(structstudentstu[],intk)//第k个的排名

{

intcount,i=0;

count=k+1;//paiming

while(i

{

if(((stu[i].average)==(stu[k].average))&&((stu[i].grade1)==(stu[k].grade1))&&((stu[i].grade2)==(stu[k].grade2)))

count--;

i++;

}

return(count);

}

#include

#include

#include

#include

#defineNULL0//令NULL代表0,用它表示空地址

#defineLENsizeof(structstudent)//令LEN代表structstudent类型数据的长度

structstudent

{

charnumber[10];

charname[20];

charclassname[6];

floatgrade1;

floatgrade2;

floataverage;

intrank;

structstudent*next;

};

structstudent*creat(char*ps)//生成节点

{

FILE*fp;

structstudent*head;

structstudent*p1,*p2;

intn=0;

p1=p2=(structstudent*)malloc(LEN);

if((fp=fopen(ps,"r"))==NULL)

{

printf("cannotopenfile\n");

exit(0);

}

fscanf(fp,"%s%s%s%f%f\n",p1->number,p1->name,p1->classname,&p1->grade1,&p1->grade2);

p1->average=(p1->grade1+p1->grade2)/2;

head=NULL;

while(!

feof(fp))

{

n=n+1;

if(n==1)head=p1;

elsep2->next=p1;

p2=p1;

p1=(structstudent*)malloc(LEN);

fscanf(fp,"%s%s%s%f%f\n",p1->number,p1->name,p1->classname,&p1->grade1,&p1->grade2);

p1->average=(p1->grade1+p1->grade2)/2;

}

p2->next=p1;

p1->next=NULL;

return(head);

}

voidprint(structstudent*head,intn)//输出n个数据

{

structstudent*p;

printf("Now,These%drecordsare:

\n",n);

p=head;

if(head!

=NULL)

do

{

printf("%4d,%10s,%-8s,%10s,%6.2f,%6.2f\n",p->rank,p->number,p->name,p->classname,p->grade1,p->grade2);

p=p->next;

}while(p!

=NULL);

}

intlength(structstudent*head)//测结点个数

{

structstudent*p;

intn=1;

p=head;

while(p->next!

=NULL)

{

n++;

p=p->next;

}

return(n);

}

structstudent*search(structstudent*head,char*s)//搜查

{

structstudent*p1,*p2;

if(head==NULL)

{

printf("nulllist!

\n");

gotoend;

}

p1=head;

while(strcmp(s,p1->number)&&p1->next!

=NULL)

{

p2=p1;

p1=p1->next;

}

if(strcmp(s,p1->number)==0)

{

p1->next=NULL;

head=p1;

}

elsehead=NULL;

end:

return(head);

}

structstudent*sort(structstudent*head,intk)//排序

{

intn=0,i,j;

structstudent*p[20];

structstudent*p1,*p2;

structstudent*temp;

p1=p2=head;

p[n]=head;

while(n

{

n++;

p1=p2->next;

p[n]=p1;

p2=p1;

}

for(i=0;i

for(j=0;j

{

if(p[j]->averageaverage)

{

temp=p[j];

p[j]=p[j+1];

p[j+1]=temp;

}

else

if(p[j]->average==p[j+1]->average)

{

if(p[j]->grade1grade1)

{

temp=p[j];

p[j]=p[j+1];

p[j+1]=temp;

}

else

if(p[j]->grade1==p[j+1]->grade1)

{

if(p[j]->grade2grade2)

{

temp=p[j];

p[j]=p[j+1];

p[j+1]=temp;

}

}

}

}

head=p[0];

n=0;

while(n

{

p[n]->next=p[n+1];

n++;

}

p[k-1]->next=NULL;

return(head);

}

intrank(structstudent*head,structstudent*p,inti)//不对。

空间不连续

{

structstudent*p1;

intcount;

p1=head;

count=i+1;

while(p1!

=p)

{

if(((p->average)==(p1->average))&&((p->grade1)==(p1->grade1))&&((p->grade2)==(p1->grade2)))

count--;

p1=p1->next;

}

return(count);

}

voidmain()

{

structstudent*creat(char*ps);

intlength(structstudent*head);

structstudent*sort(structstudent*head,intk);

intrank(structstudent*head,structstudent*p,inti);

voidprint(structstudent*head,intn);

structstudent*combine(structstudent*p1,structstudent*p2);

structstudent*head1,*head2,*head,*stu,*p;

intk,i,j;

chars1[10],s2[10],s[10];

printf("inputthefilename1:

\n");

scanf("%s",s1);

head1=creat(s1);

printf("inputthefilename2:

\n");

scanf("%s",s2);

head2=creat(s2);

head=combine(head1,head2);

k=length(head);

head=sort(head,k);

for(i=0;i

//(head+i)->rank=rank(head,i,k);错,空间不连续,不能用+i

{

p=head;

for(j=0;j

p=p->next;

p->rank=rank(head,p,i);

}

print(head,k);

while

(1)

{

printf("inputanumberforresearch:

");

scanf("%s",s);

if(strcmp(s,"end")==0)

break;

stu=search(head,s);

if(stu==NULL)

printf("Error\n");

else

print(stu,1);

}

system("pause");

}

structstudent*combine(structstudent*p1,structstudent*p2)

{

structstudent*p;

p=p1;

while(p->next!

=NULL)

p=p->next;

p->next=p2;

return(p1);

}

3、字母统计(30分)

请编写程序实现以下功能。

(1)假设有一串英文文字,存储在字符串str中。

(2)编写函数lettercount(),统计在字符串str中每个字母和数字字符出现的次数,统计结果形成一个链表,函数返回指向头结点的指针head。

//20分

(3)编写函数listcount(head),在屏幕上输出统计结果链表中,每个字母出现的次数,输出格式见示例。

//10分

要求:

请使用链表实现上述两个函数的功能。

假设str初始为:

aaabbbccsss1234567abc4564567

屏幕输出:

a(4),b(4),c(3),s(3),1

(1),2

(1),3

(1),4(3),5(3),6(3),7

(2)

#include

#include

#include

#include

#defineNULL0

#defineLENsizeof(structletter)

structletter

{

charch;

inttime;

structletter*next;

};

voidmain()

{

structletter*lettercount(char*str);

voidlistcount(structletter*head);

charstr[100];

structletter*head;

printf("inputastring\n");

gets(str);

head=lettercount(str);

listcount(head);

system("pause");

}

intjiance(charc,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1