李欣潼

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