发布网友 发布时间:2022-04-23 08:54
共3个回答
热心网友 时间:2022-06-18 16:20
楼主记得给我加分呦!
#include<iostream>
#include<string>
#include<iomanip>
#include<fstream>
#include<stdlib.h>
#include<cstring>
#include<ctype.h>
using namespace std;
class Node //节点类
{
char Name[10];//姓名
char Number[15];//学号
char Score[5];//成绩
Node *next;//下一结点指针
public:
Node(char *name=NULL,char *number=NULL,char *score=NULL) //构造函数,各参数均有缺省值
{
if(name)
strcpy_s(Name,name);
else
strcpy_s(Name," ");
if(number)
strcpy_s(Number,number);
else
strcpy_s(Number," ");
if(score)
strcpy_s(Score,sore);
else
strcpy_s(Score," ");
}
void Show() //显示节点数据
{
cout<<setw(11)<<Number<<setw(16)<<Name<<setw(21)<<Score<<endl;
}
void SetName(char name[]) //修改姓名
{
strcpy_s(Name,name);
}
void SetNumber(char number[]) //修改学号
{
strcpy_s(Number,number);
}
void SetScore(char score[]) //修改score地址
{
strcpy_s(Score,score);
}
char *GetName() //返回姓名地址
{
return Name;
}
char *GetNumber() //返回学号地址
{
return Number;
}
char *GetScore() //返回score地址
{
return Score;
}
Node *Getnext() //返回next
{
return next;
}
friend class ScoreManage; //将ScoreManage类说明为友元类
};
class ScoreManage //ScoreManage链表类
{
Node *HeadPtr; //链表首指针
Node *TailPtr; //链表为指针
int Tag; //排序状态标志,tag=1时按姓名排;tag=2时按学号号码排
public:
ScoreManage(); //构造函数,创建空链表,将tag设为1
void AddTail(Node *p);//将p指向的结点加入到链表尾部
void AddSort(Node *p);//将p指向的结点按Tag指定的顺序插入到链表中
Node *LookUp(char *name);//按姓名查找结点,返回该结点的指针
void Delete(char *name);//删除指定姓名的结点
void Sort(int tag);//按tag指定的关键字重新排序
void ShowAll();//显示全部结点,每10个显示一屏
void SetTag(int t);//置tag值
int GetTag();//取tag值
Node *GetHeadPtr(); //取首指针
~ScoreManage();//释放链表空间
void CreateList(char *filename);//从二进制文件读入数据
void WriteToFile(char *filename);//将链表中数据写入指定的二进制文件
};
ScoreManage::ScoreManage()//构造函数,创建空链表,将tag设为1
{
HeadPtr=TailPtr=NULL;
Tag=1;
}
void ScoreManage::AddTail(Node *p) //将p指向的节点加入到链表尾部
{
p->next=NULL;
if(!HeadPtr)
HeadPtr=p;
else
TailPtr->next=p;
TailPtr=p;
}
void ScoreManage::AddSort(Node *p) //将p指针的节点按Tag指定的顺序插入到链表中
{
p->next=NULL;
if(HeadPtr==NULL)
{
HeadPtr=TailPtr=p;
return;
}
else
{
Node *p1=HeadPtr, *p2;
while(((Tag==1)&&strcmp(p->Name,p1->Name)>0 && p1->next)||
(Tag==2)&&(strcmp(p->number,p1->number)>0 && p1->next))
{
p2=p1;
p1=p1->next;
}
if(((Tag==1)&&strcmp(p->Name,p1->Name)<0 )||
(Tag==2)&&(strcmp(p->number,p1->number)<0 ))
{
if(p1==HeadPtr)
{
p->next=p1;
HeadPtr=p;
}
else
{
p2->next=p;
p->next=p1;
}
}
else
{
p1->next=p;
TailPtr=p;
}
}
}
Node *ScoreManage::LookUp(char *name) //按姓名查找节点,返回该节点指针
{
Node *p;
p=HeadPtr;
while(p!=NULL)
{
if(strcmp(p->Name,name)==0) return p;
p=p->next;
}
return NULL;
}
void ScoreManage::Delete(char *name) //删除指定姓名的节点
{
Node *p1,*p2;
if(HeadPtr==NULL)
{
cout<<"未删除!\n";
}
else if(strcmp(HeadPtr->Name,name)==0)
{
p1=HeadPtr;
HeadPtr=HeadPtr->next;
cout<<"删除成功!\n";
}
else
{
p1=HeadPtr;
p2=HeadPtr->next;
while(strcmp(p2->Name,name) && p2)
{
p1=p2;
p2=p2->next;
}
if(p2 && strcmp(p2->Name,name)==0)
{
p1->next=p2->next;
cout<<"删除成功!\n";
}
else
cout<<name<<"未删除!\n";
}
}
void ScoreManage::Sort(int tag) //按tag指定的关键字重新排序
{
ScoreManage *newptr;
newptr=new ScoreManage;
Node *p1=HeadPtr,*p2;
newptr->Tag=tag;
while(p1)
{
p2=p1;
p1=p1->next;
newptr->AddSort(p2);
}
HeadPtr=newptr->HeadPtr;
TailPtr=newptr->TailPtr;
Tag=newptr->Tag;
newptr->HeadPtr=NULL;
newptr->TailPtr=NULL;
delete newptr;
}
void ScoreManage::ShowAll() //显示全部节点,每10个显示一屏
{
if(HeadPtr==NULL)
{
cout<<"无数据!\n";
cin.get();
cin.get();
}
else
{
int n=0;
Node *p=HeadPtr;
cout<<setw(11)<<"姓名"<<setw(16)<<"学号"<<setw(21)<<"学生成绩"<<'\n';
while(p)
{
p->Show();
p=p->next;
n++;
if(n%10==0 || p==NULL)
system("pause");
}
}
}
void ScoreManage::SetTag(int t) //置tag值
{
Tag=t;
}
int ScoreManage::GetTag() //取tag值
{
return Tag;
}
Node * ScoreManage::GetHeadPtr() //取首指针
{
return HeadPtr;
}
ScoreManage::~ScoreManage() //释放链表空间
{
Node *p;
while(HeadPtr)
{
p=HeadPtr;
HeadPtr=HeadPtr->next;
delete p;
}
}
void ScoreManage::CreateList(char *filename) //从指定文件中读入数据,构造链表
{
fstream in(filename,ios::in|ios::binary);
if(!in)
return;
int nodenum = 0;
in.read((char*)&nodenum,sizeof(int));
Node *nodeptr;
for(int i=0;i<nodenum;i++)
{
nodeptr=new Node;
in.read((char*)nodeptr,sizeof(Node));
AddSort(nodeptr);
}
in.close();
}
void ScoreManage::WriteToFile(char *filename) //将链表中数据写入指定的文件
{
ofstream out(filename,ios::out|ios::binary);
if(!out)
{
cout<<"打不开!\n";
exit(1);//异常退出
}
Node *nodeptr=HeadPtr;
int nodenum=0;
while(nodeptr)
{
nodenum++;
nodeptr=nodeptr->next;
}
out.write((char*)&nodenum,sizeof(int));
nodeptr=HeadPtr;
while(nodeptr)
{
out.write((char*)nodeptr,sizeof(Node));
nodeptr=nodeptr->next;
}
out.close();
}
void add(ScoreManage &ScoreManage)//增加记录
{
char name[10];//姓名
char number[15];//学号
char score[20];//score地址
Node *nodeptr;//定义一个Node类对象
nodeptr=new Node;
cout<<"请依次输入:\n姓名 学号 学生成绩"<<endl;
cin>>name>>number>>score;
nodeptr->SetName(name);//调用类内置入函数给结点赋值
nodeptr->SetNumber(number);
nodeptr->SetScore(score);
ScoreManage.AddSort(nodeptr);
cout<<"添加成功!\n";
cin.get();
cin.get();
}
void del(ScoreManage &ScoreManage) //删除记录
{
char name[10],c;
cout<<"请输入要删除的姓名\n";
cin>>name;
cout<<"你确定要删除"<<name<<"吗? [是(y)/否(n)]\n";
cin>>c;
if(c=='y'||c=='Y')
ScoreManage.Delete(name);//调用ScoreManage类的删除成员函数
cin.get();
cin.get();
}
void showall(ScoreManage &ScoreManage) //显示所有记录
{
ScoreManage.ShowAll();//调用ScoreManage的成员函数
cin.get();
cin.get();
}
void query(ScoreManage &ScoreManage) //按姓名查找并显示一条记录
{
char name[10];//姓名
Node *p;
cout<<"请输入要显示的姓名!\n";
cin>>name;
cout<<setw(11)<<"姓名"<<setw(16)<<"学号"<<setw(21)<<"学生成绩\n";
int tag=1;
if(ScoreManage.GetTag()!=tag)
ScoreManage.Sort(tag);
if(p=ScoreManage.LookUp(name))
p->Show();
else
cout<<"没有"<<name<<"!\n";
cin.get();
cin.get();
}
void modify(ScoreManage &ScoreManage) //按姓名修改一条记录
{
char name1[10];
Node *p;
cout<<"请输入要修改项的姓名!\n";
cin>>name1;
if(ScoreManage.GetTag()==1)
p=ScoreManage.LookUp(name1);
cout<<"修改什么? 姓名(1) 手机号码(2) score地址(3)\n请选择:\n";
int n,tag;
cin>>n;
char name[10],number[15],score[20];
if(n==1)
{
cout<<"请输入修改后的姓名!\n";
cin>>name;
p->SetName(name);
tag=1;
ScoreManage.Sort(tag);
}
else if(n==2)
{
cout<<"请输入修改后的手机号码!\n";
cin>>number;
p->SetNumber(number);
tag=2;
ScoreManage.Sort(tag);
}
else
{
cout<<"请输入修改后的score地址!\n";
cin>>score;
p->Setscore(score);
}
cout<<"修改成功!\n";
cin.get();
cin.get();
}
void addfromtxtfile(ScoreManage &ScoreManage) //从正文文件中添加数据到库表中
{
char filename[26];
cout<<"从哪个文件中添加数据?\n请输入文件名:\n";
cin>>filename;
ifstream in(filename,ios::in);
if(!in)
{
cout<<"不能打开"<<filename<<"文件!"<<endl;
return;
}
char name[10],number[15],score[20];
Node *nodeptr;
int nodenum,i;
in>>nodenum;
for(i=0;i<nodenum;i++)
{
nodeptr=new Node;
in>>name>>number>>score;
nodeptr->SetName(name);
nodeptr->SetNumber(number);
nodeptr->SetScore(score);
ScoreManage.AddSort(nodeptr);
}
cout<<"添加成功!\n";
in.close();
cin.get();
cin.get();
}
void writetotxtfile(ScoreManage &ScoreManage) //将库表中的数据导出到征文文件
{
Node *nodeptr=ScoreManage.GetHeadPtr();
if(nodeptr==NULL)
cout<<"无数据!\n";
else
{
char filename[26];
cout<<"将数据导入那个文件?\n请输入文件名:\n";
cin>>filename;
fstream out(filename,ios::out);
if(!out)
{
cout<<"不能打开"<<filename<<"文件!"<<endl;
return;
}
int nodenum=0,i;
while(nodeptr)
{
nodenum++;
nodeptr=nodeptr->Getnext();
}
out<<nodenum<<endl;
nodeptr=ScoreManage.GetHeadPtr();
for(i=0;i<nodenum;i++)
{
out<<setw(11)<<nodeptr->GetName()<<setw(16)<<nodeptr->GetNumber()<<setw(21)<<nodeptr->GetScore()<<endl;
nodeptr=nodeptr->Getnext();
}
cout<<"写入成功!\n";
out.close();
cin.get();
cin.get();
}
}
void sort(ScoreManage &ScoreManage) //排序库链表
{
int tag;//排序标志
char c;//判断标志
tag=ScoreManage.GetTag();
if(tag==1)
{
cout<<"现在是按名字排序!\n";
cout<<"您确定要按学号排序吗? [是(y)/否(n)]\n";
}
else
{
cout<<"现在是按学号排序!\n";
cout<<"您确定要按名字排序吗? [是(y)/否(n)]\n";
}
cin>>c;
if(c=='y'||c=='Y')
{
if(tag==1) tag=2;
else tag=1;
}
ScoreManage.Sort(tag);
cin.get();
cin.get();
}
void dela(ScoreManage &ScoreManage) //删除所有记录
{
char c;
cout<<"您确定要删除全部记录吗? [是(y)/否(n)]\n";
cin>>c;
if(c=='y'||c=='Y')
{
ScoreManage.~ScoreManage();
cout<<"已全部删除!\n";
}
else
cout<<"未删除!\n";
cin.get();
cin.get();
}
void quit(ScoreManage &ScoreManage) //退出系统,内部做到结尾工作
{
ScoreManage.WriteToFile("ScoreManage.dat");
}
int menu_select();
void main() //主函数
{
ScoreManage scoreManage;
ScoreManage.CreateList("ScoreManage.dat");
for( ; ; )
{
switch(menu_select())
{
case 1:
add(scoreManage);
system("pause");
break;
case 2:
del(scoreManage);
system("pause");
break;
case 3:
showall(scoreManage);
system("pause");
break;
case 4:
query(scoreManage);
system("pause");
break;
case 5:
modify(scoreManage);
system("pause");
break;
case 6:
addfromtxtfile(scoreManage);
system("pause");
break;
case 7:
writetotxtfile(scoreManage);
system("pause");
break;
case 8:
sort(scoreManage);
system("pause");
break;
case 9:
dela(scoreManage);
system("pause");
break;
case 0:
quit(scoreManage);
system("pause");
exit(0);
}
}
}
int menu_select() //选择函数
{
char *m[11]={"1.增加一条记录",
"2.删除一条记录",
"3.显示所有记录",
"4.按姓名修改查找并显示一条记录",
"5.按姓名修改查找并修改一条记录",
"6.从文件中添加数据到库表中",
"7.将库表中的数据写入文件",
"8.排序",
"9.清空",
"0.退出系统"};
int i;
char c;
do{
system("cls");/*清屏*/
cout<<"\n\n======欢迎使用成绩管理系统管理系统======\n\n";
for(i=0;i<10;i++)
cout<<m[i]<<endl;
cout<<"\n==================================\n";
cout<<"请选择(1-9,0):";
cin>>c;
}while(c<'0'||c>'9');
return(c-'0');
}
热心网友 时间:2022-06-18 16:21
用Qt很容易实现,Qt也有类似的Demo.
热心网友 时间:2022-06-18 16:21
这么简单的都不舍得动脑子想啊追问我是真的没时间, 家里有些事情必须我回去。