源码在个人博客下载
先说感受:搞了3~4天,不得不说c++的语法对我这种入门萌新十分友好。几天在debug和想怎么写中度过。不过这是第一次写c++的小项目.我觉得完全不会也情有可原(你看看人家大佬).第一次写该咋写怎么写,从毫无头绪到从IDE别人的源码中学习语法(其实是因为我笨听不懂上课老师讲的语法)
这里说下总结
- 根据功能逐个添加成员变量和成员函数(这句话真的不是空话,先想好大概有什么类,然后从第一个要实现的功能去写,写这个功能的时候不要思考其他功能的实现)
- 要返回一个类里的私有成员还是在该类自己的cpp里写返回函数不会容易出错
- 头文件的添加一旦重复添加了就会重定义而且不好找.所以最好的解决办法是#pragma once
- 如果要存多个对象的指针/一个类里的多个成员可以开指针数组来存
- 在B类获得A类的成员变量(如果不用后面的知识的话)要通过B去调用A的成员函数来获得A的成员变量
- cout<<一个类的多个成员变量时比较麻烦,可以采用运算符重载(格式比较固定)
- 代码真的要随手写注释,写算法的题的时候没咋觉得,学新的知识以前板子的时候会写注释,但是写项目如果不写,第二天或者第三天就容易忘记自己之前的函数功能了…
- 头文件(Teacher类暂时没怎么写)
#pragma once
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
class Console {
public:
Console();//默认构造函数
int run();//运行
int displaymenu() const;///展现菜单
private:
};
----------
#pragma once
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include <fstream>
using namespace std;
const int MAX_SIZE = 1000;
class Course
{
friend ostream& operator<<(ostream&, const Course&);//重载<<运算符
public:
Course();//默认构造函数
void buildCourse();//初始化文件库
///基本数据类型就传值吧,除非要修改实参;对象传引用
///int 和指针一样大,传引用和传int一样,但是传引用还多了寻址的过程
Course(const string& cname, const int& credit,const string& tame,int grade=0);//拷贝构造函数,让成绩缺省
void showcourse();///展示课程
Course* getNum(int nums);///获得课程编号
void addcourse();//增加备选课程
Course* getcourselist();///获得课表
int getocNum();///获得实际数量
int getcredit(Course* course);///获得课程学分
private:
///在其他类访问Course的private写一个访问的函数
int ocNum;///可选的课程的实际数量
Course* oc[MAX_SIZE];///全部可选课程的指针清单(存指针的数组)
string cname;
int credit;
string tame;
int grade;
};
----------
#pragma once
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include"Course.h"
//小心重复添加
using namespace std;
class Student {
public:
Student();//默认构造函数
Student(string name, string schnums);//构造函数
void showstudent();///打印名字和学号
void addCourse( Course* course );///选择课程函数
void showcourse();///打印课表
void showgrades();///查看选课算术平均绩点
void showgpa();///查看学分权值平均绩点
void setgrades();///设置成绩
private:
string name;
string schnums;
///注意这么写Course的头文件加在student.h里
vector< Course* >pricourse; ///存课程的指针
vector<double > grades;///存课程的成绩
vector<int> coursecredit;///选的每课的学分
double totalgrades;///总绩点和
double totalcredit;//总学分和
};
------
#pragma once
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include"Course.h"
using namespace std;
class Teacher {
public:
Teacher();//默认构造函数
Teacher(string name);///构造函数
/*void getteacher_course(Course* getcourselist,int num);//*///获得老师的任教课程
private:
string tname;
};
- cpp
#include"Console.h"
int main(void)
{
Console console;
int result=console.run();
return 0;
}
-----
#include"Console.h"
#include"Student.h"
//#include"Teacher.h"
//#include"Course.h"//重复添加了,用pragma once
#include<fstream>
Console::Console()
{
}
int Console::run()
{
//char fileName[256];
//ofstream* ofile;
//加载课程 ////
///Course::buildCourse(); ///只有静态成员这么调用才行,如果不是静态成员,可能在这个函数中又调用了该类的其他成员变量,这样就会出错误了
Course* course = new Course();
course->buildCourse();
///注册学生
string name; string schnums;
cout << "输入你的名字:"; cin >> name;
cout << "输入你的学号:"; cin >> schnums;
Student *student=new Student(name,schnums);//new一个学生对象
int choice= displaymenu();
while (choice != 0)
{
switch (choice)
{
case 1:///选择课程
///有问题&Course::showcourse;
{
course->showcourse();
cout << "\t输入要选择的课程编号(1~):";
int cnum; cin >> cnum;
//cout<<""
cout << *(course->getNum(cnum));
student->addCourse(course->getNum(cnum));
break;
}
case 2://查看选课情况
{
student->showstudent();
student->showcourse();
break;
}
case 3://查看选课成绩,
{
student->showgrades();
student->showgpa();
break;
}
case 4:///设置选课成绩
{
// string _user;
// cout << "输入你的教师账号: "; cin >> _user;
// Teacher* userteacher = new Teacher(_user);
//// userteacher->getteacher_course(course->getcourselist(),course->getocNum());//(返回课表指针数组的指针和数组大小)
// cout << "你可以设置成绩的课程为: ";
student->setgrades();
break;
}
case 5:///增加备选课程
{
course->addcourse();
break;
}
}
choice = displaymenu();//再次调用菜单
}
return 0;
}
int Console::displaymenu() const
{
int choice = 0;
cout << "***********学生选课系统***********\n"
<< "\t1.选择课程\n"
<< "\t2.查看选课情况\n"
<< "\t3.查看选课成绩\n"
<< "\t4.设置选课成绩\n"
<< "\t5.增加备选课程\n"
<< "请选择需要的操作(1~5)(按0退出系统)\n";
cin >> choice;
return choice;
}
--------------
#include"Course.h"
Course::Course()//默认构造函数
{
ocNum = 0;
}
void Course::buildCourse()///初始化选课库
{
oc[++ocNum] = new Course("高级语言程序设计", 3, "东明");
oc[++ocNum] = new Course("数据分析", 5, "李俊生");
oc[++ocNum] = new Course("大学物理", 4, "秀金");
oc[++ocNum] = new Course("音乐欣赏", 2, "方圆");
oc[++ocNum] = new Course("软件英语", 2, "史俊");
}
//int grade缺省=0
Course::Course(const string& cname, const int& credit, const string& tame,int grade)
{
this->cname = cname;
this->credit = credit;
this->tame = tame;
this->grade = grade;
}
void Course::showcourse()
{
cout << "可选择的课程:\n";
for (int i = 1; i <= ocNum; i++)
{
cout << *oc[i] << endl;
}
}
Course* Course::getNum(int nums)
{
return oc[nums];
}
void Course::addcourse()
{
string _cname; int _credit; string _cteacher;
cout << "输入你要增加的课程的名称: "; cin >> _cname;
cout << "输入你要增加的课程的学分: "; cin >> _credit;
cout << "输入你要增加的课程的老师: "; cin >> _cteacher;
oc[++ocNum] = new Course(_cname, _credit, _cteacher);
}
Course* Course::getcourselist()///获得课表
{
return oc[ocNum];//返回数组的指针
}
int Course::getocNum()
{
return ocNum;
}
////总结:要返回一个类里的私有成员还是在自己类的cpp里写返回函数不会出错
int Course::getcredit(Course* course)
{
return course->credit;
}
//输出运算符重载
ostream& operator<<(ostream &output, const Course&c)
{
output << "课程名: " << c.cname
<< "\t学分: " << c.credit
<< "\t任课老师: " << c.tame;
if (c.grade)
{
output <<"\t绩点: "<<c.grade;
}
output<< "\n";
return output;
}
-------------------
#include"Student.h"
//#include"Course.h" 在本类添加其他类的头文件在本类的.h里面添加
//要小心重复添加头文件,在另外一份里又写了一份
Student::Student()//默认构造函数
{
}
Student::Student(string name,string schnums)//构造函数
{
this->name = name;
this->schnums = schnums;
}
void Student::showstudent()
{
cout << "\t" << name;
cout << "\t" << schnums << endl;;
}
void Student::addCourse(Course* course)///选择课程函数
{
if (course != nullptr)
{
pricourse.push_back(course);
cout << "已添加:"<<*course<<"\n";
double k= course->getcredit(course);
totalcredit += k;
coursecredit.push_back(k);
}
}
void Student::showcourse()
{
for (int i = 0; i < pricourse.size(); i++)
{
cout << "你的选课情况:"
<< "\t" << *pricourse[i] << endl;
}
}
//算数平均成绩
void Student::showgrades()
{
for (int i = 0; i < pricourse.size(); i++)
{
cout << "你的每门课的绩点: " << grades[i]
<< "\t" << *pricourse[i] ;
}
cout << endl;
cout << "你的算数平均成绩: "
<< "\t" << (totalgrades / pricourse.size()) << endl;
}
///加权绩点
void Student::showgpa()
{
double k = 0;
for (int i = 0; i < pricourse.size(); i++)
{
cout << "你的每门课的绩点: " << grades[i]
<< "\t" << *pricourse[i] ;
k += coursecredit[i] * grades[i];
}
cout << endl;
cout << "你的学分加权平均成绩: "
<< "\t" << (k/ totalcredit)<<endl;
}
void Student::setgrades()
{
for (int i = 0; i < pricourse.size(); i++)
{
double gra;
cout << "你的选课情况: "
<< "\t" << *pricourse[i] << "设置成绩: "; cin >> gra;
grades.push_back(gra);
totalgrades += gra;
}
}
-------
#include "Teacher.h"
Teacher::Teacher()///默认构造函数
{
}
Teacher::Teacher(string name)
{
this->tname = name;
}
//void Teacher::getteacher_course(Course* getcourselist,int num)///获得该老师任教的课程
//{
//
// for (int i = 0; i <num ; i++)
// {
// *(getcourselist++);
// }
//
//}