- 课程设计
- 需要在主函数目录下新建三个txt文件:stubook, stusub, subbook以存储学生信息,并在StuBook.cpp中将文件路径修改为当前文件路径。
错误处理:出现undefined reference to `***'时,其含义为“未定义***”,查找问题思路有以下三点:1.检查当前函数或变量是否已经定义;2.检查头文件是否正确调用相关库;3.检查编译器是否链接相关资源库。
主函数main.cpp
#include <iostream>
#include <vector>
#include "Student.h"
#include "Subject.h"
#include "StuBook.h"
using namespace std;
int menu_select()
{
//显示主菜单
int c;
cout << "*******************************\n";
cout << "* 学生成绩管理 v1.0*\n";
cout << "* *\n";
cout << "* 1. 创建学科信息*\n";
cout << "* 2. 读取学科信息*\n";
cout << "* 3. 更新学科信息*\n";
cout << "* 4. 删除学科信息*\n";
cout << "* 5. 创建学生信息*\n";
cout << "* 6. 读取学生信息*\n";
cout << "* 7. 更新学生信息*\n";
cout << "* 8. 删除学生信息*\n";
cout << "* 9. 退出程序*\n";
cout << "*******************************\n";
cout << "\n 请输入(1~9): ";
do //键盘输入循环
{
cin>>c;
}
while(c<1 || c>9);
return c;
}
void menu()
{
int choice;
StuBook book;
book.sub_load();
book.stu_load();
while(1) //循环,直到键盘输入结束代码
{
try
{
char p='0';
choice = menu_select();
if(choice<=9&&choice>=0)system("cls");
switch(choice) //根据键盘输入,调用相应的功能
{
case 1:
cout << "*创建学科信息*\n";
book.sub_create();
break;
case 2:
cout << "*读取学科信息*\n";
book.sub_read();
break;
case 3:
cout << "*更新学科信息*\n";
book.sub_update();
break;
case 4:
cout << "*删除学科信息*\n";
book.sub_delete();
break;
case 5:
cout << "*创建学生信息*\n";
book.stu_create();
break;
case 6:
cout << "*读取学生信息*\n";
book.stu_read();
break;
case 7:
cout << "*更新学生信息*\n";
book.stu_update();
break;
case 8:
cout << "*删除学生信息*\n";
book.stu_delete();
break;
case 9:
throw 9;
}
while(p!='Y'&&p!='N')
{
cout<<"->是否继续?(Y/N)";
cin>>p;
}
if(p=='N')break;
system("cls");
}
catch(int n)
{
if(n==9)
break;
}
}
book.sub_save();
book.stu_save();
cout<<"退出成功!"<<endl;
}
int main()
{
menu();
return 0;
}
Student.h文件
#ifndef STUDENT_H
#define STUDENT_H
#include <iostream>
#include <vector>
#include "Subject.h"
using namespace std;
class Student
{
public:
Student();
virtual ~Student();
void setName(string name);
void setClassroom(string classroom);
void setGrades();
void setRanking(int ranking);
void setSubject(string name,double scores);
void deleteSubject(string name);
string getName();
string getClassroom();
double getGrades();
double getScores(string name);
int getRanking();
int getNumSub();
void show();
protected:
private:
string name,classroom;
double grades;
int ranking;
vector<Subject> sub;
};
#endif // STUDENT_H
Student.cpp文件
#include "Student.h"
#include <iostream>
#include <vector>
#include "Subject.h"
Student::Student()
{
name=classroom="null";
grades=0;
ranking=0;
}
Student::~Student()
{
//dtor
}
void Student::setName(string name)
{
this->name=name;
}
void Student::setClassroom(string classroom)
{
this->classroom=classroom;
}
void Student::setGrades()
{
int length;
length=sub.size();
grades=0;
for(int i=0; i<length; i++)
{
grades+=sub[i].getScores();
}
}
void Student::setRanking(int ranking)
{
this->ranking=ranking;
}
void Student::deleteSubject(string name)
{
int length=sub.size();
for(int i=0; i<length; i++)
{
if(sub[i].getName()==name)
{
sub.erase(sub.begin()+i);
}
}
}
string Student::getName()
{
return name;
}
string Student::getClassroom()
{
return classroom;
}
double Student::getGrades()
{
return grades;
}
double Student::getScores(string name)
{
double scores=0;
int length=sub.size();
for(int i=0; i<length; i++)
{
if(sub[i].getName()==name)
{
scores=sub[i].getScores();
}
}
return scores;
}
int Student::getRanking()
{
return ranking;
}
int Student::getNumSub()
{
return sub.size();
}
void Student::setSubject(string name,double scores)
{
int length=sub.size();
int flag=1;
for(int i=0; i<length; i++)
{
if(sub[i].getName()==name)
{
sub[i].setScores(scores);
flag=0;
break;
}
}
if(flag)
{
Subject s;
s.setName(name);
s.setScores(scores);
sub.push_back(s);
}
}
Subject.h文件
#ifndef SUBJECT_H
#define SUBJECT_H
#include <iostream>
using namespace std;
class Subject
{
public:
Subject();
Subject(string name,double scores);
virtual ~Subject();
void setName(string name);
void setScores(double scores);
string getName();
double getScores();
protected:
private:
string name;
double scores;
};
#endif // SUBJECT_H
Subject.cpp文件
#include "Subject.h"
#include <iostream>
using namespace std;
Subject::Subject()
{
name="null";
scores=-1;
}
Subject::Subject(string name,double scores)
{
setName(name);
setScores(scores);
}
Subject::~Subject()
{
//dtor
}
void Subject::setName(string name)
{
this->name=name;
}
void Subject::setScores(double scores)
{
this->scores=scores;
}
string Subject::getName()
{
return name;
}
double Subject::getScores()
{
return scores;
}
StuBook.h文件
#ifndef STUBOOK_H
#define STUBOOK_H
#include <iostream>
#include <vector>
#include "Subject.h"
#include "Student.h"
using namespace std;
class StuBook
{
public:
StuBook();
virtual ~StuBook();
int getNumSub();
int getNumStu();
void sub_create();
void sub_read();
void sub_update();
void sub_delete();
void stu_create();
void stu_read();
void stu_update();
void stu_delete();
void stu_ranking();
void sub_load();
void stu_load();
void stusub_load();
void sub_save();
void stu_save();
protected:
private:
vector<Student> stu;
vector<Subject> sub;
};
#endif // STUBOOK_H
StuBook.cpp文件
/* 下方有文件路径需要自定义修改 */
#include "StuBook.h"
#include "vector"
#include "Subject.h"
#include "Student.h"
#include <iomanip>
#include <sstream>
#include <fstream>
StuBook::StuBook()
{
//dtor
}
StuBook::~StuBook()
{
//dtor
}
int StuBook::getNumStu()
{
return stu.size();
}
int StuBook::getNumSub()
{
return sub.size();
}
void StuBook::sub_create()
{
StuBook::sub_read();
string name;
int flag=1,length;
double scores;
cout<<"->请输入学科名称及学分制:";
cin>>name>>scores;
length=sub.size();
for(int i=0; i<length; i++)
{
if(sub[i].getName()==name)
{
flag=0;
break;
}
}
if(flag)
{
Subject s(name,scores);
int len=stu.size();
for(int j=0; j<len; j++)
{
stu[j].setSubject(name,0);
stu[j].setGrades();
}
sub.push_back(s);
cout<<"->创建成功!"<<endl;
}
else
cout<<"->创建失败!已存在该学科."<<endl;
}
void StuBook::sub_read()
{
int length;
length=sub.size();
if(length)
{
cout<<"->读取当前学科信息:"<<endl;
cout<<"\t学科名称\t学分制"<<endl;
for(int i=0; i<length; i++)
{
cout<<"\t"<<sub[i].getName()<<"\t\t"<<sub[i].getScores()<<endl;
}
cout<<"->读取成功"<<endl;
}
else
cout<<"->读取失败!未创建学科."<<endl;
}
void StuBook::sub_update()
{
string name;
int flag=1,length;
length=sub.size();
if(length)
{
StuBook::sub_read();
double scores;
cout<<"->请输入学科名称及学分制:";
cin>>name>>scores;
for(int i=0; i<length; i++)
{
if(sub[i].getName()==name)
{
sub[i].setScores(scores);
int len=stu.size();
for(int j=0; j<len; j++)
{
stu[j].setSubject(name,0);
stu[j].setGrades();
}
stu_ranking();
flag=0;
break;
}
}
if(flag)
cout<<"->更新失败!未找到该学科."<<endl;
else
cout<<"->更新成功!"<<endl;
}
else
cout<<"->更新失败!暂无学科信息."<<endl;
}
void StuBook::sub_delete()
{
string name;
int flag=1,length;
length=sub.size();
if(length)
{
StuBook::sub_read();
cout<<"->请输入学科名称:";
cin>>name;
for(int i=0; i<length; i++)
{
if(sub[i].getName()==name)
{
sub.erase(sub.begin()+i);
int len=stu.size();
for(int j=0; j<len; j++)
{
stu[j].deleteSubject(name);
stu[j].setGrades();
}
stu_ranking();
flag=0;
break;
}
}
if(flag)
cout<<"->删除失败!未找到该学科."<<endl;
else
cout<<"->删除成功!"<<endl;
}
else
cout<<"->删除失败!暂无学科信息."<<endl;
}
void StuBook::stu_create()
{
string name,classroom;
int flag=1,length;
int len;
len=sub.size();
if(len)
{
StuBook::stu_read();
cout<<"->学生姓名及班级:";
cin>>name>>classroom;
length=stu.size();
for(int i=0; i<length; i++)
{
if(stu[i].getName()==name)
{
flag=0;
break;
}
}
if(flag)
{
Student s;
s.setName(name);
s.setClassroom(classroom);
if(len)
{
cout<<"->请输入下列学科学分:"<<endl;
for(int j=0; j<len; j++)
{
int m=1;
do
{
cout<<"\t"<<sub[j].getName()<<"("<<sub[j].getScores()<<"分制):";
double scores;
cin>>scores;
if(scores>=0&&scores<=sub[j].getScores())
{
m=0;
s.setSubject(sub[j].getName(),scores);
}
}
while(m);
}
cout<<"->学科学分录入完毕!"<<endl;
s.setGrades();
stu.push_back(s);
stu_ranking();
cout<<"->学生信息创建成功!"<<endl;
}
}
else
cout<<"->创建失败!已存在该学生."<<endl;
}
else
cout<<"->创建失败!暂无学科信息."<<endl;
}
void StuBook::stu_read()
{
int length,len;
len=sub.size();
length=stu.size();
if(length)
{
cout<<"->读取当前学生信息:"<<endl;
cout<<"\t姓名\t班级";
for(int j=0; j<len; j++)
{
cout<<"\t"<<sub[j].getName();
}
cout<<"\t学分\t排名"<<endl;
for(int i=0; i<length; i++)
{
cout<<"\t"<<stu[i].getName()<<"\t"<<stu[i].getClassroom();
for(int j=0; j<len; j++)
{
cout<<"\t"<<stu[i].getScores(sub[j].getName());
}
cout<<"\t"<<stu[i].getGrades()<<"\t"<<stu[i].getRanking()<<endl;
}
cout<<"->读取成功!"<<endl;
}
else
cout<<"->读取失败!未创建学生信息."<<endl;
}
void StuBook::stu_update()
{
int flag=1,length;
length=stu.size();
if(length)
{
StuBook::stu_read();
string name;
cout<<"->请输入学生姓名:";
cin>>name;
for(int i=0; i<length; i++)
{
if(name==stu[i].getName())
{
flag=0;
string answer;
cout<<"->是否更新班级信息?(Y or N)";
cin>>answer;
if(answer=="Y")
{
string classroom;
cout<<"->请输入班级:";
cin>>classroom;
stu[i].setClassroom(classroom);
}
cout<<"->是否更新学科学分信息?(Y or N)";
cin>>answer;
if(answer=="Y")
{
int len=stu[i].getNumSub();
for(int j=0; j<len; j++)
{
int f=1;
do
{
double scores;
cout<<"->"<<sub[j].getName()<<"("<<sub[j].getScores()<<"分制):";
cin>>scores;
if(scores>=0&&scores<=sub[j].getScores())
{
f=0;
stu[i].setSubject(sub[j].getName(),scores);
}
}
while(f);
}
stu[i].setGrades();
stu_ranking();
}
cout<<"->更新成功!"<<endl;
}
}
if(flag)
cout<<"->更新失败!未找到该学生."<<endl;
}
else
cout<<"->更新失败!未创建学生信息."<<endl;
}
void StuBook::stu_delete()
{
int flag=1,length;
length=stu.size();
if(length)
{
StuBook::stu_read();
string name;
cout<<"->请输入学生姓名:";
cin>>name;
for(int i=0; i<length; i++)
{
if(name==stu[i].getName())
{
flag=0;
stu.erase(stu.begin()+i);
stu_ranking();
break;
}
}
if(flag)
cout<<"->删除失败!未找到该学生."<<endl;
else
cout<<"->删除成功!"<<endl;
}
else
cout<<"->删除失败!未创建学生信息."<<endl;
}
void StuBook::stu_ranking()
{
int length;
length=stu.size();
if(length)
{
for(int i=0; i<length; i++)
{
int num=0;
for(int j=0; j<length; j++)
{
if(stu[i].getName()==stu[j].getName())
continue;
if(stu[i].getGrades()<stu[j].getGrades())
{
num++;
}
}
stu[i].setRanking(num+1);
}
}
else
cout<<"->排名完成."<<endl;
}
void StuBook::stu_load()
{
ifstream stu_file;
ifstream stu_sub;
char file_stu[]="F:\\Files\\cppFile\\stu\\stubook.txt";/*新建txt文件后,修改此处路径,以便正常读取。*/
char sub_stu[]="F:\\Files\\cppFile\\stu\\stusub.txt";/*新建txt文件后,修改此处路径,以便正常读取。*/
stu_file.open(file_stu,ios::in);
stu_sub.open(sub_stu,ios::in);
if(!stu_file)
{
cout << "!!! 打开文件失败!\n";
}
else
{
string strOne;
int length=sub.size();
while (getline(stu_file, strOne))
{
stringstream ss;
ss << strOne;
string stu_name,stu_classroom;
ss >> stu_name >> stu_classroom;
Student s;
s.setName(stu_name);
s.setClassroom(stu_classroom);
stu.push_back(s);
}
int num=0;
while (getline(stu_sub, strOne))
{
int i=num/length;
stringstream ss;
ss << strOne;
string sub_name;
double sub_scores;
ss>>sub_name>> sub_scores;
stu[i].setSubject(sub_name,sub_scores);
num++;
}
stu_sub.close();
stu_file.close();
length=stu.size();
for(int i=0; i<length; i++)
{
stu[i].setGrades();
}
stu_ranking();
//cout<<" 导入成功!\n"<<endl;
}
}
void StuBook::sub_load()
{
ifstream sub_file;
char file_sub[]="F:\\Files\\cppFile\\stu\\subbook.txt";/*新建txt文件后,修改此处路径,以便正常读取。*/
sub_file.open(file_sub,ios::in);
if(!sub_file)
{
cout << "!!! 打开文件失败!\n";
}
else
{
string strOne;
while (getline(sub_file, strOne))
{
stringstream ss;
ss << strOne;
string name;
double scores;
ss >> name >> scores;
Subject s(name,scores);
sub.push_back(s);
}
sub_file.close();
//cout<<" 导入成功!\n"<<endl;
}
}
void StuBook::sub_save()
{
ofstream sub_file;
int i;
int length=sub.size();
char file_sub[]="F:\\Files\\cppFile\\stu\\subbook.txt";/*新建txt文件后,修改此处路径,以便正常读取。*/
sub_file.open(file_sub,ios::out);
if(!sub_file)
{
cout << "!!! 打开文件失败!\n";
}
else
{
for(i=0; i<length; i++)
{
sub_file<<sub[i].getName()<<"\t"<<sub[i].getScores()<<endl;
}
sub_file.close();
//cout<<" 保存成功!\n"<<endl;
}
}
void StuBook::stu_save()
{
ofstream stu_file;
ofstream stu_sub;
int i;
int length=stu.size();
int len=sub.size();
char file_stu[]="F:\\Files\\cppFile\\stu\\stubook.txt";/*新建txt文件后,修改此处路径,以便正常读取。*/
char sub_stu[]="F:\\Files\\cppFile\\stu\\stusub.txt";/*新建txt文件后,修改此处路径,以便正常读取。*/
stu_file.open(file_stu,ios::out);
stu_sub.open(sub_stu,ios::out);
if(!stu_file)
{
cout << "!!! 打开文件失败!\n";
}
else
{
for(i=0; i<length; i++)
{
stu_file<<stu[i].getName()<<"\t"<<stu[i].getClassroom()<<endl;
for(int j=0; j<len; j++)
{
stu_sub<<sub[j].getName()<<"\t"<<stu[i].getScores(sub[j].getName())<<endl;
}
}
stu_sub.close();
stu_file.close();
//cout<<" 保存成功!\n"<<endl;
}
}
截图
版权声明:本文为weixin_43307431原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。