项目要求:
选修课查询系统
假定有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中,也在控制台上显示。