数据结构课程设计 成绩管理系统

来源:互联网 发布:如何查看服务器域名 编辑:程序博客网 时间:2024/05/25 18:10
/**********************************************
*文件名称:学生成绩管理系统
*文件标识:无
*内容摘要:实现学成成绩的输入、插入、删除、修改、排序和输出
*其他内容:无
*当前版本:codeblocks
*作者:宋雨静
*完成日期:2016.12.29
*版本号:codeblocks

*************************************************/

                                              


                                                     main.cpp


#include"chengji.h"
struct LNode *head=NULL;//全局变量的头结点,里面有第一个学生的信息
int main()
{  
read(); 
Menu();
   return 0;
}










                                                   chengji.h
#ifndef chengji
#define chengji
#include <string>  //string 类型
using namespace std;
typedef struct LNode//学生结构体

    string name;
string num;
string classname;
float Cmark;
float Math;
float English;
    struct LNode *next;//指针域,指向后继节点
} LinkList;


void addstudent(LNode *a);//添加学生函数的声明
int num(LNode *a);//判断学号是否重复的函数的声明
void NewNode();//创建新的一个学生结构体,新节点
void read();//从文件中读取信息
void DestroyList(LinkList *&head);//销毁线性表
void ListLength(LinkList *L);//求学生个数
void DispList();//输出线性表
void deletestudent();//删除学生信息
void findstudentname();//按姓名查找学生
void findstudentnum();//按学号查找学生
void ChangeMarkByNum();//根据学号修改学生成绩
void shuchujiedian(LNode *p);//输出一个结点信息
void DesplayMarkSegment();//输出不及格的学生成绩
void paixu();//按平均成绩排序并输出成绩
void Save();//保存链表数据到文件
void Menu();//显示菜单
#endif
































         
                                              chengji.cpp
#include <iostream>
#include<stdio.h>
#include<conio.h>//catch() 任意键继续
#include <windows.h>//system("cls") 清屏






#include"chengji.h"
extern struct LNode *head;
/************************************
* 功能描述:申请一个新结点,并将其初始化
* 输入参数:无
* 输出参数:无
************************************/
void InitList(LinkList *&L)//创建一个头结点
{    
L=(LinkList *)malloc(sizeof(LinkList));  
L->next=NULL;
}
/************************************
* 功能描述:创建新的一个学生结构体,新节点。
* 输入参数:无
* 输出参数:无
************************************/
void NewNode()// 创建完成调用addstudent()函数将新节点尾插法插入链表
{
        LNode *a;
a=new LNode;//申请空间
cout<<"学生姓名"<<endl;
cin>>a->name;
cout<<"学生学号"<<endl;
cin>>a->num;
cout<<"学生班级: "<<endl;
cin>>a->classname;
cout<<"c语言:  "<<endl;
cin>>a->Cmark;
cout<<"高数:   "<<endl;
cin>>a->Math;
cout<<"英语    "<<endl;
cin>>a->English;
addstudent(a);
}
/************************************
* 功能描述:从文件中读学生信息到链表中
* 输入参数:无
* 输出参数:无
************************************/
void read()//从文件中读取信息
{
    FILE *fp;
    LNode *p;
    fp=fopen("d://bing.txt","r");//以可读方式打开bing.txt文件
    if(!fp)
    {
      
        return;
    }
    p=new LNode;
char z[30];//临时的字符数组,用来装TXT中的字符串
char b[30];
char c[30]; 
string e,f,g;
    while(fscanf(fp,"%s %s %s %f %f %f\n",z,b,c,&p->Cmark,&p->Math,&p->English)>0)//将TXT文件中第一行数据写入到P节点的各项内容中
    {
string e (z);//将字符数组转化为string类型。
string f (b);
string g (c);
p->name=e;
p->num=f;
p->classname=g;
addstudent(p);//添加该节点P到链表中
        p=new LNode;//再次为P申请新的空间
    }
    fclose(fp);//关闭文件
}
void addstudent(LNode *a)//添加学生
{
   LNode *p;
if(head==NULL)//如果链表为空
{
head =a;
a->next=NULL;
return;//插入完成返回
}
else
{
if(num(a)==1)//判断学号是否重复
{
    p = head;//从头结点开始找
     while(p)//p非空则一直循环
 {
  if(p->next==NULL)//找到尾节点
  {
    p->next =a;
   a->next =NULL;
return;//插入完成返回
  }
   p= p->next;//找下一个节点
 }
}
else
cout<<"学号已重复"<<endl;


}
}
/************************************
* 功能描述:销毁线性表
* 输入参数:无
* 输出参数:无
************************************/
void DestroyList(LinkList *&head)//销毁线性表
{    
LinkList *pre=head,*p=head->next; //准备好前驱后置指针 
while (p!=NULL)   
{        
free(pre);//释放内存空间
pre=p;      
p=pre->next; 
}   
free(pre);
head=NULL;
cout<<"学生信息已清空"<<endl;
}
void ListLength(LinkList *L)//求学生个数
{    int n=0;  
  LinkList *p=L; 
  while (p->next!=NULL)
  {      
 n++;   
 p=p->next; 
  } 
  cout<<"一共有"<<n+1<<"个学生."<<endl;
}
/************************************
* 功能描述:显示所有学生的信息
* 输入参数:无
* 输出参数:输出学生的姓名、学号、
*            班级、三个成绩
************************************/
void DispList()//输出线性表
{    
LinkList *p=head;  
if(head==NULL)
{
cout<<"现在还没学生信息,请先输入学生信息"<<endl;
return;
}
else
{
   
while (p!=NULL)  
 {   
       
cout<<"************************"<<endl;
cout<<"学生姓名: "<<p->name<<endl;
cout<<"学生学号: "<<p->num<<endl;
cout<<"学生班级: "<<p->classname<<endl;
cout<<"c语言:    "<<p->Cmark<<endl;
cout<<"数学:     "<<p->Math<<endl;
cout<<"英语:     "<<p->English<<endl;
cout<<"平均成绩: "<<(p->Cmark+p->Math+p->English)/3<<endl;
cout<<"总成绩:   "<<p->Cmark+p->Math+p->English<<endl;
cout<<"************************"<<endl;


        p=p->next;
 }
}
ListLength(head);
}
/************************************
* 功能描述:根据输入的学号删除学生信息
* 输入参数:学生学号
* 输出参数:无
************************************/
void deletestudent()//删除学生信息
{
string num;
int m;
LNode *p,*pre;
cout<<"请输入要删除学生的学号:";
   cin>>num;
 if (head==NULL)
 {
 cout<<"学号输入有误"<<endl;
     return;
 }
 else
 {
    p=pre=head;
while(p)
{
     if (p->num==num)
 {
    cout<<"学生姓名: "<<p->name<<endl;
        cout<<"学生学号: "<<p->num<<endl;
                 cout<<"学生班级: "<<p->classname<<endl;
        cout<<"c语言:    "<<p->Cmark<<endl;
cout<<"数学:     "<<p->Math<<endl;
cout<<"英语:     "<<p->English<<endl;
    cout<<"是否要删除学生成绩?"<<endl;
    cout<<" 1.是    2.不是    "<<endl;
    cin>>m;
if(m==1)
{
if(p==head)
{
head = head->next;
free(p);
p=NULL;
cout<<"学生成绩信息已删除!"<<endl;
return;
}
 else
 {
pre->next =p->next;
free(p);
p=NULL;
cout<<"学生成绩信息已删除!"<<endl;
return;
 }
}


if(m==2)
{
return;
}
}
             else
 {
pre=p;
p=p->next;
 }

 }
}
cout<<"学号输入有误"<<endl;

}
/************************************
* 功能描述:根据输入的姓名查找成绩
* 输入参数:学生姓名
* 输出参数:无
************************************/
void findstudentname()//按姓名查找学生
{
   string name;
cout<<"请输入要查找的学生姓名"<<endl;
cin>>name;
LNode *p=head;
if (head==NULL)
{
cout<<"现在还没学生信息,请先输入学生信息"<<endl;
return;
}
p=head;
while(p)
{
  if (p->name==name)
  {
    cout<<"学生姓名: "<<p->name<<endl;
       cout<<"学生学号: "<<p->num<<endl;
                cout<<"学生班级: "<<p->classname<<endl;
       cout<<"c语言:    "<<p->Cmark<<endl;
cout<<"数学:     "<<p->Math<<endl;
cout<<"英语:     "<<p->English<<endl;
return;
  }
   p= p->next;


}
cout<<"没有该学生!"<<endl;
 
}
/************************************
* 功能描述:根据输入的学号查找成绩
* 输入参数:学生学号
* 输出参数:无
************************************/
void findstudentnum()//按学号查找学生
{
        string num;
cout<<"请输入要查找的学生学号"<<endl;
cin>>num;
LNode *p=head;
if (head==NULL)
{
cout<<"现在还没学生信息,请先输入学生信息"<<endl;
return;
}
p=head;
while(p)
{
  if (p->num==num)
  {
    cout<<"学生姓名: "<<p->name<<endl;
       cout<<"学生学号: "<<p->num<<endl;
                cout<<"学生班级: "<<p->classname<<endl;
       cout<<"c语言:    "<<p->Cmark<<endl;
cout<<"数学:     "<<p->Math<<endl;
cout<<"英语:     "<<p->English<<endl;
return;
  }
   p= p->next;


}
cout<<"没有该学生!"<<endl;


}
/************************************
* 功能描述:判断学号是否重复
* 输入参数:无
* 输出参数:无
************************************/
int num(LNode *a)//判断学号是否重复
{
LNode *p=head;
while(p)
{
  if (p->num==a->num)
  {
return 0;  
  }
   p= p->next;
}
    return 1;
}
/************************************
* 功能描述:根据输入的学号修改成绩
* 输入参数:学生学号
* 输出参数:无
************************************/
void ChangeMarkByNum()//根据学号修改学生成绩
{
    LNode *p;//////////
    string num;
int m;
    float mark1;
float mark2;
float mark3;
    p=head;//////////
    cout<<"请输入学生学号: "<<endl;
    cin>>num;
    while(p)
    {
        if(p->num==num)
        {
            cout<<"学生姓名: "<<p->name<<endl;
   cout<<"学生学号: "<<p->num<<endl;
cout<<"学生班级: "<<p->classname<<endl;
   cout<<"c语言:    "<<p->Cmark<<endl;
cout<<"数学:     "<<p->Math<<endl;
cout<<"英语:     "<<p->English<<endl;
            cout<<"是否要修改学生成绩?"<<endl;
cout<<" 1.是    2.不是    "<<endl;
cin>>m;
if(m==1)
{
cout<<"请输入新的c语言成绩"<<endl;
cin>>mark1;
cout<<"请输入新的高数成绩"<<endl;
cin>>mark2;
cout<<"请输入新的英语成绩"<<endl;
cin>>mark3;
p->Cmark=mark1;
p->Math=mark2;
p->English=mark3;
cout<<"成绩修改成功!"<<endl;
cout<<"学生姓名: "<<p->name<<endl;
       cout<<"学生学号: "<<p->num<<endl;
cout<<"学生班级: "<<p->classname<<endl;
       cout<<"c语言:    "<<p->Cmark<<endl;
cout<<"数学:     "<<p->Math<<endl;
cout<<"英语:     "<<p->English<<endl;
return;
}
if(m==2)
{
cout<<"学生成绩保留!"<<endl;
return;
}
            break;
        }
        p=p->next;
    }
//////////////
       cout<<"对不起,不存在学号为"<<num<<"的学生"<<endl;
}
/************************************
* 功能描述:输出一个结点信息
* 输入参数:无
* 输出参数:输出学生的姓名、学号、
*            班级、成绩1、成绩2、成绩3
************************************/
void shuchujiedian(LNode *p)//输出一个结点信息
{
   cout<<"************************"<<endl;
cout<<"学生姓名: "<<p->name<<endl;
cout<<"学生学号: "<<p->num<<endl;
cout<<"学生班级: "<<p->classname<<endl;
cout<<"c语言:    "<<p->Cmark<<endl;
cout<<"数学:     "<<p->Math<<endl;
cout<<"英语:     "<<p->English<<endl;
cout<<"平均成绩: "<<(p->Cmark+p->Math+p->English)/3<<endl;
        cout<<"************************"<<endl;
}
/************************************
* 功能描述:不及格学生成绩
* 输入参数:无
* 输出参数:不及格的信息
************************************/
void DesplayMarkSegment()//输出不及格的学生成绩
{
      LNode *p=head;
 int count=0;
 cout<<"60分以下(不及格)的学生成绩如下: "<<endl;
 while(p)
 {
 if(p->Cmark<60 || p->Math<60 || p->English<60)
 {
 count++;
 shuchujiedian(p);
 }
 p=p->next;
 }
 cout<<"不及格的学生一共有"<<count<<"人"<<endl;
}


/************************************
* 功能描述:按平均成绩排序
* 输入参数:无
* 输出参数:无
************************************/
void paixu()//按平均成绩排序并输出成绩
{
LNode change,*p,*q,*r;
r=head;
if(r==NULL)
{
cout<<"现在还没学生信息,请先输入学生信息"<<endl;
return;
}
 while(r)
 {
    p=r;
q=r->next;
    while(q)
{
if((q->Cmark+q->Math+q->English)>(p->Cmark+p->Math+p->English))
{
change.name=q->name;//将q结点的信息给change
change.num=q->num;
change.Cmark=q->Cmark;
change.Math=q->Math;
change.English=q->English;

q->name=p->name;//将p结点的信息给q
q->num=p->num;
q->Cmark=p->Cmark;
q->Math=p->Math;
q->English=p->English;


p->name=change.name;//将change结点的信息给p
p->num=change.num;
p->Cmark=change.Cmark;
p->Math=change.Math;
p->English=change.English;
}
q=q->next;
}
r=r->next;
 }
 DispList();//输出
}
/************************************
函数功能:保存链表数据到文件中
************************************/
void Save()//保存链表数据到文件 
{  
    LNode *p;  
    FILE *fp;  
    p=head;  
    if(p==NULL)  
    {  
        printf("现在没有学生信息,请先输入学生信息\n\n");  
        return;  
    }  
    fp=fopen("d://bing.txt","w+");//以写方式创建bing.txt文件,若文件已存在则以不覆盖之前内容的写方式打开。 
    if(!fp)  
    {  
        printf("文件不存在\n");  
        return;  
    }  
    while(p)  
    {  
       fprintf(fp,"%s %s %s %f %f %f\n",p->name.c_str(),p->num.c_str(),p->classname.c_str(),p->Cmark,p->Math,p->English);
        p=p->next;  
    }  
    fclose(fp);  

/************************************
* 功能描述:显示菜单,根据用户的输入
*            完成相应的功能
* 输入参数:你要选择的功能的序号
* 输出参数:选择的功能
************************************/ 
void Menu()
{

    int choose;


                printf("   ***************请选择相应功能*****************\n\n");
                printf("  |             1 添加学生成绩信息             |\n");
                printf("  |             2 输出当前所有学生成绩信息     |\n");
                printf("  |             3 按姓名查找学生成绩信息       |\n");
                printf("  |             4 删除学生成绩信息             |\n");
                printf("  |             5 按学号查找学生成绩信息       |\n");
                printf("  |             6 输出不及格的学生             |\n");
                printf("  |             7 根据学号修改学生成绩         |\n");
                printf("  |             8 保存所有学生信息             |\n");
                printf("  |             9 按平均成绩排序并输出成绩     |\n");
                printf("  |             10 清空所有学生信息            |\n\n");
printf("   ********************************************|\n");
    scanf("%d",&choose);/*取得用户的选择*/
    switch(choose)
    {
    case 1:
        system("cls");
NewNode();
        //创建新的一个学生结构体,新节点
cout<<"按任意键继续"<<endl;
        getch();
        break;
    case 2:
        system("cls");
   DispList(); 
//输出学生信息
        cout<<"按任意键继续"<<endl;
getch();
        break;
    case 3:
        system("cls");
        findstudentname();
//根据姓名查找学生信息
cout<<"按任意键继续"<<endl;
        getch();
        break;    
    case 4:
       system("cls");
  deletestudent();
  //删除学生信息
  cout<<"按任意键继续"<<endl;
       getch();
       break;
    case 5:
       system("cls");
       findstudentnum();
  //按照学生学号查找信息
        cout<<"按任意键继续"<<endl;
        getch();
        break;
    case 6:
       system("cls");
       DesplayMarkSegment();
  //输出不及格的学生成绩
        getch();
        break;
    case 7:
       system("cls");
       ChangeMarkByNum();
       /*根据用户输入的学号修改学生成绩*/
        getch();
        break;
    case 8:
       system("cls");
   Save();
        /*保存数据*/
        break;
    case 9:
        system("cls");
         paixu();
        getch();
/*按平均成绩排序*/
        break;
    case 10:
       system("cls");
       DestroyList(head);
  //清空学生信息
        getch();
        break;
    default:
        break;
    }
    Menu();/*菜单函数*/
}
0 0
原创粉丝点击