C++學習 —— 從新認識C++

  我大概是從讀研究生入學那天開始,想要學好C++的,學習C++幾乎也成了我每一個學期的計劃之一。爲何會每一個學期都想要學好C++呢?由於每次學習都失敗了啊。。。ios

  本月,我開始再Coursera上學習Heterogeneous Parallel Programming 以及 北京大學的C++。也今後時開始思考C++或者說編程究竟是什麼,以及如何學習。編程

一、C++究竟是什麼

  我之前一直覺得C++是一種語言。個人女友很長一段時間都和我說「幫我用VC++寫個程序」,顯然她以爲C++就是那個VC6.0的IDE了。通過一段時間的學習,我發現C++並不徹底是一種語言,它是一種標準。就像漢字,點橫豎撇捺組成方塊字,每一個字都是標準的,你本身不準造,造了就是錯別字。若是咱們本身造了C++的語法,那固然編譯器是不認的。C++僅僅是一堆語法嗎?ide

  

  不是的,C++的意義還包括了「特性」,特性和語法實際上是兩個層面上的東西,語法須要死記硬背,而特性則更容易被理解。C++的特性指的應該是那些比較高級的功能,繼承、組合、委託、封裝、泛型、模版......這些功能是爲了更好的幫助咱們完成程序設計。包括更少的編碼,更好的管理、重用代碼,更利於閱讀等等。這些特性強依賴於標準,必須以標準的方式來表達,才能使用這些特性。C++強大是由於它的特性方便嗎?函數

  

  也不徹底是,C++的強大還在於它歷史悠久,效率高,有不少可使用的「庫函數」。庫與特性又不同,庫更接近咱們的專業知識,好比PCL, OPENCV, Boost, Eigen, BLAS, 這些都是基於C/C++的庫。它離咱們的專業知識僅有一步之遙。不少時候咱們解決專業問題會想着使用庫,而後程序編譯失敗,程序崩潰,最終本身也崩潰了。開始質疑人生質疑價值觀。這怪C++嗎?工具

 

  這還真不怪C++,編譯失敗多是語法不符合C++的標準,多是使用某特性時沒有很好的理解致使程序太亂,本身沒法收場。多是庫函數自己不靠譜,可能時本身沒有讀明白庫函數的API文檔。多是本身對專業知識的理解有問題,建模失敗,致使程序裏的變量和你指望的值不同。學習

  

二、學習C++

  C++自己強調鬆耦合,而後咱們在學習C++的時候,各個環節倒是緊耦合的... 任何一個層面出問題,都會崩盤...測試

  我以爲學習C++應該是一個使用的過程,每天寫些hello world除了能驗證工具鏈正確,偶爾在語法層面作些驗證之外,沒有任何做用。關鍵的關鍵,就是須要一個足夠大的項目,可以讓C++的各類特性有用武之地,可以提高本身對C++特性的理解。至於標準層面的學習,應該是在編譯器不停的報錯中學會處理的吧。強大的面向對象工具 =  特性+標準。 這個工具和咱們的專業知識,或者其餘庫函數並不耦合,不妨先用matlab完成專業知識的訓練,一邊訓練C++的技能。必定曾都的時候將專業知識代碼移植到C++上,來感覺C++的效率以及本身的能力。this

  我以爲學習C++就應該從特性入手,到大型程序裏取體會。沒寫過個一兩千行代碼,是無法聊C++的特性的。總而言之,I have a plan, attack.編碼

 

三、面向對象

  在完成第三週魔獸世界相關的做業後,我對類和對象又有了新的認識。C++須要咱們作的就是抽象,不停的找到共性,具體的每一個對象再分配特性。共性的部分就是類的成員變量名,特性的部分就是成員變量的取值不一樣。貨車轎車本質是一類,只不過「載重」這個成員變量的取值不一樣。轎車消防車卻不是一類,轎車並無一個成員變量叫作」載水量「 啊。C++的特性就是爲了讓咱們能把內心想好的抽象可以實現出來。特性只能幫助咱們實現腦子裏的抽象,它並不能替咱們抽象,本身腦子裏都不知道應該怎樣抽象,不能怪C++的特性難啊。總之面向對象是一種思路。spa

  最後附上第三週做業的一些代碼,這些代碼不能經過考覈,由於Coursera 的平臺不支持C++11.

  

編程題#4:魔獸世界之一:備戰

 

注意: 總時間限制: 1000ms 內存限制: 65536kB

描述

魔獸世界的西面是紅魔軍的司令部,東面是藍魔軍的司令部。兩個司令部之間是依次排列的若干城市。

紅司令部,City 1,City 2,……,City n,藍司令部

兩軍的司令部都會製造武士。武士一共有 dragon 、ninja、iceman、lion、wolf 五種。每種武士都有編號、生命值、攻擊力這三種屬性。

雙方的武士編號都是從1開始計算。紅方製造出來的第n個武士,編號就是n。一樣,藍方製造出來的第n個武士,編號也是n。

武士在剛降生的時候有一個生命值。

在每一個整點,雙方的司令部中各有一個武士降生。

紅方司令部按照iceman、lion、wolf、ninja、dragon的順序循環制造武士。

藍方司令部按照lion、dragon、ninja、iceman、wolf的順序循環制造武士。

製造武士須要生命元。

製造一個初始生命值爲m的武士,司令部中的生命元就要減小m個。

若是司令部中的生命元不足以製造某個按順序應該製造的武士,那麼司令部就試圖製造下一個。若是全部武士都不能製造了,則司令部中止製造武士。

給定一個時間,和雙方司令部的初始生命元數目,要求你將從0點0分開始到雙方司令部中止製造武士爲止的全部事件按順序輸出。

一共有兩種事件,其對應的輸出樣例以下:

1) 武士降生

輸出樣例: 004 blue lion 5 born with strength 5,2 lion in red headquarter

表示在4點整,編號爲5的藍魔lion武士降生,它降生時生命值爲5,降生後藍魔司令部裏共有2個lion武士。(爲簡單起見,不考慮單詞的複數形式)注意,每製造出一個新的武士,都要輸出此時司令部裏共有多少個該種武士。

2) 司令部中止製造武士

輸出樣例: 010 red headquarter stops making warriors

表示在10點整,紅方司令部中止製造武士

輸出事件時:

首先按時間順序輸出;

同一時間發生的事件,先輸出紅司令部的,再輸出藍司令部的。

 

輸入

第一行是一個整數,表明測試數據組數。

每組測試數據共兩行。

第一行:一個整數M。其含義爲, 每一個司令部一開始都有M個生命元( 1 <= M <= 10000)。

第二行:五個整數,依次是 dragon 、ninja、iceman、lion、wolf 的初始生命值。它們都大於0小於等於10000。

 

輸出

對每組測試數據,要求輸出從0時0分開始,到雙方司令部都中止製造武士爲止的全部事件。

對每組測試數據,首先輸出"Case:n" n是測試數據的編號,從1開始 。

接下來按恰當的順序和格式輸出全部事件。每一個事件都以事件發生的時間開頭,時間以小時爲單位,有三位。

 

樣例輸入            

1
20
3 4 5 6 7

           

         樣例輸出

Case:1
000 red iceman 1 born with strength 5,1 iceman in red headquarter
000 blue lion 1 born with strength 6,1 lion in blue headquarter
001 red lion 2 born with strength 6,1 lion in red headquarter
001 blue dragon 2 born with strength 3,1 dragon in blue headquarter
002 red wolf 3 born with strength 7,1 wolf in red headquarter
002 blue ninja 3 born with strength 4,1 ninja in blue headquarter
003 red headquarter stops making warriors
003 blue iceman 4 born with strength 5,1 iceman in blue headquarter
004 blue headquarter stops making warriors

  1 #include <iostream>
  2 #include <vector>
  3 #include <string>
  4 #include <iomanip>
  5 using namespace std;
  6 
  7 
  8 class warrior{
  9 public:
 10     warrior(int life_,string name_,int num_=0):life(life_),name(name_),num(num_){}
 11     int getLife()    const {return this->life;}
 12     string getName() const {return this->name;}
 13     int getNum()     const {return this->num;}
 14     void addOne(){this->num += 1;}
 15 private:
 16     int num;
 17     const string name;
 18     const int life;    
 19 };
 20 
 21 
 22 class headquarter{
 23 public:
 24     headquarter(const string quarterName_,int ALLLIFE_,vector<warrior> warriorList_):quarterName(quarterName_),
 25                                                                               ALLLIFE(ALLLIFE_),
 26                                                                               warriorList(warriorList_){}
 27     bool warriorBurn(int time);
 28 private:
 29     inline void __successPrint(int time,const warrior &current_warrior) const;
 30     inline bool __warriorBurn(warrior & burnwarrior);
 31     
 32     const string quarterName;
 33     int ALLLIFE;
 34     vector<warrior> warriorList;
 35 };
 36 
 37 
 38 void headquarter::__successPrint(int time,const warrior &current_warrior) const{
 39     
 40      cout<< setfill('0') << setw(3) << time;
 41     cout<<' '
 42         <<this->quarterName
 43         <<' '<<current_warrior.getName()
 44         <<' '
 45         <<(time+1)
 46         <<" with strength"
 47         <<current_warrior.getLife()
 48         <<", "
 49         <<current_warrior.getNum()
 50         <<' '
 51         <<current_warrior.getName()
 52         <<" in"
 53         <<this->quarterName
 54         <<" headquarter"
 55         <<endl;
 56 }
 57 
 58 bool headquarter::warriorBurn(int time){
 59 
 60     int current = time;
 61     while(!__warriorBurn(warriorList.at(time%5)))
 62     {
 63         time++;
 64         if(current+5 == time)
 65             {
 66                 cout<<this->quarterName<<" stop making warriors"<<endl;
 67                 return false;
 68             }
 69     }
 70     this->__successPrint(current,warriorList.at(time%5));
 71     return true;
 72 }
 73 
 74 
 75 bool headquarter::__warriorBurn(warrior & burnwarrior){
 76     
 77     int totalLife = ALLLIFE;
 78     totalLife -= burnwarrior.getLife();
 79     if(totalLife > 0)
 80     {
 81         ALLLIFE = totalLife; 
 82         burnwarrior.addOne();
 83         return true;
 84     }
 85     return false;
 86 }
 87 
 88 
 89 int main(int argc, char const *argv[])
 90 {
 91 
 92 
 93 
 94     int Case;
 95     int alllife,lionlife,ninjialife,dragonlife,wolflife,icemanlife;
 96 
 97     cin>>Case;
 98     cin>>alllife;
 99     cin>>dragonlife>>ninjialife>>icemanlife>>lionlife>>wolflife;    
100     cout<<"case:"<<Case<<endl;
101 
102 
103 
104     warrior lion(lionlife,"lion");
105     warrior ninja(ninjialife,"ninja");
106     warrior dragon(dragonlife,"dragon");
107     warrior wolf(wolflife,"wolf");
108     warrior iceman(icemanlife,"iceman");
109 
110     std::vector<warrior> red_list;
111     red_list.push_back(iceman);
112     red_list.push_back(lion);
113     red_list.push_back(wolf);
114     red_list.push_back(ninja);
115     red_list.push_back(dragon);
116 
117 
118     std::vector<warrior> blue_list;
119     blue_list.push_back(lion);
120     blue_list.push_back(dragon);
121     blue_list.push_back(ninja);
122     blue_list.push_back(iceman);
123     blue_list.push_back(wolf);
124 
125     headquarter red("red",alllife,red_list);
126     headquarter blue("blue",alllife,blue_list);
127 
128     int time = 0;
129     bool red_result = true;
130     bool blue_result = true;
131     while(1)
132     {    
133         if(red_result)
134             red_result = red.warriorBurn(time);
135         if(blue_result)
136             blue_result = blue.warriorBurn(time);
137         if(red_result || blue_result)
138         {
139             time++;
140             continue;
141         }
142         break;
143     }
144     
145     return 0;
146 }
View Code
相關文章
相關標籤/搜索