謝邀。
初學(xué)者在學(xué)習(xí)一段時(shí)間C語(yǔ)言后,會(huì)對(duì)語(yǔ)法和結(jié)構(gòu)基本了解,再看書常會(huì)產(chǎn)生一種“什么都會(huì)”的錯(cuò)覺(jué)。之所以說(shuō)“錯(cuò)覺(jué)”是因?yàn)椋孀屪约簩慍語(yǔ)言代碼,不少初學(xué)者完全不知道如何下手。
這是一個(gè)比較普遍的現(xiàn)象,題主也不用驚慌,這里我將介紹一種非常適合初學(xué)者的編寫C語(yǔ)言程序的方法。
從頭開始編寫C語(yǔ)言程序解決某個(gè)問(wèn)題,應(yīng)該按照什么步驟來(lái)呢?
我還記得我當(dāng)初學(xué)習(xí)C語(yǔ)言時(shí),看人家寫的例子非常順暢,覺(jué)得 C 語(yǔ)言也不過(guò)如此。可是真的給我一個(gè)問(wèn)題讓我從頭編程解決,還真是一臉懵逼,完全沒(méi)有頭緒,不知道從何下手。
現(xiàn)在想想,這是因?yàn)楫?dāng)時(shí)我還沒(méi)有編程思想,還不會(huì)按照計(jì)算機(jī)的思維考慮問(wèn)題,這項(xiàng)能力只能多鍛煉獲得。
長(zhǎng)征是一步一步走的,再?gòu)?fù)雜的C語(yǔ)言程序也是一句一句完成的。這里我將介紹一種“增量式”開發(fā)的思路,非常適合還沒(méi)有形成“計(jì)算機(jī)思維”的初學(xué)者。
“增量式”C語(yǔ)言程序開發(fā)
還是以實(shí)際問(wèn)題為例,對(duì)這種開發(fā)思路做介紹,請(qǐng)看問(wèn)題:
一個(gè)長(zhǎng)方形對(duì)角的兩個(gè)點(diǎn)坐標(biāo)分別為 (x1, y1) 和 (x2, y2),用 C 語(yǔ)言編寫程序求它的面積。
從數(shù)學(xué)上來(lái)看,要解決這個(gè)問(wèn)題,顯然可以分三步:
- 計(jì)算這個(gè)長(zhǎng)方形的長(zhǎng): L=|x1-x2
- 計(jì)算這個(gè)長(zhǎng)方形的寬:W=|y1-y2
- 利用公式:長(zhǎng) x 寬 計(jì)算這個(gè)長(zhǎng)方形的面積 S=L x W
這里直接認(rèn)為長(zhǎng)方形的長(zhǎng)在 x 軸方向,寬在 y 軸方向了,長(zhǎng)寬的方向并不影響計(jì)算面積。
接著,我們看看如何用C語(yǔ)言計(jì)算長(zhǎng)方形的長(zhǎng)。首先應(yīng)該知道,坐標(biāo),長(zhǎng)寬,面積應(yīng)該用 double 類型的數(shù)據(jù)表示,所以計(jì)算長(zhǎng)方形長(zhǎng)的函數(shù)可以如下寫:
初學(xué)者寫到這里就已經(jīng)不太自信了:這個(gè)函數(shù)定義寫得對(duì)嗎?雖然我是按我理解的語(yǔ)法規(guī)則寫的,但書上沒(méi)有和這個(gè)一模一樣的例子,萬(wàn)一不小心遺漏了什么呢?
既然不自信就不要再往下寫了,沒(méi)有一個(gè)平穩(wěn)的心態(tài)來(lái)寫程序很可能會(huì)引入Bug。所以在函數(shù)定義中插一個(gè)return 0.0立刻結(jié)束掉它,然后立刻測(cè)試這個(gè)函數(shù)定義得有沒(méi)有錯(cuò)誤:
編譯,運(yùn)行,一切正常。這時(shí)你就會(huì)建立起信心了:既然沒(méi)問(wèn)題,就不用管它了,繼續(xù)往下寫剩下的C語(yǔ)言代碼。
如果你不敢確定寫的對(duì),可以就此打住,再來(lái)測(cè)試一次:
編譯并運(yùn)行這段C語(yǔ)言代碼,程序輸出 2,是正確的。
至此,就完成了根據(jù)坐標(biāo)計(jì)算長(zhǎng)方形長(zhǎng)度的函數(shù),而且測(cè)試正確,又有信心往下繼續(xù)寫了。下面同樣的方式來(lái)完成計(jì)算寬度的C語(yǔ)言函數(shù):
好了,計(jì)算長(zhǎng)和寬的函數(shù)都完成了,現(xiàn)在可以來(lái)寫計(jì)算面積的C語(yǔ)言函數(shù)了。計(jì)算面積的話,就需要輸入兩個(gè)坐標(biāo)了,也就是四個(gè)變量,然后要在計(jì)算面積的函數(shù)里計(jì)算長(zhǎng)方形的長(zhǎng)和寬,然后再把長(zhǎng)寬相乘計(jì)算面積。
如果擔(dān)心C語(yǔ)言程序?qū)懙牟粚?duì),可以寫到這里停下來(lái),先把長(zhǎng)和寬計(jì)算后打印出來(lái)。因?yàn)槟阋呀?jīng)測(cè)試過(guò) width 和 length 函數(shù)都正確了,如果寫到這里出問(wèn)題了,那就說(shuō)明肯定是 area 函數(shù)寫的有問(wèn)題,這樣就不用去之前寫的代碼中找問(wèn)題了。編譯,運(yùn)行發(fā)現(xiàn)一切正常:
確定沒(méi)問(wèn)題了,我們就可以繼續(xù)往下寫 area 函數(shù)的C語(yǔ)言代碼了。
area 函數(shù)中的,包括之前我們測(cè)試 width 和 length 函數(shù)中的 printf 都起到了類似腳手架的作用:在蓋房子時(shí)很有用,但它不是房子的一部分,房子蓋好之后就可以拆掉了。
房子蓋好之后可能還需要維修、加蓋、翻新,又要再加上腳手架,這很麻煩,要是當(dāng)初不用拆就好了,可是不拆不行,不拆多難看啊。寫代碼卻可以有一個(gè)更高明的解決辦法:把 printf 的代碼注釋掉。
到這里我們就寫完了計(jì)算面積的代碼,趕緊放到 main 函數(shù)中測(cè)試:
編譯并運(yùn)行這段C語(yǔ)言代碼,發(fā)現(xiàn)輸出正常:
成功了,至此,終于一點(diǎn)一點(diǎn)的(增量式)用C語(yǔ)言解決了問(wèn)題。當(dāng)然,熟練了以后,可以直接寫出求面積的函數(shù):
這樣寫簡(jiǎn)潔得多了。但是如果出錯(cuò)了呢?只知道是這一長(zhǎng)串表達(dá)式有錯(cuò),但根本不知道錯(cuò)在哪,而且 area2 整個(gè)函數(shù)就一個(gè)語(yǔ)句,插 printf 都沒(méi)地方插。
所以用臨時(shí)變量有它的好處,程序更清晰,調(diào)試更方便。而且,這樣寫,length和width函數(shù)還要不要?不要的話刪掉,如果有些情況,只需求長(zhǎng)方形的長(zhǎng)和寬呢?
那留著 length 和 width 函數(shù)咋樣?這樣的話,length,width 以及 area2 函數(shù)有相同的C語(yǔ)言代碼,一旦出了錯(cuò),修改 length,width 還得記著修改 area2 函數(shù)。
維護(hù)重復(fù)的代碼是非常容易出錯(cuò)的,在任何時(shí)候都要盡量避免。因此,盡可能復(fù)用以前寫的C語(yǔ)言代碼,避免寫重復(fù)的代碼。
按照這個(gè)思路來(lái)看,還是 area 函數(shù)好一點(diǎn)。更進(jìn)一步的,我們發(fā)現(xiàn) width 和 length 函數(shù)的C語(yǔ)言代碼邏輯其實(shí)是一樣的,只是變量的名字不一樣,這也應(yīng)該避免,width 和 length 函數(shù)可以用 distance 函數(shù)代替:
整理一下,最終C語(yǔ)言代碼如下:
到這里,我們就一點(diǎn)一點(diǎn)的寫出了自己的C語(yǔ)言程序,可以發(fā)現(xiàn)并沒(méi)有什么難度。