课程设计之学生成绩管理系统

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

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

头文件

 chengji.h


#ifndef chengji
#define chengji
#include  //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
#include
#include//catch() 任意键继续
#include //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<<"学生姓名"<cin>>a->name;
cout<<"学生学号"<cin>>a->num;
cout<<"学生班级: "<cin>>a->classname;
cout<<"c语言:  "<cin>>a->Cmark;
cout<<"高数:   "<cin>>a->Math;
cout<<"英语    "<cin>>a->English;
addstudent(a);
}
/************************************
* 功能描述:从文件中读学生信息到链表中
* 输入参数:无
* 输出参数:无
************************************/
void read()//从文件中读取信息
{
    FILE *fp;
    LNode *p;
    fp=fopen("d://zou.txt","r");//以可读方式打开zou.txt文件
    if(!fp)
    {
        printf("文件不存在\n");
        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<<"学号已重复"<

}
}
/************************************
* 功能描述:销毁线性表
* 输入参数:无
* 输出参数:无
************************************/
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<<"学生信息已清空"< }
void ListLength(LinkList *L)//求学生个数
{    int n=0;  
  LinkList *p=L; 
  while (p->next!=NULL)
  {      
 n++;   
 p=p->next; 
  } 
  cout<<"一共有"< }
/************************************
* 功能描述:显示所有学生的信息
* 输入参数:无
* 输出参数:输出学生的姓名、学号、
*            班级、三个成绩
************************************/
void DispList()//输出线性表
{    
LinkList *p=head;  
if(head==NULL)
{
cout<<"现在还没学生信息,请先输入学生信息"<return;
}
else
{
   
while (p!=NULL)  
 {   
       
cout<<"************************"<cout<<"学生姓名: "<name<cout<<"学生学号: "<num<cout<<"学生班级: "<classname<cout<<"c语言:    "<Cmark<cout<<"数学:     "<Math<cout<<"英语:     "<English<cout<<"平均成绩: "<<(p->Cmark+p->Math+p->English)/3<cout<<"总成绩:   "<Cmark+p->Math+p->English<cout<<"************************"<

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


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

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


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


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

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


/************************************
* 功能描述:按平均成绩排序
* 输入参数:无
* 输出参数:学生成绩信息
************************************/
void paixu()//按平均成绩排序并输出成绩
{
LNode change,*p,*q,*r;
r=head;
if(r==NULL)
{
cout<<"现在还没学生信息,请先输入学生信息"<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://zou.txt","w+");//以写方式创建zou.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<<"按任意键继续"<         getch();
        break;
    case 2:
        system("cls");
   DispList(); 
//输出学生信息
        cout<<"按任意键继续"<getch();
        break;
    case 3:
        system("cls");
        findstudentname();
//根据姓名查找学生信息
cout<<"按任意键继续"<         getch();
        break;    
    case 4:
       system("cls");
  deletestudent();
  //删除学生信息
  cout<<"按任意键继续"<        getch();
       break;
    case 5:
       system("cls");
       findstudentnum();
  //按照学生学号查找信息
        cout<<"按任意键继续"<         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();/*递归调用*/
}


主函数

 main.cpp




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

}


结果显示:

(1)主界面

课程设计之学生成绩管理系统_第1张图片


(2)添加学生

课程设计之学生成绩管理系统_第2张图片


(3)输出学生信息

课程设计之学生成绩管理系统_第3张图片


(4)按姓名查找

课程设计之学生成绩管理系统_第4张图片


(5)删除

课程设计之学生成绩管理系统_第5张图片


(6)按学号查找

课程设计之学生成绩管理系统_第6张图片


(7)输出不及格

课程设计之学生成绩管理系统_第7张图片


(8)按照平均成绩排序

课程设计之学生成绩管理系统_第8张图片


你可能感兴趣的:(编程语言,编辑语言)