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

/**********************************************
*文件名称:学生成绩管理系统
*文件标识:无
*内容摘要:实现学成成绩的输入、插入、删除、修改、排序和输出
*其他内容:无
*当前版本:codeblocks
*作者:张冰
*完成日期:2016.12.29
*版本号:codeblocks

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

头文件:

#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

 

函数代码:

 

#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();/*菜单函数*/
}

 

主函数:

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

 read();
 Menu();
   return 0;
}

运行结果:

 

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值