c读取txt文件内容并建立一个链表_C++链表实现学生信息管理系统

可以增删查改,使用链表存储,支持排序以及文件存储及数据读取,基本可以应付期末大作业(狗头) 界面为

13fc7c17e37657a3c9c8726a84fd585f.png

源代码为一个main.cpp和三个头文件,具体为 main.cpp

#include <iostream>
#include <fstream>//文件操作
#include <sstream>//int转string
#include <iomanip>//cout格式化输出 setw()
#include <stdlib.h>
#include "student.h"
#include "node.h"
#include "list.h"
using namespace std;int main()//入口函数
{//test();CList list1;//创建链表对象Read4File(list1);//将文件数据读取到链表中int choice = -1;//接收用户选择while(true){system("cls");//清屏MainMenu();cin>>choice;switch(choice){case 1:system("cls");//清屏cout<<"********【所有数据】********"<<endl;cout<<"序号t学号      姓名      班级      分数"<<endl;cout<<"*******【共 "<<list1.DisplayListData()<<" 人】******n"<<endl;list1.Compute(); system("pause");//暂停一下break;case 2:Add(list1);//添加操作break;case 3:Find(list1);//查找操作break;case 4:Update(list1);//更新操作(修改)break;case 5:Sort(list1);//排序操作break;case 6:Del(list1);//删除操作break;case 7:ClearFileData();//清空文件数据list1.Clear();//清空链表数据break;case 0://退出程序return 0;default:cout<<"请输入0~7"<<endl;system("pause");break;}}return 0;
}

list.h

#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <stdlib.h>
#define FILE_PATH "student.txt" //数据文件的路径
using namespace std;
//声明
class CList;
void Save2File(CList& list);//将数据保存到文件
void Read4File(CList& list);//读取文件数据到链表bool CmpStr(string str1, string str2)//字符串比较函数
{int len1 = str1.size();//字符串1的长度int len2 = str2.size();//字符串2的长度//将两个字符串的长度 添加为一样长(达到右对齐的效果)for(int i=0; i<len1-len2; i++)//如果字符串str1比str2长,在str2的前面补0{str2.insert(0, "0");//在最前面补0}for(int i=0; i<len2-len1; i++)//如果字符串str2比str1长,在str1的前面补0{str1.insert(0, "0");//在最前面补0}return str1>str2;
}bool SortById(SNode* &p, SNode* &q)//按学号升序排序
{return ( p->stu.GetId()>q->stu.GetId() );
}bool SortByName(SNode* &p, SNode* &q)//按姓名升序排序
{return CmpStr(p->stu.GetName(), q->stu.GetName());  
}bool SortByClass(SNode* &p, SNode* &q)//按班级升序排序
{return CmpStr(p->stu.GetClass(), q->stu.GetClass());    
}
bool SortByScore(SNode* &p, SNode* &q)//按Score升序排序
{return ( p->stu.GetScore()>q->stu.GetScore() );
}typedef bool (*FUNCP)(SNode* &p, SNode* &q);//函数指针
FUNCP pFunArr[] = {SortById, SortByName, SortByClass,SortByScore};//排序函数的指针数组//链表操作类
class CList
{SNode* m_pListHead;//链表头结点指针void Init_ListHead();//初始化头结点
public:CList();//无参构造函数,用来初始化成员,创建对象的时候自动调用~CList();//析构函数,用来释放格外申请的堆空间,(对象被销毁的时候自动调用)void AddHead(SNode& node);//头插法 添加数据void AddTail(SNode& node);//尾插法 添加数据bool DelData(int id);//根据id删除数据SNode* FindData(int id);//根据id查找指定数据bool UpdateData(int id, SNode& update);//根据id修改数据(更新)int DisplayListData();//显示链表所有数据,返回数据条数SNode* GetListHead();//外界获取头结点指针的接口(头指针是private权限)void Clear();//清空链表。释放链表空间void Sort(int type = 0);//默认按id升序排序int Size();void Compute();//获取链表数据的个数
};//类成员函数的类外实现
CList::CList()//无参构造函数,用来初始化成员
{Init_ListHead();//初始化链表头结点
}CList::~CList()//析构函数,用来释放格外申请的堆空间,(对象被销毁的时候自动调用)
{Clear();//释放链表空间delete m_pListHead;//释放头结点,m_pListHead = NULL;//置空,防止重复操作
}
void CList::Compute()//根据id升序排序
{ int a=0,b=0,c=0;if(m_pListHead == NULL)//空链表直接返回{return;}SNode* p; //排序辅助指针(以p为基准,q遍历连链表数据,temp在交换的数据时使用,指向需要交换时的较大者)for(p = m_pListHead->next;p != NULL;p = p->next){if(p->stu.GetScore()<60)a++;else if(p->stu.GetScore()>=60&&p->stu.GetScore()<=80)b++;else if(p->stu.GetScore()>80)c++;}cout<<"60分以下(不含60分)的人数有:"<<a<<"人"<<endl;cout<<"60分以上80分以下(含80分)的人数有:"<<b<<"人"<<endl;cout<<"80分以上的人数有:"<<c<<"人"<<endl;if((a+b+c)!=0)cout<<"及格率为:"<<(float)(b+c)/(a+b+c)*100<<"%"<<endl;}void CList::Init_ListHead()//初始化头结点
{m_pListHead = new SNode;//初始化头结点m_pListHead->stu.SetId(0);m_pListHead->stu.SetName("头结点");m_pListHead->stu.SetClass("A班");m_pListHead->stu.SetScore(0);m_pListHead->next = NULL;
}void CList::AddHead(SNode& node)//头插法 添加数据
{SNode* new_node = new SNode(node);new_node->next = NULL;if(m_pListHead == NULL)//头结点为空,就初始化头结点{Init_ListHead();}if(m_pListHead->next == NULL)//如果除头结点外还没有数据节点,直接让头结点指向新的节点,新的节点作为第一个数据节点{m_pListHead->next = new_node;}else //将新的节点作为第一个数据节点(头结点后面的一个){new_node->next = m_pListHead->next;m_pListHead->next = new_node;}
}void CList::AddTail(SNode& node)//尾插法 添加数据
{SNode* new_node = new SNode(node);new_node->next = NULL;if(m_pListHead == NULL)//头结点为空,就初始化头结点{Init_ListHead();}SNode* p = m_pListHead;while(p->next)//遍历到链表最后一个节点,直到p->next为NULL{p = p->next;}p->next = new_node;//链表最后的节点指向新的节点,新的节点成为尾节点}bool CList::DelData(int id)//根据id删除数据
{if(m_pListHead == NULL){return false;}SNode* p = m_pListHead->next;//p遍历节点SNode* q = m_pListHead;//q为p的前一个节点while(p != NULL)//遍历链表{if(id == p->stu.GetId())//找到要删除的数据节点p{q->next = p->next;delete p;p = NULL;//置空,防止再次操作造成隐蔽错误return true;}q = p;p = p->next;}return false;
}SNode* CList::FindData(int id)//根据id查找指定数据
{if(m_pListHead == NULL){return NULL;}SNode* p = m_pListHead->next;//p遍历节点while(p != NULL)//遍历链表{if(id == p->stu.GetId())//找到要删除的数据节点p{return p;}p = p->next;}return NULL;
}bool CList::UpdateData(int id, SNode& update)//根据id修改数据(更新)
{if(m_pListHead == NULL){return false;}SNode* findNode = NULL;findNode = FindData(id);if(findNode != NULL){//memcpy(findNode, &update, sizeof(SNode)-sizeof(SNode*));//更新数据,不更新指针域findNode->stu.SetId(update.stu.GetId());findNode->stu.SetName(update.stu.GetName());findNode->stu.SetClass(update.stu.GetClass());findNode->stu.SetScore(update.stu.GetScore());return true;}return false;
}int CList::DisplayListData()//显示链表所有数据
{if(m_pListHead == NULL){return 0;}int count = 0;//记录数据的总条数SNode* p = m_pListHead->next;while(p != NULL)//遍历链表{count++;cout<<"["<<count<<"]t"<<setw(4)<<p->stu.GetId()<<"  "<<setw(8)<<p->stu.GetName()<<"  "<<setw(8)<<p->stu.GetClass()<<setw(8)<<p->stu.GetScore()<<endl;//(setw(8)输出宽度,默认右对齐)p = p->next;}return count;
}void CList::Clear()//清空链表。释放链表空间
{if(m_pListHead == NULL){return;}SNode* p = m_pListHead->next;while(p != NULL)//遍历链表{m_pListHead->next = p->next;delete p;p = m_pListHead->next;}
}void CList::Sort(int type)//排序
{if(m_pListHead == NULL)//空链表直接返回{return;}SNode* p, *q, *bigger;//排序辅助指针(以p为基准,q遍历连链表数据,temp在交换的数据时使用,指向需要交换时的较大者)for(p = m_pListHead->next;p != NULL;p = p->next){bigger = p;for(q = p->next;q != NULL;q = q->next){if( pFunArr[type](bigger, q) )//前面的比后面的大,就交换{bigger = q;//指向需要交换时的较大者}}if(bigger != p)//需要交换{SNode temp = *bigger;//指针域不用交换bigger->stu.SetId(p->stu.GetId());bigger->stu.SetName(p->stu.GetName());bigger->stu.SetClass(p->stu.GetClass());bigger->stu.SetScore(p->stu.GetScore());p->stu.SetId(temp.stu.GetId());p->stu.SetName(temp.stu.GetName());p->stu.SetClass(temp.stu.GetClass());p->stu.SetScore(temp.stu.GetScore());}}
}SNode* CList::GetListHead()//外界获取头结点指针的接口(头指针是private权限)
{return  this->m_pListHead;
}int CList::Size()
{if(m_pListHead == NULL){return 0;}int count = 0;//数据的个数SNode* p = m_pListHead;while( (p=p->next) != NULL){count++;}return count;
}void AddMenu()//添加 菜单
{cout<<"┏━━━━━━━━━━┓"<<endl;cout<<"┃      添加菜单      ┃"<<endl;cout<<"┃   【1】 添加到头部 ┃"<<endl;cout<<"┃   【2】 添加到尾部 ┃"<<endl;cout<<"┃   【0】 返回       ┃"<<endl;cout<<"┗━━━━━━━━━━┛"<<endl;cout<<" ******请输入0~2:";
}void Add(CList& list)//添加处理
{int id = -1;//接收用户输入的idstring name = "";//接收用户输入的姓名string _class = "";//接收用户输入的班级float score =0;SNode new_node;//存储输入的合法数据int choice = -1;//接收用户选择char save = 'Y';//是否将数据保存到文件char isAdd = 'N';//用来表识 用户是否有添加过数据,如果有会在返回上级菜单的时候提示用户保存到文件char isContinue = 'Y';//表识是否继续添加while(true){system("cls");//清屏AddMenu();//添加菜单cin>>choice;//接收用户选择switch(choice){case 1://头插法case 2://尾部添加isContinue = 'Y';while(isContinue == 'Y' || isContinue == 'y')//循环添加{cout<<"请输入学号:";cin>>id;if(id<=0)//检查用户输入的id是否合法{cout<<"序号应大于0!请重新输入!"<<endl;}else if(list.FindData(id) != NULL)//学号大于0但是已经存在{cout<<"学号 "<<id<<" 已经存在!请重新输入!"<<endl;}else//学号大于0且不存在{new_node.stu.SetId(id);//设置新的学号for(;;)//循环接收用户输入的姓名,直到姓名不为空{cout<<"请输入姓名:";cin>>name;if(name.empty())//如果姓名为空{cout<<"姓名 不能为空!请重新输入!(按0结束输入)"<<endl;continue;}break;}if(name == "0")//如果姓名为0,结束添加{break;//跳出循环}new_node.stu.SetName(name);//设新节点的姓名for(;;)//循环接收用户输入的班级,直到班级不为空{cout<<"请输入班级:";cin>>_class;if(_class.empty())//如果班级为空{cout<<"班级 不能为空!请重新输入!(按0结束输入)"<<endl;continue;}break;}if(_class == "0")//如果班级为0,结束添加{break;//跳出循环}new_node.stu.SetClass(_class);//设置新节点的班级for(;;)//循环接收用户输入的score,直到score不为空{cout<<"请输入分数:";cin>>score;if(score<0){cout<<"分数不能为负!请重新输入!(按0结束输入)"<<endl;continue;}break;}if(score==0)//如果分数为0,结束添加{break;//跳出循环}new_node.stu.SetScore(score);if(choice == 1){list.AddHead(new_node);//头插法添加到链表}else{list.AddTail(new_node);//尾插法添加到链表}isAdd = 'Y';//表识用户添加了数据}cout<<"是否继续添加?(y/n):";cin>>isContinue;}break;case 0:if(isAdd == 'Y')//用户添加过数据才提示保存{cout<<"是否保存到文件?(y/n)"<<endl;cin>>save;if(save == 'Y'|| save == 'y'){Save2File(list);//将数据保存到文件cout<<"保存成功!"<<endl;system("pause");}else//不保存{list.Clear();//清除数据Read4File(list);//重新读取数据}}return;default:cout<<"请输入0~2"<<endl;system("pause");break;}}
}void DelMenu()//删除菜单
{cout<<"┏━━━━━━━━━━┓"<<endl;cout<<"┃      删除菜单      ┃"<<endl;cout<<"┃   【1】 按学号删除 ┃"<<endl;cout<<"┃   【0】 返回       ┃"<<endl;cout<<"┗━━━━━━━━━━┛"<<endl;cout<<" ******请输入0~1:";
}void Del(CList& list)//删除操作
{int id  = -1;char choice = '0';//用户选择bool isDel = false;//接收删除结果char isSure = 'N';//提示用户 确认删除SNode* findNode = NULL;//指向匹配的数据节点while(true){system("cls");//清屏DelMenu();cin>>choice;if(choice == '1'){cout<<"请输入要删除的学号:";}else{break;}cin>>id;if(id == 0){break;}findNode = list.FindData(id);if(findNode != NULL)//存在目标数据{cout<<"学号"<<"t"<<"姓名"<<"t"<<"班级"<<"t"<<"分数"<<endl;cout<<findNode->stu.GetId()<<"t"<<findNode->stu.GetName()<<"t"<<findNode->stu.GetClass()<<endl;cout<<"已经找到学号为 "<<id<<"的数据,是否删除?(y/n):";cin>>isSure;if(isSure == 'Y' || isSure == 'y')//用户确认删除{isDel = list.DelData(id);Save2File(list);//保存到文件if(isDel)//删除成功{cout<<"已成功删除id为"<<id<<"的数据"<<endl;}else{cout<<"删除id为"<<id<<"的数据 失败!"<<endl;}}}else{cout<<"请检查"<<id<<"是否存在!"<<endl;}system("pause");}
}void FindMenu()//查找的菜单
{cout<<"┏━━━━━━━━━━┓"<<endl;cout<<"┃      查找菜单      ┃"<<endl;cout<<"┃   【1】 按学号查找 ┃"<<endl;cout<<"┃   【2】 按姓名查找 ┃"<<endl;cout<<"┃   【3】 按班级查找 ┃"<<endl;cout<<"┃   【0】 返回       ┃"<<endl;cout<<"┗━━━━━━━━━━┛"<<endl;cout<<" ******请输入0~3:";
}void Find(CList& list)//查找操作
{int id  = -1;//存放要查找的学号string name_class = "";//存放要查找的姓名(或班级)int choice = -1;//接收用户的选择SNode* findNode = NULL;//接收查找结果while(true){system("cls");//清屏FindMenu();//查找菜单cin>>choice;//接收用户选择switch(choice){case 1://按学号查找,因为学号是唯一的,所以最多只有一个匹配的数据cout<<"请输入要查找的学号:";cin>>id;findNode = list.FindData(id);if(findNode != NULL)//找到数据{cout<<"n已经找到id为"<<id<<"的数据"<<endl;cout<<"学号"<<"t"<<"姓名"<<"t"<<"班级"<<endl;cout<<findNode->stu.GetId()<<"t"<<findNode->stu.GetName()<<"t"<<findNode->stu.GetClass()<<"t"<<findNode->stu.GetScore()<<endl;}else{cout<<"未找到,请检查学号 "<<id<<" 是否存在!"<<endl;}break;case 2://按姓名查找,可能有重名的,所以结果可能包含多个数据case 3:{if(choice == 2){cout<<"请输入要查找的姓名:";}else{cout<<"请输入要查找的班级:";}cin>>name_class;CList findList;//存放查询的结果findNode = list.GetListHead();//获取链表头结点if(findNode != NULL){findNode = findNode->next;while(findNode != NULL)//遍历数据链表,匹配就添加到结果链表{if( ((choice == 2) && name_class == findNode->stu.GetName()) ||((choice == 3) && name_class == findNode->stu.GetClass()))//姓名(或班级)匹配{findList.AddTail(*findNode);//添加到结果链表中}findNode = findNode->next;}}int count = findList.Size();//匹配到的数据数目if( count>0 )//如果结果链表中匹配到有数据{if(choice == 2){cout<<"n已经找到姓名为 "<<name_class<<" 的数据"<<endl;}else{cout<<"n已经找到班级为 "<<name_class<<" 的数据"<<endl;}cout<<"学号"<<"t"<<"姓名"<<"t"<<"班级"<<endl;findNode = findList.GetListHead()->next;while(findNode != NULL){cout<<findNode->stu.GetId()<<"t"<<findNode->stu.GetName()<<"t"<<findNode->stu.GetClass()<<endl;findNode = findNode->next;}cout<<"*****【共 "<<count<<" 名学生】*****n"<<endl;}else{if(choice == 2){cout<<"未找到,请检查姓名 "<<name_class<<" 是否存在!"<<endl;}else{cout<<"未找到,请检查班级 "<<name_class<<" 是否存在!"<<endl;}}break;}case 0://返回return;default:cout<<"请输入0~3"<<endl;break;}system("pause");}
}void UpdateMenu()//更新菜单
{cout<<"┏━━━━━━━━━━┓"<<endl;cout<<"┃      更新菜单      ┃"<<endl;cout<<"┃   【1】 按学号更新 ┃"<<endl;cout<<"┃   【0】 返回       ┃"<<endl;cout<<"┗━━━━━━━━━━┛"<<endl;cout<<" ******请输入0~1:";
}void Update(CList& list)//更新操作
{int id = -1;int choice = -1;//用户的选择bool isUpdate = NULL;//接收修改结果string name = "";//新的姓名string _class = "";//新的班级float score=0;SNode* findNode = NULL;//指向要更新的节点SNode update;//新的数据while(true){system("cls");//清屏UpdateMenu();//更新菜单cin>>choice;//接收用户选择switch(choice){case 1:cout<<"请输入要更新的学号:";cin>>id;findNode = list.FindData(id);if(findNode == NULL)//不存在目标数据,则重新输入{cout<<"不存在此学号!"<<endl;system("pause");continue;}cout<<"n已经找到id为"<<id<<"的数据"<<endl;cout<<"学号"<<"t"<<"姓名"<<"t"<<"班级"<<"t"<<"分数"<<endl;cout<<findNode->stu.GetId()<<"t"<<findNode->stu.GetName()<<"t"<<findNode->stu.GetClass()<<"t"<<findNode->stu.GetScore()<<endl;update = *findNode;cout<<"【输入0,表示不更改】"<<endl;cout<<"将姓名:"<<findNode->stu.GetName()<<" 改为:";cin>>name;if(name != "0"){update.stu.SetName(name);}cout<<"将分数:"<<findNode->stu.GetScore()<<" 改为:";cin>>score;if(score != 0){update.stu.SetScore(score);}cout<<"将班级:"<<findNode->stu.GetClass()<<" 改为:";cin>>_class;if(_class != "0"){update.stu.SetClass(_class);}if(name != "0" || _class != "0")//用户有更改{isUpdate = list.UpdateData(id, update);if(isUpdate == true){Save2File(list);//保存到文件cout<<"更新成功!"<<endl;}else{cout<<"更新失败!"<<endl;}}else{cout<<"未更改!"<<endl;}break;case 0:return;default:cout<<"请输入0~1"<<endl;break;}system("pause");//因为有清屏动作,所以暂停一下,让用户查看输出信息}
}void Save2File(CList& list)//将数据保存到文件
{SNode* listHead = list.GetListHead();//获取到链表头结点if(listHead == NULL){return;}ofstream fout(FILE_PATH,ios_base::binary);//不存在则创建,存在则会清空。//fout.clear();//清空文件数据SNode* p = listHead->next;while(p !=NULL ){fout<<p->stu.ToString()<<" ";//以空格分隔数据p = p->next;}fout.close();//关闭流return;
}void Read4File(CList& list)//读取文件数据 到链表中
{SNode node;int beforeId = -1;//上一个idint id = -1;//临时存放学号string name = "";//临时存放姓名string _class = "";//存放班级float score=0;ifstream fin;fin.open(FILE_PATH, ios_base::in);//打开文件if(fin == NULL)//文件不存在,直接返回{return;}while(!fin.eof())//循环读取直到文件末尾{fin>>id>>name>>_class>>score;if(id>0 && id != beforeId)//因为空格的原因 读取读后一个数据两次,这里使用beforeId来避免重复添加{node.stu.SetId(id);node.stu.SetName(name);node.stu.SetClass(_class);node.stu.SetScore(score);list.AddTail(node);//添加}beforeId = id;//记录上一次id}fin.close();//关闭文件流return;
}void ClearFileData()//清空文件数据,方便测试
{char isSure = 'n';//是否确认清除数据cout<<"确认清除文件数据?(y/n):";cin>>isSure;if(isSure == 'Y' || isSure == 'y'){ofstream fout(FILE_PATH);//不存在则创建,存在则会清空fout.close();cout<<"清除文件数据成功!"<<endl;system("pause");}
}void SortMenu()//排序菜单
{cout<<"┏━━━━━━━━━━┓"<<endl;cout<<"┃      排序菜单      ┃"<<endl;cout<<"┃   【1】 按学号排序 ┃"<<endl;cout<<"┃   【2】 按姓名排序 ┃"<<endl;cout<<"┃   【3】 按班级排序 ┃"<<endl;cout<<"┃   【4】 按分数排序 ┃"<<endl;cout<<"┃   【0】 返回       ┃"<<endl;cout<<"┗━━━━━━━━━━┛"<<endl;cout<<" ******请输入0~4:";
}void Sort(CList& list)
{char isSave = 'n';//是否将排序后的数据更新到文件int choice = -1;while(true){system("cls");//清屏SortMenu();cin>>choice;switch(choice){case 1://按学号排序case 2://按姓名排序case 3:case 4://按班级排序list.Sort(choice-1);if(choice == 1){cout<<"***按学号升序排序如下:"<<endl;}else if(choice == 2){cout<<"***按姓名升序排序如下:"<<endl;}else if(choice == 3){cout<<"***按班级升序排序如下:"<<endl;}else if(choice == 4){cout<<"***按分数升序排序如下:"<<endl;}cout<<"序号t学号      姓名      班级      分数"<<endl;list.DisplayListData();//显示cout<<"是否将排序后的数据更新到文件?(y/n):";cin>>isSave;if(isSave == 'Y' || isSave == 'y')//确认保存到文件{Save2File(list);//将数据重新写入到文件cout<<"保存数据成功!"<<endl;system("pause");}else{list.Clear();//清空链表数据Read4File(list);//重新加载数据文件}break;case 0:return;break;default:cout<<"请输入0~3"<<endl;system("pause");break;}}
}void MainMenu()//主菜单
{cout<<"┏━━━━━━━━┓"<<endl;cout<<"┃学生信息管理程序┃"<<endl;cout<<"┃   【1】 显示   ┃"<<endl;cout<<"┃   【2】 添加   ┃"<<endl;cout<<"┃   【3】 查找   ┃"<<endl;cout<<"┃   【4】 修改   ┃"<<endl;cout<<"┃   【5】 排序   ┃"<<endl;cout<<"┃   【6】 删除   ┃"<<endl;cout<<"┃   【7】 清空   ┃"<<endl;cout<<"┃   【0】 退出   ┃"<<endl;cout<<"┗━━━━━━━━┛"<<endl;cout<<" *****请输入0~7:";
}

node.h

//链表节点
typedef struct SNode
{Student stu;//数据域struct SNode* next;//指针域SNode()//无参构造函数{stu.SetId(0);next = NULL;}SNode(int id)//有参构造函数{stu.SetId(id);next = NULL;}
}SNode;

student.h

//学生类
#include <sstream>
using namespace std;//int转string
class Student
{
private:int m_id;//学号string m_name;//姓名string m_class;//班级float m_score;
public:Student()//无参构造函数{m_id = 0;m_score=0;m_name = "0";m_class = "0";}Student(int id, string name, string _class,float score)//有参构造函数,class是关键字,所以不能用作变量名{if(id < 0)//确保id不为负数{id = 0;}this->m_id = id;if(name.empty())//确保name不为空{name = "0";}this->m_name = name;if(_class.empty())//确保_class不为空{_class = "0";}this->m_class = _class;if(score<0)//确保_class不为空{score = 0;}this->m_score = score;}void SetId(int id)//设置id{if(id < 0 )//确保id>0,id=0为无效{id = 0;}this->m_id = id;}int GetId()//获取id{return this->m_id;}void SetName(string name)//设置姓名{if(name.empty())//确保name不为空{name = "0";}this->m_name = name;}string GetName()//获取姓名{return this->m_name;}void SetClass(string _class)//设置班级{if(_class.empty())//确保_class不为空{_class = "0";}this->m_class = _class;}string GetClass()//获取班级{return this->m_class;}void SetScore(float score)//设置id{if(score < 0 )//确保id>0,id=0为无效{score = 0;}this->m_score = score;}float GetScore()//获取id{return this->m_score;}string ToString()//将数据转为字符串形式,方便存到文件中{stringstream ss;ss<<m_id<<" "<<m_name<<" "<<m_class<<" "<<m_score;//学号 姓名 班级return ss.str();}
};

使用GCC编译。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/389005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阎焱多少身价_2020年,数据科学家的身价是多少?

阎焱多少身价Photo by Christine Roy on Unsplash克里斯汀罗伊 ( Christine Roy) 摄于Unsplash Although we find ourselves in unprecedented times of uncertainty, current events have shown just how valuable the fields of Data Science and Computer Science truly are…

单据打印_Excel多功能进销存套表,自动库存单据,查询打印一键操作

Hello大家好&#xff0c;我是帮帮。今天跟大家分享一张Excel多功能进销存管理套表&#xff0c;自动库存&#xff0c;单据打印&#xff0c;查询统算一键操作。为了让大家能更稳定的下载模板&#xff0c;我们又开通了全新下载方式(见文章末尾)&#xff0c;以便大家可以轻松获得免…

卡尔曼滤波滤波方程_了解卡尔曼滤波器及其方程

卡尔曼滤波滤波方程Before getting into what a Kalman filter is or what it does, let’s first do an exercise. Open the google maps application on your phone and check your device’s current location.在了解什么是卡尔曼滤波器或其功能之前&#xff0c;我们先做一个…

Candidate sampling:NCE loss和negative sample

在工作中用到了类似于negative sample的方法&#xff0c;才发现我其实并不了解candidate sampling。于是看了一些相关资料&#xff0c;在此简单总结一些相关内容。 主要内容来自tensorflow的candidate_sampling和卡耐基梅隆大学一个学生写的一份notesNotes on Noise Contrastiv…

golang key map 所有_Map的底层实现 为什么遍历Map总是乱序的

Golang中Map的底层结构其实提到Map&#xff0c;一般想到的底层实现就是哈希表&#xff0c;哈希表的结构主要是Hashcode 数组。存储kv时&#xff0c;首先将k通过hashcode后对数组长度取余&#xff0c;决定需要放入的数组的index当数组对应的index已有元素时&#xff0c;此时产生…

朴素贝叶斯分类器 文本分类_构建灾难响应的文本分类器

朴素贝叶斯分类器 文本分类背景 (Background) Following a disaster, typically you will get millions and millions of communications, either direct or via social media, right at the time when disaster response organizations have the least capacity to filter and…

第二轮冲次会议第六次

今天早上八点我们进行了站立会议 此次站立会议我们开了30分钟 参加会议的人员&#xff1a; 黄睿麒 侯熙磊 会议内容&#xff1a;我们今天讨论了如何分离界面&#xff0c;是在显示上进行限制从而达到不同引用展现不同便签信息&#xff0c;还是单独开一个界面从而实现显示不同界面…

markdown 链接跳转到标题_我是如何使用 Vim 高效率写 Markdown 的

本文仅适合于对vim有一定了解的人阅读&#xff0c;没有了解的人可以看看文中的视频我使用 neovim 代替 vim &#xff0c;有些插件是 neovim 独占&#xff0c; neovim 和 vim 的区别请自行 google系统: Manjaro(Linux)前言之前我一直使用的是 vscode 和 typora 作为 markdown 编…

Seaborn:Python

Seaborn is a data visualization library built on top of matplotlib and closely integrated with pandas data structures in Python. Visualization is the central part of Seaborn which helps in exploration and understanding of data.Seaborn是建立在matplotlib之上…

福大软工 · 第十次作业 - 项目测评(团队)

写在前面 本次作业测试报告链接林燊大哥第一部分 调研&#xff0c;评测 一、评测 软件的bug&#xff0c;功能评测&#xff0c;黑箱测试 1.下载并使用&#xff0c;描述最简单直观的个人第一次上手体验 IOS端 UI界面简单明了&#xff0c;是我喜欢的极简风格。课程模块界面简洁优雅…

销货清单数据_2020年8月数据科学阅读清单

销货清单数据Note: I am not affiliated with any of the writers in this article. These are simply books and essays that I’m excited to share with you. There are no referrals or a cent going in my pocket from the authors or publishers mentioned. Reading is a…

c++运行不出结果_fastjson 不出网利用总结

点击蓝字 关注我们 声明 本文作者:flashine 本文字数:2382 阅读时长:20分钟 附件/链接:点击查看原文下载 声明:请勿用作违法用途,否则后果自负 本文属于WgpSec原创奖励计划,未经许可禁止转载 前言 之前做项目在内网测到了一个fastjson反序列化漏洞,使用dnslo…

FocusBI:租房分析可视化(PowerBI网址体验)

微信公众号&#xff1a;FocusBI关注可了解更多的商业智能、数据仓库、数据库开发、爬虫知识及沪深股市数据推送。问题或建议&#xff0c;请关注公众号发送消息留言;如果你觉得FocusBI对你有帮助&#xff0c;欢迎转发朋友圈或在文章末尾点赞[1] 《商业智能教程》pdf下载地址 …

米其林餐厅 盐之花_在世界范围内探索《米其林指南》

米其林餐厅 盐之花Among the culinary world, there are few greater accolades for a restaurant than being awarded a Michelin star (or three!), or being listed as one of the best in the world by a reputable guide. Foodies and fine dine lovers like myself, see …

差值平方和匹配_纯前端实现图片的模板匹配

基础介绍模板匹配是指在当前图像A里寻找与图像B最相似的部分&#xff0c;本文中将图像A称为模板图像&#xff0c;将图像B称为搜索匹配图像。引言&#xff1a;一般在Opencv里实现此种功能非常方便&#xff1a;直接调用result cv2.matchTemplate(templ, search, method)templ 为…

蓝牙耳机音量大解决办法_长时间使用蓝牙耳机的危害这么大?我们到底该选什么蓝牙耳机呢?...

蓝牙耳机避免了耳机线缠结&#xff0c;使人活动更自由&#xff0c;给人们带来了更加方便、舒适的听觉体验。但近日&#xff0c;英国《每日邮报》刊文表示&#xff0c;蓝牙耳机可能会危害人体健康。美国加州大学伯克利分校公共健康教授乔尔莫斯科维茨博士表示&#xff0c;已有研…

spotify 数据分析_我的Spotify流历史分析

spotify 数据分析Spotisis /spo-ti-sis/ noun The analysis of one’s Spotify streaming history using Python.Spotisis / spo-ti-sis / 名词使用Python分析一个人的Spotify流历史。 I was reading through a lot of data science related guides and project ideas when I …

intellig idea中jsp或html数据没有自动保存和更换字体

主题一:保存数据jsp intellig idea是自动保存数据的,看到没有保存 解决方案&#xff1a; 成功解决 主题二:更换字体: 或者快捷键CtelAlts 成功解决 转载于:https://www.cnblogs.com/weibanggang/p/9398498.html

java 环境变量

1.确保安装jrd jdk 2.环境变量配置 (1)新建->变量名"JAVA_HOME"&#xff0c;变量值"C:\Java\jdk1.8.0_05"&#xff08;JDK的安装路径&#xff09; (2)编辑->变量名"Path"&#xff0c;在原变量值的最后面加上“;%JAVA_HOME%\bin;%JAVA_HOME…

陆涛喜欢夏琳吗_夏琳·香布利斯(Charlene Chambliss):从心理学到自然语言处理和应用研究

陆涛喜欢夏琳吗技术系列中的女性 (WOMEN IN TECHNOLOGY SERIES) Interest in data science has been exponentially increasing over the past decade, and more and more people are working towards making a career switch into the field. In 2020, articles and YouTube v…