计算机科学与应用系课程设计报告4.docx
- 文档编号:9340408
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:17
- 大小:133.82KB
计算机科学与应用系课程设计报告4.docx
《计算机科学与应用系课程设计报告4.docx》由会员分享,可在线阅读,更多相关《计算机科学与应用系课程设计报告4.docx(17页珍藏版)》请在冰豆网上搜索。
计算机科学与应用系课程设计报告4
《数据结构》
课程设计报告书
题目:
学生奖学金评定系统
系别:
计算机科学与应用系
学号:
101006436
学生姓名:
张占涛
指导教师:
薛海燕
完成日期:
2012年5月28日
学生奖学金评定系统
(1)问题分析与系统结构设计
输入部分,要求用户能从屏幕上格式化输入所要求的数据项,例如添加信息的时候输入学生的基本信息:
学号、姓名、性别、分数,本程序为方便调试可随机生成100个同学的信息并写入到当前目录中的stuinfo.txt文件中。
程序通过对stuinfo.txt文件的读取,得到大量学生的信息,通过使用插入排序方法,按照分数的高低进行降序排列,得到有序单链表。
然后通过对链表的操作进行学生信息的添加、查询、删除,在此过程中可随时对链表内修改过的信息进行保存。
最终结果将在屏幕上输出获得一、二、三等奖学金同学的名单,同时将结果保存到当前目录下的namelist.txt文件中。
开始
输入操作序号
本程序的流程图如下:
添加、删除、查询、排序
显示、保存
判断序号
结束
(二)详细设计和编码
采用VS2010作为开发工具,用结构体定义单链表,对所要处理的学生信息进行存储,分别调用各个功能函数来处理。
structlink
{
intno;//学号
intscore;//分数
charname[20];//名字
charsex[5];//性别
structlink*next;
};
voidwenjianwrite()
{
inti,j;
structlinkone;
FILE*fp=fopen("stuinfo.txt","w");//创建文件
srand(time(0));
for(i=0;i<100;i++)
{
one.no=i+1;
for(j=0;j<20;j++)
{
one.name[j]=(char)(rand()%25+63);
}
one.name[19]='';
if(rand()%2==0)
{
memcpy(one.sex,"boy",5);
}
else
{
memcpy(one.sex,"girl",5);
}
one.score=rand()%100;//随机产生分数
fprintf(fp,"\n%d",one.no);//开始向文件中写信息
for(j=0;j<20;j++)
{
fprintf(fp,"%c",one.name[j]);
}
fprintf(fp,"%c",'');
for(j=0;j<5;j++)
fprintf(fp,"%c",one.sex[j]);
fprintf(fp,"%d",one.score);
}
fclose(fp);
printf("随机文件生成成功!
\n");
}
voidwenjianread(structlink*head)
{
structlink*one,*p,*q;
inti,state;
FILE*fp;//定义文件指针
p=head->next;
q=head;
while(head->next!
=NULL)
{
if(p->next==NULL)
{
q->next=NULL;//防止链表悬空
free(p);//释放不必要的内存空间
p=head->next;
q=head;
continue;
}
p=p->next;
q=q->next;
}
fp=fopen("stuinfo.txt","r");//读取文件
if(fp==NULL)
{
printf("\n\n!
openfilefailed!
\n\n");
return;
}
for(;!
feof(fp);)
{
state=0;
one=(structlink*)malloc(sizeof(structlink));
one->next=NULL;
fscanf(fp,"%d%s%s%d",&one->no,one->name,one->sex,&one->score);
//printf("%d%s%s%d\n",one.no,one.name,one.sex,one.score);
p=head->next;
while
(1)
{
if(p==NULL)break;
if(p->no==one->no)
{
free(one);
state=1;
break;
}
else
p=p->next;
}
if(state==1)continue;
p=head->next;
q=head;
while
(1)
{
if(p==NULL)
{
q->next=one;
break;
}
if(p->score<=one->score)
{
q->next=one;
one->next=p;
break;
}
p=p->next;
q=q->next;
}
}
fclose(fp);
printf("读取文件成功!
\n");
}
voidbaocun(structlink*head)
{
structlink*p;
intj;
FILE*fp=fopen("stuinfo.txt","w");
p=head->next;
while
(1)
{
if(p==NULL)
{
printf("保存成功\n");
break;
}
else
{
fprintf(fp,"\n%d",p->no);
for(j=0;j<20;j++)
{
fprintf(fp,"%c",p->name[j]);
}
fprintf(fp,"%c",'');
for(j=0;j<5;j++)
fprintf(fp,"%c",p->sex[j]);
fprintf(fp,"%d",p->score);
p=p->next;
}
}
fclose(fp);
printf("保存成功!
\n");
}
(3)上机准备和静态分析
方便用户根据需要对数据进行增添,本函数采用了遍历查找方法,不允许有相同学号的信息插入,并在插入过程中采用了按照分数进行了降序排列,具体实现如下:
voidtianjia(structlink*head)
{
structlink*one,*p,*q;
p=head->next;
q=head;
one=(structlink*)malloc(sizeof(structlink));
one->next=NULL;
printf("nonamesexscore\n");
scanf("%d%s%s%d",&one->no,&one->name,&one->sex,&one->score);
while
(1)
{
if(p==NULL)break;
if(p->no==one->no)
{
printf("已经存在,无法保存!
\n");
return;
}
else
p=p->next;
}
p=head->next;
q=head;
while
(1)
{
if(p==NULL)
{
q->next=one;
break;
}
if(p->score<=one->score)
{
one->next=p;
q->next=one;
break;
}
p=p->next;
q=q->next;
}
printf("添加成功!
");
}
本函数采用遍历方式,对要删除的学号和链表内的学号逐个比较,找到后对链表进行重新连接,还要防止悬空,并释放不需要的内存;对于链表中没有找到的信息,提示用户不存在,无法删除;具体实现如下:
voidshanchu(structlink*head)
{
structlink*p,*q;
inttheno;
p=head->next;
q=head;
printf("请输入要删除同学的学号:
");
scanf("%d",&theno);
while
(1)
{
if(p==NULL)
{
printf("没有找到这个同学的信息\n");
break;
}
if(p->no==theno)//找到
{
q->next=p->next;
free(p);
printf("删除成功!
\n");
return;
}
else
p=p->next;
q=q->next;
}
}
首先输入需要查询的学号,本函数遍历链表的过程中按照学号进行比较,找到则显示该信息,找不到则提示用户不存在,具体实现如下:
voidchaxun(structlink*head)
{
inttheno;
structlink*p;
p=head->next;
printf("查询的学号:
");
scanf("%d",&theno);
for(;;)
{
if(p->no==theno)
{
printf("%d%s%s%d\n",p->no,p->name,p->sex,p->score);
break;
}
elsep=p->next;
if(p==NULL)
{
printf("没有找到你的信息\n");
break;
}
}
}
为了方便用户随时对链表中的信息整体监视,采用本函数显示链表中的全部学生信息,具体实现如下:
voidprint(structlink*head)
{
structlink*p;
p=head->next;
while(p!
=NULL)
{
printf("%d%s%s%d\n",p->no,p->name,p->sex,p->score);
p=p->next;
}
printf("打印完毕。
\n");
}
本函数首先对所有的信息进行统计,按照统计结果进行获奖比例运算,显示获一二三等奖学金同学的信息,不允许有相同分数却不同名词的情况,同时将该获奖信息存储到当前目录下的namelist.txt文件中,具体实现如下:
voidnamelist(structlink*head)
{
structlink*p;
doubletest,sum;
inti,score[3];
p=head->next;
for(sum=0;p!
=NULL;sum++)
{
p=p->next;
}
printf("统计的总人数是%f位",sum);
test=sum*0.03;
p=head->next;
for(i=0;i<=test;i++)
{
p->next;
}
score[0]=p->score;
//////////////
test=sum*0.17;
p=head->next;
for(i=0;i<=test;i++)
{
p=p->next;
}
score[1]=p->score;
test=sum*0.30;
p=head->next;
for(i=0;i<=test;i++)
{
p=p->next;
}
score[2]=p->score;
printf("获得一等奖的有:
\n");
for(p=head->next;score[0]<=p->score;p=p->next)
{
printf("%d%s%s%d\n",p->no,p->name,p->sex,p->score);
}
printf("获得二等奖的有:
\n");
for(;score[1]<=p->score;p=p->next)
{
printf("%d%s%s%d\n",p->no,p->name,p->sex,p->score);
}
printf("获得三等奖的有:
\n");
for(;score[2]<=p->score;p=p->next)
{
printf("%d%s%s%d\n",p->no,p->name,p->sex,p->score);
}
FILE*fp=fopen("namelist.txt","w");
if(fp==NULL)
{
printf("打开文件namelist失败!
\n");
return;
}
fprintf(fp,"获得一等奖的有:
\n");
for(p=head->next;score[0]<=p->score;p=p->next)
{
fprintf(fp,"%d%s%s%d\n",p->no,p->name,p->sex,p->score);
}
fprintf(fp,"获得二等奖的有:
\n");
for(;score[1]<=p->score;p=p->next)
{
fprintf(fp,"%d%s%s%d\n",p->no,p->name,p->sex,p->score);
}
fprintf(fp,"获得三等奖的有:
\n");
for(;score[2]<=p->score;p=p->next)
{
fprintf(fp,"%d%s%s%d\n",p->no,p->name,p->sex,p->score);
}
fclose(fp);
return;
}
(四)上机调试程序
添加信息和删除信息
显示获奖学生信息,并保存到文件
显示所有同学的信息
(五)整理设计报告
通过对这次数据结构的设计,在指导老师的悉心教导下,我学到了很多,比如面向过程的设计方法,针对单个问题,单独解决,逐步求精等软件分析设计方法,提高了分析问题、解决问题的能力,同时对循环语句有了更好的理解和运用,对函数间的数值传递方法有了进一步的了解……
通过这次设计,我明白了数据的存储分析及算法设计在程序设计中占据着十分重要的地位,是程序执行效率的内部体现,也让我在不断克服困难逐步成长的过程中对程序设计产生了更加浓厚的兴趣。
借此机会,向敬爱的老师们表达我最诚挚的谢意。
指导教师评语:
程序成绩:
报告成绩:
综合成绩:
指导教师姓名:
批改日期:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机科学 应用 课程设计 报告