#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;
}
/*代码心得:太不容易了,链表没啥问题了,还有文件的知识需要补充!!
多看多写是关键!!!!*/