日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

课程管理系统设计(windows系统)

發布時間:2024/8/26 综合教程 34 生活家
生活随笔 收集整理的這篇文章主要介紹了 课程管理系统设计(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系统)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。