用c++输入输出来编程c语言的学生管理系统(源代码) 有清晰的解释,因为写给自己看的,最好自己写一遍,仅供参考

1 篇文章 0 订阅

#include<iostream>
#include <stdio.h>                                                     //有一个输入的方法不会用c++的输入输出 
#include<stdlib.h>                                                     //动态内存分配空间 
#include<string.h>                                                     //字符串处理函数*********** 
using namespace std;

struct student                                                         //构造结构体                                       
{
    int id;                                                            //学号                                   
    int age;                                                           //年龄 
    char name[20];                                                     //名字 
    char sex[5];                                                       //性别 
    int c1;
    int c2;
    int c3;                                                            //c1, c2, c3,                                                                  
    int sum;
    struct student*next;                                               //next是指向student结构体变量 
}; 
student list;                                                          // 链表 (非常重要) 头节点 


//函数的声明如下 
void welcome();
void insertA();                                                         //输入(1)学生信息函数,简单的打印 
void insertB(student *a, student b);                                   //输入(2)学生信息的函数,需要用头插法来插入结点 
void readFile(student *L);                                              //文件(1)的读取,为了形成链表,才可以插入 
void saveFile(student *L);                                              //文件(2)的保存(!!!!!!!!!!!!好好看多几次 ) 
void searchSum(student* L);                                            //总的寻找(1)学生在该函数中实现 
student* searchId (int id, student *L);                                //根据*学号*寻找(2)学生!
student* searchName (char name[], student *L);                        //根据*名字去*寻找(3)学生 
void deleteA(student *L);                                             //删除学生信息的页面 
void deleteB(student *L);                                             //删除学生信息的主要函数 
void  fixA(student *L);                                                //修改学生信息 
void coutt(student *L);                                                 //学生的信息 清单 
void averageHL(student* L);                                            //按照学生成绩的高低来输出学生的信息 
void average(student* L);                                               //平均分的函数 
void numberSore(student* L);                                            //各分数段人数的统计 


//主函数 
int main(){  //****************************************************************************************main函数                                              
int a=0, b, number=1;                                                
while(number){
readFile(&list);                                                       //读取文件
welcome();                                                              //首页面 
cin>>number;                                                            //需要查询的选择
switch(number)
{
    case 0 : return 0;                                                         //退出系统 
    case 1 : insertA();                                                    //录入,增加学生的信息函数的调用
    break; 
    case 2 : searchSum(&list);                                             //通过名字,学号来寻找学生信息 
    break; 
    case 3 : deleteA(&list);
    break;
    case 4 : fixA(&list);
    break; 
    case 5 : coutt(&list);
    break;
    case 6 :averageHL(&list);
    break;
    case 7 :average(&list);
            numberSore(&list);
}
if(number<0||number>7)
{
    cout<<"输入的选择有误!"<<endl; 
 } 
cout<<"是否继续进行页面的操作?(1/0)"<<endl;
cin>>a;
/*if(a==1){
welcome();}*/
if(a!=1){
    if(a==0)   break;
    if(a!=0)
    {
    cout<<"本次输入错误!是否继续进行页面的操作?(1/0)"<<endl;
    cout<<"1.重新输入!  0.退出!"<<endl;
    cin>>b;
    if(b==0)
     {
    break;
    }
    }}}    
return 0; 
}  //************************************************************************************************main函数


//主页面的函数,菜单 
void welcome()
{
cout<<"\t\t\t    "<<"学生管理系统"<<endl;
cout<<"---------------------------------------------------------------------"<<endl;
cout<<"\t\t"<<"请输入序号0~9来查询或者填入相应的内容"<<endl; 
cout<<"---------------------------------------------------------------------"<<endl;
cout<<"\t\t\t"<<"1:录入学生信息"<<endl; //(get)                                //需要文件来储存数据 
cout<<"\t\t\t"<<"2:按学号,名字查找学生信息"<<endl; //(get)                
cout<<"\t\t\t"<<"3:删除学生信息"<<endl;  //(get) 
cout<<"\t\t\t"<<"4:修改学生信息"<<endl;  //(get)
cout<<"\t\t\t"<<"5:按照录入先后输出学生信息清单"<<endl;  //(get)  头插法! 
cout<<"\t\t\t"<<"6:按照平均分高低输出学生信息清单"<<endl;//***************
cout<<"\t\t\t"<<"7:各分数段人数,平均分"<<endl;//*************** 
cout<<"\t\t\t"<<"0:退出系统"<<endl;
}


//问:读取文件的目的是什么?
//把文件在文件夹中读取出来
//本来就已经形成链表了,只是需要重新读取 
 void readFile(student *L)                                          //读取文件 ,文件的操作 (内含链表关键的知识) 
 {
 FILE *fpr=fopen("学生信息文件5.txt","r");                          //r表示只读 
 /*打开这个file,把他们连接起来,形成链表(非常关键)
 必须是形成了链表才有下面的操作,才可以使用头插法插入数据,删除。。。。*/ 
 student st;
 student *s;
 student *t=L;
 
 if(fpr==NULL)
 {
  return ;
 }
 else
 {
 while(fscanf(fpr,"%d %s %d %s %d %d %d %d",&st.id,&st.name,&st.age,&st.sex,&st.c1,&st.c2,&st.c3,&st.sum)!=EOF)    //这是一个循环体,目的是形成链表 
 { 
  //fscanf()
   s=(student *)malloc(sizeof(student));                   
   *s=st;                                                 //为什么不写成s=st ;因为s是一个指针,st不是,要取他的值所以就是取*s; 
   t->next=s;
   t=s;                                                    //这一步非常关键,t指针指向s的内容 
   t->next=NULL;                                           
  }
 }
 fclose(fpr);//关闭文件指针 
 return ;
}


//保存文件函数 
//非常关键!!! 
void saveFile(student *L)                                                         
{
 FILE *fpw=fopen("学生信息文件5.txt","w");        //写文件                                
 if(fpw==NULL)                                    //如果没有开辟出新的空间 
 {
 return ;
 }
 
 student* p=L->next;                                    //指针p指向L的下一个结点 
 while(p!=NULL)
 {
  fprintf(fpw,"%d %s %d %s %d %d %d %d\n",p->id,p->name,p->age,p->sex,p->c1,p->c2,p->c3,p->sum);
  p=p->next;                                           
 }
 fclose(fpw);//关闭文件指针
 return ; 
}


//插入学生信息(1)
//插入学生信息的框架 
void insertA()                                                    
{
    student p1;
    int a;
    do{
    cout<<"请输入学生的学号:"<<endl; 
     cin>>p1.id;
    cout<<"请输入学生的名字:"<<endl;
    cin>>p1.name;
    cout<<"请输入学生的年龄:"<<endl; 
     cin>>p1.age;    
     cout<<"请输入学生的性别(m/f):"<<endl; 
     cin>>p1.sex;
     cout<<"请输入学生高数的成绩:"<<endl; 
    cin>>p1.c1;
     cout<<"请输入学生线代的成绩:"<<endl; 
    cin>>p1.c2;
     cout<<"请输入学生c语言的成绩:"<<endl; 
     cin>>p1.c3;
     p1.sum=p1.c1+p1.c2+p1.c3;                                      //这里有写总分数 (为什么会错)?????????? 
     insertB(&list, p1);                                            //不能写void(早已知道)只是需要注意 
     cout<<"是否需要继续输入学生信息(1/0)"<<endl;
     cout<<"1:继续输入  0:退出"<<endl;
    cin>>a;
    if(a!=1)                                                        //如果输入的选择不是1/0,需要有容错 
    {
        if(a!=0)
        {
            cout<<"本次输入的选择有误!!"<<endl;
            return;
        }
    }
    if(a==0)
     {
        return;
     } 
    }while(a==1);
 } 
 
 
 //插入学生信息(2)   头插法 !!!!!!!!!!!!!!!!! 
 void insertB(student *L, student b)                               
 {
     student *c=L;                                                  //为什么一定要让一个指针c等于a,为什么不可以直接用?(因为要移动) 
     student *d=(student*)malloc(sizeof(student));                  //初步理解:指针d的指向开辟了一个空间 
     *d=b;                                                          //b的内容存放在d指向的空间中
    d->next=c->next;                                               //d指向空间中的next指针域指向指针c所指向的空间(节点)的下一个节点
    c->next=d;                                                     //c指向空间中的next指针域指向d所指向的空间(节点) 
    saveFile(L);                                                   //保存文件 注意文件知识
 }
 

/*寻找学生信息总函数(1) ,寻找学生信息的主函数,容错率很高,
比如说不小心输入了的数字不是判断(1、0)或者选择非1,2,0等数字,
它会出现相应的提醒和循环!!!!! 
*/ 
void searchSum(student* L)                    
{
    int a, id, b=0;                          //b来判断输入的信息是否正确 
    student* c;                              //存放前面函数return的内容 
    do{                                      //循环输入或者退出 
    char name[20]; 
    cout<<"1.输入学生的学号:"<<endl; 
    cout<<"2.输入学生的名字:"<<endl;
    cout<<"选择(1/2)?"<<endl;
    cin>>a;
    //分隔 
    if(a==1)
    {
    cout<<"请输入学生的学号:";
    cin>>id;
    c=searchId (id, L);            //注意的是这个c找到的是要找到内容的上一位(还要有c=c-next) 
        if(c==NULL)
    {  
        b=1;
        cout<<"输入有误! ";
        cout<<"是否继续查找学生信息:"<<endl;
        cout<<"1.继续输入  0.退出输入 (1/0)"<<endl; 
        cin>>b;
    }
        else
    {
        c=c->next;
        b=0;                         //非常关键,要是输入错误的话b的值1,然后正确之后b要归0(避免循环); 
    cout<<"|学号\t|名字\t|年龄\t|性别\t|高数\t|线代\t|c语言\t|总分|"<<endl;
    cout<<"  "<<c->id<<"\t "<<c->name<<"   "<<c->age<<"\t  "<<c->sex<<"\t  "<<c->c1<<"\t  "<<c->c2<<"\t  "<<c->c3<<"\t  "<<c->sum<<"\t  "<<endl;
    cout<<"是否需要继续根据学生学号查询?(1.yes/0.no)"<<endl;
    cin>>b;
    if(b!=1)
    {
        if(b!=0)
        {
            cout<<"本次输入有误!"<<endl;
            return; 
        }
    }
    }}
    //分隔 
    
    
    if(a==2)
    {
    cout<<"请输入学生的名字:";
    cin>>name;
    c=searchName (name, L);       
    if(c==NULL)
    {
        b=1;
        cout<<"输入有误! ";
        cout<<"是否继续查找学生信息:"<<endl;
        cout<<"1.继续输入  0.退出输入 (1/0)"<<endl; 
        cin>>b;
    }
    else
    {
        c=c->next; 
        b=0;                           //非常关键,要是输入错误的话b的值为1,然后正确之后b要归0(跳出循环);
    cout<<"|学号\t|名字\t|年龄\t|性别\t|高数\t|线代\t|c语言\t|总分|"<<endl;
    cout<<"  "<<c->id<<"\t "<<c->name<<"   "<<c->age<<"\t  "<<c->sex<<"\t  "<<c->c1<<"\t  "<<c->c2<<"\t  "<<c->c3<<"\t  "<<c->sum<<"\t  "<<endl;
    cout<<"是否需要继续根据学生名字查询?(1.yes/0.no)"<<endl;
    cin>>b;
    if(b!=1)
    {
        if(b!=0)
        {
            cout<<"本次输入有误!"<<endl;
            return; 
        }
    }
    }}
    
    if(a!=1)
    {
        if(a!=2)
        {
            cout<<"本次输入有误!请重新输入!"<<endl;
            b=1; 
        }
    }
}while(b==1);
}


//根据*学号*寻找学生! (2) 
//利用循环一个一个来查找学号,技术的关键是p->next!=NULL;和p=p->next(即p的下个空间由p指向,简单说便是p下移动了一个位置) 
// 注意的点是返回值类型是student*,是一个指针类型,注意return时候是返回p(指针),而不是*p( 指针里面地址所指向的内容) 
student* searchId (int id, student *L)                                
{
    student *p=L;
    while(p->next!=NULL)
    {
        if(p->next->id==id)
        {
            return p;                                                         //为什么不用*p????  因为她返回的是一个指针 *p指的是指针里面地址的内容 
        }
        p=p->next;
    }
    return NULL;                                                     
 } 
 
 
//根据*名字去*寻找学生(3)
//与以上学号的重点一样,这里需要注意的是name是一个char类型的,要写成数组的形式(这是关键) 
 student* searchName (char name[], student *L)                         
 {
     student *p=L;
     while(p->next!=NULL)
     {
         if(strcmp(name,p->next->name)==0)                                              //因为是数组,所以写的形式不一样(为什么这么写还没解决)不能写成p->name=name                                      
         {
         return p;                                                      //为什么不用*p???? 因为她返回的是一个指针 *p指的是指针里面地址的内容
         }
         p=p->next; 
     }
     return NULL;                                                        
 }
 
 
//删除学生信息
//简单的一些逻辑思维
//容错率大幅度提高
//输入错误之后不会返回主函数,而是再函数中循环
//大大增强了实用性 
 void deleteA(student *L)                                             
 {
     int a, b, d=0, id, e;
     char name[20]; 
     student *c, *h, *f;
     do{
     cout<<"根据(1.学号/2.名字)来删除学生信息"<<endl;
    cin>>e;
    if(e==1)
    {
        cout<<"请输入学生的学号:";
        cin>>id;
          c=searchId (id, L);                                                      
          if(c!=NULL) 
          {
              c=c->next;
          cout<<"|学号\t|名字\t|年龄\t|性别\t|高数\t|线代\t|c语言\t|总分|"<<endl;
        cout<<"  "<<c->id<<"\t "<<c->name<<"   "<<c->age<<"\t  "<<c->sex<<"\t  "<<c->c1<<"\t  "<<c->c2<<"\t  "<<c->c3<<"\t  "<<c->sum<<"\t  "<<endl;
        do
        {
        cout<<"是否确定需要删除该学生信息(1/0)"<<endl;
        cout<<"1.yes/0.no"<<endl;
        cin>>b; 
        if(b==1)
        {
            h=searchId(id,L);                                            //引入这一步是因为前面有c=c->next,c指向了下一位(非常重要) 
            deleteB(h);                                                  //删除学生信息           
            cout<<"已删除该生的信息!"<<endl;
            d=0;                                                         //这一步非常重要!!!!! 
        }
        
        if(b!=1){
            if(b==0)
              break;
              if(b!=0)
              {
                  cout<<"输入的选择有误!请重新输入或者退出"<<endl;
                  cout<<"1.重新输入  0.退出"<<endl;
                  cin>>d;
             }                                                       
          }
        }while(d==1);
        }
        else
        {
            a=0;
            cout<<"输入的名字有误,是否需要重新输入(1/0)"<<endl;
            cout<<"1.重新输入/0.退出!"<<endl; 
            cin>>a;
        }
        }
    if(e==2) 
    {
        cout<<"请输入学生的名字:";
        cin>>name; 
        c=searchName(name, L); 
        if(c!=NULL)            
        {
            c=c->next;
        cout<<"|学号\t|名字\t|年龄\t|性别\t|高数\t|线代\t|c语言\t|总分|"<<endl;
        cout<<"  "<<c->id<<"\t "<<c->name<<"   "<<c->age<<"\t  "<<c->sex<<"\t  "<<c->c1<<"\t  "<<c->c2<<"\t  "<<c->c3<<"\t  "<<c->sum<<"\t  "<<endl;
        do
        {
        cout<<"是否确定需要删除该学生信息(1/0)"<<endl;
        cout<<"1.yes/0.no"<<endl;
        cin>>b; 
        if(b==1)
        {
            h=searchName(name, L);
            deleteB(h);
            cout<<"已删除该生的信息!"<<endl;
            d=0;                                                                //这一步非常重要 
        }
         if(b!=1){
            if(b==0)
              break;
              if(b!=0)
              {
                  cout<<"输入的选择有误!请重新输入或者退出"<<endl;
                  cout<<"1.重新输入  0.退出"<<endl;
                  cin>>d;
             }                                                       
          }
        }while(d==1);}
        else
        {
            a=0;
            cout<<"输入的名字有误,是否需要重新输入(1/0)"<<endl;
            cout<<"1.重新输入/0.退出!"<<endl; 
            cin>>a;
        }}
        }while(a==1);
     //deleteB(c->next);
     saveFile(L);                                     
}


//删除函数的逻辑
//利用要删除函数指向NULL 
void deleteB(student *L)                            //L表示的是找到数据的前一位那一个地址   
{
 student *p=L->next; 
 L->next=p->next;
 p->next=NULL;
 free(p);//释放结点空间
}
 
 
//测试完成!没有问题! 
//简单的逻辑,就不多解释了
//主要得步骤是靠switch来实现 
//容错率很高,不用担心输出错误,还是需要继续优化 
void  fixA(student *L)                                                     //t=t->next的意思是读取下一位,让t等于下一位  
{
    int a, id, b, d, e;
    student *c;
    char name[20];
    do{
    cout<<"请问是需要通过学号还是名字对学生进行查找并修改:"<<endl;
    cout<<"1.学号  2.名字  0.退出"<<endl;
    cin>>a;
    if(a==1)
    {
        cout<<"请输入修改学生的学号:"<<endl;
        cin>>id;
        c=searchId (id, L);
        if(c!=NULL)
        {
            c=c->next;
        cout<<"|学号\t|名字\t|年龄\t|性别\t|高数\t|线代\t|c语言\t|总分|"<<endl;
        cout<<"  "<<c->id<<"\t "<<c->name<<"   "<<c->age<<"\t  "<<c->sex<<"\t  "<<c->c1<<"\t  "<<c->c2<<"\t  "<<c->c3<<"\t  "<<c->sum<<"\t  "<<endl;
        cout<<"是否需要对该生信息进行修改"<<endl;
        cout<<"1.yes  0.no"<<endl;
        cin>>b;
        if(b==1)
        {
            cout<<"1.修改学号"<<endl;
            cout<<"2.修改名字"<<endl;
            cout<<"3.修改年龄"<<endl;
            cout<<"4.修改性别"<<endl;
            cout<<"5.修改高数成绩"<<endl; 
            cout<<"6.修改线代成绩"<<endl; 
            cout<<"7.修改c语言成绩"<<endl; 
            cout<<"请输入需要修改的选项:"<<endl;
            cin>>d;
            switch(d)
            {
                case 1: cout<<"修改的学号为: ";
            cin>>c->id;
            break;
                case 2: cout<<"修改的名字为: ";
            cin>>c->name;
            break;
                case 3: cout<<"修改的年龄为: ";
            cin>>c->age;
            break;
                case 4: cout<<"修改的性别为: ";
            cin>>c->sex;
            break;
                case 5: cout<<"修改的高数成绩为: ";
            cin>>c->c1;
            break;
                case 6: cout<<"修改的线代成绩为: ";
            cin>>c->c2;
            break;
                case 7: cout<<"修改的c语言成绩为: ";
            cin>>c->c3;
            break;
            } 
            cout<<"修改成功!"<<endl; 
            saveFile(L);
            e=0;
            cout<<"|学号\t|名字\t|年龄\t|性别\t|高数\t|线代\t|c语言\t|总分|"<<endl;
            cout<<"  "<<c->id<<"\t "<<c->name<<"   "<<c->age<<"\t  "<<c->sex<<"\t  "<<c->c1<<"\t  "<<c->c2<<"\t  "<<c->c3<<"\t  "<<c->sum<<"\t  "<<endl;
         } 
         if(b!=1)
         {
             if(b==0)
             {
                 e=0; 
             }
             else
             { 
             cout<<"输入的选择有误,请重新输入:"<<endl;
             e=0;
             }
          } 
        }}
         
         if(a==2)
    {
        cout<<"请输入修改学生的名字:"<<endl;
        cin>>name;
        c=searchName (name, L);
        if(c!=NULL)
        {
            c=c->next;
        cout<<"|学号\t|名字\t|年龄\t|性别\t|高数\t|线代\t|c语言\t|总分|"<<endl;
        cout<<"  "<<c->id<<"\t "<<c->name<<"   "<<c->age<<"\t  "<<c->sex<<"\t  "<<c->c1<<"\t  "<<c->c2<<"\t  "<<c->c3<<"\t  "<<c->sum<<"\t  "<<endl;
        cout<<"是否需要对该生信息进行修改"<<endl;
        cout<<"1.yes  0.no"<<endl;
        cin>>b;
        if(b==1)
        {
            cout<<"1.修改学号"<<endl;
            cout<<"2.修改名字"<<endl;
            cout<<"3.修改年龄"<<endl;
            cout<<"4.修改性别"<<endl;
            cout<<"5.修改高数成绩"<<endl; 
            cout<<"6.修改线代成绩"<<endl; 
            cout<<"7.修改c语言成绩"<<endl; 
            cout<<"请输入需要修改的选项:"<<endl;
            cin>>d;
            switch(d)
            {
                case 1: cout<<"修改的学号为:";
            cin>>c->id;
            break;
                case 2: cout<<"修改的名字为:";
            cin>>c->name;
            break;
                case 3: cout<<"修改的年龄为:";
            cin>>c->age;
            break;
                case 4: cout<<"修改的性别为:";
            cin>>c->sex;
            break;
                case 5: cout<<"修改的高数成绩为:";
            cin>>c->c1;
            break;
                case 6: cout<<"修改的线代成绩为:";
            cin>>c->c2;
            break;
                case 7: cout<<"修改的c语言成绩为:";
            cin>>c->c3;
            break;
            } 
            cout<<"修改成功!"<<endl; 
            saveFile(L);
            e=0;
        cout<<"|学号\t|名字\t|年龄\t|性别\t|高数\t|线代\t|c语言\t|总分|"<<endl;
        cout<<"  "<<c->id<<"\t "<<c->name<<"   "<<c->age<<"\t  "<<c->sex<<"\t  "<<c->c1<<"\t  "<<c->c2<<"\t  "<<c->c3<<"\t  "<<c->sum<<"\t  "<<endl;
         } 
         if(b!=1)
         {
             if(b==0)
             {
                 e=0; 
             }
             else
             { 
             cout<<"输入的选择有误,请重新输入:"<<endl;
             e=0;
             }
          } 
        }}
         
         if(a!=1)
         {
             if(a==0)
             return;
             else
             {
                 cout<<"输入的选择有误,请重新输入!"<<endl;
                 e=0; 
             }
          } 
 }while(e==0);
}


//学生的信息清单
//学生各种信息的列表! 
void coutt(student *L)                                                                 
{
    student*c;
    c=L->next;
    if(c==NULL)
    cout<<"还没有录入学生信息!"<<endl; 
    while(c!=NULL)
    {
        cout<<"|学号\t|名字\t|年龄\t|性别\t|高数\t|线代\t|c语言\t|总分|"<<endl;
        cout<<"  "<<c->id<<"\t "<<c->name<<"   "<<c->age<<"\t  "<<c->sex<<"\t  "<<c->c1<<"\t  "<<c->c2<<"\t  "<<c->c3<<"\t  "<<c->sum<<"\t  "<<endl;
        c=c->next;
    }
 } 

 
//按照平均分的高低(利用总分就可以比较)输出学生信息清单
//利用排序来实现(普通排序,后面再继续优化)
//容错率的提高,输入错误之后会跳出提醒 
void averageHL(student* L)
{
    student* p=L->next;   //指向头结点,方便移动(特别注意头结点不存放数据) 
    student* t;     //指向p的下一个结点,形成循环
    student a;//需要一个空间的内容来存放交换的数据,作为中间商 
    int b=1, c=0; 
    do
    { 
    cout<<"1.根据成绩从高到低排序 / 2.根据成绩从低到高排序"<<endl;
    cin>>b;
    if(b!=1&&b!=2)
    {
        cout<<"输入的选择有误!"<<endl;
        cout<<"1.重新输入 / 0.退出"<<endl;
        cin>>c;
        if(c==0)
         {
        return; 
         }
     } 
    if(b==1)
    { 
    c=0;
    while(p!=NULL)
     {
         t=p->next;
          while(t!=NULL)
           {
              if(p->sum<=t->sum)                    //???? 为什么出现错误 
               {                       
                  a=*p;                           //交换数据域 
                  *p=*t;
                  *t=a;
                  a.next=p->next;                     //交换所指向下一个结点的指针域 
                  p->next=t->next;
                  t->next=a.next;
              }
                 t=t->next;
           }
        p=p->next; 
     }
     coutt(L);                               //输出学生清单 
     }
    //分隔 
    if(b==2)
    { 
    c=0;
    while(p!=NULL)
     {
         t=p->next;
          while(t!=NULL)
           {
              if(p->sum>=t->sum)
               {                       
                  a=*p;                           //数据域进行交换 
                  *p=*t;
                  *t=a;
                  a.next=p->next;                     //交换所指向下一个结点的指针域 
                  p->next=t->next;
                  t->next=a.next;
              }
                 t=t->next;
           }
        p=p->next; 
     }
     coutt(L);                               //输出学生清单 
     }
         
         
}while(c==1);
}


//各分数段的平均分
//利用简单的总分除以平均数实现 
void average(student* L)                                                                
{
     student*c;
     int a1=0, a2=0, a3=0, b=0;
     double d1, d2, d3;
     c=L->next;
     while(c!=NULL)
     {
         a1=a1+(c->c1);
         a2=a2+(c->c2);
         a3=a3+(c->c3);
         b++;
         c=c->next;
      }
      d1=a1/b;
      d2=a2/b;
      d3=a3/b;
      cout<<"高数成绩的平均分为:" ;
      cout<<d1<<endl;
      cout<<"线代成绩的平均分为:" ;
      cout<<d2<<endl;
      cout<<"c语言成绩的平均分为:" ;
      cout<<d3<<endl; 


//统计各分数段的人数
//没有难点 
void numberSore(student* L)
{
    student* p=L->next;
    student* t=L->next;
    student* y=L->next;
    int a1=0, b1=0, c1=0, d1=0, e1=0;
    int a2=0, b2=0, c2=0, d2=0, e2=0;
    int a3=0, b3=0, c3=0, d3=0, e3=0;
    while(p!=NULL)
    {
        if(p->c1>=91)
        {
            e1++; 
        }
        else if(p->c1>=81)
        {
            d1++; 
        }
        else if(p->c1>=71)
        {
            c1++;
        }
            else if(p->c1>=60)
        {
            b1++;
        }
            else if(p->c1<60)
          {
            a1++;
        }
        p=p->next;
    }
        while(t!=NULL)
    {
        if(t->c2>=91)
        {
            e2++; 
        }
        else if(t->c2>=81)
        {
            d2++; 
        }
        else if(t->c2>=71)
        {
            c2++;
        }
            else if(t->c2>=60)
        {
            b2++;
        }
            else if(t->c2<60)
        {
            a2++;
        }
        t=t->next;
    }

        while(y!=NULL)
    {
        if(y->c3>=91)
        {
            e3++; 
        }
        else if(y->c3>=81)
        {
            d3++; 
        }
        else if(y->c3>=71)
        {
            c3++;
        }
            else if(y->c3>=60)
        {
            b3++;
        }
            else if(y->c3<60)
        {
            a3++;
        }
        y=y->next;
    }
    cout<<"高数成绩各分数段学生人数:"<<endl; 
    cout<<"分数段为 0~59人数:"<<a1<<endl;
    cout<<"分数段为 60~70人数:"<<b1<<endl;
    cout<<"分数段为 71~80人数:"<<c1<<endl;
    cout<<"分数段为 81~90人数:"<<d1<<endl;
    cout<<"分数段为 91~100人数:"<<e1<<endl;
    cout<<endl; 
    cout<<"线代各分数段学生人数:"<<endl; 
    cout<<"分数段为 0~59人数:"<<a2<<endl;
    cout<<"分数段为 60~70人数:"<<b2<<endl;
    cout<<"分数段为 71~80人数:"<<c2<<endl;
    cout<<"分数段为 81~90人数:"<<d2<<endl;
    cout<<"分数段为 91~100人数:"<<e2<<endl;
    cout<<endl;
    cout<<"c语言成绩各分数段学生人数:"<<endl; 
    cout<<"分数段为 0~59人数:"<<a3<<endl;
    cout<<"分数段为 60~70人数:"<<b3<<endl;
    cout<<"分数段为 71~80人数:"<<c3<<endl;
    cout<<"分数段为 81~90人数:"<<d3<<endl;
    cout<<"分数段为 91~100人数:"<<e3<<endl;
 } 

/*代码心得:太不容易了,链表没啥问题了,还有文件的知识需要补充!!
多看多写是关键!!!!*/ 
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值