数据结构课程设计报告 成绩分析问题 和 通讯录.docx
- 文档编号:3305067
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:63
- 大小:608.35KB
数据结构课程设计报告 成绩分析问题 和 通讯录.docx
《数据结构课程设计报告 成绩分析问题 和 通讯录.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告 成绩分析问题 和 通讯录.docx(63页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告成绩分析问题和通讯录
《数据结构》课程设计报告
5:
成绩分析问题
16:
通讯录
学院(系):
*************
班级:
*********
学生姓名:
***学号**********
指导教师:
***
时间:
从2011年12月31日到2012年1月6日
一、课程设计概述:
本次数据结构课程设计共完成两个题:
成绩分析问题和通讯录
使用语言:
C
编译环境:
TC3.0/VC6.0
二、课程设计题目一
[实验内容]
成绩分析问题
[问题描述]
录入、保存一个班级学生多门课程的成绩,并对成绩进行分析。
[需求分析]
(1)通过键盘输.入各学生的多门课程的成绩,建立相应的文件input.dat。
(2)对文件input.dat中的数据进行处理,要求具有如下功能:
1)按各门课程成绩排序,并生成相应的文件输出。
2)计算每人的平均成绩,按平均成绩排序,并生成文件。
3)求出各门课程的平均成绩、最高分、最低分、不及格人数、60~69分人数、70~79分人数、80~89分人数、90分以上人数。
4)根据姓名或学号查询某人的各门课成绩,重名情况也能处理。
(3)界面美观。
[概要设计]
-=ADT=
{
intright(STD*h,inti);
//查看学号i是否存在
voidnewstu(STD*h);
//新增一个学生
STD*find(STD*h,charnam);
//查找姓名为nam的学生,返回该学生上一结点的地址
STD*find(STD*h,charnum);
//查找学号为mum的学生,返回该学生上一结点的地址
voidshow(STD*p,inti);
//输出结点p的信息,若i=0只输出姓名和学号,i=1,输出全部信息
voidshow(STD*h);
//按提示输出学生的信息
voidintoscores(STD*h);
//按提示录入学生的成绩
voidsort(STD*h,inta,intb);
/*对学生信息排序,a为0以数学成绩为关键字排序a=1-4为英语成绩、计算机成绩、总成绩、学号。
b=0为降序,b=1为升序*/
voidcjjpx(STD*h);
//按提示对学生信息排序
voidtjcj(STD*h);
//统计学生成绩
voiddel(STD*h);
//按提示删除学生
intinto(STD*h);
//从文件中读数据放在头结点为h的链表中
intsave(STD*h);
//将头结点为h的链表数据保存在文件中
}
[存储结构]
structSTD//学生信息链表
{
charname[20];//姓名
intnumber;//学号
intscores[4];//各科成绩
structSTD*next;//指向下一结点的指针
};
structSTDD//记录数据
{
charname[20];//姓名
intnumber;//学号
intscores[4];//各科分数
};
[流程图]
intright(STD*h,STDDstudent);
//判断学号student.number是否存在
voidnewstu(STD*h)STD*find(STD*h,charname[])
//添加一个新学生//以姓名为关键字
STD*find(STD*h,charname[])
//以学号为关键字
voidintoscores(STD*h)//录入学生的成绩
voidshow(STD*h)//输出学生信息
voidtjcj(STD*h)//学生信息统计
voidsort(STD*h,inta,intb)//对学生信息按要求进行排序
voiddel(STD*h)//删除学生
[详细设计]
//成绩分析问题.cpp
#include
#include
#include
#include
structSTD{//学生成绩链表
charname[20];//学生姓名
intnumber;//学生学号
intscores[4];//学生成绩
structSTD*next;//指向下一学生结点
};
structSTDD//学生结点
{
charname[20];
intnumber;
intscores[4];
};
intright(STD*h,STDDstudent)
{
STD*p;//定义结点p,使之在链表中遍历
p=h->next;//p指向头结点的下一个结点开始遍历
while(p!
=NULL)//判断p是否为空
{
if(student.number==p->number)//否p不为空再判断学号是否相同
return(0);//若学号相同,返回0
p=p->next;//若学号不同,p指向下一结点继续比较
}
return
(1);//若学号都没相同的,返回1。
}
voidnewstu(STD*h)
{
STDDstudents;//定义STDD结构体变量students来存储一些数据
inti;//定义整型变量
STD*p,*q;//定义STDD链表结点
p=h;//p指向头结点
while(p->next!
=NULL)//找到最后一个结点
{
p=p->next;
}
system("cls&title学生注册");
printf("\n\n\n");
printf("<><><><><><><><><><><><><><><><><><><><><><><><><><>\n\n");
printf("<>请输入要注册学生的学号");
scanf("%d",&students.number);//输入注册的学号
while(right(h,students)==0)//判断该学号是否存在,若存在,就重新输入
{
printf("\a\n学号有重复,请重新输入按任意键继续");
getch();
system("cls&title学生注册");
printf("\n\n\n");
printf("<><><><><<><><><><><><><><><><><><><><><><><><>\n\n");
printf("<>请输入要注册学生的学号");
scanf("%d",&students.number);
}
printf("\n<>请输入要注册学生的姓名");
q=(structSTD*)malloc(sizeof(STD));//给q分配内存
scanf("%s",q->name);//输入姓名
q->number=students.number;//将输入的学号存入q中
for(i=0;i<4;i++)//初始化成绩
q->scores[i]=0;
p->next=q;//将q联结在p的后面
q->next=NULL;//q为最后一结点
printf("\n\n");
printf("<><><><><><><><><><><><><><><><><><><><><><><>\n\n");
printf("<>你注册以以上信息的学生按任意键返回");
getch();
printf("\n");
}
voidshow(STD*p,inti)
{
if(i==0)//若i=0只输出姓名和学号
{
printf("<>学号%d姓名%s\n",p->number,p->name);
}
else//若i=0输出全部信息
printf("%3d%6s%4d%4d%4d%4d%4.1f\n",p->number,p->name,p->scores[0],p->scores[1],p->scores[2],p->scores[3],(p->scores[3]*1.0)/3);
}
STD*find(STD*h,charname[])
{
STD*p=h;//定义链表指针使之对成绩链表进行遍历
while(p->next!
=NULL)//只要p不为最后一结点
{
if((strcmp(p->next->name,name))==0)//比较姓名
return(p);//若姓名一样,返回该姓名的上一结点p
p=p->next;//若不一样,p向下继续搜索
}
return(p);//若都不一样,返回最后一结点p
}
STD*find(STD*h,intnum)
{
STD*p;
p=h;
while(p->next!
=NULL)
{
if(p->next->number==num)
return(p);
p=p->next;
}
return(p);
}
voidshow(STD*h)
{
system("cls&title查看成绩");
STD*p;//定义链表指针
STDDstudent;//定义记录变量
charxz;//定义字符xz来进行菜单的选择
inti=0;//定义整型常量i
printf("\n\n");
printf("<><><><><><><><><><><><><><><><><><><><><><><><><>\n\n");
printf("<>成绩查看<>\n\n");
printf("<><><><><><><><><><><><><><><><><><><><><><><><><><>\n\n");
printf("<>1:
查看全部\n\n");
printf("<>2:
查看单个\n\n");
printf("<>0:
返回\n\n");
printf("<><><><><><><><><><><><><><><><><><><><><><><><><><>\n\n");
printf("<>输入你的选择:
");
xz=getch();
switch(xz)//判断xz的值
{
case'1':
system("cls");
p=h->next;
printf("\n\n");
printf("<><><><><><><><><><><><><><><><><><><><><><><><>\n\n");
if(p!
=NULL)
{
printf("学号姓名语文数学计算机总分平均分\n\n");
}
while(p!
=NULL)//只要p不为空,输出该结点的信息
{
show(p,1);
p=p->next;//指向下一结点
i++;
}
if(i==0)
printf("没有学生\n");
else
printf("\n一共输出了%d名学生的信息",i);
printf("\n\n");
printf("<><><><><><><><><><><><><><><><><><><><><><><><>\n\n");
printf("<>按任意键返回");
getch();
break;
case'2':
system("cls");
printf("\n\n");
printf("<><><><><><><><><><><><><><><><><><><><><><><><>\n\n");
printf("<>成绩查看<>\n\n");
printf("<><><><><><><><><><><><><><><><><><><><><><><><>\n\n");
printf("<>1:
学号\n\n");
printf("<>2:
姓名\n\n");
printf("<>0:
返回\n\n");
printf("<><><><><><><><><><><><><><><><><><><><><><><><>\n\n");
printf("<>输入你的选择:
");
xz=getch();
switch(xz)
{
case'1':
system("cls");
printf("\n\n\n\n");
printf("<><><><><><><><><><><><><><><><><><><><><><><>\n\n");
printf("请输入学号");
scanf("%d",&student.number);//输入要输出学生的学号
p=find(h,student.number);//以学号为关键字查找
if(p->next!
=NULL)//只要p的下一结点不为空,输出p的下一结点的信息
{
printf("学号姓名语文数学计算机总分平均分\n\n");
show(p->next,1);
}
else
printf("没有该学生\n");
printf("\n\n");
printf("<><><><><><><><><><><><><><><><><><><><><><><>\n\n");
printf("<>按任意键返回");
getch();
break;
case'2':
system("cls");
printf("\n\n\n\n");
printf("<><><><><><><><><><><><><><><><><><><><><><><>\n\n");
printf("请输入姓名");
scanf("%s",student.name);//输入姓名
p=find(h,student.name);//经姓名为关键字查找
if(p->next!
=NULL)//p的下一结点是否为空
{
printf("学号姓名语文数学计算机总分平均分\n\n");
while(p->next!
=NULL)
{
i++;
show(p->next,1);//输出p的下一结点的信息
p=find(p->next,student.name);//从p下一结点开始继续搜索,看是还有学生为该名,有则输出
}
}
if(i==0)
printf("没有该学生\n");
else
printf("\n一共输出了%d名学生的信息",i);
printf("\n\n");
printf("<><><><><><><><><><><><><><><><><><><><><><>\n\n");
printf("<>按任意键返回");
getch();
break;
}
}
}
voidintoscores(STD*h)
{
inti;
charxz;//记录选择的菜单编号
STDDstudent;//记录信息
STD*p;//对链表进行遍历
system("cls&title成绩输入");
printf("\n\n\n");
printf("<><><><><><><><><><><><><><><><><><><><><><><><>\n\n");
printf("成绩录入\n\n");
printf("<><><><><><><><><><><><><><><><><><><><><><><><>\n\n");
printf("<>1:
录入全部学生成绩\n\n");
printf("<>2:
录入单个学生成绩\n\n");
printf("<>0:
返回\n\n");
printf("<><><><><><><><><><><><><><><><><><><><><><><><><>\n\n");
printf("<>请输入你的选择");
xz=getch();
printf("%c",xz);
system("cls");
printf("\n\n\n");
printf("<><><><><><><><><><><><><><><><><><><><><><><><><>\n\n");
printf("成绩录入\n\n");
printf("<><><><><><><><><><><><><><><><><><><><><><><><><>\n\n");
switch(xz)//判断输出菜单的编号
{
case'1':
p=h->next;//p指向头结点的下一结点
i=0;
while(p!
=NULL)//p是否为空
{
show(p,0);//输出p的姓名和学号,下面按提示输入成绩
printf("\n");
printf("<>请输入数学成绩");
scanf("%d",&p->scores[0]);
while(p->scores[0]>100||p->scores[0]<0)//若成绩不正确,重新输入
{
printf("<>请输入数学成绩");
scanf("%d",&p->scores[0]);
}
printf("<>请输入英语成绩");
scanf("%d",&p->scores[1]);
while(p->scores[1]>100||p->scores[1]<0)
{
printf("<>请输入英语成绩");
scanf("%d",&p->scores[1]);
}
printf("<>请输入计算机成绩");
scanf("%d",&p->scores[2]);
while(p->scores[2]>100||p->scores[2]<0)
{
printf("<>请输入计算机成绩");
scanf("%d",&p->scores[2]);
}
p->scores[3]=p->scores[0]+p->scores[1]+p->scores[2];//计算总分
p=p->next;//指向下一结点继续输入成绩
i++;
printf("\n");
}
printf("<>你一共录入了%d名学生的成绩\n\n",i);
printf("<><><><><><><><><><><><><><><><><><><><><><><>\n\n");
printf("<>按任意键返回");
getch();
break;
case'2':
printf("<>请输入要录入学生的学号");
scanf("%d",&student.number);//输入学生的学号
p=find(h,student.number);//找到为该学号的学生
printf("\n");
show(p->next,0);//输出学生姓名,学号
printf("\n");
printf("<>请输入数学成绩");//输入成绩
scanf("%d",&p->next->scores[0]);
while(p->next->scores[0]>100||p->next->scores[0]<0)
{
printf("<>请输入数学成绩");
scanf("%d",&p->next->scores[0]);
}
printf("<>请输入英语成绩");
scanf("%d",&p->next->scores[1]);
while(p->next->scores[1]>100||p->next->scores[1]<0)
{
printf("<>请输入英语成绩");
scanf("%d",&p->next->scores[1]);
}
printf("<>请输入计算机成绩");
scanf("%d",&p->next->scores[2]);
while(p->next->scores[2]>100||p->next->scores[2]<0)
{
printf("<>请输入计算机成绩");
scanf("%d",&p->next->scores[2]);
}
p->next->scores[3]=p->next->scores[0]+p->next->scores[1]+p->next->scores[2];
break;
}
}
voidsort(STD*h,inta,intb)
{
inti;
STDDstudent;//定义记录变量
STD*p,*q;//定义链表变量
p=h;//从头开始
if(b==0)//若b=0,为升序
{
while(p->next!
=NULL)//只要p不为最后一结点
{
q=p->next;//q为p的下一结点
while(q->next!
=NULL)//q不为最后一结点
{
if(a==4)//若a=4,则以学号为关键字排序
{
if(p->next->number>q->next->number)
{//比较学号的大小,满足则交接两者
student.number=p->next->number;
p->next->number=q->next->number;
q->next->number=stud
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构课程设计报告 成绩分析问题 通讯录 数据结构 课程设计 报告 成绩 分析 问题