如何用輕小說的方式學(xué)C++(三) 天秤(下)

放學(xué)后,剎那直奔部室,開門,便見到惱羞成怒卻又有些梨花帶雨的凜音以及旁邊笑岔氣的久遠(yuǎn)。見剎那進(jìn)了部室,久遠(yuǎn)補(bǔ)刀:
“剎那啊,你說100升水和100升油哪個重?”
“誒?水的密度比油大吧,所以肯定水更重???”
“然而你的師傅似乎不這么認(rèn)為。那剎那,100升醬油和100升油哪個重?”
“醬油密度大于水大于油吧,肯定醬油更重啊。”
“你的師傅似乎認(rèn)為醬油就是油呢?!?/p>
“夠了?。?!閉嘴?。。 眲C音咆哮。
“那么我們今天就開始寫比較程序吧?!?/p>
#include<iostream>
int main() {
????int a,b;
????std::cin>>a>>b;
????if(a>b) {
????????std::cout<<a<<">"<<b<<std::endl;
????}
????else if(a==b) {
????????std::cout<<a<<"="<<b<<std::endl;
????}
????else {
????????std::cout<<a<<"<"<<b<<std::endl;
????}
????return 0;
}

int a,b;
“剎那還記得int是啥嗎?”
“整數(shù)?!?/p>
“對,整數(shù)。a和b是定義的變量,專門存整數(shù)的?!?/p>
“那變量不能存其他的東西嗎?”
“C++是一個強(qiáng)類型的語言。無奈,你一旦有int a;后,a只能存整數(shù)而不能存其他的東西了?!?/p>
“接下來是下一行,和std::cout輸出類似,std::cin從黑框框里面讀兩個整數(shù)進(jìn)來,給a和b,為什么是>>符號就等著以后再說吧。”
(不懂)
“比方說我現(xiàn)在寫一些東西,100 200 300 400,就可以把這看成一個流?!?/p>
(就當(dāng)它是這樣吧。)
“那我不就可以讀入兩個整數(shù)到a和b了嘛。a是100,b是200?!?/p>
“那300和400呢?”
“在緩沖區(qū)留著唄,等之后再讀數(shù)據(jù)才會讀進(jìn)來?!?/p>
(似懂非懂)
“接下來是今天的核心——if語句。”
“喔喔!”
“剎那有沒有曾經(jīng)后悔過什么?”
“唔——有喲?!?/p>
“誒?比如?”
“當(dāng)初不該好奇打開這個活動部室的門~”
咳——凜音噴出一口老血。
“好了好了開玩笑的啦~這里挺好的,而且還學(xué)了不少的東西呢?!?/p>
剎那摸了摸梨花帶雨的凜音的頭。“なでなで”
“嗯...比如說之前不小心游戲氪金氪多了,這個月生活費(fèi)有點(diǎn)吃緊呢?!?/p>
“誒?剎那醬缺多少錢我墊著?”
“啊沒事,剛好最近要減肥,少吃點(diǎn)就少吃點(diǎn)吧?!?/p>
“咳咳。if的意思就是,如果怎么怎么樣,就怎么怎么樣?!?/p>
“這不是廢話嗎?”
“if后面跟一對小括號,里面寫著一個表達(dá)式;后面再跟一對大括號;當(dāng)且僅當(dāng)表達(dá)式結(jié)果不為0的時候執(zhí)行大括號里面的程序?!?/p>
“a>b這種也算表達(dá)式嗎?”
“說出來你可能不信,a大時表達(dá)式值是1,a小于等于時表達(dá)式值是0。”
“簡單粗暴的1嗎?”
“嗯。剎那知道‘非’運(yùn)算嗎?”
“嗯,是那個真的非是假,假的非是真?”
“那么,130的非呢?”
“誒?...0?”
“bingo~那0的非呢?”
“...1?”
“流石吾徒~”
“誒嘿嘿~”
“表達(dá)式之后會慢慢說,目前先學(xué) > >= < <= == +-*/ 運(yùn)算就行了。注意,運(yùn)算也是有優(yōu)先級的呢,比如5+3*2是11而不是16喲。個人建議,除去一眼就能看出來的優(yōu)先級外,其他的都還是用小括號括起來。”
“呃凜音醬啊,這個==是什么東西?為什么有兩個等號?”
“流石吾徒~盲生你發(fā)現(xiàn)了華點(diǎn)~那我先問,如果要給a賦值應(yīng)該怎么寫?”
“誒托,a=100; 這樣?”
“那判斷a和100是否相等呢?”
“a=100...哦?。》枦_突了!”
“嗯。所以,以后比較大小的時候可以寫100==a喲~把常數(shù)寫左邊?!?/p>
“誒?為什么?”
“你寫錯符號試試?”
“100=a...哦??!不可能給一個常數(shù)賦值呢?!?/p>
“扯得有點(diǎn)遠(yuǎn)了,我們回來。第一個if之后,后面又跟著了一個else if對吧?”
“嗯。”
“很簡單,如果不滿足第一個if卻又滿足第二個else if后面的表達(dá)式條件的話,會執(zhí)行這個里面。最后的else則表示如果前面的條件都不滿足,就執(zhí)行后面大括號內(nèi)的語句?!?/p>
“else if或者這個else都是必須的嗎?”
“不不不。你可以一個else if或者else都不寫,也可以一個if一個else if而沒有else,亦或若干個else if。但是要注意,你最多只能有一個else。當(dāng)然,如果你有多個if就相當(dāng)于是多個分支了?!?/p>
(似懂非懂)
“總而言之以后還有復(fù)雜的邏輯,到時候再說吧。這一次只有一個if-else if-else?!?/p>
(點(diǎn)頭)
“那么吾徒喲,寫一個找出三個數(shù)最大的那個數(shù)的程序吧~”
“...誒?”
“不要感覺很難,你先自己仿照著這個程序擴(kuò)充一下?”
剎那打開編輯器,開始敲起了代碼。

#include<iostream>
int main() {
????int a,b,c;
????std::cin>>a>>b>>c;

似乎一切順利,然而剎那突然犯了難:“凜音醬啊,有沒有什么運(yùn)算可以表示a大于b同時a大于c呢?”
“有的啦~是 && 號?!?/p>
“就是 ‘a(chǎn)nd 與’ 嗎?為什么要打兩個&號呢?”
“因?yàn)橛幸粋€按位與用的是一個&號。那個你暫時用不到,你用這個就行?!?/p>
“好~”

????if(a>b&&a>c) {
????????std::cout<<a<<"最大"<<std::endl;
????}
???? else if(b>a&&b>c) {
???? ???? std::cout<<b<<"最大"<<std::endl;
????}
???? else {
???????? std::cout<<c<<"最大"<<std::endl;
???? }
???? return 0;
}

“寫好了~”
“嗨~摸摸頭。”
“~~~今天可以結(jié)束了嗎?”
“可惜你的程序是錯的~”
“好的謝師傅...誒?錯的?”
“你輸 1 1 0 進(jìn)去試試?!?/p>
>> g++ 1.cpp
>> ./a.out
1 1 0
0最大
“噗——”剎那噴出一口老血。隨后重新看了一下自己的代碼,發(fā)現(xiàn)了問題。
“那凜音醬,這么改呢?”

???? if(a>=b&&a>=c) {
???? ????std::cout<<a<<"最大"<<std::endl;
???? }
???? else if(b>=a&&b>=c) {
???? ????std::cout<<b<<"最大"<<std::endl;
???? }

“這次就對了?!?/p>
“~誒凜音醬你這里的程序...”
“啊,是另一個寫法,你可以看一下?!?/p>
#include<iostream>
int max(int a,int b) {
???? if(a>b) return a;
???? else return b;
}
int main() {
???? int a,b,c;
???? std::cin>>a>>b>>c;
???? std::cout<<max( max(a,b) , c)<<"最大"<<std::endl;
???? return 0;
}

“等等凜音醬,你這個程序...信息量有點(diǎn)大?!?/p>
“我還沒用a>b?a:b呢?!?/p>
旁邊的久遠(yuǎn)看不下去,上來就用紙扇狠狠扇了凜音一巴掌:“學(xué)了點(diǎn)東西就開始跳,你給我來個編譯時期堆排序???”
凜音(土下座):“我錯了~”
“跪搓衣板到我講完這個程序?!?/p>
“誒?!”
久遠(yuǎn):“那么我來系統(tǒng)地解釋一下這里。剎那你知道過程的吧。”
“嗯,之前講過?!?/p>
“和main一樣,max就是個過程。輸入兩個整數(shù)a和b,輸出較大的那一個?!?/p>
“我看max后面的大括號里面有兩個東西,是參數(shù)吧?”
“對。”
“叫a和b的參數(shù)?”
“這里的參數(shù)你可以這么理解。我們都學(xué)過函數(shù)。f(x)=2x+3的話,那么f(3x+1)=2(3x+1)+3=6x+5,用實(shí)際參數(shù)替換形式參數(shù)?!?/p>
(懵逼)
“很顯然。max(a,b)不是會得到一個更大的那個數(shù)對吧?”
“對?!?/p>
“這個更大的數(shù)作為a,而c作為b,再次調(diào)用max過程。”
(似懂非懂)
旁邊的凜音用怨念的眼神盯著剎那,明顯是搓衣板跪不住了。
然而并沒有什么卯月。
“簡而言之就是替換?!?/p>
“替換?”
“我舉這么個例子:”

int div(int x,int y) {
????return x/y;
}
int main() {
????int x=100,y=200;
????div(y,x);
????return 0;
}

“剎那你認(rèn)為div(y,x)結(jié)果是多少?”
“呃,y到上面是x,x到上面是y,那div(y,x)=div(200,100)=2吧?”
“對,就是這么換的?!?/p>
“哦!”(光然大語)
“等等——if語句的小括號以及表達(dá)式之后,不是要大括號嗎?”
“要怪就怪你的師傅吧。準(zhǔn)確而言,后面是跟一條語句的,所以可以直接寫一條‘return a;’。當(dāng)有多條語句的時候,則使用大括號,將這多條語句‘打包’成復(fù)合語句,也就是有多行(當(dāng)然單行也行的)的時候需要使用大括號?!?/p>
“誒,還挺自由的呢。”
“就是太自由了才會有一堆破事呢?!?/p>
“誒?”
“比如過于自由,寫出諸如:”

int expression1=0,expression2=1,var1=0,var2=0;
if(expression1)
????var1=100;
????if(expression2)
????????var2=200;

“這樣下來后var1和var2分別是多少?”
“呃,expression1是0,所以不會執(zhí)行到里面的語句...所以最后都是0?”
“No No No,這其實(shí)是兩個并排的if,所以var2最后是200?!?/p>
“誒?”
“但是打上括號以后就不一樣了:”
if(expression1)? {
????var1=100;
????if(expression2)
????????var2=200;
}
“這個樣子的話就和你說的是一樣的,不會執(zhí)行到里面的語句。”
“哦哦哦。”
“那么,今天的作業(yè)?!?/p>
“哦...誒?”
“再不搞快點(diǎn)你的凜音醬的腿就要廢了喲~”
“誒好好,作業(yè)是什么?”
“輸入3個數(shù),輸出從大到小順序的結(jié)果?!?/p>
“誒不是挺簡單的嗎?”
“p.s.:寫完程序以后試一下這些數(shù):”
3 3 3
3 3 2
3 3 4
2 3 3
4 3 3
3 3 2
3 3 4
“看看上面這些數(shù)能不能正確輸出結(jié)果喲~”
剎那和久遠(yuǎn)高高興興地走出了活動部室。
凜音依舊在那跪搓衣板。