柴群 梁劍波
摘要:C程序設(shè)計是計算機科學(xué)與技術(shù)專業(yè)中開設(shè)的比較重要、基礎(chǔ)的專業(yè)課,大部分學(xué)生接觸程序設(shè)計都是從該門課開設(shè)的。學(xué)過的學(xué)生普遍反映C程序設(shè)計比較難,不容易掌握。該文根據(jù)《C程序設(shè)計》教學(xué)經(jīng)驗,從算法出發(fā),總結(jié)出“五步編程法”,幫助學(xué)生編程快速入門,以提高學(xué)生編程水平和編程能力。
關(guān)鍵詞:C程序設(shè)計;五步編程法;算法;編程
中圖分類號:TP311 文獻標(biāo)識碼:A 文章編號:1009-3044(2017)31-0140-02
通過總結(jié)最近幾個學(xué)期的《C程序設(shè)計》的期末考試試卷發(fā)現(xiàn),學(xué)生對于C程序的掌握較差,得分率很低,原因主要存在兩個方面:(1)對C語言語法死記硬背,不能靈活使用,當(dāng)題目有變化時就不知道如何處理。(2)拿到題目后不知如何編寫符合題意的程序,不能將書本的知識解決現(xiàn)實問題。
對于第一種情況,說明這些同學(xué)C語言知識掌握不牢,可以通過大量的練習(xí)來提高其編程能力。對于第二種情況,筆者總結(jié)了“五步編程法”來進行針對性教學(xué),實踐表明,可以很好地提高學(xué)生的編程能力。
1 第一步——算法分析
算法從廣義上來說,是為了解決一個問題而采取的方法和步驟,它分為數(shù)值運算算法和非數(shù)值運算算法兩大類。數(shù)值運算的目的是求數(shù)值解,例如求解方程的跟、求一個函數(shù)的定積分等,都屬于數(shù)值運算范疇,這類算法往往都有現(xiàn)成的模型、公式,可供學(xué)生使用。而非數(shù)值運算算法包括的就十分廣泛,最常見的是用于事務(wù)管理領(lǐng)域,這類算法運算的種類繁多,要求各異,只有一些典型的非數(shù)值運算算法,如排序算法,查找算法等。C程序設(shè)計所涉及的算法基本上以數(shù)值運算算法為主,也接觸一些典型的非數(shù)值運算算法,這樣算法具有一定的規(guī)律,可以引導(dǎo)學(xué)生查找這些算法的規(guī)律,提高學(xué)生的編程能力。①
在這一步中,學(xué)生的主要是任務(wù)是尋找算法,并將算法用數(shù)學(xué)公式表達出來。
例如求ax2+bx+c=0方程的根。a,b,c由鍵盤輸入,設(shè)b2-4ac>0,且a≠0。這是一個典型的二元一次方程,在中學(xué)的時候就知道,求解方程的根的公式是:
[x1=-b+b2-4ac2a] …………①
[x2=-b-b2-4ac2a] …………②
為了表達方便,可以將公式分為兩項:
[p=-b2a],[q=b2-4ac2a],則公式①、②可變?yōu)?/p>
[x1=p+q] …………③
[ x2=p-q] …………④
有了這些公式,只要知道a、b、c的值就可以求出方程的根。
2 第二步——將算法用C語言語句表示
C語言有自己的語法規(guī)則,在這一步,學(xué)生需要將數(shù)學(xué)公式轉(zhuǎn)換成符合C語言語法規(guī)則的表達式,并將該表達式轉(zhuǎn)換成可以執(zhí)行的C語句。
根據(jù)C語言的語法規(guī)則,[p=-b2a]可以表示為
[p=-b/(2*a)] …………⑤
[q=b2-4ac2a]可以表示為
[q=sqrt(b*b-4*a*c)/(2*a)] …………⑥
其中 disc=b*b-4*a*c …………⑦
sqrt()是編譯系統(tǒng)提供數(shù)學(xué)函數(shù),作用是求解[x],它在使用時必須在源文件中加入#include
公式⑤⑥⑦在C語言中被稱為表達式,表達式轉(zhuǎn)換成可執(zhí)行的C語句的方法是在表達式后面加上“;”。根據(jù)語法規(guī)則,公式③④⑤⑥⑦轉(zhuǎn)換成C語句為:
disc=b*b-4*a*c; …………⑧
[p=-b/(2*a)]; …………⑨
[q=sqrt(disc)/(2*a)]; …………⑩
[ x1=p+q]; …………?
[ x2=p-q]; …………?
3 第三步——將得到的C語句填充到程序的主函數(shù)的函數(shù)體中
C語言規(guī)定,程序的執(zhí)行總是從主函數(shù)(main)開始,并從主函數(shù)結(jié)束。而且C語言的輸入輸出都是通過庫函數(shù)實現(xiàn),這個庫函數(shù)被包含在stdio.h的頭文件中。C語言的main()函數(shù)語法格式(加上兩個頭文件,#include
#include
#include
void main()
{
函數(shù)體
} …………?
將⑧~?填充到?中得到程序為:
#include
void main()
{
disc=b*b-4*a*c; …………⑧
[p=-b/(2*a)]; …………⑨
[q=sqrt(disc)/(2*a)]; …………⑩
[ x1=p+q]; …………?
[ x2=p-q]; …………?
} …………?
4 第四步——查漏補缺
C語言規(guī)定,任何變量必須“先定義、后使用”,例中disc,p,q,a,b,c,x1,x2都是變量,這些變量都需要在使用前先定義,在語句⑧之前添加給變量定義的語句。設(shè)變量a,b,c為整型,其它的變量為浮點型。根據(jù)語法規(guī)則,補充語句(帶陰影部分),得到源程序為:
#include
#include
void main()
{
int a,b,c;
float disc,p,q,x1,x2;
disc=b*b-4*a*c; …………⑧
[p=-b/(2*a)]; …………⑨
[q=sqrt(disc)/(2*a)]; …………⑩
[ x1=p+q]; …………?
[ x2=p-q]; …………?
} …………?
很多變量在使用前需要給它一個初始的值,這個過程被稱為賦初值。C語言一般通過兩種形式實現(xiàn),一個是通過賦值語句,一個是通過輸入函數(shù)scanf。使用輸入函數(shù),可以通過人機界面實現(xiàn)數(shù)據(jù)的輸入,編制的程序復(fù)用性高,是常見的變量賦值的方法,本題要求是通過輸入函數(shù)實現(xiàn)對a,b,c賦初值的。根據(jù)語法規(guī)則,補充語句(帶陰影部分),得到源程序為:
#include
#include
void main()
{
int a,b,c;
float disc,p,q,x1,x2;
scanf(“%d%d%d”,&a,&b,&c);
disc=b*b-4*a*c; …………⑧
[p=-b/(2*a)]; …………⑨
[q=sqrt(disc)/(2*a)]; …………⑩
[ x1=p+q]; …………?
[ x2=p-q]; …………?
} …………?
編程的目的是想求解方程的根,輸入a,b,c就要得到方程的解(假設(shè)方程有解),因此還要加上輸出語句(用printf實現(xiàn))。根據(jù)語法規(guī)則,補充語句(帶陰影部分),得到源程序為:
#include
void main()
{
int a,b,c;
float disc,p,q,x1,x2;
scanf(“%d%d%d”,&a,&b,&c);
disc=b*b-4*a*c; …………⑧
[p=-b/(2*a)]; …………⑨
[q=sqrt(disc)/(2*a)]; …………⑩
[ x1=p+q]; …………?
[ x2=p-q]; …………?
printf(“方程的兩個根分別是x1=%f\n,x2=%f\n”,x1,x2);
} …………?
至此,一個完整的求解二元一次方程根的源程序已經(jīng)編寫完成,下面就要進行第五步,編譯、排錯、執(zhí)行。
5 第五步——反復(fù)進行編譯、排錯、執(zhí)行程序,直至輸出正確的結(jié)果
編譯的作用首先是對源程序進行檢查,判斷有沒有語法方面的錯誤,如有,則給出錯誤信息,通知編程人員進行修改。修改程序后還要重新進行編譯,如果有錯,還要進行修改。這個過程會反復(fù)執(zhí)行,直到?jīng)]有語法錯誤為止。
對沒有語法錯誤的源程序進行連接處理,得到.obj文件。編譯系統(tǒng)在對.obj文件進行處理得到可執(zhí)行文件.exe,運行該文件即可得到結(jié)果。
這里需要注意的是,由于編譯只能發(fā)現(xiàn)語法錯誤,不能發(fā)現(xiàn)邏輯錯誤,因此有時會出現(xiàn)源程序沒有語法錯誤,但是卻得不到正確的結(jié)果。這就要對源程序進行單步調(diào)試,觀察變量的值,尋找邏輯錯誤。本例中語句⑨就存在邏輯錯誤,初學(xué)者很難發(fā)現(xiàn)。運算符“[/]”的左右兩邊都是整型數(shù)值時,得到的數(shù)據(jù)也是整型,如果b<2*a,p的值就會是0,而不是一個小數(shù),因此需要將計算的結(jié)果轉(zhuǎn)換成小數(shù),語句⑨可修改為,[p=-b/(2.0*a)]; 這樣得到的程序才能計算出正確的結(jié)果。
在學(xué)生掌握“五步編程法”基礎(chǔ)上,可以繼續(xù)對第一步、第二步進行擴充到選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、復(fù)合結(jié)構(gòu),從數(shù)值運算擴充到非數(shù)值運算,從而慢慢地提高學(xué)生的編程能力,解決學(xué)生編程難的問題。
參考文獻:
[1] 譚浩強.C程序設(shè)計[M].四版.北京:清華大學(xué)出版社,16-17.