- 變量、常量
- 輸入、輸出、流
- getline() 函數(shù)讀入整行輸入
- Hello() 函數(shù)復習
- 新定義函數(shù) Input() 實現(xiàn)友好的人機交互
- 還有 “痘痘” 為什么擠不到的分析……
?
1. DRY 原則簡介
上一節(jié)課,我們寫了兩版“問候”程序。第一版的最大問題是重復的內(nèi)容比較多,每一次問候都在重復從 cout 到 endl 的代碼,中間只有人名不同。
剛學編程的人可能會說:“代碼重復怕什么???在電腦里 復制、 粘貼 文本非??彀?!”
問題不在于寫代碼是快還是慢,而在于重復的代碼,難以修改、難以維護。
重復的代碼,它們的背后的業(yè)務邏輯往往是相同或者高度相似的。如果有一天,這個業(yè)務邏輯發(fā)生改變,就會造成代碼中所有重復的地方都要修改。我們現(xiàn)在的代碼才幾行而已,如果有一天q有上千,上萬行代碼,我們很可能都無法找出所有重復的地方,一個個修改過去也極大可能引發(fā)新的錯誤。
“不要到處寫重復的代碼”,這已經(jīng)成為專門一條行業(yè)內(nèi)的編碼規(guī)矩,稱為 “DRY”原則,也就是 “Dont’t repeat yourself”,不要重復你自己。
2. 新情景、新需求
第二版的問候程序,有很大的進步。因為我們把重復的,問候操作,寫成一個函數(shù),叫Hello(),多次調(diào)用。這樣一來,將來,如果問候操作,需要變化,我們也只需要修改這個Hello()函數(shù)即可。
// 我的第一個函數(shù)
void Hello(std::string_view XXX)
{
std::cout << "你好," << XXX << "!" << std::endl;
}
?這一節(jié)課,我們要為問候業(yè)務,提出新的場景需求:模擬在上班路上,碰到誰,就問候誰的過程。
碰上誰,就問候誰……那我們能事先知道每一天上班會碰到誰嗎?當然無法預知。這樣一看,現(xiàn)有的這第二版問候程序就顯得非?!八腊濉绷?。每一次運行這個程序,都是先問候志玲,再問候冪冪,再問候冰冰……無論運行多少次,它的問候過程都是一成不變的。
這就說到了“變”!我們需要可以變的姓名;這就引出這節(jié)譚,們要學習第一個重要的知識點:變量。
3. 認識變量和常量
程序中的數(shù)據(jù),可以按可變和不可變區(qū)分,分成兩大類:常量和變量。
3.1 常量
常量,就是在程序運行之后,無法修改,或禁止修改它的“量”的數(shù)據(jù)。
這里的“量”,更通俗易懂的說法是一個數(shù)據(jù)的“值”,或者說,一塊內(nèi)存里存放的內(nèi)容。
我們以后會重點講解常量。不過,大家要在今天記住這兩個描述:“無能力修改” 和 “禁止修改”。
來舉一個“惡俗”,但絕對管用的例子吧——
假設你是一個非常喜歡擠別人痘痘的人。然后,有個女生說她后背某個地方長了一顆很大的痘痘,可是她不告訴你這顆痘痘的位置。請問,你能擠掉一顆你看不見,摸不著的痘痘嗎?當然不能,這就叫“無能力修改”。
另外一種情況,這顆痘痘就長在女生鼻頭上,你看得見,摸得著,但是你能伸手就擠掉它嗎?也不能,因為人家女生不允許你動它。
這就是將來我們會學習到的,最常見的兩種類型的常量:一種是代碼在客觀上沒有能力修改的數(shù)據(jù),一種在語法上明確標明不讓修改的數(shù)據(jù)。上一課第一版代碼中的名字字符串,就是第一種,叫“字面常量”。它就像我們白紙黑字簽下的字,一旦寫下,就涂改不了。
3.2 變量
初中學習的代數(shù),當一個數(shù)據(jù)我們暫時不知道它會是什么值時,我們可以用個字母,比如 x、y、z,來暫時先代表這個數(shù)據(jù)。在程序中,一個數(shù)據(jù),我們暫時不知道它會是什么值;或者,知道它一開始的值,但這個值會隨著程序的運行而不斷變化,這情況下,我們也可以用一個字母,或者更好的,用一個單詞來表達它,表達這個會變化的數(shù)據(jù)。
今天,我們不知道什么?答,我們不知道每一天上班路上會先遇到誰,后遇到誰。所以,就讓我們寫的C++程序,定義第一個真正意義上的變量,取名為 “誰” 吧!
你當然也可以使用 X 來表達,這樣顯得更加有科技感和神秘感。但是,我覺得用名字是“誰”這個變量,來表達程序中可能遇到誰誰誰誰……想一想是不是也挺直觀的?
沒錯,這也是我們今天學習到又一個重要的知識點:變量的名字一定要能直觀地表達它的作用。
來看一些常量與變量使用對比的例子——
-
“我的體重是 60 公斤”:人的體重很少一成不變,所以我們得用變量表達它,這個變量的名字可以叫 weight。
-
“我的身高 175 厘米……”:也一樣,從小到大再到老,身高也會變化,這個變量可以叫 height。
3.3 變量常見使用過程
結(jié)合用變量表達待問候的人名的例子,我們來看看變量最常見的使用過程。
(1)定義變量
要使用變量,首先需要定義變量。C++定義變量時,需要給出變量名字,還需要直接或間接給出變量的類型。今天我們學習其中的“直接”方式:
變量類型 變量名字;
即:先寫下變量的類型,再寫下它的名字,然后用分號結(jié)束,這是定義變量的一種常見語法。
在我們的例子,變量名是誰,它實際是要表達人的名字,所以它的類型應該是字符串。在 C++ 的標準庫中,有一個叫 string 的類型,用來表達字符串。
std::string 誰; // 定義了一個變量,名字叫誰,類型是 std::string
大家還記得前面課堂學習到的名字空間的知識點吧?特別是這個 std:: 的寫法,你應該很熟悉了。
這樣定義的變量誰,一開始時,它并不持任何字符內(nèi)容(或者說,它持有一個空的字符串)。
2)修改變量的值
有了一個變量,接下來,就可以修改它的“量”了,也就是為它賦值。你可能猜到了,賦值操作在C++中,就是日常的 “=” 操作符(等號)。
下面演示了賦值 “張三” 給 誰 的代碼:
誰 = "張三"; // 修改這個變量的值 (量、內(nèi)存)
(3)使用變量
變量很方便用來傳遞一個值,比如,我們可以把 誰 作為之前我們寫的 Hello() 函數(shù)的入?yún)?,以實現(xiàn)將 誰 的當前值(第2步中的 “張三”)傳遞給 Hello() 函數(shù)的入?yún)ⅲㄟ€記得嗎,這個入?yún)⑹且粋€“偷窺狂”,哦不是,是“觀察者”)……
Hello(誰); // 將誰的當前值,傳遞給 Hello() 函數(shù)入?yún)ⅲ儆诤瘮?shù)內(nèi)部輸出其值
(4)再改,再用
變量變量,比孫悟空還善變,悟空才能連續(xù)72變,我們的變量可以無窮盡地變下去……
誰 = "李天王";
Hello(誰);
誰 = "孫悟空";
Hello(誰);
// ...
3.4 變量使用完整示例代碼
#include <iostream>
#include <string>
#include <string_view>
void Hello(std::string_view XXX)
{
std::cout << "你好," << XXX << "!" << std::endl;
}
int main()
{
std::string 誰;
誰 = "志玲";
Hello(誰);
誰 = "冪冪";
Hello(誰);
誰 = "冰冰";
Hello(誰);
誰 = "熱巴";
Hello(誰);
誰 = "真木陽子";
Hello(誰);
誰 = "井川遙";
Hello(誰);
誰 = "Lily Collins";
Hello(誰);
}
問題來了:這個使用變量的版本,感覺寫起來,比之前的常量版本還啰嗦呀?
4. 人機交互!
4.1 認識 getline()
盡管用了變量,但這個版本每次運行起來,輸出結(jié)果還是一成不變;甚至寫起來比常量的那個版本,還要麻煩、還啰嗦,并且,沒有引入什么新功能呀?!
我們準備這樣來模擬每天上班路上遇到誰問候誰的過程:我們讓用戶(其實,就是我們自己),在程序運行時,通過鍵盤輸入一個姓名,輸入誰,就表示我們遇到誰。
我們要輸入的是一個姓名,一個字符串。并且,如果是外國人的話,那么他們的姓名中間可能包含空格。C++標準庫提供了一個 getline() 的函數(shù),特別適合于讀入整行的字符串,包括中間的空格。
getline() 有兩個入?yún)?。第一個入?yún)⒅付ㄝ斎肓鳌J裁唇小拜斎肓鳌保?/p>
【輸入、輸出】:首先來理解什么叫“輸入”:往程序里“塞”數(shù)據(jù),就叫“輸入”。大家順便可以理解一下什么叫 “輸出”,程序往外“吐”數(shù)據(jù),就叫輸出,也就是,編程時講的輸入和輸出,是以程序為中心來理解的。
【流】:那什么叫流:水流、電流,都是流。流就是在同一個方向上的排著隊的一大堆數(shù)據(jù)。比如,“車流”就是:同一個行駛方向上,有很多車一輛接一輛地往前走。
本站深入講解,包含多個實踐項目的 C++“流”的高級課程:
《C++“流”編程視頻輔導》課程 建議及時加深學習
我們現(xiàn)在寫的程序,暫時只能使用鍵盤往程序里輸入數(shù)據(jù),一陣“噼噼啪啪”敲鍵盤,就可以往程序里輸入一大串字符,因此它滿足“輸入流”的概念的三個要素:
- 同一個方向:鍵盤到主機
- 支持連續(xù):噼噼啪啪快速輸入,一個字符都不會丟
- 支持排隊(即有序):無論你擊鍵有多少,都不可能出現(xiàn)先輸入字符的后到,后輸入的字符先到的亂序情況
所以,C++標準庫就把鍵盤輸入,包裝成一個 標準字符輸入流,并且預先定義成一個變量。
如果是我寫的標準庫,那這個變量的名字肯定得叫 噼噼啪啪,可惜不是。
這個預先定義的,代表標準輸入流,或者說,絕大多數(shù)情況下,代表鍵盤的變量,它的真正的名字叫 cin。c指字符,in 指輸入 。加上標準庫名字空間直接限定,就是 std::cin。
getline() 函數(shù)的第二個入?yún)?,在本例中,我們給的是我們自己定義的字符串變量,也就是誰。
當程序這樣寫時:
getline(std::cin, 誰);
執(zhí)行該句代碼并完成 getline() 的調(diào)用之后,變量誰的值,就是用戶從鍵盤上輸入的一行文本。輸入一行文本,是指用戶輸入一些普通字符內(nèi)容(包括漢字內(nèi)容)之后,非常瀟灑的拍下鍵盤上的回車鍵。getline()開始從行首一直讀到行尾,不含回車換行。
如果用戶在此期間就是不碰鍵盤,那程序就會“卡”在這一行一動不動。
4.2 問候程序的人機交互第一版
#include <iostream>
#include <string_view>
#include <string>
void Hello(std::string_view XXX)
{
std::cout << "你好," << XXX << "!" << std::endl;
}
int main()
{
std::string 誰;
std::getline(std::cin, 誰);
Hello(誰);
std::getline(std::cin, 誰);
Hello(誰);
}
為了不浪費版面,暫時就只支持上班路上遇到兩個吧!后面的遇到的,管他是大老板還是小保安,管她是不是你暗戀的辦公室女神,咱們就全都假裝沒看到。
5. 是時候看視頻了……
ffls09-HelloWorld-交互版
6. 最終版本代碼
將 “遇見” 的過程,也封裝成一個函數(shù):Input(),該函數(shù)返回用戶輸入的姓名,并且提供了更好的人機交互界面。文章來源:http://www.zghlxwxcb.cn/news/detail-860077.html
#include <iostream>
#include <string_view>
#include <string>
// 負責問候(輸出)
void Hello(std::string_view XXX)
{
std::cout << "你好," << XXX << "!" << std::endl;
}
// 負責遇見(輸入)
std::string Input()
{
std::cout << "遇見誰了?請輸入他的名字:";
std::string name;
std::getline(std::cin, name);
return name;
}
int main()
{
std::string 誰;
誰 = Input(); // 遇見誰
Hello(誰); // 問候誰
誰 = Input(); // 縱不遇見你
Hello(誰); // 也想問候你
}
「本課終」文章來源地址http://www.zghlxwxcb.cn/news/detail-860077.html
到了這里,關于C++感受6-Hello World 交互版的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!