64,646
社区成员
发帖
与我相关
我的任务
分享
#include<fstream>
#include<iostream>
#include<string>
using namespace std;
struct stu_score
{
int num;
int mark[3];
string name;
stu_score *next;
float aver;
};
class student
{
private:
int i;
stu_score *head;
void swap(stu_score *,stu_score *);
void print(stu_score *);
stu_score *find(int);
public:
student() {head=NULL;}
stu_score *get_head() {return head;}
int listcount();
void additem(int num,string name,int mark[3]);
void removeitem(int);
void list();
void sort_by_num();
void sort_by_aver();
void search(int);
int average();
};
int student::listcount()
{
if(!head) return 0;
stu_score *p=head;
int n=0;
while(p)
{
n++;
p=p->next;
}
return n;
}
void student::additem(int num,string name,int mark[3])
{
if(!head)
{
head=new stu_score;
for(i=0;i<3;i++)
head->mark[i]=mark[i];
head->num=num;
head->name=name;
head->next=NULL;
return;
}
stu_score *t=head;
while(t && t->num!=num)
t=t->next;
if(t)
{
cout<<"操作失败:学号为:"<<num<<"的记录已存在!"<<endl;
return;
}
stu_score *p=head;
while(p->next)
p=p->next;
stu_score *p1=new stu_score;
p1->num=num;
for(int i=0;i<3;i++)
p1->mark[i]=mark[i];
p1->name=name;
p1->next=NULL;
p->next=p1;
return;
}
void student::removeitem(int num)
{
stu_score *t=find(num);
if(!t) return;
stu_score *p=head;
if(head==t)
{
head=head->next;
delete p;
cout<<"成功删除学号为"<<num<<"的记录"<<endl<<endl;
return;
}
while(p->next!=t) p=p->next;
stu_score *p1=p->next;
p->next=p1->next;
delete p1;
cout<<"成功删除学号为:"<<num<<"的记录!"<<endl<<endl;
return;
}
void student::print(stu_score *p)
{
cout.precision(3);
cout<<p->num<<"\t\t";
cout<<p->name<<"\t\t";
cout<<p->mark[0]<<"\t"<<p->mark[1]<<"\t"<<p->mark[2]<<"\t"<<p->aver<<endl;
return;
}
void student::list()
{
if(listcount()==0)
{
cout<<"错误:当前列表为空!"<<endl;
return;
}
stu_score *p=head;
cout<<"共有记录:"<<listcount()<<endl;
cout<<"学号\t\t姓名\t\t英语\t数学\t化学\t平均分" <<endl;
while(p)
{
print(p);
p=p->next;
}
cout<<endl;
return;
}
void student::search(int num)
{
cout<<"searching..."<<endl;
stu_score *p=find(num);
if(p)
{
cout<<"学号\t\t姓名\t\t英语\t数学\t化学\t平均分" <<endl;
print(p);
}
cout<<endl;
}
stu_score *student::find(int num)
{
if(listcount()==0)
{
cout<<"错误:当前列表为空!"<<endl;
return NULL;
}
stu_score *p=head;
while(p)
{
if(p->num==num) break;
p=p->next;
}
if(!p)
{
cout<<"错误:找不到该记录!\n";
return NULL;
}
return p;
}
void student::swap(stu_score *p1, stu_score *p2)
{
int i;
stu_score *temp=new stu_score;
temp->num=p1->num;
p1->num=p2->num;
p2->num=temp->num;
for(i=0;i<3;i++)
temp->mark[i]=p1->mark[i];
for(i=0;i<3;i++)
p1->mark[i]=p2->mark[i];
for(i=0;i<3;i++)
p2->mark[i]=temp->mark[i];
temp->name=p1->name;
p1->name=p2->name;
p2->name=temp->name;
temp->aver=p1->aver;
p1->aver=p2->aver;
p2->aver=temp->aver;
}
void student::sort_by_num()
{
cout<<"sorting..."<<endl;
if(listcount()<2) return;
stu_score *temp=NULL,*p=NULL,*p1=NULL,*p2=NULL,*k=NULL;
int n=listcount(),i,j;
p=head;
for(i=1;i<n;i++)
{
k=p;
p1=p->next;
for(j=0;j<n-i;j++)
{
if(k->num>p1->num){
k=p1;
}
p1=p1->next;
}
if(p!=k)swap(k,p);
p=p->next;
}
cout<<"complete successfully!"<<endl<<endl;
return;
}
void student::sort_by_aver()
{
cout<<"sorting..."<<endl;
if(listcount()<2) return;
stu_score *temp=NULL,*p=NULL,*p1=NULL,*p2=NULL,*k=NULL;
int n=listcount(),i,j;
p=head;
for(i=1;i<n;i++)
{
k=p;
for(j=0;j<n-i;j++)
{
p1=k->next;
if(k->aver<p1->aver)
{
swap(k,p1);
}
k=k->next;
}
}
cout<<"complete successfully!"<<endl<<endl;
return;
}
int student::average()
{
int i;
if(listcount()==0)
{
cout<<"错误:当前列表为空!"<<endl;
return -1;
}
float sum, n=0;
stu_score *p=head;
while(p)
{
sum=0;
for(i=0;i<3;i++)
sum+=p->mark[i];
p->aver=sum/3;
p=p->next;
n++;
}
return 0;
}
student student;
int menu()
{
cout<<"==========主菜单=========="<<endl;
int n=1,select=-1;
cout<<n++<<".请输入学生成绩;"<<endl<<endl;
cout<<n++<<".按学号排序;"<<endl<<endl;
cout<<n++<<".按学号查找记录;"<<endl<<endl;
cout<<n++<<".删除由学号指定的记录;"<<endl<<endl;
cout<<n++<<".列出所有记录;"<<endl<<endl;
cout<<n++<<".按平均成绩排序输出;"<<endl<<endl;
cout<<n++<<".从数据文件导入成绩;"<<endl<<endl;
cout<<n++<<".将成绩导出到磁盘文件;"<<endl<<endl;
cout<<"0.退出;"<<endl<<endl;
cout<<"【请选择(相应的数字)】:";
cin>>select;
return select;
}
char exit()
{
char s;
cout<<"确定要退出程序吗?[Y/N]:";
cin>>s;
return s;
}
void input(int *num,string *name,int mark[3])
{
cout<<"请输入 学号 姓名 英语 数学 化学:"<<endl;
cin>>*num;
if(*num==-1) return;
cin>>*name>>mark[0]>>mark[1]>>mark[2];
return;
}
void sort_by_num()
{
student.sort_by_num();
}
void addnew()
{
int num=0,mark[3]={0};
string name="";
cout<<endl<<"当输入学号为-1时表示结束输入。"<<endl;
input(&num,&name,mark);
while(num!=-1)
{
student.additem(num,name,mark);
student.average();
input(&num,&name,mark);
}
return;
}
void dofind()
{
int num;
cout<<endl<<"当输入学号为-1时表示结束输入。"<<endl;
do{
cout<<"请输入要查找的学生学号:";
cin>>num;
if(num==-1) continue;
student.search(num);
}while(num!=-1);
return;
}
void dodelete()
{
cout<<endl<<"当输入学号为-1时表示输入结束。"<<endl;
int num;
do
{
cout<<"请输入要删除学生学号:";
cin>>num;
if(num==-1) continue;
student.removeitem(num);
}while(num!=-1);
return;
}
void list()
{
student.list();
}
void showaverage()
{
student.sort_by_aver();
if(student.listcount()==0)
{
cout<<"错误:当前列表为空!"<<endl;
return;
}
int n=0;
cout.precision(3);
stu_score *p=student.get_head();
cout<<"学号"<<"\t姓名"<<"\t平均分"<<"\t排名"<<endl;
while(p)
{
cout<<p->num<<"\t"<<p->name<<":\t"<<p->aver<<"\t"<<++n<<endl;
p=p->next;
}
return;
}
void loadfromfile()
{
int num,mark[3];
char name[20]="";
fstream iofile;
int i=0;
iofile.open("stud.dat",ios::in|ios::binary);
if(!iofile)
{
cout<<"数据文件不存在,请先建立该文件!"<<endl;
return;
}
if(iofile.eof())
{
cout<<"数据库为空,请添加数据"<<endl;
iofile.close();
}
else
{
while(iofile.peek()!=EOF)
{
iofile.read((char *) &num,sizeof(int));
iofile.read((char *) name,20);
iofile.read((char *) &mark[0],sizeof(int));
iofile.read((char *) &mark[1],sizeof(int));
iofile.read((char *) &mark[2],sizeof(int));
student.additem(num,name,mark);
}
student.average();
iofile.close();
}
}
void savetofile()
{
stu_score *p;
char name[20];
fstream iofile;
int i=0;
iofile.open("stud.dat",ios::out|ios::binary);
if(!iofile)
{
cerr<<"open error"<<endl;
abort();
}
p=student.get_head();
while(p)
{
p->name.copy(name,20,0);
name[p->name.length()]=0;
iofile.write((char *) &p->num,sizeof(int));
iofile.write((char *) name,20);
iofile.write((char *) &p->mark[0],sizeof(int));
iofile.write((char *) &p->mark[1],sizeof(int));
iofile.write((char *) &p->mark[2],sizeof(int));
p=p->next;
}
iofile.close();
}
int main()
{
cout<<"Welcome!\n学生成绩管理系统\nVer 1.01\n \n\n";
int select;
char s;
while(1)
{
select=menu();
switch(select)
{
case 0:
s=exit();
if(s=='y'||s=='Y') return 0;
break;
case 1:
addnew();
break;
case 2:
sort_by_num();
break;
case 3:
dofind();
break;
case 4:
dodelete();
break;
case 5:
list();
break;
case 6:
showaverage();
break;
case 7:
loadfromfile();
break;
case 8:
savetofile();
break;
default:
cout<<"无效输入!"<<endl;
}
}
return 0;
}
#include <iomanip>
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <conio.h>
#include <stdlib.h>
#include <string>
#include <process.h>
#include <algorithm>
#include <stdio.h>
using namespace std;
struct student
{
char name[15]; //姓名
char id[6]; //学号
char sex[6]; //性别
char snum[6]; //宿舍号
char qq[15]; //qq号
char tel[13]; //手机号
string addr; //家庭地址
student *next;
};//定义结构体
class stud
{
student *p1,*p2,*head;
public:
~stud() // 析构函数
{
while(head)
{
p1=head->next;
delete head;
head=p1;
}
}
// 成员函数
void output(student *head); // 输出学生信息
student* input(student *head); // 增加学生记录
student* del(student *head, char*p); // 删除记录
student* findn(student *head,char *p,int &n); // 按姓名查找学生信息记录(可查找多个同名数据)
student* findi(student *head,char *p,int &n); // 按学号查找学生信息记录
student* finds(student *head,char *p,int &n); // 按宿舍号查找学生信息记录
void infile(student *head); //存入文件
student *outfile(student *head); //将文件导出表
student* stat(student *head); //排序统计学生信息
student* clear(student *head); // 删除当前表
void Inputs(student *p); //用于添加数据的子函数
};
// 用于添加数据的子函
void stud::Inputs(student*p)
{
cout<<setw(8)<<"姓名"<<setw(6)<<"学号"
<<setw(6)<<"性别"<<setw(8)<<"宿舍号"<<setw(8)<<"qq号"
<<setw(10)<<"手机号"<<setw(12)<<"家庭地址"<<endl;
cin>>p->name>>p->id>>p->sex>>
p->snum>>p->qq>>p->tel>>p->addr;
}
// 输出学生成绩
void stud::output (student *head)
{ p1=head;
while(p1!=NULL)
{
cout<<setw(6)<<p1->name<<setw(6)
<<p1->id<<setw(6)<<p1->sex<<setw(8)<<p1->snum<<setw(8)
<<p1->qq<<setw(12)<<p1->tel<<setw(12)<<p1->addr<<endl;
p1=p1->next;
}
}
void stud::infile(student *head)//存入文件
{
p1=head;
ofstream fout("student.txt",ios::app);//创建文件,存放联系人信息
if(!fout)
cerr<<"Cannot open ! "<<endl;
else
while(p1=NULL)
{
//cin>>p1->name>>p1->id>>p1->sex>>p1->snum>>p1->qq>>p1->tel>>p1->addr;
//这儿为啥要用cin??不是从链表中获取存入文件?
fout<<"\n"<<p1->name<<" "<<p1->id<<" "<<p1->sex<<" "<<p1->snum<<" "<<p1->qq<<" "<<p1->tel<<" "<<p1->addr;
p1=p1->next;
}
fout.close();
}
student *stud::outfile(student *head)//将文件导出表
{
p1=new student;
p2=head;
ifstream fin("student.txt",ios::in);
if(!fin)
cerr<<"Cannot open !"<<endl;
else
while(!fin.eof())
{
fin>>p1->name>>p1->id>>p1->sex>>p1->snum>>p1->qq>>p1->tel>>/*p1->email>>*/p1->addr;
}
fin.close();//向p1中增加数据
if(head ==NULL)
{
head=p1;
p1->next =NULL;
return head;
}
while(p2->next !=NULL)
p2=p2->next;
p2->next=p1;
p1->next=NULL;
return head;
}
// 清空数据
student* stud::clear(student*head)
{
while(head)
{ p1=head->next ;
delete head;
head=p1;
}
return head;
}
// 排序统计函数
student *stud::stat(student *head)
{
p2=head;
p1=p2->next;
while(p2->next) //用冒泡法实现排序
{
if(p2->id > p1->id)
{ // 把头指针指向当前比较小的节点
p2->next=p1->next;
p1->next=head;
head=p1;
// 把用于比较的两个指针复位
p1=p2->next ;
}
else
{ // 指向下一个节点
p2=p2->next ;
p1=p2->next ;
}
}
cout<<"当前表以按学号排序完成"<<endl;
return head;
}
// 删除记录
student* stud::del (student *head,char *p)
{
p1=head;
p2=NULL;
while(strcmp(p1->name ,p)&& p1->next !=NULL)
{ p2=p1;
p1=p1->next ;
}
if(!strcmp(p1->name ,p))
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next ;
cout<<"删除成功,OK"<<endl;
delete p1;
}
else
cout<<" 没找到姓名"<<p<<"的学生.\n"; //结点没找到
return head ;
}
// 按姓名查找函数
student* stud::findn (student *head,char *p,int& n)
{
p2=head;
while(strcmp(p2->name ,p) !=0 && p2->next !=NULL) //strcmp,字符比较函数
p2=p2->next;
if(0==strcmp(p2->name,p))
{
cout<<setw(6)<<p2->name<<setw(6)
<<p2->id<<setw(6)<<p2->sex<<setw(8)<<p2->snum<<setw(8)
<<p2->qq<<setw(12)<<p2->tel<<setw(12)<<p2->addr<<endl;
n++;
return p2;
}
else
if(n==0)
{
system("cls");//刷新屏幕
cout<<"对不起,没有您要查找的学生数据"<<endl;
}
return NULL;
}
// 按学号查找学生信息记录
student* stud::findi(student *head,char *p,int& n)
{
p2=head;
while(strcmp(p2->id ,p) !=0 && p2->next !=NULL)
p2=p2->next ;
if(0==strcmp(p2->id,p))
{
cout<<setw(6)<<p2->name<<setw(6)
<<p2->id<<setw(6)<<p2->sex<<setw(8)<<p2->snum<<setw(8)
<<p2->qq<<setw(12)<<p2->tel<<setw(12)<<p2->addr<<endl;
n++;
return p2;
}
else
if(n==0)
{
system("cls");
cout<<"对不起,没有您要查找的学生数据"<<endl;
}
return NULL;
}
// 按宿舍号查找学生信息记录
student* stud::finds(student *head,char *p,int& n)
{
p2=head;
while(strcmp(p2->snum ,p) !=0 && p2->next !=NULL) //strcmp,字符比较函数
p2=p2->next;
if(0==strcmp(p2->snum,p))
{
cout<<setw(6)<<p2->name<<setw(6)
<<p2->id<<setw(6)<<p2->sex<<setw(8)<<p2->snum<<setw(8)
<<p2->qq<<setw(12)<<p2->tel<<setw(12)<<p2->addr<<endl;
n++;
return p2;
}
else
if(n==0)
{
system("cls");//刷新屏幕
cout<<"对不起,没有您要查找的学生数据"<<endl;
}
return NULL;
}
// 增加学生记录
student *stud::input (student *head)
{ p1=new student;
p2=head;
Inputs(p1); //调用子函数 增加数据
if(head ==NULL)
{
head=p1;
p1->next =NULL;
return head;
}
while(p2->next !=NULL)
p2=p2->next;
p2->next=p1;
p1->next=NULL;
return head;
}
// 输出错误
void error()
{
cout<<"错误,这还是一张空表,请输入数据"<<endl;
getch();
}
// 主函数
int main(void)
{
{
system("color 8e");//————添加背景颜色
}
stud stus;
student *head=NULL;
student *pd; //临时指针, 用于查找函数
char choice; //用于存放用户的选择项
char choice2,choice3;//用于细节选择
char name[10]; //查找,删除记录的 key
char snum[8];
char id[10];
while(1)
{ system("cls");
cout<<" ┏┱┲┱┲┱┲┱┲┱┲┱┲┱┲┱┲┱┲┱┲┓"<<endl;
cout<<" ┢ 学 生 信 息 管 理 系 统 ┪"<<endl;
cout<<" ┡━━━━━━━━━━━━━━━━━━━━┩"<<endl;
cout<<" ┢ ┪"<<endl;
cout<<" ┡ 1.增加学生信息 2.显示学生信息 ┩"<<endl;
cout<<" ┢ 3.排序统计信息 4.查找学生信息 ┪"<<endl;
cout<<" ┡ 5.删除学生信息 6.清空所有数据 ┩"<<endl;
cout<<" ┢ 7.保存学生信息 8.安全退出系统 ┪"<<endl;
cout<<" ┡ ┩"<<endl;
cout<<" ┢ ┪"<<endl;
cout<<" ┖┺┹┺┹┺┹┺┹┺┹┺┹┺┹┺┹┺┹┺┹┚"<<endl;
cout<<" 请输入您的选择(0--7):";cout<<endl;
int n=0; //计数器,用于在查找时计算有没有同名学生
cin>>choice;
fflush(stdin);
if(choice=='7') //退出程序
{ cout<<"谢谢使用,再见"<<endl;
exit(0);
}
switch(choice)
{
case '1': //增加学生信息
head=stus.input (head);
break;
case '2': //显示学生信息
if(head==NULL)
{
error();
break;
}
cout<<setw(8)<<"姓名"<<setw(6)<<"学号"
<<setw(6)<<"性别"<<setw(8)<<"宿舍号"<<setw(8)<<"qq号"
<<setw(10)<<"手机号"<<setw(12)<<"家庭地址"<<endl;
stus.output (head);
getch();
break;
case '3': //排序学生信息
if(head==NULL)
{
error();
break;
}
head=stus.stat(head);
getch();
break;
case '4': //查找学生信息
if(head ==NULL)
{
error(); //调用函数输出错误信息
break;
}
cout<<"请选择:"<<endl;
cout<<"a.按姓名查找"<<endl;
cout<<"b.按学号查找"<<endl;
cout<<"c.宿舍号查找"<<endl;
cin>>choice2;
switch(choice2)//选择a,b,c
{
case 'a'://按姓名查找
{
cout<<"请输入要查找的学生姓名(可查找相同姓名的学生)"<<endl;
cin>>name;
pd=head;
cout<<setw(8)<<"姓名"<<setw(6)<<"学号"<<setw(6)
<<"性别"<<setw(8)<<"宿舍号"<<setw(8)<<"qq号"
<<setw(10)<<"手机号"<<setw(12)<<"家庭地址"<<endl;
while(pd) //循环调用函数, 用于输出多个的同名学生信息
{
pd=stus.findn (pd,name,n);
if(pd==NULL)
break;
pd=pd->next ; //指针指向当前以找到的下一个节点,可以查找同名学生
}
getch();
break;
}
case 'b'://按学号查找
{
cout<<"请输入要查找的学生学号"<<endl;
cin>>id;
pd=head;
cout<<setw(8)<<"姓名"<<setw(6)<<"学号"
<<setw(6)<<"性别"<<setw(8)<<"宿舍号"<<setw(8)<<"qq号"
<<setw(10)<<"手机号"<<setw(12)<<"家庭地址"<<endl;
while(pd) //循环调用函数, 用于输出多个的同名学生信息
{
pd=stus.findi (pd,id,n);
if(pd==NULL)
break;
pd=pd->next ; //指针指向当前以找到的下一个节点
}
getch();
break;
}
case 'c'://按宿舍号查找
{
cout<<"请输入要查找的宿舍号"<<endl;
cin>>snum;
pd=head;
cout<<setw(8)<<"姓名"<<setw(6)<<"学号"
<<setw(6)<<"性别"<<setw(8)<<"宿舍号"<<setw(8)<<"qq号"
<<setw(10)<<"手机号"<<setw(12)<<"家庭地址"<<endl;
while(pd) //循环调用函数, 用于输出多个相同宿舍学生的信息
{
pd=stus.finds (pd,snum,n);
if(pd==NULL)
break;
pd=pd->next ; //指针指向当前以找到的下一个节点
}
getch();
break;
}
}//choice2选择结束
break;
//case'4'结束
case '5': //删除学生信息
if(head==NULL)
{
error();
break;
}
cout<<"学生数据如下"<<endl;
cout<<setw(8)<<"姓名"<<setw(6)<<"学号"
<<setw(6)<<"性别"<<setw(8)<<"宿舍号"<<setw(8)<<"qq号"
<<setw(10)<<"手机号"<<setw(12)<<"家庭地址"<<endl;
stus.output (head);
cout<<"请输入想要删除学生姓名"<<endl;
cin>>name;
head=stus.del(head,name);
getch();
break;
case '6':
if(head==NULL)
{
error();
break;
}
cout<<"确定要保存数据吗?"<<endl;
cout<<"选择y/n:"; //少个分号
cin>>choice3;
switch (choice3)
{ case 'y':
stus.infile(head);
break;
case 'n':
cout<<"按任意键继续"<<endl;
break;
}
break;
case '7':
if(head==NULL)
{
error();
break;
}
head=stus.clear(head);
cout<<"删除表成功~"<<endl;
getch();
break;
default :
cout<<" 对不起,您的输入有误,请重新输入。\n";
getch();
break;
}
}
getch();
return 0;
}