课程管理系统设计(windows系统)
1. 介紹
本項目使用 C++ 實現一個課程管理系統,這個項目會學習C++的很多特性,同時可以熟悉Linux下的C++語言編譯方法及簡單的Makefile編寫(以后會完善)。
2. 項目需求
編寫一個課程管理程序,程序具備下述基本功能:
程序運行后可以循環輸入操作命令
操作命令輸入0,打印出程序幫助信息,即每個操作命令的作用
操作命令輸入1,打印出程序中存儲的所有課程ID和課程名
輸入2,打印出課程數量
輸入3,打印出名字最長的課程信息,如果有多個相同長度的課程名請都打印出
輸入4,刪除最后一個課程,如果沒有課程需要返回錯誤信息
輸入5,退出程序
在上述基本功能之外的附加功能:
課程包含基礎課,項目課,評估課不同的類型
課程ID唯一,需要自動生成
需求很簡單,我們完全不需要復雜的面向對象也可以實現,但為了盡可能多的應用C++的知識點,會進行“過度設計”,目的是讓大家盡可能多的了解C++的知識如何應用到實際的代碼場景中。
一、針對這個項目,我們首先需要知道我們要做什么,要達到什么樣的效果。根據項目要求,我們要做的就是輸出一系列幫助信息,每一條幫助信息對應一個功能,對于每個功能,我們需要編寫函數實現。項目要求:默認輸出全部幫助信息,根據幫助信息中顯示的命令行,輸入相應的命令后,根據命令判斷以及相應的函數處理,然后輸出對應的操作。這個項目的重點是實現基礎課的相關操作,為了能夠體現項目的可擴展性和鍛煉C++編程的技能,又定義了擴展接口,即項目課和評估課等不同的類型(即為基礎課的派生類)。同時由于要求課程id是唯一的,需要將課程id定義為static變量,并在類的外部初始化。
二、根據項目功能要求,可以進行模塊劃分,分成兩個模塊:命令輸入及處理和課程存儲及管理。既而得出類的劃分,分為課程類、課程管理類和命令管理類。課程對象存儲每個課程的信息,課程管理對象對課程列表進行維護和管理,命令管理對象對命令進行管理。具體來說:
1、課程類:類成員需要包括課程Id和課程名稱,類成員函數至少包括構造函數(參數為課程名稱)、拷貝構造函數、返回和設置課程名稱、獲得課程id和打印課程信息函數(需要重載operator<<)等。
2、課程管理類:類成員至少包含課程列表,類成員函數至少包括構造函數(參數為課程對象vector容器)、獲取課程數目、添加課程(參數為課程名稱或課程對象)、刪除課程(刪除最新課程、指定id或指定名稱)、打印課程列表、打印課程(最長名稱、指定id或指定名稱)等。
3、命令管理類:類成員至少需要命令列表和課程管理對象,類成員函數至少包括初始化函數(課程及命令信息初始化)、打印幫助信息和命令處理函數。 現在根據現有的類的劃分,每個類都有.cpp和.h,然后在定義一個Cmd.h,其中定義所有支持的命令數字,還需要主函數main.cpp和Makefile文件。說到這里,這個項目的整體架構已經成形,接下來就是如何實現。 這里附上每個類.cpp的具體實現,一句一句敲上的,記錄一下。
1 //------------------------------Course.cpp-------------------------------------
2 #include<iostream>
3 #include"Course.h"
4 using namespace std;
5 // Course 類成員函數
6 //初始化靜態成員,默認第一個課程Id為1
7 int Course::currentId = 1;
8 //課程類構造函數
9 Course::Course()
10 {
11 //將currentId當前值賦值給id,再將currentId自增
12 id = currentId++;
13 //默認課程名稱為空字符串
14 name = "";
15 }
16 //課程類拷貝構造函數
17 Course::Course(const Course& course)
18 {
19 id = course.GetId();
20 name = course.GetName();
21 }
22 //打印課程信息
23 void Course::PrintInfo() const{
24 cout<<"Course: "<< id <<" : "<< name << endl;
25 }
26 //友元函數:讀取輸入創建新的課程
27 void read(istream& is, Course& item){
28 is >> item.name;
29 }
30 //友元函數:操作符<<重載函數,當cout<<輸出課程信息時使用
31 ostream& operator<<(ostream& os, const Course& course)
32 {
33 os << "Course: "<< course.id <<" : " << course.name;
34 return os;
35 }
36 //ProjectCourse 類成員函數
37 //打印課程信息
38 void ProjectCourse::PrintInfo() const{
39 cout<<"ProjectCourse: "<< id <<" : "<<name<<" : "<<tag<< endl;
40 }
41 //JudgeCourse 類成員函數
42 //打印課程信息
43 void JudgeCourse::PrintInfo() const{
44 cout<<"JudgeCourse: "<< id <<" : "<<name<<" : "<<time<<endl;
45 }
1 //---------------------------------------CourseManager.cpp--------------------------
2 #include<stdexcept>
3 #include<iostream>
4 #include "CourseManager.h"
5
6 using namespace std;
7
8 //構造函數,參數為課程vector
9 CourseManager::CourseManager(const vector<Course>& course){
10 for(auto curs = course.begin();curs!=course.end();curs++)
11 courseList.push_back(*curs);
12 }
13 //添加課程函數(參數為課程名稱)
14 void CourseManager::AddCourse(const string& courseName){
15 Course course(courseName);
16 courseList.push_back(course);
17 }
18 //添加課程函數(參數為課程對象)
19 void CourseManager::AddCourse(const Course& course){
20 courseList.push_back(course);
21 }
22
23 //刪除最后一個課程
24 void CourseManager::RemoveLast(){
25 try
26 {
27 //如果課程非空,則刪除最后一門課程
28 if(!courseList.empty()){
29 courseList.pop_back();
30 cout<<"Deleted successfully!"<<endl;
31 }
32 //如果課程為空,則拋出異常被catch捕獲
33 else{
34 throw runtime_error("Deleted error, there is no course!");
35 }
36 }
37 catch(runtime_error err){
38 cout<<err.what()<<endl;
39 }
40 }
41 //刪除課程:刪除指定id的課程
42 void CourseManager::RemoveById(int id){
43 int index = FindCourse(id);
44 if(index>0)
45 courseList.erase(courseList.begin()+index);
46 else
47 cout<<"NOT FOUND"<<endl;
48 }
49 //刪除課程:刪除指定名稱的課程
50 void CourseManager::RemoveByName(const string& name){
51 int index = FindCourse(name);
52 if(index>0)
53 courseList.erase(courseList.begin()+index);
54 else
55 cout<<"NOT FOUND"<<endl;
56 }
57 //打印課程列表
58 void CourseManager::PrintAllCourse(){
59 cout<<"CourseList: "<<endl;
60 //遍歷courseList,打印出所有course信息
61 for(auto curs = courseList.begin();curs!=courseList.end();curs++)
62 cout<<*curs<<endl;
63 }
64 //打印指定課程(指定id)
65 void CourseManager::PrintCourse(int id){
66 int index = FindCourse(id);
67 if(index > 0)
68 cout<<courseList[index]<<endl;
69 else
70 cout<<"NOT FOUND"<<endl;
71 }
72 //打印指定課程(指定名稱)
73 void CourseManager::PrintCourse(const string& name){
74 int index = FindCourse(name);
75 if(index>0)
76 cout<<courseList[index]<<endl;
77 else
78 cout<<"NOT FOUND"<<endl;
79 }
80 //打印最長名稱課程函數
81 void CourseManager::PrintLongName(){
82 int maxLen = 0;
83 //遍歷courseList,查找最長名稱
84 for(auto curs = courseList.begin();curs!=courseList.end();curs++){
85 int currentLen = curs->GetName().size();
86 if(currentLen>maxLen)
87 maxLen = currentLen;
88 }
89 //遍歷courseList,打印最長名稱課程
90 for(auto curs = courseList.begin();curs!=courseList.end();curs++){
91 if(curs->GetName().size()==maxLen)
92 cout<<*curs<<endl;
93 }
94 }
95 //根據id查找課程,返回課程在vector的索引
96 int CourseManager::FindCourse(int id){
97 for(int i=0;i<courseList.size();i++){
98 if(courseList[i].GetId()==id)
99 return i;
100 }
101 return -1;
102 }
103 //根據名稱查找課程,返回課程在vector的索引
104 int CourseManager::FindCourse(const string& name){
105 for(int i=0;i<courseList.size();i++){
106 if(courseList[i].GetName()==name)
107 return i;
108 }
109 return -1;
110 }
1 //------------------------------------CmdManager.cpp-----------------------------
2 #include<iostream>
3 #include "CmdManager.h"
4
5 using namespace std;
6
7 //初始化函數
8 void CmdManager::Init(){
9 //初始化課程列表
10 manager.AddCourse("Linux");
11 manager.AddCourse("NodeJS");
12 manager.AddCourse("C++");
13 manager.AddCourse("Python");
14 manager.AddCourse("Spark");
15 manager.AddCourse("Hadoop");
16 manager.AddCourse("Ruby");
17 manager.AddCourse("Java");
18 //初始化命令列表
19 cmdMap.insert(pair<CourseCmd,string>(Cmd_PrintHelp,"Help Info"));
20 cmdMap.insert(pair<CourseCmd,string>(Cmd_PrintCourse,"Course List"));
21 cmdMap.insert(pair<CourseCmd,string>(Cmd_PrintCourseNum,"Course Number"));
22 cmdMap.insert(pair<CourseCmd,string>(Cmd_PrintLongName,"Longest Course Name"));
23 cmdMap.insert(pair<CourseCmd,string>(Cmd_RemoveLastCourse,"Remove Last Course"));
24 cmdMap.insert(pair<CourseCmd,string>(Cmd_exit,"Exit"));
25 }
26 //打印幫助信息
27 void CmdManager::PrintAllHelp() const{
28 cout<<"Cmd List: "<<endl;
29 for(auto iter = cmdMap.begin();iter!=cmdMap.end();iter++)
30 cout<<iter->first<<":"<<iter->second<<endl;
31 }
32 //根據命令查詢幫助信息
33 void CmdManager::PrintCmdHelp(const CourseCmd cmd) const{
34 auto iter = cmdMap.find(cmd);
35 if(iter != cmdMap.end())
36 cout<<iter->first<<":"<<iter->second<<endl;
37 else
38 cout<<"NOT FOUND"<<endl;
39 }
40 //處理命令操作,如果返回false則表示退出程序,其他情況返回true
41 bool CmdManager::HandleCmd(const CourseCmd cmd){
42 auto iter = cmdMap.find(cmd);
43 if(iter == cmdMap.end()){
44 cout<<"NOT FOUND"<<endl;
45 return true;
46 }
47 switch(cmd){
48 case Cmd_PrintHelp: PrintAllHelp();break;
49 case Cmd_PrintCourse: manager.PrintAllCourse();break;
50 case Cmd_PrintCourseNum: cout<<manager.GetCourseNum()<<endl;break;
51 case Cmd_PrintLongName: manager.PrintLongName();break;
52 case Cmd_RemoveLastCourse: manager.RemoveLast();break;
53 case Cmd_exit:return false;
54 default: return true;
55 }
56 return true;
57 }
1 //-----------------------------------------main.cpp---------------------------------
2 #include "CmdManager.h"
3 using namespace std;
4
5 int main()
6 {
7 //輸入的命令
8 int cmd;
9 //創建命令管理對象
10 CmdManager cmdManager;
11 cmdManager.Init();
12 //打印幫助信息
13 cmdManager.PrintAllHelp();
14 cout<<"New Command: ";
15 //進入主循環并處理輸入信息
16 while(cin>>cmd){
17 if(cin.good()){
18 bool exitCode = cmdManager.HandleCmd((CourseCmd)cmd);
19 if(!exitCode)
20 return 0;
21 }
22 cout<<"---------------------------------"<<endl;
23 cout<<"New Command: ";
24
25 //清理輸入流,避免剛才流中的字符影響后續輸入
26 cin.clear();
27 cin.ignore();
28 }
29 return 0;
30 }
這里需要說明幾點:
(1)在CourseManager類中需要存儲課程列表,即包含一個Course容器,這里使用的vector容器,因為我們需要根據id和名稱查找課程,并且需要刪除最后的課程操作,順序容器是最好的選擇。
(2)在CmdManager類中包含課程管理對象和命令行列表,在這里優先選擇關聯容器map,因為map中存儲的對象既是key又是value,并且不允許有重復的key,map存儲的對象是必須具有可排序性的,默認采用less排序行為。這里使用map既要存儲命令值又要存儲相應的提示信息。
轉載請注明出處:
C++博客園:godfrey_88
http://www.cnblogs.com/gaobaoru-articles/
總結
以上是生活随笔為你收集整理的课程管理系统设计(windows系统)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哪几种人最招蚊子?
- 下一篇: 第一次保养压缩机应该要隔多久时间?