摘要:針對c語言程序設(shè)計課程中較難理解和掌握的知識點的授課方法,以計算思維理念為導(dǎo)向,進行思考和分析,探索出一種先給出問題描述,讓學(xué)生參與問題解決,歸納總結(jié)解決方法和過程,得到算法,并用c語言程序?qū)崿F(xiàn)算法的講授方法。文章介紹這種教學(xué)方法的實施過程。關(guān)鍵詞:程序設(shè)計語言;算法;歸納總結(jié);計算思維;教學(xué)方法
1、計算思維理念指導(dǎo)的計算機程序語言教學(xué)
由于C語言是一種既可作為系統(tǒng)描述,又可編寫系統(tǒng)軟件和應(yīng)用軟件的計算機高級語言。因此,“C語言程序設(shè)計”是初學(xué)計算機語言的一門重要的程序設(shè)計語言課程。許多高校都將“C語言程序設(shè)計”課程作為計算機專業(yè)及其他專業(yè)學(xué)習(xí)計算機語言的第一門必修課。該門課程的開設(shè)不僅可以培養(yǎng)學(xué)生利用計算機解決問題的能力,還是后續(xù)計算機專業(yè)相關(guān)課程甚至非計算機專業(yè)一些課程的重要基礎(chǔ)。
目前,語言程序設(shè)計課程的教學(xué)方法主要是基于案例或程序,利用多媒體輔助教學(xué)方法為主,任務(wù)驅(qū)動教學(xué)法和項目教學(xué)法也同時使用。課程的教學(xué)過程一般是按照教材編排的章節(jié)順序進行講授,即先介紹變量定義,再逐條介紹指令語句的語法,然后針對某—條指令列舉一段簡單程序,甚至_段不完整的程序。這樣安排教學(xué)內(nèi)容,會使學(xué)生很快就感到厭倦,造成看似明白某種問題要用某些指令語句或某種算法,但在實際解決問題或編程時,便不知如何下手的情況,特別是在講授c語言程序設(shè)計中的一些相對較難的算法時,例如函數(shù)的遞歸調(diào)用方法以及建立動態(tài)鏈表,在講授過程中,一般是按照為了解決某個問題,需要采用某種算法或方法,并直接給出算法案例或程序,用于解決該問題。這種講授方法會讓學(xué)生覺得算法很抽象,編寫出的程序較死板,甚至?xí)烙浻脖?,將程序代碼與應(yīng)用硬性結(jié)合,而不是將算法與應(yīng)用結(jié)合,不懂得程序由算法而來,導(dǎo)致當遇到類似問題時,只會套用死記硬背的代碼,而不能正確地寫出解決新問題的程序代碼。另外,這種課堂教學(xué)模式由于過于注重語句語法,不能突出解決問題的思路和方法,更沒有讓學(xué)生參與問題的思考,難以調(diào)動學(xué)生學(xué)習(xí)的積極性。學(xué)生甚至認為在學(xué)習(xí)語法和算法的過程中只要跟著老師或課本上講授的方法學(xué)就可以了,不需要有自己的思考。
立足于培養(yǎng)創(chuàng)新型人才的需求,程序設(shè)計課程重要的是培養(yǎng)學(xué)生利用計算機技術(shù)解決實際問題的綜合能力,體現(xiàn)的是知識運用的綜合性、靈活性和探索性,這恰好符合周以真教授提出的計算思維的理念:運用計算機科學(xué)的基礎(chǔ)概念進行問題求解、系統(tǒng)設(shè)計以及人類行為理解等涵蓋計算機科學(xué)之廣度的一系列思維活動。因此,程序設(shè)計課程可以運用計算思維的理念,講授基本概念和編程的基本思路及方法,重點是對問題進行符合邏輯地、科學(xué)地分析,找出解決問題的抽象方法。在講授程序語言基本概念、語法和算法的過程中使學(xué)生體會計算思維的理念,掌握如何通過約簡、嵌入、轉(zhuǎn)化和仿真等方法,把一個看似困難的問題重新闡釋成一個我們知道問題怎樣解決的思維方法等。
筆者在教學(xué)實踐過程中發(fā)現(xiàn),在學(xué)生有了最基本的編程基礎(chǔ)后:①當給出明確的算法時,由算法寫出程序代碼是沒有太大問題的。即便要用到新的語句,只要在編程前講解新語句,學(xué)生就會使用新的語句將算法用程序語句編寫出來。②在不講授算法和解決方法的情況下,如果學(xué)生遇到需要采用遞歸方法或建立鏈表來解決的實際問題時,自行解決是沒有任何問題的,而且能很清晰地描述解決過程,只是缺少對過程的歸納和總結(jié),從而形成某種算法。
因此,筆者結(jié)合培養(yǎng)計算思維能力的思路和方法,通過對c語言中較難知識點講授方法的思考和分析,探索出一種給出實際問題,讓學(xué)生自行解決,然后對問題解決過程歸納總結(jié),并在教師引導(dǎo)下進行完善,得到算法,進而編寫出程序代碼的方法。在采用該方法講授時,學(xué)生可以輕松地理解算法,快速寫出程序,并能靈活運用算法,將算法用于解決類似問題,收到了較為理想的課堂教學(xué)效果。
2、函數(shù)遞歸調(diào)用算法的講授方法
2.1 問題描述
給每位學(xué)生發(fā)一張紙條,紙條上給出該學(xué)生的x語言課程成績的計算方法,讓學(xué)生根據(jù)紙條上的方法計算出自己的成績。紙條上的成績計算方法有兩種:一種是明確寫出成績,如“你的成績是90分”;另一種是“你的成績是你右側(cè)學(xué)生的分數(shù)加3分”。
根據(jù)學(xué)生當時的座次情況,教師將第1種寫有明確成績的紙條發(fā)給每一排坐在最右側(cè)的學(xué)生,將寫有第2種成績計算方法的紙條發(fā)給其余學(xué)生,再請各位學(xué)生算出自己x語言課程的成績。
2.2 教學(xué)引導(dǎo)
學(xué)生拿到紙條后,會詢問自己右側(cè)的同學(xué),但大部分同學(xué)還要再向坐在更右側(cè)的學(xué)生詢問,因此不少學(xué)生暫時安靜下來等待回復(fù),當回復(fù)從右到左慢慢傳回來后,每個學(xué)生都會算出自己的成績。在等待和計算的過程中,坐在教室靠近左側(cè),距離最右側(cè)學(xué)生較遠的學(xué)生會發(fā)現(xiàn)其右側(cè)學(xué)生,以及右側(cè)的右側(cè)的學(xué)生的紙條上寫的成績計算方法都是“你的成績是你右側(cè)學(xué)生的分數(shù)加3分”,要想算出自己的成績必須知道最右側(cè)學(xué)生的分數(shù)。于是部分學(xué)生會離開座位去詢問與其同一排的最右側(cè)那位學(xué)生的成績,然后數(shù)其所坐位置的右側(cè)共有多少個學(xué)生。假設(shè)有n個學(xué)生,便用公式:最右側(cè)學(xué)生的成績+3+……+3,共加n-1個3”,來計算自己的成績;而距離最右側(cè)學(xué)生比較近的學(xué)生在詢問的過程中也會了解到本排最右側(cè)學(xué)生的成績。之后,每位學(xué)生都會計算出自己的成績。
2.3 算法分析及知識點講授
根據(jù)學(xué)生計算成績的過程,歸納總結(jié)出成績計算有以下兩種方法,并引入知識點——函數(shù)的遞歸算法。
①第1個學(xué)生(最右側(cè)學(xué)生)的成績已知;
②其余成績按照固定算法:前一個學(xué)生的成績+3。
該問題的解決算法可歸納為:若假設(shè)計算第n個(n≠1)學(xué)生的成績的函數(shù)為s(n),則有s(n)=s(n-1)+3。該算法用C語言函數(shù)編寫可描述為:
int s(int n)
{
int y;
y=s(n-1)+3;
return(y);
}
算法在使用函數(shù)s(n)計算學(xué)生的成績時還要調(diào)用函數(shù)s(n)本身,這種函數(shù)調(diào)用方法就是函數(shù)的遞歸調(diào)用。
以上對函數(shù)s(n)的描述歸納總結(jié)出了計算成績的第2種情況,其中還缺少當n=1的情況:若沒有此條件,就如同沒有給出最右側(cè)學(xué)生的成績,這樣遞歸是不能得出最終結(jié)果的。因此遞歸算法能得到結(jié)果的前提是必須給出當n=l時函數(shù)s(n)的確切數(shù)據(jù)。假如最右側(cè)學(xué)生的紙條上寫著“你的成績是90分”,則遞歸算法用c語言函數(shù)編寫的完整描述為:
int s(int n)
{
inty;
if(n==1)
y=90;
else
y=s(n-1)+3;
return(y);
}
算法分析及程序語言描述結(jié)束后,請坐在每一排最右側(cè)的學(xué)生念出自己紙條上寫的成績,請學(xué)生們寫出自己所坐位置的計算成績的函數(shù)s(n)。
2.4 問題解決方案
給出以上遞歸算法函數(shù)后,讓學(xué)生書寫主函數(shù)mainO調(diào)用函數(shù)s(n),并根據(jù)自己的座位情況,帶入n的值,計算出自己的成績,并分析調(diào)用s(n)的次數(shù)和調(diào)用過程。
這樣,學(xué)生們能很迅速地寫出如下主函數(shù):
#Include
intmainO
{
int s(int n);
im score:
score=s(4);//我是本排右起第4個學(xué)生
prinff(\"My score is:%d\n\",score);
return O:
}
然后結(jié)合“2.2教學(xué)引導(dǎo)”中計算自己成績時的過程分析出調(diào)用s(n)的次數(shù)和調(diào)用過程,從而明白在每一次遞歸調(diào)用s(n-1)是得不到成績值的,直到n=1的那次調(diào)用后才能依次倒著計算得到s(n-1)的值,最終算出自己的成績。
采用此方法講解遞歸算法后,學(xué)生們會發(fā)現(xiàn)問題的解決過程跟自己開始計算自己成績的過程完全相同,只需將解決問題的過程進行歸納,總結(jié)成算法,就能輕松地寫出程序。學(xué)生們再遇到遞歸方面的問題時,就會先找出問題求解的幾種情況或相應(yīng)過程,再將問題進行梳理總結(jié)成算法,編寫出相應(yīng)的遞歸函數(shù),并寫出正確的遞歸函數(shù)調(diào)用程序。漢諾塔問題也可以用此方法解決。
3、“建立單向動態(tài)鏈表”的講授方法.
3.1 問題描述
在講述了鏈表的節(jié)點、頭指針、表尾等相關(guān)概念,以及單向鏈表的組成(如圖1所示)后,給出如下問題,要求學(xué)生建立一個鏈表。
①鏈表由學(xué)號相鄰的5個學(xué)生組成1組而建立,學(xué)號01-05的學(xué)生為一組,06-10的學(xué)生為一組,依次類推;鏈表的節(jié)點成員有num、name、score(自己擬定值)、next(下一個學(xué)號學(xué)生的地址,即座位號)。
②在每組中,若學(xué)號%5=1,該學(xué)號學(xué)生的地址(座位號)放在鏈表的頭指針head中。
③在每組中,若學(xué)號%5=0,則該學(xué)生的信息放在鏈表表尾。
④若本組有學(xué)生請假未到,也將該學(xué)號學(xué)生的節(jié)點加在表中,但其中的數(shù)據(jù)和地址(座位號)是空白的。
教師在黑板上畫出整個教室的座位編號,每個學(xué)生可以明確自己的座位號,即地址。如1-5排的學(xué)生座位號如圖2所示。
3.2 問題解決過程
學(xué)生看到問題后,會根據(jù)問題描述分別畫出head,并詢問其他同學(xué)相關(guān)信息,填寫head的值,然后依次畫出連同自己的學(xué)號、座位號節(jié)點在內(nèi)的本小組5位學(xué)生的信息節(jié)點,并詢問與其學(xué)號相鄰的學(xué)生的相關(guān)信息,填寫節(jié)點中的信息,完成整個鏈表。
3.3 鏈表的建立及知識點講授
每個學(xué)生都能根據(jù)問題描述和要求,畫出相應(yīng)的鏈表,并且每個小組5位學(xué)生的鏈表相同。圖3所示為第3小組學(xué)生畫出的單向鏈表。
讓學(xué)生根據(jù)建立鏈表的過程,歸納總結(jié)出鏈表建立的方法及過程,學(xué)生能清晰地給出如下過程:
①畫head;
②畫鏈表中第一個節(jié)點,填寫該學(xué)生信息,并將該學(xué)生的座位號填寫在head中;
③重復(fù)過程②,將后一節(jié)點學(xué)生的座位號填寫在前一節(jié)點的地址處,直到某種情況結(jié)束鏈表。
只需將學(xué)生給出的過程稍加解釋,作出補充,便可得到如下算法:
①畫head,即建立頭指針head,并賦初值NULL;
②畫鏈表中第一個節(jié)點,即建立一個新節(jié)點,并填寫節(jié)點數(shù)據(jù),將新節(jié)點的地址賦值給頭指針head;
③重復(fù)過程②,將后一節(jié)點的地址賦值給前一節(jié)點的next,直到某種情況結(jié)束鏈表。
然后再將算法用相應(yīng)的程序代碼書寫,或?qū)ο鄳?yīng)的程序代碼進行講解,學(xué)生就很容易理解并掌握單向鏈表的建立。
圖3中第2個節(jié)點的座位號為空,分析得出其下一個節(jié)點學(xué)號為10313的學(xué)生請假未到,因此可將后面學(xué)號為10314的同學(xué)的座位號填寫在第2個節(jié)點空白的座位號中,然后將學(xué)號為10313的同學(xué)的節(jié)點從鏈表中刪除。刪除學(xué)號為10313后的鏈表如圖4所示。如果該學(xué)生在下一節(jié)課來到教室上課,還可以將其節(jié)點再插入到鏈表中。
通過以上分析,學(xué)生能很好地理解單向鏈表的組成與建立,以及鏈表節(jié)點的插入與刪除,特別是動態(tài)鏈表的。之后再進行用指針方法進行建立靜態(tài)鏈表或動態(tài)鏈表的程序的講述和分析就非常輕松了,學(xué)生也能很快掌握用指針進行鏈表的處理方法和程序的編寫。
4、結(jié)語
通過實際教學(xué)過程可以發(fā)現(xiàn),采用有效的講授方法不僅能充分調(diào)動學(xué)生上課的參與性,更能培養(yǎng)學(xué)生歸納總結(jié)解決問題的方法的能力,以及將算法用程序語言代碼實現(xiàn)的能力,從而進一步提高了學(xué)生綜合運用基本概念和知識解決實際問題的能力,提高了學(xué)生學(xué)習(xí)的熱情和自主學(xué)習(xí)能力。該方法運用在c語言程序設(shè)計課程課堂教學(xué)中收到了滿意的效果。