夏蕓
摘要:C語言程序設(shè)計(jì)是計(jì)算機(jī)專業(yè)的專業(yè)課程,一般是學(xué)生所接觸的第一門程序設(shè)計(jì)課程,所以這門課程的實(shí)驗(yàn)教學(xué)尤為重要。文中主要是探討結(jié)構(gòu)體實(shí)驗(yàn)教學(xué)的設(shè)計(jì),通過這種設(shè)計(jì)方案幫助學(xué)生掌握結(jié)構(gòu)體的基本知識(shí),能夠使用結(jié)構(gòu)體數(shù)組和鏈表解決問題。教學(xué)實(shí)踐證明此種教學(xué)設(shè)計(jì)方案在一定程度上激發(fā)了學(xué)生的學(xué)習(xí)熱情。
關(guān)鍵詞:C語言;程序設(shè)計(jì);教學(xué);結(jié)構(gòu)體;實(shí)驗(yàn)
中圖分類號(hào):G642 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2015)09-0163-02
Abstract: C language programming is a profession course in the computer special field of study, and it is usually the first programming course to the students. So the experiment teaching of the course is too important. It mainly discusses the teaching design of structures in this paper, which can help the students to grasp the basic knowledge about structures, and can solve problems by using arrays of structure and linked lists. It proves that the teaching design can stimulate the students study interest.
Key words:C language; programming; teaching; structure; experiment
《C語言程序設(shè)計(jì)》這門課一般是計(jì)算機(jī)專業(yè)學(xué)生入學(xué)時(shí)所接觸到的第一門程序設(shè)計(jì)課程,這門課程需要學(xué)生掌握程序設(shè)計(jì)的方法,用C語言編程解決問題。在現(xiàn)實(shí)問題求解時(shí),往往用簡(jiǎn)單數(shù)據(jù)類型描述問題對(duì)象時(shí)可能不是很方便和準(zhǔn)確,例如,描述職工信息這樣不同類型的數(shù)據(jù)組合時(shí),這時(shí)就需要定義一種構(gòu)造類型的數(shù)據(jù)結(jié)構(gòu)來描述,這就是結(jié)構(gòu)體。而且,本文認(rèn)為結(jié)構(gòu)體是實(shí)現(xiàn)了數(shù)據(jù)的封裝,在一定程度上體現(xiàn)了封裝的特性,對(duì)后續(xù)課程的教學(xué)有一定的啟發(fā)性。所以,結(jié)構(gòu)體教學(xué)是C語言程序設(shè)計(jì)的一個(gè)重要的部分,同樣,在實(shí)驗(yàn)課教學(xué)中結(jié)構(gòu)體的實(shí)驗(yàn)教學(xué)也是重要的一個(gè)環(huán)節(jié),特別是鏈表方面的實(shí)驗(yàn)教學(xué)對(duì)后續(xù)課程,如《數(shù)據(jù)結(jié)構(gòu)》起著基礎(chǔ)性的作用。本文主要是對(duì)結(jié)構(gòu)體的實(shí)驗(yàn)教學(xué)的設(shè)計(jì)進(jìn)行探討。
1 結(jié)構(gòu)體實(shí)驗(yàn)教學(xué)的設(shè)計(jì)
結(jié)構(gòu)體實(shí)驗(yàn)教學(xué)在教學(xué)時(shí)設(shè)計(jì)了3個(gè)實(shí)驗(yàn)題目,這三個(gè)實(shí)驗(yàn)題目的難度由易到難,試圖讓學(xué)生掌握結(jié)構(gòu)體變量、結(jié)構(gòu)體數(shù)組和鏈表的使用。
1.1 結(jié)構(gòu)體變量的實(shí)驗(yàn)設(shè)計(jì)
結(jié)構(gòu)體變量的實(shí)驗(yàn)屬于結(jié)構(gòu)體實(shí)驗(yàn)中比較簡(jiǎn)單的實(shí)驗(yàn),這個(gè)實(shí)驗(yàn)就是讓學(xué)生練習(xí)如何根據(jù)實(shí)際問題,用結(jié)構(gòu)體定義自己所需的類型,再使用這種類型定義變量,編寫程序去解決問題。
在實(shí)驗(yàn)教學(xué)中,教師要求學(xué)生解決如下的問題:要求用戶輸入三個(gè)點(diǎn)的坐標(biāo),編程判斷這三個(gè)點(diǎn)是否可以構(gòu)成一個(gè)三角形,如果可以則輸出三角形的類型,即直角三角形、銳角三角形或者鈍角三角形。這個(gè)題目在實(shí)驗(yàn)課上是以程序填空題的形式提供,這樣既可以引導(dǎo)學(xué)生初次使用結(jié)構(gòu)體進(jìn)行編程,在填寫缺失的代碼過程中,鍛煉學(xué)生的程序閱讀能力。在題目設(shè)計(jì)中盡可能的考察學(xué)生以前的所學(xué)知識(shí)點(diǎn),比如,函數(shù)形參、函數(shù)調(diào)用、選擇結(jié)構(gòu)編程等等。
這個(gè)程序填空題首先要求完成圖1中所示的點(diǎn)的結(jié)構(gòu)體的設(shè)計(jì),從而讓學(xué)生掌握如何根據(jù)實(shí)際需要來定義結(jié)構(gòu)體這種類型。再要求學(xué)生完成圖1中input函數(shù)和len函數(shù)的填寫,讓學(xué)生掌握如何使用結(jié)構(gòu)體變量的成員分量,并注意函數(shù)的類型;judgeexist函數(shù)用于判斷三個(gè)點(diǎn)能否構(gòu)成三角形,在這個(gè)函數(shù)中強(qiáng)調(diào)邏輯運(yùn)算符的使用,同時(shí)讓學(xué)生注意函數(shù)的返回值類型,強(qiáng)調(diào)C語言的數(shù)據(jù)類型沒有邏輯型,若想表示真假這樣的邏輯型值可以用1和0這樣的數(shù)值型數(shù)據(jù)來表示。
圖2中的qcos函數(shù)在設(shè)計(jì)填空時(shí)主要考察的是指針的使用,讓學(xué)生加深指針作為函數(shù)形參傳遞的是地址值這一個(gè)概念的理解。這個(gè)函數(shù)在編寫時(shí)并不是很難,就是三角形余弦函數(shù)的使用,關(guān)鍵在于形參變量中指
針變量的引用,即諸如*cosA的賦值。而圖2中judgetype函數(shù)就是依據(jù)三個(gè)角的余弦值來判斷三角形是直角三角形、銳角三角形,還是鈍角三角形。這個(gè)函數(shù)在設(shè)計(jì)填空時(shí),主要是考察學(xué)生關(guān)系運(yùn)算符的使用,以及嵌套的選擇if語句的理解和應(yīng)用。圖3中主函數(shù)的設(shè)計(jì)填空主要是考察學(xué)生是否了解上述用戶自定義函數(shù)的功能,并通過填寫函數(shù)調(diào)用語句能正確的使用這些函數(shù),此外,還考察了switch多分支語句的使用。
這個(gè)題目總體來說設(shè)計(jì)的并不是很難,當(dāng)學(xué)生完成程序填空后,要求學(xué)生必須完成4種情況,即無法構(gòu)成三角形、構(gòu)成直角三角形、銳角三角形和鈍角三角形的數(shù)據(jù)測(cè)試,通過輸出的結(jié)果與預(yù)期結(jié)果作比較,從而檢查程序是否編寫正確。
1.2 結(jié)構(gòu)體數(shù)組的實(shí)驗(yàn)設(shè)計(jì)
結(jié)構(gòu)體數(shù)組的實(shí)驗(yàn)在結(jié)構(gòu)體實(shí)驗(yàn)中是中等難度的實(shí)驗(yàn),這個(gè)實(shí)驗(yàn)題目的設(shè)計(jì)主要是讓學(xué)生掌握結(jié)構(gòu)體數(shù)組的定義,讓學(xué)生了解結(jié)構(gòu)體數(shù)組元素的訪問和其他基本數(shù)據(jù)類型的數(shù)組元素訪問是類似的,如若要訪問某個(gè)數(shù)組元素的成員分量時(shí),需要在結(jié)構(gòu)體數(shù)組元素后加上“.成員分量名”。
在實(shí)驗(yàn)課時(shí),布置了如下的實(shí)驗(yàn)題目:輸入職工的職工號(hào)、姓名、工資和出生年、月、日,按職工工資由高到低輸出職工的職工號(hào)、姓名和周歲年齡。注意:輸入“#”表示輸入結(jié)束,假設(shè)最多只處理200個(gè)職工記錄。此題在定義職工信息這種數(shù)據(jù)類型時(shí),涉及到了出生年、月、日這種日期類型,而C語言的基本類型中沒有這種類型,因此,教師可以引導(dǎo)學(xué)生先寫出如圖4(a)所示的日期類型struct date,再引導(dǎo)學(xué)生思考職工類型如何定義,提示學(xué)生職工信息包含出生日期這樣的日期型數(shù)據(jù),建議定義出如圖4(b)所示的職工信息類型struct zg。一般地,學(xué)生會(huì)依據(jù)題目要求定義出struct zg的數(shù)組,其數(shù)組的大小為200。這個(gè)題目之所以這樣設(shè)計(jì)就是希望通過這個(gè)練習(xí)讓學(xué)生了解結(jié)構(gòu)體類型中的成員分量沒有具體類型要求,完全根據(jù)需要而設(shè)。
此題的另一個(gè)設(shè)計(jì)要點(diǎn)是排序算法在結(jié)構(gòu)體數(shù)組中的應(yīng)用,在課堂練習(xí)時(shí),有的學(xué)生使用的是冒泡排序法,有的則使用選擇排序法,但是在交換兩個(gè)struct zg的數(shù)組元素時(shí),有部分學(xué)生會(huì)注意交換結(jié)構(gòu)體數(shù)組元素的成員分量,那么這時(shí)就需要聲明交換結(jié)構(gòu)體數(shù)組元素和交換整型數(shù)組元素的方法類似,將結(jié)構(gòu)體數(shù)組元素看作一個(gè)整體。這個(gè)設(shè)計(jì)要點(diǎn)在于復(fù)習(xí)數(shù)組章節(jié)中所提到的排序算法。
此題最后一個(gè)設(shè)計(jì)要點(diǎn)是由已知的職工出生年、月、日求出該職工的周歲年齡,此處要求學(xué)生使用計(jì)算機(jī)的系統(tǒng)時(shí)間計(jì)算出職工的周歲年齡。為了能成功獲取計(jì)算機(jī)的系統(tǒng)時(shí)間,則要求學(xué)生在幫助菜單或者網(wǎng)上查找C中“time.h”所定義的time_t這個(gè)數(shù)據(jù)類型,讓學(xué)生了解typedef的用法;了解函數(shù)time()和localtime的用法,并能在程序中正確的使用;了解結(jié)構(gòu)體struct tm,掌握該結(jié)構(gòu)體中關(guān)于年、月、日表示的成員分量,讓學(xué)生特別注意每個(gè)成員分量所表示的意義及其取值的范圍,例如,成員分量tm_year表示的是年份,但是它的取值是從1900開始的一個(gè)整數(shù),若想正確獲得當(dāng)前的年份值,應(yīng)該是tm_year+1900。當(dāng)學(xué)生能正確地完成獲取系統(tǒng)時(shí)間的年、月、日的程序代碼設(shè)計(jì)后,引導(dǎo)學(xué)生思考如何計(jì)算周歲年齡,實(shí)際上就是用if嵌套語句完成多分支結(jié)構(gòu)的設(shè)計(jì)。這個(gè)設(shè)計(jì)要點(diǎn)是希望學(xué)生了解C程序設(shè)計(jì)過程中可能會(huì)出現(xiàn)書本上所未介紹過的知識(shí),這就需要學(xué)生通過其他方式,例如查閱工具書或者上網(wǎng)等手段來獲取所需的知識(shí),同時(shí),也復(fù)習(xí)了多分支結(jié)構(gòu)的程序設(shè)計(jì)。
此外,在編程時(shí)要求學(xué)生盡量不要程序中只有一個(gè)main()函數(shù),要盡量根據(jù)需要編寫用戶自定義函數(shù)。
1.3 鏈表的實(shí)驗(yàn)設(shè)計(jì)
鏈表實(shí)驗(yàn)的題目主要是讓學(xué)生熟悉結(jié)構(gòu)體與指針相結(jié)合,對(duì)鏈表有個(gè)初步認(rèn)識(shí),了解鏈表中的一些操作。題目與1.2中結(jié)構(gòu)體數(shù)組的題目非常類似,但是要求必須用鏈表來完成,從而讓學(xué)生熟悉鏈表這種結(jié)構(gòu)。實(shí)驗(yàn)題目是:輸入學(xué)生的學(xué)號(hào)、姓名和年齡,要求按學(xué)號(hào)由小到大輸出學(xué)生的學(xué)號(hào)、姓名和年齡,要求輸入“#”表示輸入結(jié)束。這個(gè)題目解決的方法很多,因?yàn)閷W(xué)生初次接觸鏈表,因此實(shí)驗(yàn)教學(xué)時(shí)沒有提出任何方法的限制,只是要求學(xué)生用單鏈表求解,在求解過程中要求學(xué)生注意鏈表的創(chuàng)建算法,鏈表的輸出算法,以及鏈表修改結(jié)點(diǎn)指針的一些操作。
首先,教師要引導(dǎo)學(xué)生正確的完成鏈表結(jié)點(diǎn)的定義,即指針與結(jié)構(gòu)體相結(jié)合,學(xué)生信息結(jié)點(diǎn)的定義可以如圖5所示。在求解問題時(shí),需要學(xué)生注意結(jié)點(diǎn)指針的操作。實(shí)驗(yàn)課上,有的學(xué)生在輸入學(xué)生信息時(shí),即建鏈表時(shí)采用插入排序的思想,將待插入的學(xué)生信息的結(jié)點(diǎn)插入到已建好的且有序的鏈表中,用這種方法創(chuàng)建鏈表后,鏈表本身就是有序的,那么只需用循環(huán)結(jié)構(gòu)輸出鏈表就可以完成問題的求解。在實(shí)驗(yàn)課上,會(huì)發(fā)現(xiàn)有的學(xué)生有了這個(gè)想法但是算法編寫有問題,教師在指導(dǎo)的過程中可以建議學(xué)生在建鏈表過程中,每插入一個(gè)結(jié)點(diǎn)后就完成當(dāng)前鏈表的輸出,從而有助于發(fā)現(xiàn)算法設(shè)計(jì)出錯(cuò)之處。
在實(shí)驗(yàn)課上,有的學(xué)生則先是創(chuàng)建鏈表,即將學(xué)生信息結(jié)點(diǎn)按輸入的順序插入到鏈表中,此時(shí)鏈表中的學(xué)生信息結(jié)點(diǎn)是無序的,再采用冒泡排序法或者選擇排序法對(duì)鏈表中的結(jié)點(diǎn)調(diào)整順序,最后編寫循環(huán)完成鏈表輸出。在調(diào)整結(jié)點(diǎn)時(shí)有的學(xué)生會(huì)出現(xiàn)算法思路不夠清晰,有點(diǎn)混亂這種現(xiàn)象,這時(shí)教師可以建議學(xué)生在草稿紙畫出鏈表結(jié)點(diǎn)的調(diào)整草圖,再依據(jù)圖示編寫代碼。在實(shí)驗(yàn)課上,有的學(xué)生采用排序算法調(diào)整結(jié)點(diǎn)時(shí)直接交換圖5所示結(jié)點(diǎn)的no、name和age值,這種方法很便捷,但是達(dá)不到鏈表練習(xí)的目的,因此,教師可以鼓勵(lì)學(xué)生再換一種算法。
2 結(jié)束語
本文給出了結(jié)構(gòu)體實(shí)驗(yàn)教學(xué)的三個(gè)實(shí)驗(yàn)題目,這三個(gè)題目有各自的重點(diǎn),而且題目有程序填空,也有程序設(shè)計(jì),讓學(xué)生由淺入深地逐步掌握結(jié)構(gòu)體的定義,使用結(jié)構(gòu)體變量和數(shù)組編程求解實(shí)際問題。并且實(shí)驗(yàn)題目中有的內(nèi)容是對(duì)課本上的知識(shí)進(jìn)行一定的擴(kuò)展,力圖培養(yǎng)學(xué)生的自學(xué)能力,因?yàn)樵趯?shí)際解決問題時(shí),有的知識(shí)可能是課堂上沒有提到的,因此,學(xué)生要學(xué)會(huì)查閱資料進(jìn)行自學(xué)。
參考文獻(xiàn):
[1] 胡明, 王紅梅. 程序設(shè)計(jì)基礎(chǔ)——從問題到程序[M]. 北京: 清華大學(xué)出版社, 2011.
[2] 孫燮華. C程序設(shè)計(jì)導(dǎo)引實(shí)驗(yàn)與習(xí)題解答[M]. 北京: 清華大學(xué)出版社, 2011.
[3] 羅永龍, 方群. C語言程序設(shè)計(jì)[M]. 北京: 科學(xué)出版社, 2013.
[4] 羅永龍, 方群. C語言程序設(shè)計(jì)輔導(dǎo)及實(shí)驗(yàn)指導(dǎo)書[M]. 北京: 科學(xué)出版社, 2013.
[5] 蔣小鶯. C語言程序設(shè)計(jì)課程教學(xué)方法實(shí)踐[J]. 電腦知識(shí)與技術(shù), 2014, 10(7): 1467-1468.