选课系统设计思路

项目要求:

选修课查询系统

假定有n门课程,每门课程有课程编号,课程名称,课程性质,总学时,授课学时,实验学时,学分,开课学期等信息,试设计一选修课查询系统,使之能提供以下功能:

1)系统以菜单方式工作

        菜单如下:

                a课程录入

                b课程浏览

                c查询  按学分查询 按课程性质查询

                d退出

2)课程信息录入功能(课程信息用文件保存)--输入;

3)课程信息浏览功能--输出;

4)按学分查询;

5)按课程性质查询;

设计思路:

1.按照要求定义课程结构体:

typedef struct kemu{
	int bianhao;
	string mingcheng;
	string xingzhi;
	int zhongxueshi;
	int shoukexueshi;
	double xuefen;
	int kaishexueqi;
} K;

K ke[100];
int num;

定义课程结构体,同时把课程总数作为全局变量,可以方便后面的遍历查找操作。 

2.整体架构:

首先是一个欢迎界面,打印提供的业务,然后按照要求写出主函数,先做一个整体的架构,再把每个函数填全。

主函数代码:

int main(){
	welcome();
	char a;
	while(cout<<"请选择业务:",cin>>a){
		switch(a){
			case 'a':
				cout<<"请输入录入课程数:";
				cin>>num;
				for(int k=0;k<num;k++){
					luru(k);
					cout<<endl;
				}
				cout<<"录入成功"<<endl;
			break;
			
			case 'b':
				liulan();
			break;
			
			case 'c':
				chaxun();
			break;
			
			case 'd':
				return 0;
		}
	}
	return 0;
}

要求有四个功能,其中,查询可以按照学分和课程性质进行查找,所以声明函数如下:

void welcome();
void print(int i);
void luru(int k);
void liulan();
void chaxun();
void xuefen_chaxun(double n);
void xingzhi_chaxun(string s);

因为两个查询查到之后都是要打印的,所以为了缩减代码行数,我们定义了print函数。

3.函数 void luru(int k);

void luru(int k){
	cout<<"请输入:"<<endl;
	cout<<"课程编号:";cin>>ke[k].bianhao;
	cout<<"课程名称:";cin>>ke[k].mingcheng;
	cout<<"课程性质:";cin>>ke[k].xingzhi;
	cout<<"总学时:";cin>>ke[k].zhongxueshi;
	cout<<"授课学时:";cin>>ke[k].shoukexueshi;
	cout<<"实验学分:";cin>>ke[k].xuefen;
	cout<<"开设学期:";cin>>ke[k].kaishexueqi;
}

给使用者提示,然后输入结构体中的具体内容。

4.函数 void liulan();

void liulan(){
	int i;
	freopen("output.txt","w",stdout);//文件output.txt的建立与打开
    //在文件中打印结构体数组中的信息
	for(i=0;i<num;i++){
		print(i);
		cout<<endl;
	}
    //文件的关闭
	freopen("CON","w",stdout);
    //第二次遍历,控制台上打印信息
	for(i=0;i<num;i++){
		print(i);
		cout<<endl;
	}
	return;
}

因为要求要把课程信息存在文件中,还要把课程信息打印在控制台上。所以我们把结构体数组遍历两遍,一次把信息写入文件.txt中,第二次打印在控制台上。

5.函数 void chaxun();

void chaxun(){
	cout<<"你有以下选择:"<<endl;
	cout<<"1:按学分查询"<<endl;
	cout<<"2:按性质查询"<<endl;
	int id;
	cin>>id;
	if(id==1){
		double xuefen;
		cout<<"请输入你想查询的学分:";
		cin>>xuefen;
		xuefen_chaxun(xuefen);
		cout<<endl;
	}else
	if(id==2){
		string xingzhi;
		cout<<"请输入你想查询的性质:";
		cin>>xingzhi;
		xingzhi_chaxun(xingzhi);
		cout<<endl;
	}
}

查询功能有两个:1.按学分查询 2.按课程性质查询

所以我们要让用户选择按哪个进行查询,然后按分支结构分支出两个函数。

6.函数 void xuefen_chaxun(double n);与void xingzhi_chaxun(string s);

void xuefen_chaxun(double n){
	bool b=0;
	for(int k=0;k<num;k++){
		if(ke[k].xuefen==n){
			b=1;
			cout<<"已找到:"<<endl;
			print(k);
		}
	}
	if(b==0) cout<<"未找到"<<endl;
}

void xingzhi_chaxun(string s){
	bool b=0;
	for(int k=0;k<num;k++){
		if(s==ke[k].xingzhi){
			b=1;
			cout<<"已找到:"<<endl;
			print(k);
		}
	}
	if(b==0) cout<<"未找到"<<endl; 
}

这两个函数本质上都是遍历这个课程信息,然后进行信息比对,比对成功后,就打印课程信息。只不过一个是浮点数,一个是字符串。string的好处就是不用调用strcmp();直接用==即可进行比对。

这个程序的代码:

#include <iostream>
#include <cstdio>
#include <fstream>

using namespace std;

void welcome();
void print(int i);
void luru(int k);
void liulan();
void chaxun();
void xuefen_chaxun(double n);
void xingzhi_chaxun(string s);

typedef struct kemu{
	int bianhao;
	string mingcheng;
	string xingzhi;
	int zhongxueshi;
	int shoukexueshi;
	double xuefen;
	int kaishexueqi;
} K;

K ke[100];
int num;

int main(){
	welcome();
	char a;
	while(cout<<"请选择业务:",cin>>a){
		switch(a){
			case 'a':
				cout<<"请输入录入课程数:";
				cin>>num;
				for(int k=0;k<num;k++){
					luru(k);
					cout<<endl;
				}
				cout<<"录入成功"<<endl;
			break;
			
			case 'b':
				liulan();
			break;
			
			case 'c':
				chaxun();
			break;
			
			case 'd':
				return 0;
		}
	}
	return 0;
}

void welcome(){
	cout<<"欢迎来到选修课查询系统:"<<endl;
	cout<<"本系统提供以下业务:"<<endl;
	cout<<"a:课程录入"<<endl;
	cout<<"b:课程浏览"<<endl;
	cout<<"c:查询"<<endl;
	cout<<"d:退出"<<endl;
}

void print(int i){
	cout<<"课程编号:";printf("%4d\n",ke[i].bianhao); 
	cout<<"课程名称:";printf("%10s\n",ke[i].mingcheng.c_str()); 
	cout<<"课程性质:";printf("%10s\n",ke[i].xingzhi.c_str());
	cout<<"总学时:";printf("%4d\n",ke[i].zhongxueshi);
	cout<<"授课学时:";printf("%4d\n",ke[i].shoukexueshi);
	cout<<"实验学分:";printf("%4.2f\n",ke[i].xuefen);
	cout<<"开设学期:";printf("%5d\n",ke[i].kaishexueqi);
}

void luru(int k){
	cout<<"请输入:"<<endl;
	cout<<"课程编号:";cin>>ke[k].bianhao;
	cout<<"课程名称:";cin>>ke[k].mingcheng;
	cout<<"课程性质:";cin>>ke[k].xingzhi;
	cout<<"总学时:";cin>>ke[k].zhongxueshi;
	cout<<"授课学时:";cin>>ke[k].shoukexueshi;
	cout<<"实验学分:";cin>>ke[k].xuefen;
	cout<<"开设学期:";cin>>ke[k].kaishexueqi;
}

void liulan(){
	int i;
	freopen("output.txt","w",stdout);
	for(i=0;i<num;i++){
		print(i);
		cout<<endl;
	}
	freopen("CON","w",stdout);
	for(i=0;i<num;i++){
		print(i);
		cout<<endl;
	}
	return;
}

void xuefen_chaxun(double n){
	bool b=0;
	for(int k=0;k<num;k++){
		if(ke[k].xuefen==n){
			b=1;
			cout<<"已找到:"<<endl;
			print(k);
		}
	}
	if(b==0) cout<<"未找到"<<endl;
}

void xingzhi_chaxun(string s){
	bool b=0;
	for(int k=0;k<num;k++){
		if(s==ke[k].xingzhi){
			b=1;
			cout<<"已找到:"<<endl;
			print(k);
		}
	}
	if(b==0) cout<<"未找到"<<endl; 
}

void chaxun(){
	cout<<"你有以下选择:"<<endl;
	cout<<"1:按学分查询"<<endl;
	cout<<"2:按性质查询"<<endl;
	int id;
	cin>>id;
	if(id==1){
		double xuefen;
		cout<<"请输入你想查询的学分:";
		cin>>xuefen;
		xuefen_chaxun(xuefen);
		cout<<endl;
	}else
	if(id==2){
		string xingzhi;
		cout<<"请输入你想查询的性质:";
		cin>>xingzhi;
		xingzhi_chaxun(xingzhi);
		cout<<endl;
	}
}

第二代系统:增加了在文件中读入课程信息:

 

#include <iostream>
#include <cstdio>
#include <fstream>
#include <cstring>

using namespace std;

void welcome();
void print(int i);
void luru();
void liulan();
void chaxun();
void xuefen_chaxun(double n);
void xingzhi_chaxun(char *s);

typedef struct kemu{
	int bianhao;
	char mingcheng[100];
	char xingzhi[100];
	int zhongxueshi;
	int shoukexueshi;
	double xuefen;
	int kaishexueqi;
} K;

K ke[100];
int num=0;

int main(){
	welcome();
	char a;
	while(cout<<"请选择业务:",cin>>a){
		switch(a){
			case 'a':
				luru();
				cout<<"录入成功"<<endl;
			break;
			
			case 'b':
				liulan();
			break;
			
			case 'c':
				chaxun();
			break;
			
			case 'd':
				return 0;
		}
	}
	return 0;
}

void welcome(){
	cout<<"欢迎来到选修课查询系统:"<<endl;
	cout<<"本系统提供以下业务:"<<endl;
	cout<<"a:课程录入"<<endl;
	cout<<"b:课程浏览"<<endl;
	cout<<"c:查询"<<endl;
	cout<<"d:退出"<<endl;
}

void print(int i){
	cout<<"课程编号:";printf("%4d\n",ke[i].bianhao); 
	cout<<"课程名称:";printf("%10s\n",ke[i].mingcheng); 
	cout<<"课程性质:";printf("%10s\n",ke[i].xingzhi);
	cout<<"总学时:";printf("%4d\n",ke[i].zhongxueshi);
	cout<<"授课学时:";printf("%4d\n",ke[i].shoukexueshi);
	cout<<"实验学分:";printf("%4.2f\n",ke[i].xuefen);
	cout<<"开设学期:";printf("%5d\n",ke[i].kaishexueqi);
}

void luru(){
	cout<<"请输入录入课程总数:";
	cin>>num;
	FILE *fp=fopen("input.txt","r");
	for(int i=0;i<num;i++){
		fscanf(fp,"%d %s %s %d %d %lf %d",&ke[i].bianhao,ke[i].mingcheng,ke[i].xingzhi,
		&ke[i].zhongxueshi,&ke[i].shoukexueshi,&ke[i].xuefen,&ke[i].kaishexueqi);
	}
}

void liulan(){
	int i;
	freopen("output.txt","w",stdout);
	for(i=0;i<num;i++){
		print(i);
		cout<<endl;
	}
	freopen("CON","w",stdout);
	for(i=0;i<num;i++){
		print(i);
		cout<<endl;
	}
	return;
}

void xuefen_chaxun(double n){
	bool b=0;
	for(int k=0;k<num;k++){
		if(ke[k].xuefen==n){
			b=1;
			cout<<"已找到:"<<endl;
			print(k);
		}
	}
	if(b==0) cout<<"未找到"<<endl;
}

void xingzhi_chaxun(char *s){
	bool b=0;
	for(int k=0;k<num;k++){
		if(strcmp(s,ke[k].xingzhi)==0){
			b=1;
			cout<<"已找到:"<<endl;
			print(k);
		}
	}
	if(b==0) cout<<"未找到"<<endl; 
}

void chaxun(){
	cout<<"你有以下选择:"<<endl;
	cout<<"1:按学分查询"<<endl;
	cout<<"2:按性质查询"<<endl;
	int id;
	cin>>id;
	if(id==1){
		double xuefen;
		cout<<"请输入你想查询的学分:";
		cin>>xuefen;
		xuefen_chaxun(xuefen);
		cout<<endl;
	}else
	if(id==2){
		char xingzhi[100];
		cout<<"请输入你想查询的性质:";
		cin>>xingzhi;
		xingzhi_chaxun(xingzhi);
		cout<<endl;
	}
}

 输出显示在文件output.txt中,也在控制台上显示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值