您的位置:首页 > 理论基础 > 数据结构算法

数据结构课程设计 学生成绩管理

2015-12-25 18:08 741 查看
<pre class="cpp" name="code">本次实验设计了一个学生管理系统,程序运用结构体 链表,学生的信息分为了四大项,分别是学生的学号、姓名、年龄、成绩,这四项一起作为链表节点的数据部分,程序功能如下:
(1)输入成绩
(2)输出成绩
(3)删除成绩
(4)学生总数的显示
(5)查找成绩
(6)插入成绩
(7)根据学生的成绩进行排序
(8)统计不及格的人数并显示出来


程序代码如下:

xueshengchengji.h

#define N 50
typedef struct LNode//数据节点定义
{
char num
;//学号
char name
;//姓名
int age;//年龄
float Score;//成绩
LNode *next;
}LNode;
class LinkList//链表类
{
private://将节点封装为私有变量
LNode *head;
int length;
public:
LinkList();//构造函数
bool IsCreate();//判断是否建立链表
void ListSize();//求链表长度
void CreatList(); //建立链表
void InsertList();//插入
void DeleteList();//删除
void Find(); //查找
void Display(); //显示数据
void BubbleSortList();//链表的冒泡排序法
void Count();//统计成绩不及格的人数
};


xueshengchengji.cpp

#include "xueshengchengji.h"
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
using namespace std;

LinkList::LinkList()//链表的初始化
{
head=(LNode *)malloc(sizeof(LNode));
head->next=NULL;
length=0;
}
//判断用户是否建立了链表,如果是,则返回值为1,反之为0
bool LinkList::IsCreate()

{

if(length==0)
return 0;
return 1;
}
//数据长度
void LinkList::ListSize()
{
if(!IsCreate())
{
cout<<"您还没有建表,请先建表!"<<endl;
cout<<"请按任意键继续. . ."<<endl;
getch();
}
else
{
cout<<"共存储了"<<length<<"个学生的数据信息."<<endl;
cout<<"********************************************************************************"<<endl;
cout<<"请按任意键继续. . ."<<endl;
getch();
}

}

/*运行建立链表的程序时,先预先判断是否建立了链表,
如果建立了链表,则返回主菜单;如果没有建表,则建立链表*/
void LinkList::CreatList()
{
if(IsCreate())
{
cout<<"已经建立链表!"<<endl<<"请按任意键继续. . . "<<endl;
getch();
}
else
{
int n;
cout<<"请输入要输入成绩的学生个数: ";
cin>>n;
LNode *p=head;//头插法建立链表
length=n;
for(int i=n;i>0;i--)
{
LNode *p=(LNode *)malloc(sizeof(LNode));
cout<<"请输入学号: ";cin>>p->num;
cout<<"请输入姓名: ";cin>>p->name;
cout<<"请输入年龄: ";cin>>p->age;
cout<<"请输入成绩: ";cin>>p->Score;
p->next=head->next;//指向头节点的指针指向指针指向的下一个节点
head->next=p;
}
cout<<"********************************************************************************"<<endl;
cout<<"请按任意键继续. . ."<<endl;
getch();
}
}
//查找成绩
void LinkList::Find()
{
if(!IsCreate())
{
cout<<"您还没有建表,请先建表!"<<endl;
cout<<"请按任意键继续. . ."<<endl;
getch();
}
else /*利用while循环从头结点开始,循环查找各个节点,直到找到为止,
若查找循环结束后仍然未找到,则提示输出“无法查找到所要查找的学生信息!”*/
{
char num
;
cout<<"请输入学号: ";
cin>>num;
LNode *p=head->next;
while(p&&strcmp(p->num,num)!=0)
{
p=p->next;
}
if(!p)cout<<"无法查找到所要查找的学生成绩!"<<endl;
else{
cout<<"姓名: "<<p->name<<endl;
cout<<"年龄: "<<p->age<<endl;
cout<<"成绩: "<<p->Score<<endl;
}
cout<<"********************************************************************************"<<endl;
cout<<"请按任意键继续. . ."<<endl;
getch();
}
}
//删除成绩
void LinkList::DeleteList()
{
if(!IsCreate())
{
cout<<"您还没有建表,请先建表!"<<endl;
cout<<"请按任意键继续. . ."<<endl;
getch();
}
else//利用while循环从头结点开始,循环查找各个节点

{
char num
;
cout<<"请输入所要删除的学生的学号:";
cin>>num;
LNode *p=head;
while(p->next&&strcmp(p->next->num,num)!=0)
{
p->next=p->next->next;
}
if(!(p->next))
cout<<"找不到所要删除的内容,操作失败!";
else//找到后将当前节点的前一个节点的next指针指向当前节点的下一个节点,并且释放当前节点
{
length--;
LNode *q=p->next;
p->next=p->next->next;
free(q);
}
cout<<"********************************************************************************"<<endl;
cout<<"请按任意键继续. . ."<<endl;
getch();
}
}
//显示学生成绩
void LinkList::Display()
{
if(!IsCreate())
{
cout<<"您还没有建表,请先建表!"<<endl;
cout<<"请按任意键继续. . ."<<endl;
getch();
}
else//利用链表的循环查找方式从头结点的下一个节点依次输出数据
{
cout<<"所有学生的成绩如下:"<<endl;
cout<<"共有"<<length<<"个学生的成绩"<<endl;
LNode *p=head->next;
while(p)
{
cout<<"学号: "<<p->num<<endl;
cout<<"姓名: "<<p->name<<endl;
cout<<"年龄: "<<p->age<<endl;
cout<<"成绩: "<<p->Score<<endl<<endl;
p=p->next;
}
cout<<"********************************************************************************"<<endl;
cout<<"请按任意键继续. . ."<<endl;
getch();
}
}
//插入成绩
void LinkList::InsertList()
{
if(!IsCreate())
{
cout<<"您还没有建表,请先建表!"<<endl;
cout<<"请按任意键继续. . ."<<endl;
getch();
}
else
{
int n,i=1;
cout<<"请输入要插入的位置: ";
cin>>n;
if(n<1||n>length+1)cout<<"插入的位置不正确,操作失败!"<<endl;
else//利用while循环从头结点开始,循环查找各个节点
{
LNode *q,*p=head;
q=(LNode *)malloc(sizeof(LNode));
while(i<n)
{
p=p->next;
i++;
}
cout<<"请输入学号: ";cin>>q->num;
cout<<"请输入姓名: ";cin>>q->name;
cout<<"请输入年龄: ";cin>>q->age;
cout<<"请输入成绩: ";cin>>q->Score;

/*先将要插入的节点的next指针指向找到的节点的下一个节点,
再将找到的节点的next指针指向要插入的节点*/
q->next=p->next;
p->next=q;
length++;
cout<<"********************************************************************************"<<endl;
cout<<"请按任意键继续. . ."<<endl;
getch();
}
}
}
//成绩排序
void LinkList::BubbleSortList()   //链表冒泡排序
{
if(!IsCreate())
{
cout<<"您还没有建表,请先建表!"<<endl;
cout<<"请按任意键继续. . ."<<endl;
getch();
}
else//定义两个节点,比较后如果要交换,则把节点的顺序部分交换,而节点的位置并没有改变
{
LNode *_temp=head->next;
LNode *_node=head->next;
char temp1
,temp2
;
int temp3;
float temp4;
for(;_temp->next;_temp=_temp->next)
{
for(_node=head->next;_node->next;_node=_node->next)
{
if(_node->Score<_node->next->Score)
{
strcpy(temp1,_node->num);
strcpy(_node->num,_node->next->num);
strcpy(_node->next->num,temp1);
strcpy(temp2,_node->name);
strcpy(_node->name,_node->next->name);
strcpy(_node->next->name,temp2);
temp3=_node->age;
_node->age=_node->next->age;
_node->next->age=temp3;
temp4=_node->Score;
_node->Score=_node->next->Score;
_node->next->Score=temp4;

}
}
}
}
}
//统计不及格人数模块
void LinkList::Count()
{
if(!IsCreate())
{
cout<<"您还没有建表,请先建表!"<<endl;
cout<<"请按任意键继续. . ."<<endl;
getch();
}
else
{
LNode *p=head->next;
int count=0;//设置一个计数变量count并赋初值为0
while(p)//若当前节点的Score的值小于60,则count加1,直到整个链表查找完后,count的值就是不及格的人数
{
if(p->Score<60) count++;
p=p->next;
}
cout<<"这"<<length<<"名学生中有"<<count<<"名学生成绩不及格."<<endl;
cout<<"********************************************************************************"<<endl;
cout<<"请按任意键继续. . ."<<endl;
getch();
}
}


main.cpp

#include "xueshengchengji.h"
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
using namespace std;

int main()
{
LinkList L;
int order,flag=1,confirm=1;
char a[50];
cout<<"       *********************欢迎进入学生信息管理系统**********************"<<endl;
while(confirm)
{
while(flag)
{
cout<<"       *        请输入命令:                                              *"<<endl;
cout<<"       *       1.输入学生成绩          ***      2.输出学生成绩           *"<<endl;
cout<<"       *       3.插入学生成绩          ***      4.删除学生成绩           *"<<endl;
cout<<"       *       5.查询学生成绩          ***      6.显示学生成绩           *"<<endl;
cout<<"       *       7.按照成绩排序          ***      8.显示不及格的人数       *"<<endl;
cout<<"                                    9.退出系统                           "<<endl;
cout<<"输入命令(数字标号):";
cin>>order;
switch(order)
{
case 1:	L.CreatList();break;
case 2:	L.Display();;break;
case 3:	L.InsertList();break;
case 4:	L.DeleteList();;break;
case 5:	L.Find();break;
case 6:	L.ListSize();break;
case 7:	L.BubbleSortList();break;
case 8: L.Count();break;
case 9:	flag=0;break;
}
cout<<endl;
}
question:	cout<<"您确定要退出吗?(Y/N): ";
cin>>a;
if(!strcmp(a,"Y")||!strcmp(a,"y"))
{
cout<<"欢迎下次再使用本系统,谢谢!"<<endl;
confirm=0;
}
else if(!strcmp(a,"N")||!strcmp(a,"n"))flag=1;
else
{
cout<<"您输入的命令不正确,请重新输入!"<<endl;
goto question;
}
}
system("pause");
return 0;
}


(1)输入成绩运行结果如下:



(2)输出成绩运行结果如下:



(3)删除成绩运行结果如下:



(4)显示学生总数运行结果如下:



(5)查找成绩运行结果如下:



(6)插入成绩运行结果如下:





(8)显示不及格的人数运行结果如下:



 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: