数据结构课程设计报告 成绩分析问题 和 通讯录Word下载.docx
《数据结构课程设计报告 成绩分析问题 和 通讯录Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告 成绩分析问题 和 通讯录Word下载.docx(63页珍藏版)》请在冰豆网上搜索。
[概要设计]
-=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//记录数据
//姓名
//各科分数
[流程图]
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<
stdio.h>
stdlib.h>
conio.h>
string.h>
structSTD{//学生成绩链表
//学生姓名
//学生学号
//学生成绩
//指向下一学生结点
structSTDD//学生结点
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->
//若学号不同,p指向下一结点继续比较
}
return
(1);
//若学号都没相同的,返回1。
voidnewstu(STD*h)
STDDstudents;
//定义STDD结构体变量students来存储一些数据
inti;
//定义整型变量
STD*p,*q;
//定义STDD链表结点
p=h;
//p指向头结点
while(p->
next!
=NULL)//找到最后一个结点
system("
cls&
title学生注册"
);
printf("
\n\n\n"
<
>
<
\n\n"
请输入要注册学生的学号"
scanf("
%d"
&
students.number);
//输入注册的学号
while(right(h,students)==0)//判断该学号是否存在,若存在,就重新输入
printf("
\a\n学号有重复,请重新输入按任意键继续"
getch();
system("
scanf("
\n<
请输入要注册学生的姓名"
q=(structSTD*)malloc(sizeof(STD));
//给q分配内存
%s"
q->
name);
//输入姓名
q->
number=students.number;
//将输入的学号存入q中
for(i=0;
i<
4;
i++)//初始化成绩
q->
scores[i]=0;
p->
next=q;
//将q联结在p的后面
next=NULL;
//q为最后一结点
你注册以以上信息的学生按任意键返回"
getch();
\n"
voidshow(STD*p,inti)
if(i==0)//若i=0只输出姓名和学号
学号%d姓名%s\n"
p->
number,p->
else//若i=0输出全部信息
%3d%6s%4d%4d%4d%4d%4.1f\n"
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;
//定义链表指针使之对成绩链表进行遍历
=NULL)//只要p不为最后一结点
if((strcmp(p->
next->
name,name))==0)//比较姓名
return(p);
//若姓名一样,返回该姓名的上一结点p
//若不一样,p向下继续搜索
return(p);
//若都不一样,返回最后一结点p
STD*find(STD*h,intnum)
=NULL)
if(p->
number==num)
voidshow(STD*h)
title查看成绩"
//定义链表指针
STDDstudent;
//定义记录变量
charxz;
//定义字符xz来进行菜单的选择
inti=0;
//定义整型常量i
成绩查看<
1:
查看全部\n\n"
2:
查看单个\n\n"
0:
返回\n\n"
输入你的选择:
"
xz=getch();
switch(xz)//判断xz的值
case'
1'
:
system("
cls"
p=h->
if(p!
{
printf("
学号姓名语文数学计算机总分平均分\n\n"
}
while(p!
=NULL)//只要p不为空,输出该结点的信息
show(p,1);
p=p->
//指向下一结点
i++;
if(i==0)
没有学生\n"
else
\n一共输出了%d名学生的信息"
i);
按任意键返回"
break;
2'
学号\n\n"
姓名\n\n"
xz=getch();
switch(xz)
case'
\n\n\n\n"
请输入学号"
scanf("
student.number);
//输入要输出学生的学号
p=find(h,student.number);
//以学号为关键字查找
if(p->
=NULL)//只要p的下一结点不为空,输出p的下一结点的信息
{
printf("
show(p->
next,1);
}
else
没有该学生\n"
getch();
break;
请输入姓名"
student.name);
//输入姓名
p=find(h,student.name);
//经姓名为关键字查找
=NULL)//p的下一结点是否为空
while(p->
{
i++;
show(p->
//输出p的下一结点的信息
p=find(p->
next,student.name);
//从p下一结点开始继续搜索,看是还有学生为该名,有则输出
}
if(i==0)
没有该学生\n"
else
voidintoscores(STD*h)
//记录选择的菜单编号
//记录信息
//对链表进行遍历
title成绩输入"
成绩录入\n\n"
1:
录入全部学生成绩\n\n"
2:
录入单个学生成绩\n\n"
0:
请输入你的选择"
%c"
xz);
switch(xz)//判断输出菜单的编号
//p指向头结点的下一结点
i=0;
=NULL)//p是否为空
show(p,0);
//输出p的姓名和学号,下面按提示输入成绩
\n"
请输入数学成绩"
p->
scores[0]);
while(p->
scores[0]>
100||p->
scores[0]<
0)//若成绩不正确,重新输入
scanf("
请输入英语成绩"
scores[1]);
scores[1]>
scores[1]<
0)
请输入计算机成绩"
scores[2]);
scores[2]>
scores[2]<
p->
scores[3]=p->
scores[0]+p->
scores[1]+p->
scores[2];
//计算总分
//指向下一结点继续输入成绩
你一共录入了%d名学生的成绩\n\n"
printf("
请输入要录入学生的学号"
//输入学生的学号
p=find(h,student.number);
//找到为该学号的学生
show(p->
next,0);
//输出学生姓名,学号
//输入成绩
while(p->
p->
voidsort(STD*h,inta,intb)
//定义链表变量
//从头开始
if(b==0)//若b=0,为升序
q=p->
//q为p的下一结点
while(q->
=NULL)//q不为最后一结点
if(a==4)//若a=4,则以学号为关键字排序
if(p->
number>
number)
{//比较学号的大小,满足则交接两者
student.number=p->
number;
p->
number=q->
q->
number=stud