李欣潼
摘要:C語(yǔ)言是一門(mén)十分重要但對(duì)初學(xué)程序設(shè)計(jì)的同學(xué)來(lái)說(shuō)又是相對(duì)難學(xué)的一門(mén)計(jì)算機(jī)語(yǔ)言。從初學(xué)者的角度出發(fā),按照分析問(wèn)題,算法設(shè)計(jì),編碼實(shí)現(xiàn)及程序運(yùn)行幾個(gè)步驟,說(shuō)明了學(xué)習(xí)C語(yǔ)言的方法。論文以二元一次方程組的求解過(guò)程為案例,首先詳細(xì)地論述了問(wèn)題分析的方法,然后從C語(yǔ)言學(xué)習(xí)時(shí)初學(xué)者難于掌握的運(yùn)算符使用、循環(huán)控制、自定義函數(shù)、數(shù)組及指針幾個(gè)方面詳細(xì)地說(shuō)明了分析和編碼實(shí)現(xiàn)方法,最后說(shuō)明了上機(jī)實(shí)現(xiàn)的方法和重要性。
關(guān)鍵詞:初學(xué)者;C語(yǔ)言;二元一次方程組;問(wèn)題分析;程序?qū)崿F(xiàn)
中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2018)29-0113-04
Abstract: C is one of the very import program design language.Oriented beginner, this paper explains the method of learning C language according to the analysis of problems, algorithm design, coding implementation and program running steps. Taking the solving process of binary first-order equations as a case, this paper discuss the method of problem analysis at first, and then illustrates the method of coding at the aspects of operator use, loop control, custom functions, arrays and pointers which are difficult for beginners in C language learning. Finally, it explains the method of computer practice.
Key words: beginner; C Language ;binary first-order equations;problem analysis;computer practice
為響應(yīng)“計(jì)算機(jī)要從娃娃抓起”的號(hào)召,我國(guó)各地中學(xué)均開(kāi)設(shè)了計(jì)算機(jī)相關(guān)課程。程序設(shè)計(jì)在啟發(fā)中學(xué)生的想象力和創(chuàng)造力,提高數(shù)學(xué)分析和邏輯思維能力,增強(qiáng)理解和解決問(wèn)題的能力等方面很有作用,因此已經(jīng)成為中學(xué)生必修的一門(mén)課程。C語(yǔ)言作為一門(mén)應(yīng)用最為廣泛的計(jì)算機(jī)語(yǔ)言之一,是許多高中開(kāi)設(shè)的計(jì)算機(jī)程序設(shè)計(jì)類(lèi)課程,同時(shí)也成為信息學(xué)奧林匹克競(jìng)賽的官方語(yǔ)言之一。C語(yǔ)言是一門(mén)面向過(guò)程的高級(jí)計(jì)算機(jī)語(yǔ)言,它語(yǔ)法靈活,編程簡(jiǎn)潔、緊湊;特別適合于模塊化程序設(shè)計(jì),層次結(jié)構(gòu)清晰,且功能強(qiáng)大,即適合開(kāi)發(fā)應(yīng)用軟件,也可以開(kāi)發(fā)系統(tǒng)軟件,因此應(yīng)用領(lǐng)域特別廣泛。但由于它運(yùn)算符豐富,語(yǔ)言限制不很?chē)?yán)格,程序設(shè)計(jì)的自由度大[1][6],針對(duì)初學(xué)程序設(shè)計(jì)的中學(xué)生來(lái)說(shuō)入門(mén)很困難,不容易掌握。本文根據(jù)自己學(xué)習(xí)C語(yǔ)言的感悟,將程序設(shè)計(jì)過(guò)程為主線(xiàn),通過(guò)‘問(wèn)題→想法→算法→程序的問(wèn)題求解過(guò)程[2] ,詳述學(xué)習(xí)C語(yǔ)言程序設(shè)計(jì)的方法,以希望能對(duì)初學(xué)者有所借鑒。
1 學(xué)習(xí)第一步:從分析問(wèn)題入手,由簡(jiǎn)到難設(shè)計(jì)解決問(wèn)題的步驟
學(xué)習(xí)程序設(shè)計(jì)的目的歸根結(jié)底是要利用計(jì)算機(jī)工具去解決人們?nèi)粘5纳?、工作、學(xué)習(xí)和娛樂(lè)等遇到的問(wèn)題。問(wèn)題的解決需要確定的步驟和方法。對(duì)于復(fù)雜的問(wèn)題要分析問(wèn)題的層次和功能模塊的劃分,而對(duì)于簡(jiǎn)單的問(wèn)題,只要確定已知什么要求什么怎么求即可,初學(xué)者學(xué)習(xí)程序設(shè)計(jì)之時(shí),應(yīng)該從學(xué)生比較熟悉的簡(jiǎn)單問(wèn)題入手,了解問(wèn)題的具體內(nèi)容(分析問(wèn)題),具備什么樣的條件(已知什么?),需要解決什么(要求解什么?),然后用自己具備的知識(shí)選擇適當(dāng)?shù)慕鉀Q方法(選擇設(shè)計(jì)算法),最后按照計(jì)算思維過(guò)程根據(jù)算法來(lái)設(shè)計(jì)步驟,實(shí)現(xiàn)編程。中學(xué)生學(xué)習(xí)生活中,最為熟悉的是數(shù)學(xué)問(wèn)題,因此可以選擇一些數(shù)學(xué)題目作為初始編程案例,題目難度從簡(jiǎn)單過(guò)渡到復(fù)雜,在初學(xué)者易于介紹的狀態(tài)下逐步掌握程序設(shè)計(jì)的過(guò)程。本文以“求解二元一次方程組的解”作為全篇貫穿案例,介紹學(xué)習(xí)程序設(shè)計(jì)的過(guò)程。
①分析問(wèn)題:
經(jīng)過(guò)分析,清楚待求解問(wèn)題是對(duì)給定的二元一次方程組求它的解。針對(duì)初學(xué)者,可以先把問(wèn)題設(shè)計(jì)得簡(jiǎn)單些:只求有唯一解的二元一次方程組的解。這樣可以明確地是給定的方程它只有一個(gè)唯一解,問(wèn)題和目的更為確定。結(jié)合學(xué)生的知識(shí)儲(chǔ)備,知道二元一次方程組是由兩個(gè)方程構(gòu)成,每個(gè)方程由兩個(gè)待求的未知數(shù)及未知數(shù)的系數(shù)和常數(shù)項(xiàng)構(gòu)成。求方程組的解需要利用消元法、代入法等求解。
②確定已知條件:
對(duì)于簡(jiǎn)單的問(wèn)題,大多是已知什么,求解什么,怎么求問(wèn)題。經(jīng)過(guò)第一步的分析,明確了要解決的問(wèn)題后,要先考察的是已知什么樣的條件,比如已知哪些數(shù)據(jù)和條件。當(dāng)明確了已知條件并將其表示清楚,才可能進(jìn)一步利用它們?nèi)デ蠼狻P枰⒁獾氖?,?duì)于已知數(shù)據(jù),要通過(guò)分析數(shù)據(jù)的特點(diǎn)、表示的內(nèi)容來(lái)確定數(shù)據(jù)的類(lèi)型,然后用合適的符號(hào)對(duì)已知數(shù)據(jù)進(jìn)行表示。已知數(shù)據(jù)抽象成了符號(hào),便可以方便地在算法中使用。本例中是給定一個(gè)簡(jiǎn)單的有唯一解的二元一次方程組對(duì)其求解,它的已知條件應(yīng)是兩個(gè)方程系數(shù)及常數(shù)項(xiàng)??梢园凑諗?shù)學(xué)課中使用的方式暫時(shí)用a1,b1,c1來(lái)表示第一個(gè)方程的已知條件;用a2,b2,c2表示第二個(gè)方程的已知條件。如果它們已知并且確定了就可以利用它們?cè)谒惴ㄖ型瓿汕蠼狻?/p>
③確定要解決的具體問(wèn)題
這種情況對(duì)于初學(xué)者,一般是要解決求什么的問(wèn)題。求解的問(wèn)題可能是完成某種操作,也可能是求得一些數(shù)據(jù)結(jié)果。求解的內(nèi)容不一樣,設(shè)計(jì)的算法也不同,因此明確求什么樣的結(jié)果將決定采用什么樣的算法。本文要求解二元一次方程組的兩個(gè)未知數(shù)的解,求的是數(shù)據(jù),設(shè)計(jì)的算法就應(yīng)該與計(jì)算有關(guān)。如果要求解的是數(shù)據(jù),那么同已知一樣,應(yīng)將結(jié)果用符號(hào)表示出來(lái),以便于設(shè)計(jì)算法時(shí)應(yīng)用。本例的求解問(wèn)題是方程組的解,把它們表示為x和y。
④設(shè)計(jì)計(jì)算法方法即算法
分析問(wèn)題之后,明確了已知和待求解問(wèn)題,接下來(lái)就是怎么求解的問(wèn)題,也就是用什么樣的方法來(lái)根據(jù)已知求未知。這個(gè)過(guò)程是要在編程者掌握了一定的數(shù)學(xué)、生活常識(shí)和計(jì)算機(jī)計(jì)算等知識(shí)和常用算法后,結(jié)合具體的問(wèn)題選擇相應(yīng)的算法來(lái)實(shí)現(xiàn)。這一步驟在整個(gè)編程過(guò)程中都是比較難的,只有有了一定的基礎(chǔ)和經(jīng)驗(yàn),才能更正確和合適地設(shè)計(jì)算法。但對(duì)于初學(xué)編程的同學(xué),初始接觸的問(wèn)題不難,是可以結(jié)合自己的基礎(chǔ)來(lái)確定算法的。需要特別注意的是程序設(shè)計(jì)設(shè)計(jì)的是程序,而程序是有著嚴(yán)格的順序和過(guò)程的,在設(shè)計(jì)問(wèn)題的算法時(shí),一定要注意計(jì)算的順序。算法中應(yīng)用符號(hào)化的已知及待求數(shù)據(jù),會(huì)讓算法更為清晰明確。
⑤描述算法
通過(guò)算法可以看出清晰的問(wèn)題計(jì)算過(guò)程和方法。
2 學(xué)習(xí)第二步:用C語(yǔ)言程序描述算法
確定好算法后,要用計(jì)算機(jī)程序來(lái)描述問(wèn)題。計(jì)算機(jī)程序是選擇不同的計(jì)算機(jī)語(yǔ)言,按照相應(yīng)的語(yǔ)法規(guī)則來(lái)程序化的算法。C語(yǔ)言是一種編程語(yǔ)法靈活,代碼簡(jiǎn)潔、功能十分強(qiáng)大的計(jì)算機(jī)語(yǔ)言,但其運(yùn)算符豐富,語(yǔ)法格式靈活,對(duì)初學(xué)者來(lái)說(shuō)掌握起來(lái)并不容易。因此本文采用由簡(jiǎn)至繁的方式讓學(xué)生循序漸進(jìn)地掌握C語(yǔ)言的語(yǔ)法規(guī)則。
用計(jì)算機(jī)語(yǔ)言描述算法,首先要清楚所采用語(yǔ)言的程序結(jié)構(gòu)。C語(yǔ)言是以函數(shù)為單位的,函數(shù)格式也比較簡(jiǎn)單,很容易記憶,本文不再多述。
本文中從只有一個(gè)函數(shù)且函數(shù)內(nèi)部只是由順序結(jié)構(gòu)構(gòu)成的最簡(jiǎn)單C語(yǔ)言程序開(kāi)始,循序漸進(jìn)結(jié)合第二部分內(nèi)容來(lái)說(shuō)明C語(yǔ)言程序的編程方法。下面依然利用二元一次方程組的求解問(wèn)題說(shuō)明C語(yǔ)言程序設(shè)計(jì)的方法。
2.1數(shù)據(jù)及簡(jiǎn)單程序
C語(yǔ)言數(shù)據(jù)類(lèi)型豐富,運(yùn)算符及表達(dá)式種類(lèi)繁多,這說(shuō)明C語(yǔ)言表達(dá)能力強(qiáng),但因規(guī)則繁雜,對(duì)初學(xué)者來(lái)說(shuō)掌握不易。初學(xué)之時(shí),只要掌握C語(yǔ)言標(biāo)識(shí)符的概念,整型、實(shí)型、字符類(lèi)型基本數(shù)據(jù)及常用算數(shù)運(yùn)算符和賦值運(yùn)算符即可,不必過(guò)多記憶。
計(jì)算機(jī)工作原理是只有將程序和數(shù)據(jù)存入到內(nèi)存中,計(jì)算機(jī)才能執(zhí)行,所以?xún)?nèi)存變量的概念是這部分的重點(diǎn)內(nèi)容。前文分析中已知數(shù)據(jù)、求解數(shù)據(jù)及算法設(shè)計(jì)時(shí)所借助的數(shù)據(jù)都必須存放在內(nèi)容變量中,所以要在分析問(wèn)題時(shí)確定這些數(shù)據(jù)所代表的數(shù)據(jù)形式以及大體范圍,這樣就可以在設(shè)計(jì)程序時(shí)將它們首先聲明好。
本文案例中已知的六個(gè)數(shù)據(jù)表示的都是數(shù)值,可以是整型也可以是實(shí)數(shù),但是待求解的數(shù)據(jù)在算法中需要用到除法運(yùn)算求解,因此為了少損失精度,應(yīng)務(wù)必將其定義為實(shí)數(shù)。所以數(shù)據(jù)定義為:int a1,b1,c1,a2,b2,c2; float x,y;。數(shù)據(jù)聲明過(guò)后,就可以利用這些數(shù)據(jù)完成運(yùn)算了。初學(xué)時(shí)運(yùn)算符學(xué)習(xí)中特別注意除號(hào)(/)和求余符號(hào)(%)以及賦值號(hào)(=)的使用,其他均與數(shù)學(xué)課中的使用相似,不必過(guò)度探討。同時(shí)掌握基本數(shù)據(jù)的簡(jiǎn)單輸入輸出函數(shù)的scanf和printf的使用也是必需的。這樣就可以實(shí)現(xiàn)簡(jiǎn)單的數(shù)學(xué)計(jì)算類(lèi)程序的編寫(xiě)了。至此,本文中二元一次方程組的解相應(yīng)的程序就可以完整地編寫(xiě)出來(lái)(完成程序略)。只記住少量的規(guī)則就能夠描述簡(jiǎn)單程序?qū)Τ鯇W(xué)者來(lái)說(shuō)是一個(gè)學(xué)習(xí)動(dòng)力,并能鼓舞和激勵(lì)他進(jìn)一步學(xué)習(xí)。
2.2循環(huán)控制
順序結(jié)構(gòu)和選擇結(jié)構(gòu)在初學(xué)者學(xué)習(xí)時(shí)難度均不大,接受容易。選擇結(jié)構(gòu)中只要牢記if語(yǔ)句的語(yǔ)法和常用的關(guān)系和邏輯運(yùn)算符的使用,大多掌握起來(lái)并不困難。但循環(huán)結(jié)構(gòu)是初學(xué)者學(xué)習(xí)C語(yǔ)言時(shí)繼運(yùn)算符和表達(dá)式后的又一個(gè)難點(diǎn)。循環(huán)結(jié)構(gòu)程序設(shè)計(jì)是C語(yǔ)言程序設(shè)計(jì)中最重要和最難掌握的基本結(jié)構(gòu)[3]。C語(yǔ)言的循環(huán)結(jié)構(gòu)可以由while、do while和for語(yǔ)句實(shí)現(xiàn)。三個(gè)語(yǔ)句各有其特點(diǎn),但均可以完成任何的循環(huán)控制。初學(xué)者開(kāi)始只要掌握while的語(yǔ)法規(guī)則,當(dāng)清楚并掌握了while語(yǔ)句的使用,其余兩個(gè)自然就迎刃而解了。
除了循環(huán)控制的語(yǔ)句,學(xué)習(xí)者還應(yīng)該明白循環(huán)語(yǔ)句的用處。在簡(jiǎn)單問(wèn)題中循環(huán)結(jié)構(gòu)有兩個(gè)作用:①控制重復(fù)某些計(jì)算的次數(shù)(次數(shù)≥2);②符合一定條件后重復(fù)執(zhí)行某些計(jì)算,直到條件不滿(mǎn)足為止。通過(guò)對(duì)問(wèn)題的分析,只要在算法中出現(xiàn)上面兩種情況,就一定要用到循環(huán)結(jié)構(gòu)。對(duì)于循環(huán)結(jié)構(gòu)的算法實(shí)現(xiàn),兩種情況都要從以下四個(gè)步驟考慮:循環(huán)結(jié)構(gòu)執(zhí)行之前的初始化問(wèn)題;循環(huán)條件的控制問(wèn)題;需要重復(fù)執(zhí)行的內(nèi)容;循環(huán)控制條件的修改。熟記這四方面的使用,循環(huán)結(jié)構(gòu)就可以萬(wàn)無(wú)一失了。下面還以二元一次方程組求解來(lái)詳細(xì)說(shuō)明。在分析問(wèn)題基礎(chǔ)上按照循環(huán)的兩種情況增加題目難度:①求n個(gè)不同的二元一次方程組的唯一解(n代表個(gè)數(shù),比如n=5);②判斷已知條件,若輸入的兩個(gè)方程的未知數(shù)系數(shù)對(duì)應(yīng)成比例,使得二元一次方程組無(wú)唯一解,即繼續(xù)輸入,直到輸入的數(shù)據(jù)能夠使方程組有唯一解為止。按照問(wèn)題分析:第一種情況是重復(fù)執(zhí)行多次,計(jì)算需要一次次完成,只要在問(wèn)題分析的算法中加入對(duì)次數(shù)的統(tǒng)計(jì)和判斷即可;第二種情況對(duì)輸入數(shù)據(jù)要按照數(shù)學(xué)上一樣的判斷方法,由于“對(duì)應(yīng)成比例”的判斷易產(chǎn)生誤差,所以改為對(duì)應(yīng)乘積的比較更合適。具體實(shí)現(xiàn)從四個(gè)步驟說(shuō)明兩種情況。
1)循環(huán)結(jié)構(gòu)執(zhí)行之前的初始化問(wèn)題
第一種情況在原有算法中,加入一個(gè)次數(shù)統(tǒng)計(jì)變量n,它初始可以從任意一個(gè)數(shù)值開(kāi)始,一般習(xí)慣上從0或1開(kāi)始,本文計(jì)從1開(kāi)始,即n=1;
第二種情況是根據(jù)輸入的二元未知數(shù)的系數(shù)來(lái)判斷,因此就是輸入的a1,b1,a2,b2的值,即input a1,b1,a2,b2。
2)循環(huán)條件的控制問(wèn)題
第一種情況求五個(gè)二元一次方程組的解,就是重復(fù)執(zhí)行五次求解,那么循環(huán)控制條件就是在次數(shù)沒(méi)超過(guò)5次之時(shí)均要計(jì)算,則循環(huán)控制可以為n≤5;
第二種情況系數(shù)成比例就要重復(fù)輸入,因此控制條件是判斷a1b2-a2b1是否為0。
3)需要重復(fù)執(zhí)行的內(nèi)容
第一種情況重復(fù)的是方程組解的多次求解,因此算法2中的①②③④步都需要重復(fù);
第二種情況是對(duì)輸入數(shù)據(jù)的判斷,因此重復(fù)的是輸入數(shù)據(jù)語(yǔ)句,即步驟①。
4)循環(huán)控制條件的修改
第一種情況循環(huán)控制條件是執(zhí)行一次循環(huán)就增加一次次數(shù),所以應(yīng)為n=n+1;
第二種情況循環(huán)是因?yàn)檩斎氲臄?shù)據(jù)使得方程組沒(méi)有唯一解,那就需要重復(fù)輸入,所以循環(huán)控制條件的修改是再次輸入數(shù)據(jù),即scanf(“%d%d%d%d%d%d”,&a1;,&b1;,&c1;,&a2;,&b2;,&c2;);常數(shù)項(xiàng)也一同輸入吧。
通過(guò)上面的問(wèn)題和算法分析,兩個(gè)情況下程序在算法1基礎(chǔ)上,確定為圖2和圖3。
2.3 C語(yǔ)言函數(shù)
在C語(yǔ)言應(yīng)用中,模塊化程序開(kāi)發(fā)的方法是必須的。函數(shù)使用是實(shí)現(xiàn)模塊化程序必不可少的方法[5],函數(shù)的使用有諸多優(yōu)點(diǎn):可以增加程序的可讀性、可以實(shí)現(xiàn)代碼重用、可以讓程序結(jié)構(gòu)更清晰等,但自定義函數(shù)的使用對(duì)于初學(xué)者來(lái)說(shuō)也是特別難掌握的。學(xué)習(xí)時(shí)最應(yīng)該讓初學(xué)者掌握的是什么時(shí)候用函數(shù)和函數(shù)應(yīng)該如何定義。什么時(shí)候用函數(shù)呢?簡(jiǎn)單地理解就是程序中有特定功能的獨(dú)立部分、在程序中要被多次執(zhí)行的部分,這些地方都可以用作自定義的函數(shù)。那么如何聲明函數(shù)呢?首先要知道函數(shù)的功能,其次要清楚函數(shù)的形式參數(shù)。函數(shù)的功能決定了函數(shù)的任務(wù):它由哪些代碼實(shí)現(xiàn),它的功能是求一個(gè)數(shù)還是完成某種操作;而函數(shù)的形式參數(shù)就是函數(shù)功能是被哪些數(shù)據(jù)決定,這些決定函數(shù)功能的數(shù)據(jù)就應(yīng)該是函數(shù)的形式參數(shù)。了解了這些初步的簡(jiǎn)單函數(shù)聲明就可以實(shí)現(xiàn)了。
比如二元一次方程組求解中,判斷方程組是否有唯一解部分就是獨(dú)立于其他部分的,可以用自定義函數(shù)實(shí)現(xiàn)。它的功能是判斷是否有唯一解,這個(gè)判斷需要由哪些數(shù)據(jù)確定呢?是兩個(gè)方程的未知數(shù)系數(shù),那么方程的未知數(shù)系統(tǒng)就是形式參數(shù)。函數(shù)的功能是判斷結(jié)果,那么可以約定如果有唯一解函數(shù)的結(jié)果即函數(shù)值是0,如果沒(méi)有唯一解,那么函數(shù)值就是1。根據(jù)這樣的分析,可以將函數(shù)定義為圖4。
此例中對(duì)二元一次方程組的求解,也可以編寫(xiě)成自定義函數(shù)。函數(shù)的功能是求解二元一次方程組的解,實(shí)現(xiàn)功能的代碼是獨(dú)立的。函數(shù)的功能需要根據(jù)方詞組的未知數(shù)系數(shù)及常數(shù)項(xiàng)來(lái)決定,那它們就是這個(gè)函數(shù)的形式參數(shù)。因函數(shù)的功能不似圖4的函數(shù)是只求一個(gè)值的,那么功能的實(shí)現(xiàn)需要結(jié)合其他的C語(yǔ)言知識(shí)來(lái)實(shí)現(xiàn),比如解用兩個(gè)全局變量來(lái)實(shí)現(xiàn),函數(shù)無(wú)需返回值(函數(shù)的程序略);也可以將結(jié)果通過(guò)兩個(gè)特別增加的形式參數(shù)傳值帶回到主調(diào)函數(shù)中(將在2.5中詳述)。
2.4數(shù)組的使用
數(shù)組的作用是為了管理和使用內(nèi)存的批量存儲(chǔ)單元。它的使用拓展了C語(yǔ)言的應(yīng)用范圍,比如批量數(shù)據(jù)的排序,以及有關(guān)利用矩陣的計(jì)算等應(yīng)用,相應(yīng)地也增加了分析問(wèn)題的難度和對(duì)應(yīng)算法的復(fù)雜性。初學(xué)者要了解何時(shí)適合使用數(shù)組、數(shù)組的簡(jiǎn)單使用方法、特別是數(shù)組下標(biāo)的表示即可,熟練掌握了之后,再考察難度較高的應(yīng)用和算法。
從二元一次方程組的求解,了解已知數(shù)據(jù)有6個(gè),待求數(shù)據(jù)有2個(gè),都不很多,用數(shù)學(xué)課上的常用符號(hào)——英文字母(x,y)及英文字母加數(shù)字(a1,b1,c1等)表示就可以分得很清,哪個(gè)符號(hào)是哪個(gè)未知數(shù)的系數(shù),哪個(gè)是常數(shù)項(xiàng)不會(huì)搞亂。但是當(dāng)未知數(shù)多(比如≥3)時(shí),再用這樣的符號(hào),對(duì)應(yīng)起來(lái)可能會(huì)比較麻煩。比如n個(gè)未知數(shù)n個(gè)方程的方程組,即使是n個(gè)常數(shù)項(xiàng)都不知道用哪些字符表示能分清楚到底是第幾個(gè)方程的,更別說(shuō)使用了。但是如果應(yīng)用了C語(yǔ)言的數(shù)組,可以用數(shù)組的下標(biāo)表示是第幾個(gè)方程的常數(shù)項(xiàng),并且下標(biāo)能夠靈活變化,一個(gè)符號(hào)可以統(tǒng)一代表所有方程的常數(shù)項(xiàng)。數(shù)據(jù)一旦用抽象符號(hào)表示,可以更易分析算法。這樣n個(gè)常數(shù)項(xiàng)可以用一個(gè)一維數(shù)組來(lái)表示。常數(shù)項(xiàng)若都是int類(lèi)型,那么常數(shù)項(xiàng)就可以用int c[n]; 聲明(n為符號(hào)常量或是有確定值的整數(shù),代表有n個(gè)方程)。同樣的每個(gè)方程由n個(gè)未知數(shù),那么每個(gè)方程的未知數(shù)系數(shù)也可以用一個(gè)一維數(shù)組定義,比如int a1[n]; ,而有n個(gè)方程組了,那系數(shù)中的每一個(gè)都需要再加一維,這樣便構(gòu)成了二維數(shù)組,可以定義為:int a[n][n];。這樣知道了數(shù)組何時(shí)使用,而且引進(jìn)了下標(biāo),對(duì)批量數(shù)據(jù)的位置和表達(dá)容易了也通用了,問(wèn)題分析和算法的確定也更容易,數(shù)組在C語(yǔ)言編程中使用就有了基礎(chǔ)。數(shù)組的使用不要急,要從簡(jiǎn)單的一維數(shù)組實(shí)踐開(kāi)始,特別注意數(shù)組下標(biāo)的范圍、變化以及在批量數(shù)據(jù)中的位置,循序漸進(jìn)才能真正掌握。
2.5 指針的使用
指針是C語(yǔ)言的重要數(shù)據(jù)類(lèi)型也是C語(yǔ)言的精髓和特色[6]。指針的使用可以提高C語(yǔ)言程序運(yùn)行的速度,可以提高內(nèi)存的使用效率,也可以間接地訪(fǎng)問(wèn)內(nèi)存變量,從而擴(kuò)充程序的功能。但是指針也是比較難掌握的內(nèi)容。
建立在應(yīng)用基礎(chǔ)上的C語(yǔ)言學(xué)習(xí),是要按照由簡(jiǎn)至難,從陌生到了解,再到熟悉,最后到完全掌握的過(guò)程學(xué)習(xí),所以依然可以從簡(jiǎn)單的簡(jiǎn)單變量的間接訪(fǎng)問(wèn)開(kāi)始,了解和體會(huì)了指針的基本功能,其他的作用就會(huì)慢慢地接受。
2.3節(jié)中可以把二元一次方程組求解過(guò)程聲明為自定義函數(shù),方程組的解可以“通過(guò)兩個(gè)特別增加的形式參數(shù)傳值帶回到主調(diào)函數(shù)中”,那么我們?cè)谥髡{(diào)函數(shù)中的求解x,y的值,可以利用被調(diào)函數(shù)多增加的這兩個(gè)特別的形式參數(shù)計(jì)算傳回。由于C語(yǔ)言的函數(shù)無(wú)論被調(diào)函數(shù)還是主調(diào)函數(shù)都是相互對(duì)立的,它們之間的聯(lián)系就是通過(guò)調(diào)用聯(lián)系。調(diào)用時(shí)主調(diào)函數(shù)首先要完成實(shí)參將值傳給被調(diào)函數(shù)的形式參數(shù),借用這個(gè)機(jī)會(huì),如果實(shí)參傳給對(duì)應(yīng)形參的是值,那么形參可以利用這個(gè)值完成計(jì)算;實(shí)參如果傳給對(duì)應(yīng)形參的是地址,那么對(duì)應(yīng)的形式參數(shù)獲得實(shí)參的地址,就可以在自己的函數(shù)內(nèi)部完成對(duì)對(duì)應(yīng)實(shí)參的訪(fǎng)問(wèn),這就是間接訪(fǎng)問(wèn)。具體地定義求二元一次方程組的解的函數(shù)見(jiàn)圖5:
實(shí)參的調(diào)用語(yǔ)句為:solve(a1,b1,c1,a2,b2,c2,&x;,&y;);。調(diào)用時(shí)實(shí)參a1-c2是傳值給對(duì)應(yīng)的形參,對(duì)應(yīng)的形參與之對(duì)應(yīng)關(guān)系是單向賦值,形參只從實(shí)參那里得到了值。而實(shí)參x,y傳給對(duì)應(yīng)形參指針變量px和py的是地址,當(dāng)獲得了實(shí)參的地址,指針變量就可以通過(guò)內(nèi)存地址間接的訪(fǎng)問(wèn)對(duì)應(yīng)的實(shí)參,圖5程序中*px的值就是x的值,*py就是變量y。這樣被調(diào)函數(shù)通過(guò)被傳地址的指針變量間接地為主調(diào)函數(shù)范圍內(nèi)有效的變量x,y賦過(guò)了值,這就是間接訪(fǎng)問(wèn)。這個(gè)明白了再了解了指針移動(dòng)等運(yùn)算,指針部分的掌握也就不成問(wèn)題了。
這部分學(xué)習(xí)建立在應(yīng)用基礎(chǔ)上,以任務(wù)作為驅(qū)動(dòng),讓C語(yǔ)言學(xué)習(xí)過(guò)程中的幾個(gè)難點(diǎn)部分從簡(jiǎn)開(kāi)始,易于讓初學(xué)者接受和掌握,這樣學(xué)起來(lái)會(huì)更有信心。
3 學(xué)習(xí)第三步:上機(jī)實(shí)現(xiàn)
C語(yǔ)言程序設(shè)計(jì)的學(xué)習(xí),理論分析、編碼與上機(jī)實(shí)踐同等重要[7],程序完成了但不在機(jī)上運(yùn)行是毫無(wú)意義的。所以程序在計(jì)算機(jī)上運(yùn)行正確無(wú)誤才是任務(wù)的最終完成。初學(xué)者一定要重視這個(gè)環(huán)節(jié)。如果運(yùn)行錯(cuò)誤要仔細(xì)分析錯(cuò)誤原因,若要弄清楚需后退回到第一步和第二步再做修改,直到運(yùn)行無(wú)誤為止。無(wú)論是問(wèn)題的分析還是算法的設(shè)計(jì),抑或是編碼時(shí)的C語(yǔ)言語(yǔ)法,上機(jī)運(yùn)行可以實(shí)現(xiàn)對(duì)前面的學(xué)習(xí)檢驗(yàn)同時(shí)更有效地豐富經(jīng)驗(yàn)。上機(jī)實(shí)驗(yàn)時(shí),熟悉所用工具的開(kāi)發(fā)環(huán)境也是很重要的。當(dāng)前C語(yǔ)言的編程大多采用合適的集成開(kāi)發(fā)環(huán)境,比如dev cpp及codeblocks等,無(wú)論哪一種熟練掌握它的操作,特別是出現(xiàn)錯(cuò)誤時(shí)的錯(cuò)誤提示、調(diào)試和分析程序運(yùn)行的手段,對(duì)于初學(xué)者都是很重要的??傊?jì)算機(jī)語(yǔ)言的學(xué)習(xí)理論和實(shí)踐同等重要。
4 結(jié)論
學(xué)校講課及學(xué)生學(xué)習(xí)編程時(shí),都是從學(xué)習(xí)語(yǔ)法開(kāi)始講授或是學(xué)習(xí),學(xué)習(xí)之初學(xué)生就開(kāi)始背誦語(yǔ)法。語(yǔ)法是語(yǔ)言的基礎(chǔ)和規(guī)則,當(dāng)然很重要,可以說(shuō)沒(méi)有掌握語(yǔ)法,就無(wú)法編寫(xiě)出正確的程序。但是對(duì)初學(xué)者來(lái)說(shuō),機(jī)械地背誦語(yǔ)言,很容易忘掉且不容易牢記。本文從初學(xué)程序設(shè)計(jì)的學(xué)生出發(fā),論述了從分析問(wèn)題開(kāi)始,以任務(wù)驅(qū)動(dòng)為主要方式,讓學(xué)生掌握編程的步驟:分析問(wèn)題、設(shè)計(jì)算法、確定步驟,并形成習(xí)慣。論文再以C語(yǔ)言學(xué)習(xí)時(shí)的難點(diǎn)為內(nèi)容,采取案例的方式說(shuō)明克服它們的方法,目的是希望初學(xué)者從簡(jiǎn)單問(wèn)題開(kāi)始,循序漸進(jìn)使學(xué)生在潛移默化中學(xué)會(huì)程序設(shè)計(jì)。
參考文獻(xiàn):
[1] 倪瑞曉.C語(yǔ)言編程技術(shù)的分析研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2009,19(12):251-254.
[2] 胡明,王紅梅.程序設(shè)計(jì)基礎(chǔ):從問(wèn)題到程序[M].北京:清華大學(xué)出版社,2011.
[3] 裘宗燕.今天的C程序設(shè)計(jì)課教什么,怎么教——兼議《從問(wèn)題到程序》的修訂[J].計(jì)算機(jī)教育,2012,13(7):24-32.
[4] 李娟,張燕.C語(yǔ)言循環(huán)結(jié)構(gòu)教學(xué)的設(shè)計(jì)與實(shí)踐[J].計(jì)算機(jī)教育,2018(3):89-91.
[5] 蘇冬娜,高俊濤.基于C語(yǔ)言的計(jì)算機(jī)編程技術(shù)分析[J].信息與電腦, 2016(18):54-55.
[6] 張蕾.基于項(xiàng)目化教學(xué)的"C語(yǔ)言程序設(shè)計(jì)"課程改革[J].計(jì)算機(jī)教育,2013(2):17-20.
[7] 夏秋菊.在C語(yǔ)言教學(xué)中如何培養(yǎng)學(xué)生的動(dòng)手編程能力[J].新課程學(xué)習(xí):下,2013(2).
【通聯(lián)編輯:王力】