我大概是從讀研究生入學那天開始,想要學好C++的,學習C++幾乎也成了我每一個學期的計劃之一。爲何會每一個學期都想要學好C++呢?由於每次學習都失敗了啊。。。ios
本月,我開始再Coursera上學習Heterogeneous Parallel Programming 以及 北京大學的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++應該是一個使用的過程,每天寫些hello world除了能驗證工具鏈正確,偶爾在語法層面作些驗證之外,沒有任何做用。關鍵的關鍵,就是須要一個足夠大的項目,可以讓C++的各類特性有用武之地,可以提高本身對C++特性的理解。至於標準層面的學習,應該是在編譯器不停的報錯中學會處理的吧。強大的面向對象工具 = 特性+標準。 這個工具和咱們的專業知識,或者其餘庫函數並不耦合,不妨先用matlab完成專業知識的訓練,一邊訓練C++的技能。必定曾都的時候將專業知識代碼移植到C++上,來感覺C++的效率以及本身的能力。this
我以爲學習C++就應該從特性入手,到大型程序裏取體會。沒寫過個一兩千行代碼,是無法聊C++的特性的。總而言之,I have a plan, attack.編碼
在完成第三週魔獸世界相關的做業後,我對類和對象又有了新的認識。C++須要咱們作的就是抽象,不停的找到共性,具體的每一個對象再分配特性。共性的部分就是類的成員變量名,特性的部分就是成員變量的取值不一樣。貨車轎車本質是一類,只不過「載重」這個成員變量的取值不一樣。轎車消防車卻不是一類,轎車並無一個成員變量叫作」載水量「 啊。C++的特性就是爲了讓咱們能把內心想好的抽象可以實現出來。特性只能幫助咱們實現腦子裏的抽象,它並不能替咱們抽象,本身腦子裏都不知道應該怎樣抽象,不能怪C++的特性難啊。總之面向對象是一種思路。spa
最後附上第三週做業的一些代碼,這些代碼不能經過考覈,由於Coursera 的平臺不支持C++11.
注意: 總時間限制: 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 ¤t_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 ¤t_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 }