急求一个C++程序,请高手帮帮忙

发布网友 发布时间: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

这么简单的都不舍得动脑子想啊追问我是真的没时间, 家里有些事情必须我回去。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com