秋季学期期末考试.docx
《秋季学期期末考试.docx》由会员分享,可在线阅读,更多相关《秋季学期期末考试.docx(29页珍藏版)》请在冰豆网上搜索。
秋季学期期末考试
清华大学《计算机语言与程序设计》
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;istu[i].rank=rank(stu,i);
for(i=0;iprintf("%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;iif(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;ifor(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;ifor(j=0;j{
if(p[j]->average
average)
{
temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
else
if(p[j]->average==p[j+1]->average)
{
if(p[j]->grade1
grade1)
{
temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
else
if(p[j]->grade1==p[j+1]->grade1)
{
if(p[j]->grade2
grade2)
{
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,