c++课设作业之课程信息管理系统

课程信息管理系统

课程信息包括:记录编号、课程编号、课程名、学时(讲课学时、实践学时)、学分、开课学期,考核方式(考试/报告)
功能要求:
A、 从课程信息文件中读取已有的课程信息,并实现屏幕显示。
B、 能通过课程编号对已有的课程信息进行修改,要求编号不能修改,其他信息内容都可改,修改的结果保存至课程信息文件。
C、 实现对课程信息的统计(分学期统计课程数量及开课总学分数)。
D、 实现对课程信息的查询显示(查询条件分为课程编号、课程学分、开课学期),对有多条记录的查询结果按照课程开课学期进行排序显示。
E、 新课程信息的添加并保存至课程信息文件。
F、 数据约束关系:学时=讲课学时+时间学时;学分=学时/16。
G、 课程信息的删除,根据课程编号,删除指定课程信息,并将结果写入文件。

本程序主要用到了类以及链表的知识。
后面代码中单链表及其功能的实现额解释在这个文章中
https://blog.csdn.net/xuese_luochen/article/details/104374323
头文件——Class.h

//头文件,用来定义类,并定义其成员函数
#ifndef CLASS_H_
#define CLASS_H_

#include 
#include 
#include 
using namespace std;

class Date						//类Date有数据成员,是课程的各种数据和一个类指针
{
public:
	string name;
	string exam_method;
	int semester;
	double time,number,credit;
	Date *Classnext;
};

class Class						//类Class有成员函数——类指针(用来临时储存各个数据),和成员函数(用来实现程序的各种功能)
{
public:
	Date *ClassHead;
	~Class();							//析构函数
	Class ();							//构造函数
	void class_set ();					//输入课程信息
	void show ();						//输出课程信息
	void class_keep ();					//将课程信息写入文档
	void class_insert(double N,string n,double t,int s,string e);		//将文档中的课程信息插入到链表中
	void class_Read();					//从文档中读取课程信息
	void class_delete();				//删除课程信息
	void class_revise();				//修改课程信息
	void class_sort();
	void class_find();					//按照一定条件寻找课程
	void class_renew();					//更新课程信息,并保持在文档中
	void class_census();				//按学期统计课程数量和学分总数
};

Class::Class()              //构造函数
{
	ClassHead=new Date;						//创建链表的链头
	ClassHead->Classnext=NULL;
}

Class::~Class()             //析构函数
{
	Date *p;
	while (ClassHead)				//将链表清除
	{
		p=ClassHead;
		ClassHead=ClassHead->Classnext;
		delete p;
	}
	ClassHead=NULL;
}


void Class::class_set ()   //输入课程信息
{
	class_sort();
	Date *p;
	Date *a;
	int class_num;
	a=ClassHead;
	cout << "您要输入几个课程的信息" << endl;
	cin >> class_num ;
	cout << "请依次输入课程编号,课程名字,课程学时,课程开课学期,课程测试方式" << endl;
	for(int k=0;k<class_num;k++)
	{
		p= new Date;
		cin >> p->number >> p->name >> p->time >> p->semester >> p->exam_method ;
		p->credit=p->time/16;					//下面三步实现将新的课程数据存放到链表中
		p->Classnext=a->Classnext;
		a->Classnext=p;
		a=a->Classnext;
	}
}

void Class::show ()                     //输出课程信息
{
	Date *p;
	cout << "课程编号" << '\t' << "课程名字" << '\t' << "课程学时" << '\t' << "课程学分" << '\t' << "课程学期" << '\t' << "课程考核方式" << endl;
	for(p=ClassHead->Classnext;p!=NULL;p =p->Classnext)		//将链表各节点的数据全部输出
	{
		cout << p->number << '\t' << '\t' << p->name <<'\t' << p->time  <<'\t'  << '\t' << p->credit  <<'\t' << '\t' << p->semester << '\t' << '\t' << p->exam_method << endl;
	}
	class_sort();						//排序函数--方便程序排列
}

void Class::class_find()				//查找课程
{
	Date *p;
	p=ClassHead;
	int m,k,a=1;			//a的作用是①如能查到则只输出一次提示②如不能查到则输出提示语
	cout << "通过课程序号进行查询请按1,通过课程学期请按2,通过学分查询请按3,退出请按0" << endl;
	cin >> m;
	if(m==1)													//按课程编号查询
	{
		cout << "请输入您要查询课程的编号" << endl;
		cin >> k;
		while (p->Classnext && p->number!=k)
		{
			p=p->Classnext;
		}
		if(p->number==k)
		{
			if(a==1)   cout << "课程编号" << '\t' << "课程名字" << '\t' << "课程学时" << '\t' << "课程学分" << '\t' << "课程学期" << '\t' << "课程考核方式" << endl;
			cout << p->number << '\t' << '\t' << p->name <<'\t' << p->time  <<'\t'  << '\t' << p->credit  <<'\t' << '\t' << p->semester << '\t' << '\t' << p->exam_method << endl;
			a++;
		}
		else
		{
			cout << "未查询到课程" << endl;
		}
	}
	else if(m==2)												//按学期查询
	{
		cout << "请输入您要查询第几学期的课程" << endl;
		cin >> k;
		while(p!=NULL)
		{
			if(p->semester==k)
			{
				if(a==1) cout << "课程编号" << '\t' << "课程名字" << '\t' << "课程学时" << '\t' << "课程学分" << '\t' << "课程学期" << '\t' << "课程考核方式" << endl;
				cout << p->number << '\t' << '\t' << p->name <<'\t' << p->time  <<'\t'  << '\t' << p->credit  <<'\t' << '\t' << p->semester << '\t' << '\t' << p->exam_method << endl;
				a++;
			}
			p=p->Classnext;
		}
		if(a==1)  cout << "未查询到课程" << endl;
	}
	else if(m==3)											//按学分查询
	{
		cout << "请输入您要查询学分为几的课程" << endl;
		cin >> k;
		while(p!=NULL)
		{
			if(p->credit==k)
			{
				if(a==1) cout << "课程编号" << '\t' << "课程名字" << '\t' << "课程学时" << '\t' << "课程学分" << '\t' << "课程学期" << '\t' << "课程考核方式" << endl;
				cout << p->number << '\t' << '\t' << p->name <<'\t' << p->time  <<'\t'  << '\t' << p->credit  <<'\t' << '\t' << p->semester << '\t' << '\t' << p->exam_method << endl;
				a++;
			}
				p=p->Classnext;
		}
		if(a==1)  cout << "未查询到课程" << endl;;
	}
	else cout << "请输入正确的指令" << endl;
}

void Class::class_delete()					//删除某个课程
{
	int k;
	Date *p,*a;
	p=ClassHead;
	a=p;
	cout << "请输入您要删除课程的序号" << endl;
	cin >> k;
	while (p->Classnext && p->number!=k)
		{
			a=p;
			p=p->Classnext;
		}
		if(p->number==k)
		{
			a->Classnext=p->Classnext;
			delete p;
		}
		else
		{
			cout << "未查询到课程" << endl;
		}
}

void Class::class_sort()					//对课程进行排序(按编号大小)
{
	string n;
	string e;
	int s,m=0,j,i;
	double t,N,c;
	Date *p1,*p2;
	p1=ClassHead;
	while(p1->Classnext!=NULL)
	{
		p1=p1->Classnext;
		m++;
	}
	for(i=0;i<m-i;i++)
	{
		p2=ClassHead->Classnext;
        p1=p2->Classnext;
        for(j=0;j< m-i-1;j++)
        {
            if(p1->number >p2->number)
             {
				N=p1->number;
				n=p1->name;
				t=p1->time;
				c=p1->credit;
				s=p1->semester;
				e=p1->exam_method;
				p1->number = p2->number;
				p1->name = p2->name;
				p1->time = p2->time;
				p1->credit = p2->credit;
				p1->semester = p2->semester;
				p1->exam_method = p2->exam_method;
				p2->number=N;
				p2->name=n;
				p2->time=t;
				p2->credit=c;
				p2->semester=s;
				p2->exam_method=e;
			}
			p1=p1->Classnext;
            p2=p2->Classnext;
		}
	}
}

void Class::class_revise()						//修改课程数据
{
	int k;
	cout << "请输入您要修改课程的编号" << endl;
	cin >> k;
	Date *p;
	p=ClassHead;
	while(p->Classnext && p->number!=k)
	{
		p=p->Classnext;
	}
	if(p->number==k)
	{
		cout << "请重新输入该课程信息(分别为课程名字,课程学时,课程学期,课程考核方式)" << endl;
		cin  >> p->name >> p->time >> p->semester >> p->exam_method ;
		p->credit=p->time/16;
		cout << "修改完成" << endl;
	}
	else cout<< "对不起,没有查询到课程,请输入已经存在的课程编号" <<endl; 
}

void Class::class_insert(double N,string n,double t,int s,string e)			//将文件中的数课程据插入到链表中
{
	Date *a;
	Date *p;
	a=ClassHead;
	p=new Date;
	p->number=N;
	p->name=n;
	p->time=t;
	p->credit=t/16;
	p->semester=s;
	p->exam_method=e;
	p->Classnext=a->Classnext;
	a->Classnext=p;
}

void Class::class_census()							//按学期来统计课程数目及学分总数
{
	double a=0,b=0,k;
	Date *p;
	p=ClassHead;
	cout << "您要查看那个学期的课程统计?" << endl;
	cin >> k ;
	while(p!=NULL)
	{
		if(p->semester==k)
		{
			a++;				//课程数目
			b=b+p->credit;                                                                                                                   
		}
		p=p->Classnext;			//课程总学分
	}
	cout << "第" << k << "学期共有" << a << "门课程,总学分为" << b << endl;
}



void Class::class_keep ()    //保存到文件里面
{
	class_sort();
	Date *p;
	p=ClassHead->Classnext;
	ofstream out("class.txt",ios::app);					//打开文件,在文件class.txt的结尾处进行添加数据
	if (!out) { cout << "不能打开文件!" << endl; return; }
	while (p != NULL)
	{
		out << p->number << '\t' << p->name << '\t' << p->time  << '\t' << p->semester <<  '\t' << p->exam_method << '\t' << endl;
		p = p->Classnext;
	}
	out.close();										//关闭文件
}

void Class::class_renew ()    //将文件覆盖(更新)
{
	Date *p;
	p=ClassHead->Classnext;
	ofstream out("class.txt");							//打开文件,直接覆盖原有数据
	if (!out) { cout << "不能打开文件!" << endl; return; }
	while (p != NULL)
	{
		out << p->number << '\t' << p->name << '\t' << p->time  << '\t' << p->semester <<  '\t' << p->exam_method << '\t' << endl;
		p = p->Classnext;
	}
	out.close();										//关闭文件
}

void Class::class_Read()    //从文件读入数据
{
	int a=0;
	Date *p;
	p = ClassHead;
	ifstream in;
	in.open("class.txt");								//打开文件
	if (!in) { cout << "没有课程信息,请先录入课程信息!" << endl; return; }
		string n,e;
		int s;
		double N,t;
		while(!in.eof())
		{
			in >> N >> n >> t >> s >> e;
			if(in.fail()) break;
			class_insert(N,n,t,s,e);
		}
	in.close();											//关闭文件
}

int door()
{
    string username = "123", password = "123";
    string name, temp;
    int number = 3;
    while (1)
    {
    	cout << "         欢迎登陆家里蹲抗大大学教务系统  "<< endl;
		cout << endl; 
        cout << "                用 户 名:";
        cin >> name;
        cout << "                密    码:";
        cin >> temp;
        if (name != username || temp != password)
        {
            number--;
            if (number >0)
            {
                cout << "          用户名/密码错误!你还有" << number << "次机会" << endl;
            }
            else
                cout << "用户名/密码错误!" << endl, exit(0);

        }
        else
        {
            cout << "********************密码正确********************" << endl<<endl;
            return 1;
        }
    }

}
	
void menu ()
{
	cout << "                    ----------------------------------------" <<endl;
	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 << "                    ----------------------------------------" <<endl;
}

#endif;

头文件有个小问题:在输入课程信息时课程名字只有在输入四个字时才会对齐,否则会偏,如果哪位大佬会就顺便教一下吧(手动滑稽)。

主文件

//本程序为课程信息管理系统
#include 
#include "Class.h"
#include
#include 
using namespace std;

int main() 
{
	door();
	int k;
	string m;
	Class c;
	while(1)
	{
		system("cls");
		menu();
		cout << "请问您要执行哪一个功能呢,请输入相应数字" << endl;
		cin >> k;
		switch(k)
		{
		case 1:
			c.class_sort();
			c.show();
			system("pause");
			break;
		case 2:
			c.class_find();
			system("pause");
			break;
		case 3:
			c.class_set();
			c.class_keep();
			cout << "课程输出完成,现有课程如下" << endl;
			c.show();
			system("pause");
			break;
		case 4:
			cout <<  "现有课程如下:" << endl;
			c.show();
			c.class_revise();
			cout << "更新成功,现有课程如下:" << endl;
			c.show();
			c.class_renew();
			system("pause");
			break;
		case 5:
			cout <<  "现有课程如下:" << endl;
			c.show();
			c.class_delete();
			cout << "更新成功,现有课程如下:" << endl;
			c.show();
			c.class_renew();
			system("pause");
			break;
		case 6:
			c.class_Read();
			c.show();
			system("pause");
			break;
		case 7:
			c.class_census();
			system("pause");
			break;
		case 0:
			cout << "感谢您的使用" << endl;
			exit(0);
		}
	}
	return 0;
}

你可能感兴趣的:(c++作业,c++,单链表)