張武洪
摘要本文針對C語言程序設(shè)計(jì)初學(xué)者在編程階段對數(shù)據(jù)的定義和使用困惑的問題,提出了數(shù)據(jù)要求說明表的解決方案。
關(guān)鍵詞數(shù)據(jù)要求說明表C語言程序設(shè)計(jì)
C語言程序設(shè)計(jì)是電子信息類專業(yè)學(xué)習(xí)程序設(shè)計(jì)的入門課程,通過這門課程的學(xué)習(xí),期望學(xué)生一方面掌握C語言的基本語法和算法。具有運(yùn)用C編寫小程序的能力;另一方面為后續(xù)軟件系統(tǒng)開發(fā)課程的學(xué)習(xí)打下基礎(chǔ)。
在C語言的教學(xué)過程中,以往都是要求學(xué)生按以下步驟解題:首先分析題意,找出算法;其次根據(jù)算法畫出流程圖;然后依據(jù)流程圖編寫程序;最后上機(jī)調(diào)試運(yùn)行程序,分析結(jié)果。但是有很多學(xué)生在完成了前兩步后,進(jìn)行依據(jù)流程圖編寫程序步驟時,卻不知道程序怎么編寫了,問其原因。主要是不知道定義哪些數(shù)據(jù),定義的數(shù)據(jù)又應(yīng)該是什么數(shù)據(jù)類型。
一、數(shù)據(jù)要求說明表的引出
計(jì)算機(jī)程序的實(shí)質(zhì)就是對特定數(shù)據(jù)進(jìn)行特定操作。在算法和流程圖中解決的是怎樣實(shí)現(xiàn)對數(shù)據(jù)進(jìn)行特定操作的問題,而對于操作的數(shù)據(jù)并沒有說明,但是數(shù)據(jù)的名稱、類型、初值、范圍等情況卻又是在程序編寫過程中首先面對的問題,這就是學(xué)生在編寫程序時突然卡殼的原因。
實(shí)際上,在各種C語言程序設(shè)計(jì)教材中,都沒有對數(shù)據(jù)進(jìn)行說明,包括譚浩強(qiáng)教授編寫的也沒有。為什么會出現(xiàn)這種情況呢?可能是C語言程序設(shè)計(jì)課程中所出現(xiàn)的問題,都是比較初級的,而對于具有C語言豐富編程經(jīng)驗(yàn)的教材編寫者,當(dāng)然不會把數(shù)據(jù)的說明當(dāng)做一個問題,就是出現(xiàn)數(shù)據(jù)定義遺漏和類型錯誤的問題,在程序調(diào)試階段也可以輕松解決。因此,大家都想當(dāng)然地認(rèn)為初學(xué)者不會出現(xiàn)處理數(shù)據(jù)情況不明的問題。在這里,我們沒有充分考慮學(xué)生的認(rèn)知規(guī)律,結(jié)果造成了學(xué)生對數(shù)據(jù)的定義和使用的困惑。
根據(jù)軟件工程的觀點(diǎn),在軟件生命周期的需求分析階段就要求編寫《數(shù)據(jù)要求說明書》的軟件文檔。在該文檔的“數(shù)據(jù)的邏輯描述”部分列出了靜態(tài)數(shù)據(jù)、動態(tài)輸入數(shù)據(jù)、動態(tài)輸出數(shù)據(jù)、內(nèi)部生成數(shù)據(jù)和以上數(shù)據(jù)的約定。在軟件技術(shù)專業(yè)《程序設(shè)計(jì)邏輯》課程中,項(xiàng)目首先分析數(shù)據(jù),然后繪制一個數(shù)據(jù)要求說明表。對所有數(shù)據(jù)進(jìn)行標(biāo)識名稱、數(shù)據(jù)類型、使用意義的說明。學(xué)生在繪制流程圖和編寫程序時,數(shù)據(jù)的定義與使用都依據(jù)數(shù)據(jù)要求說明表進(jìn)行。效果很好。
如果在C語言程序設(shè)計(jì)中引入數(shù)據(jù)要求說明,是否可以解決以上問題呢?
二、數(shù)據(jù)要求說明表在C語言程序設(shè)計(jì)中的實(shí)戰(zhàn)應(yīng)用
筆者設(shè)計(jì)的數(shù)據(jù)要求說明表是一個二維表。每條記錄有五個說明字段:標(biāo)識名稱、數(shù)據(jù)類型、含義、初值、取值范圍,前兩項(xiàng)對數(shù)據(jù)定義有幫助,后三項(xiàng)有利于數(shù)據(jù)的使用,具體見表一。
例1:求兩個正整數(shù)的最大公約數(shù)和最小公倍數(shù)。
本題有一個著名的解題算法——?dú)W幾里德算法(輾轉(zhuǎn)相除法),但對于高職學(xué)生來說,該算法既不容易理解原理,又不容易記憶具體步驟。筆者提出了一種算法效率不高但容易實(shí)現(xiàn)的方法:在最大公約數(shù)和最小公倍數(shù)可以估計(jì)的取值范圍內(nèi)逐一判斷。
在表1中,m和n是輸入求解最大公約數(shù)、最小公倍數(shù)的兩個數(shù),i和j是起輔助作用的兩個數(shù)據(jù)。i是求解最大公約數(shù)的循環(huán)控制變量,因而初值從取值范圍的上界開始;j是求解最小公倍數(shù)的循環(huán)控制變量,因而初值從取值范圍的下界開始。Min(m,n)是m和n的小者;mar(m,n)是m和n的大者,詳情見表1。
有了上表,大部分學(xué)生很容易地想出算法,并繪制出流程圖。在編程過程中,定義和使用數(shù)據(jù)也心知肚明。
例2:用以下公式求圓周率的近似值(圓周率pi表示)。
Pi14=1-1/3+115-117+……直到最后一項(xiàng)的絕對值小于10-6為止。
這是一道典型累加求和題,該類問題主要關(guān)心兩個數(shù)據(jù):和以及加數(shù)。和的表示比較簡單,定義為單精度實(shí)型變量,初值為零;加數(shù)就復(fù)雜一點(diǎn),它由符號、分子、分母三部分組成。有了這些認(rèn)識,我們可以繪制表2,即求圓周率數(shù)據(jù)要求說明表。
注意:8、p和q三個變量中至少有一個定義為float型,如果都是int型,結(jié)果一定是零。本題各數(shù)據(jù)變量的取值范圍沒有討論,其實(shí)在具體應(yīng)用中,數(shù)據(jù)的標(biāo)識名稱、數(shù)據(jù)類型、含義是必填項(xiàng),初值和取值范圍根據(jù)實(shí)際情況選擇填寫。
筆者近幾年在高職C語言程序設(shè)計(jì)課程教學(xué)過程中,引人數(shù)據(jù)要求說明的知識,取得了良好的教學(xué)效果,一方面幫助學(xué)生在定義和使用數(shù)據(jù)方面掌握了可操作性強(qiáng)的方法,另一方面培養(yǎng)學(xué)生形成了良好的編程習(xí)慣。
數(shù)據(jù)要求說明應(yīng)用起來比較簡單,但是作用卻不小。一是有助于在程序中正確的定義與使用數(shù)據(jù),二是和算法、程序流程圖一起組成必要的文檔,為程序的閱讀、調(diào)試、修改提供依據(jù)。按照學(xué)生的認(rèn)知規(guī)律,在教學(xué)實(shí)踐中運(yùn)用一些簡單而實(shí)用的方法是應(yīng)該提倡的。