实验1:类和对象(学生课程管理系统–实验设计小作业1)


http://www.yyycode.cn/index.php/2020/04/13/%e5%ad%a6%e7%94%9f%e8%af%be%e7%a8%8b%e7%ae%a1%e7%90%86%e7%b3%bb%e7%bb%9f-%e5%ae%9e%e9%aa%8c%e8%ae%be%e8%ae%a1%e5%b0%8f%e4%bd%9c%e4%b8%9a1/


源码在个人博客下载


先说感受:搞了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++);
//	}
//
//}

猜你喜欢

转载自blog.csdn.net/zstuyyyyccccbbbb/article/details/105493194