目录
前言
我选择的是新生基本信息统计软件本课题是根据老师发布的任务所写。因为之前做过关于c语言的学生信息管理系统所以选择本课设,该课设会体现c++的类的应用封装多态继承等多种特点。
该课设要求我们完成实现学生信息的录入学生姓名,学号,性别,年龄,英语成绩。要求设计链表类来实现。实现学生信息录入系统的学生信息数据的创建,增删改查,文件的保存及其读取实现了更多功能在代码中可以清楚看到。
一、核心功能模块与类设计
1 创建学生信息
2 显示学生信息
3 排序学生信息
4 查询学生信息
5 删除学生信息
6 修改学生信息
0 成功退出系统
关于类的设计,我设计了两个类,一个是student类,一个是studentmassage类。第一个是将各个数据定义好,第二个是将各个函数定义好。
二、使用步骤
1.构建两个类
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌Student类﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
class Student
{
public:
char name[20]; //姓名
char Id[20]; //学号
char sex[3]; //性别
int age; //年龄
int Enum; //英语课程得分
Student * Next;
void Input()
{
cout<<"\t\t请输入学生的姓名:";
cin>>name;
cout<<"\t\t请输入学生的学号:";
cin>>Id;
cout<<"\t\t请输入学生的性别:";
cin>>sex;
cout<<"\t\t请输入学生的年龄:";
cin>>age;
cout<<"\t\t请输入学生的英语成绩:";
cin>>Enum;
cout<<endl;
}
//全部输出文件
void ReadFile(istream & in)
{
in>>name>>Id>>sex>>age>>Enum;
}
void Show()
{
cout<<"姓名 "<<"学号 "<<"性别 " <<"年龄 " <<"英语 "<<endl;
cout<<name<<" "<<Id<<" "<<sex<<" "<<age<<" "<<Enum<<endl;
}
};
//﹌﹌﹌﹌﹌﹌﹌﹌﹌Studentmassage类﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
class Studentmassage
{
public:
Studentmassage();
~Studentmassage();
void ShowMenu();
void Find();//寻找
void Save();//保存
void ModifyItem();//修改
void RemoveItem();//删除
void Swap(Student *,Student *);//交换
void Sort(); //void Unpass();
int ListCount(); //void Average();
void Display()
{
for(Student * p=Head->Next;p!=End;p=p->Next)
p->Show();
cout<<"输入任意字符!继续……";
getch();
}
//添加
void AddItem()
{
//在链表末添加结点
End->Input();
End->Next=new Student;
End=End->Next;
cout<<"添加成功!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
private:
//链表的首和末
Student * Head,* End;
//从文件的输入
ifstream in;
//向文件的输出
ofstream out;
//按照名字进行查找
Student *FindItem(char * name)
{
for(Student * p=Head;p->Next!=End;p=p->Next)//匹配成功则返回上一个指针,不成功就返回空
if(!strcmp(p->Next->name,name))return p;
return NULL;
}
//按照ID进行查找
Student *FindID(char * Id)
{
for(Student * p=Head;p->Next!=End;p=p->Next)//匹配成功则返回上一个指针,不成功就返回空
if(!strcmp(p->Next->Id,Id))return p;
return NULL;
}
};
定义showmenu函数是为了菜单展示。
定义find函数就是输入所要查找的信息对比遍历链表如果找到所要查找的信息输出就行了
定义save函数是为了将函数存入文件。
定义modifyitem函数是为了方便学生信息的修改。
定义removeitem函数是为了对学生的信息进行删除。
定义sort函数是为了实现英语成绩排序问题采用for循环的方式来实现其功能即使链表的节点一点一点与后面的比较实现排序功能。
定义swap函数是为了将两个学生的信息进行互换。
定义display函数是为了对学生信息进行一个显示
2.构建两个函数
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌构造函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
Studentmassage::Studentmassage()
{
//链表.头插法
Head=new Student;
Head->Next=new Student;
End=Head->Next;
in.open("stu.txt",ios::in | ios::out);
if(!in)
cout<<"该系统无学生信息,请先输入。"<<endl;
else
{
//eof函数,若读取到了文件结尾符返回ture,否则返回false
while(!in.eof())
{
End->ReadFile(in);
if(End->name[0]=='\0')break;
End->Next=new Student;
End=End->Next;
}
in.close();
cout<<"\t\t读取学生信息成功!"<<endl;
}
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌析构函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
Studentmassage::~Studentmassage()
{
Save();
for(Student * temp;Head->Next!=End;)
{
temp=Head->Next;
Head->Next=Head->Next->Next;
delete temp;
}
delete Head,End;
}
定义的构造函数我是想让它初始化head并给他申请空间,然后进行头插法,尾插法,读写文件,最后读取文件。
定义的析构函数是释放空间。
3.录入学生信息
void Input()
{
cout<<"\t\t请输入学生的姓名:";
cin>>name;
cout<<"\t\t请输入学生的学号:";
cin>>Id;
cout<<"\t\t请输入学生的性别:";
cin>>sex;
cout<<"\t\t请输入学生的年龄:";
cin>>age;
cout<<"\t\t请输入学生的英语成绩:";
cin>>Enum;
cout<<endl;
}
4.排序学生信息(按照英语成绩从低到高)
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::Swap(Student *p1, Student *p2)//交换两个combox变量的数据域
{
Student *temp=new Student;
strcpy(temp->name,p1->name);
strcpy(temp->Id,p1->Id);
strcpy(temp->sex,p1->sex);
temp->Enum=p1->Enum;
temp->age=p1->age;
strcpy(p1->name,p2->name);
strcpy(p1->Id,p2->Id);
strcpy(p1->sex,p2->sex);
p1->Enum=p2->Enum;
p1->age=p2->age;
strcpy(p2->name,temp->name);
strcpy(p2->Id,temp->Id);
strcpy(p2->sex,temp->sex);
p2->Enum=temp->Enum;
p2->age=temp->age;
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::Sort()//对当前链表进行排序
{
cout <<"Sorting..."<<endl;
Student *p=NULL,*p1=NULL,*k=NULL;
int n=Studentmassage::ListCount();
if(n<2)
return;
for(p=Head->Next;p!=End;p=p->Next)
for(k=p->Next;k!=End;k=k->Next)
{
if(p->Enum>k->Enum)
{
Studentmassage::Swap(p,k);
}
}
cout <<"排序完成!"<<endl;
getch();
return;
}
5.显示学生信息
void Show()
{
cout<<"姓名 "<<"学号 "<<"性别 " <<"年龄 " <<"英语 "<<endl;
cout<<name<<" "<<Id<<" "<<sex<<" "<<age<<" "<<Enum<<endl;
}
6.查询学生信息
创建了两个链表:
//按照名字进行查找
Student *FindItem(char * name)
{
for(Student * p=Head;p->Next!=End;p=p->Next)//匹配成功则返回上一个指针,不成功就返回空
if(!strcmp(p->Next->name,name))return p;
return NULL;
}
//按照ID进行查找
Student *FindID(char * Id)
{
for(Student * p=Head;p->Next!=End;p=p->Next)//匹配成功则返回上一个指针,不成功就返回空
if(!strcmp(p->Next->Id,Id))return p;
return NULL;
}
进行查找:
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌查找函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::Find()
{
char name[20] ,Id[20];
int x;
Student * p=NULL;
cout<<"\n\t\t*********************************\n";
cout<<"\t\t※ 1.按学生的姓名查找\n\t\t※ 2.按学生学号查找";
cout<<"\n\t\t*********************************\n请选择:";
cin>>x;
switch(x)
{
case 1:{cout<<"\t\t请输入要查找的学生的姓名:";cin>>name;
if(p=FindItem(name))
{
p->Next->Show();
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到该姓名的学生!"<<'\n'<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}break;
case 2:
{
cout<<"\t\t请输入要查找的学生的学号:";
cin>>Id;
if(p=FindID(Id))
{
p->Next->Show();
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到该学好的学生!"<<'\n'<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}break;
}
}
7.删除学生信息
/﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌删除信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::RemoveItem() // 删除信息
{
char name[20];
Student * p=NULL,*temp=NULL;
cout<<"\t\t请输入要删除的学生的姓名:"<<endl;
cin>>name;
if(p=FindItem(name))
{
temp=p->Next;
p->Next=p->Next->Next;
delete temp;
cout<<"\t\t删除成功!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}
8.修改学生信息
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌修改信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::ModifyItem() //修改信息
{
char name[20];
Student * p=NULL;
cout<<"\t\t请输入要修改的人的姓名:";cin>>name;
if(p=FindItem(name))
{
cout<<"\t\t已找到学生的信息,请输入新的信息!"<<endl;
p->Next->Input();
cout<<"修改成功!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}
9.主函数
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌主函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
int main()
{
int x;
bool quit=false;
//清屏
system("cls");
system("date/t");
system("time/t");
cout <<"\n***********欢迎进入大学学生管理系统****************\n"<<endl;
cout<<"^ 进入该系统设有密码,只有2次机会! \n"<<endl;
cout<<"^ 请您输入密码: ";
string str;
cin>>str;
if(str=="123456")
{
cin.get();
Studentmassage Grade;
cout<<"按任意键开始……";
getch();
while(!quit)
{
system("cls");
Grade.ShowMenu();
cin>>x;
switch(x)
{
case 0:quit=true;
cout<<"----------------------------------------------------------------------------------"<<endl;
cout<<"======>> 大学学生信息管理系统 <<====="<<endl; /*结束程序*/
cout<<"------------------------------------------------------------------------------------"<<endl;
break;
case 1:Grade.AddItem();break;
case 2:Grade.Display();break;
case 3:Grade.Sort();break;
case 4:Grade.Find();break;
case 5:Grade.RemoveItem();break;
case 6:Grade.ModifyItem();break;
}
}
}
else
{
cout<<"第一次密码错误,请重新输入密码!"<<endl;
cin>>str;
if(str=="123456")
{
{ cin.get();}
Studentmassage Grade;
cout<<"按任意键开始……";
getch();
while(!quit)
{
system("cls");
Grade.ShowMenu();
cin>>x;
switch(x)
{
case 0:quit=true;
cout<<"----------------------------------------------------------------------------------"<<endl;
cout<<"======>>大学学生信息管理系统 <<====="<<endl; /*结束程序*/
cout<<"------------------------------------------------------------------------------------"<<endl;
break;
case 1:Grade.AddItem();break;
case 2:Grade.Display();break;
case 3:Grade.Sort();break;
case 4:Grade.Find();break;
case 5:Grade.RemoveItem();break;
case 6:Grade.ModifyItem();break;
}
}
}
else
cout<<"您无权使用本系统!"<<endl;
}
return 0;
}
此次大作业让我学会了很多东西对于c++的学习我们只是学习了皮毛,我对于基础的学习还不牢固,有待提高对与代码的联系次数太少不够熟练,c++是一本比较灵活的语言语言简练高效,具有封装继承多态抽象等特点,关于这些我们都能要通过实践才能学会而不是只通过一个简单的大作业就能学会学精。