20170729-學習日記

【本文會在今天不斷補充,如果想看完整版的朋友請在明天閱讀(^_^)】

(13:40):看了上海教育電視台出品的《我們需要化學》系列紀錄片(視頻鏈接),製作十分精良,內容也頗為有趣。美中不足是時間太少了。。。不過如果對化學感興趣的同學可以看看BBC出品的化學紀錄片:BBC化學史。對化學在人類社會中的作用,現代人了解的太少了。這也是為啥會有廣告詞說「我們恨化學」。。。。(好像是國產的一個化妝品品牌。多和人家科顏氏學學去。每次路過科顏氏的專櫃都會感覺到化學的魅力。)

(16:55):剛剛看了Youtube上的一個視頻:教你在1小時之內學會C++。看完之後,發現其實它講的都是最基礎的東西(是一些所有語言都基本一樣的。。。)。而我個人認為學習一門編程語言最重要的不是這些最基本的東西(因為它們都可以在cheatsheet上找到)。而是每個語言最獨特的地方。C++最獨特的地方就我看來可能就是它的STL庫(原來參加競賽的時候也聽說過用C++的選手不讓用STL庫,可見其中的各種函數可以幫助我們節省不少時間。)那麼下面就簡單的總結以下視頻中講的東西,同時也列一個框架,可以幫助大家更好的掌握編程語言。

首先先介紹以下C++程序的結構:

#include <iostream> // 標準輸入/輸出n#include <vector> // 向量數據結構n#include <string> // 字元串結構n#include <fstream> // 文件輸入/輸出n// 還可以加入其他許多的庫,使用#include語句nn// 函數、過程定義nnint main()n{n // some statementsn return 0 // 如果程序完成良好,就從這裡退出n}n

  • 變數類型、運算符

在C++中常用的變數類型有這些:

int, float, double, char, bool,

string (字元串變數【類】,比C方便多了。在C當中字元串是一個字元char的數組),

還有一些不太常用的:

short int, long int, long long int等等

  • 布爾運算、條件選擇

布爾表達式中的運算符:==, !=, >, <, >=, <=

布爾變數的類型為bool。值有兩個:true / false。布爾運算有三種:與(&&)、或(||)、非(!)

在C++中的條件選擇有兩種:(1)If ... else ... (2)switch。下面分別介紹它們的用法。

If ... else ... : (注意,在C++當中//表示注釋;同樣段注釋可以寫成/* ... */)

If (condition) {n // do somethingn}nelse if (condition) {n // do other thingsn}nelse {n // n}n

switch的用法:

switch(variable){n case_1 : // some statements; break;n case_2 : // some statements; break;n default : // some statements;n}n

還有一種比較簡單的寫法:(如果condition為真則運行?後的,為假則運行:後的)

variable = (condition)?(true):(false)n

  • 循環【for,while,do ... while】

For循環的用法:

for(int i = 0; i < 10; i++){ // do something }n

While循環的用法:

while (condition is true){ // do something }n

do-while循環的用法:

do { // do something } while (condition is true)n

  • 數組、字元串、向量

在C++中定義數組(Array)是非常簡單的事情:

一維數組:

int numbers[5];n

二維數組:

int numbers[5][5];n

當然要記住的一點是所有數組的index都是從0開始的。

字元串的定義很簡單:

string strVariable;n

但是有關字元串的操作卻有很多。而且在C++當中,字元串(string)其實是一個class,而字元串變數其實是一個對象(object)。因此在C++中,有關字元串的許多操作都是用以下形式來用的:

strVariable.method_name(parameters);n

在視頻中講到的操作有如下幾種:

strVariable.empty() // 判斷字元串是否為空nstrVariable.append(str) // 將str字元串添加到strVariable的尾部nstrVariable.insert(index, str) // 將str添加到index的位置上nstrVariable.replace(index, str) // 將str從index處開始覆蓋nstrVariable.assign() // 這個函數的用處暫時我還不是很了解。。。nstrVariable.compare(str) // 判斷str是否和strVariable是一樣的n

向量【Vector】在C++中的用途是當我們並不知道數組中將會有多少元素時使用的。它可以認為是變長度的數組。有關vector的定義如下:

vector <var_type> vec[initial_number];nvector <int> vec[10];n

向量和字元串一樣,它們都是object,因此有關向量的運算也有很多:

vec.push_back(var) // 在vector最後加入一個變數var,vector的長度變長nvec.pop_back() // 刪除vector中的最後一個變數n

  • 函數操作

在C++中的函數定義如下:

return_type func_name(parameters){n // some statementsn return epr;n}n

在這裡return_type可以是void(也就是無類型)。

當然我們還可以在函數定義時出現遞歸定義:

int factor(int n){n if (n=1) return 1;n sum = n * factor(n-1);n return sum;n}n

遞歸定義需要滿足兩點:(1)有終止點:例如在這裡就是當n = 1的時候(2)有遞歸過程:在這裡就是sum的表達式,每次計算都使得factor(n)變成了factor(n-1)。

  • 文件操作(讀與寫)

在C++中讀文件和寫文件所使用的庫名是<fstream>。其調用方式為:

#include <fstream>n

在一開始我們也講到了。

那麼如果我們想讀文件,假設文件名是file1.txt。那麼我們可以這麼來寫:

ifstream reader("file1.txt");nfor (int i=0; !reader.eof(); i++)n{n reader[i]n}nreader.close(); // 關閉stream入口n

如果我們想輸出文件到file2.txt中,寫法為:

ofstream writer("file2.txt");nwriter << "Hello world" << endl;nwriter.close()n

  • 面向對象程序設計(OOP):類與對象的定義

關於OOP,類的定義和對象的實例化都是很重要的。我們先講對象的實例化:

假設我們有一個類class1,那麼這個類的一個對象object1可以被聲明為:

class1 object1n

當然我們的class中會有attributes(參數)與capabilities(函數),那麼一個比較general的類定義可以被寫為:

class class_name : public father_class_name {n private:n data_type attr1;n data_type attr2;n public:n getattr1();n getattr2();n setattr1(vars);n setattr2(vars);n // other functionsn};n

其中private的意思是這些attribute只能通過類當中的函數進行調用和修改,如果我們想要知道一個對象obj1中的參數attr1,那麼必須使用:

obj1.getattr1()n

而不能直接使用obj1.attr1。這就是private的作用。

那麼這個視頻目前就整理到這裡。在以後可能還會加入更多有關C++的東西。

除了C++之外。個人認為想成為一個程序員,其他語言也是必不可少的。畢竟不同的語言在不同領域的重要性不同。要針對具體問題選擇最好的語言,這也是程序員的基本素質嘛。

個人認為這些語言對我來說比較有趣:

C, C++, Java, Python, Perl, Fortran, Julia (科學計算), JavaScript, PHP, R, Swift

對這些語言在Youtube上都有非常好的資源。在國內網站應該也能找到不少。在以後的學習日記中將會不斷的總結我對編程語言的最新學習成果。

【今天晚上要去看戰狼2(感覺好像看的有點晚了。。。)】


推薦閱讀:

如何評價特斯拉在科學史上的地位?
神秘博士聖誕特輯的一次腦洞展開
怎樣在囚徒博弈中控制對手?(知乎 Live)
基對 一方科幻No.1mDay
單個電荷運動產生的磁場問題?

TAG:日记 | 科学 | 自我提升 |