摘要:實驗是數(shù)據(jù)結(jié)構(gòu)Java語言描述課程的重要環(huán)節(jié)。本文在分析并確定課程實驗教學(xué)的主要目標(biāo)基礎(chǔ)上,重點討論在課程實驗中結(jié)合軟件工程思想、面向?qū)ο笳Z言Java的任務(wù)組織、過程設(shè)計以及保障措施,取得良好效果。
關(guān)鍵詞:數(shù)據(jù)結(jié)構(gòu)課程;實驗;設(shè)計;Java;軟件工程
數(shù)據(jù)結(jié)構(gòu)是計算機類專業(yè)的核心專業(yè)基礎(chǔ)課之一,主要討論數(shù)據(jù)的合理組織和有效存儲、處理以及算法的正確設(shè)計、分析和評價,課程本身概念抽象、方法靈活、強調(diào)邏輯思維能力、難度較大,同時課程實踐性強,實驗是該課程不可或缺的重要環(huán)節(jié)[1-4]。通常數(shù)據(jù)結(jié)構(gòu)課程實驗是由教師將問題描述和基本要求作為實驗題目給出,但又絕不是讓學(xué)生拿到實驗題目就直接上機進行編程調(diào)試,而是要通過在實驗中貫穿軟件工程的方法和原理,嚴(yán)格按照分析、設(shè)計、實現(xiàn)、測試等軟件工程過程并結(jié)合具體的實現(xiàn)語言來完成實驗,培養(yǎng)學(xué)生養(yǎng)成良好的實驗習(xí)慣。下文針對課程實驗特點和目標(biāo),結(jié)合軟件工程思想、面向?qū)ο笳Z言Java,在課程的實驗組織、過程設(shè)計、保障等方面進行了一些探索。
1課程實驗特點和目標(biāo)
由于面向?qū)ο蠓椒ㄒ呀?jīng)成為目前系統(tǒng)開發(fā)和程序設(shè)計的主流方式,而Java語言是一種目前使用最為廣泛的面向?qū)ο蟪绦蛟O(shè)計語言,因此不少計算機類專業(yè)的數(shù)據(jù)結(jié)構(gòu)課程采用了Java語言描述。作為是一種完全面向?qū)ο蟮某绦蛟O(shè)計語言,Java在提高程序的復(fù)用性和安全性時,在不同類的資源配置方面,較面向過程的程序設(shè)計語言有更高層面的要求[3],通過Java語言表現(xiàn)各種數(shù)據(jù)結(jié)構(gòu)、實現(xiàn)相關(guān)算法是數(shù)據(jù)結(jié)構(gòu)課程的難點之一,這給語言基礎(chǔ)薄弱的學(xué)生完成實驗帶來很大困難,迫切需要在目標(biāo)、過程、方法等各方面精心組織和設(shè)計實驗。
如圖1所示,作為課程教學(xué)的重要組成部分,課程實驗的目標(biāo)主要圍繞數(shù)據(jù)結(jié)構(gòu)與算法、軟件分析與設(shè)計、程序?qū)崿F(xiàn)與驗證、抽象邏輯思維等方面展開[4-7],即:①以數(shù)據(jù)結(jié)構(gòu)和算法為核心,幫助學(xué)生加深對數(shù)據(jù)結(jié)構(gòu)的理解;②以軟件工程思想為基礎(chǔ),反復(fù)練習(xí)包括軟件分析與設(shè)計在內(nèi)的軟件開發(fā)過程,培養(yǎng)分析問題、解決問題和程序設(shè)計的能力;③以面向?qū)ο蟮腏ava程序設(shè)計語言為工具,提高學(xué)生利用Java語言實現(xiàn)和驗證算法的能力;④在理解掌握數(shù)據(jù)結(jié)構(gòu)、應(yīng)用軟件工程思想、熟練使用Java語言的同時,還要培養(yǎng)嚴(yán)密的抽象邏輯思維能力。
上述實驗?zāi)繕?biāo)師生都提出了更高的要求,為了更好地達到上述目標(biāo),并幫助學(xué)生在學(xué)習(xí)過程中充分發(fā)揮主觀能動作用,圍繞課程在數(shù)據(jù)結(jié)構(gòu)、軟件開發(fā)、程序?qū)崿F(xiàn)、邏輯思維各個方面的目標(biāo),進行了課程實驗的設(shè)計,主要包括切實可行的實驗任務(wù)組織、科學(xué)合理的實驗過程設(shè)計、結(jié)合多種方法的嚴(yán)格過程保障等方面,如圖2所示。
2實驗任務(wù)組織
根據(jù)課程實驗特點和目標(biāo),對實驗任務(wù)進行了精心組織,主要是針對不同基礎(chǔ)和層次的學(xué)生進行了任務(wù)的劃分,如圖3所示。
2.1基本任務(wù)
對于所有的學(xué)生,不管其基礎(chǔ)或?qū)哟稳绾?,都必須完成一定的基本任?wù),那就是用程序驗證各種邏輯結(jié)構(gòu)的基本實現(xiàn)和算法,在實驗的總體結(jié)構(gòu)中實現(xiàn)函數(shù)的編寫、測試、調(diào)試、驗證,通過這一驗證過程達到加深理解各種數(shù)據(jù)結(jié)構(gòu)和算法、掌握基本教學(xué)內(nèi)容的目的,這也是傳統(tǒng)的數(shù)據(jù)結(jié)構(gòu)課程實驗所要求的任務(wù)。
2.2基礎(chǔ)強化
部分學(xué)生學(xué)習(xí)基礎(chǔ)較差,特別是Java語言的編程能力不足,對類、接口、封裝、多態(tài)、方法調(diào)用等的認(rèn)識較模糊,需要在基本的Java語言以及基本的方法功能理解、方法編寫及調(diào)用等方面加強實驗,通過對基本數(shù)據(jù)結(jié)構(gòu)和算法與對應(yīng)程序的反復(fù)閱讀、編寫、測試等訓(xùn)練,達到提高對Java程序結(jié)構(gòu)、語法以及Java方法在程序設(shè)計中作用的認(rèn)識。
2.3能力提升
針對基礎(chǔ)較好、學(xué)習(xí)興趣較濃的學(xué)生,為提供其發(fā)揮能力的空間,有效提高其學(xué)習(xí)興趣,提出一些要求更高、具有一定挑戰(zhàn)性的任務(wù),要求能進行分析、設(shè)計并實現(xiàn)、測試,包括:完成比教材里典型基本功能更強的拓展功能,開拓學(xué)生的思路,如統(tǒng)計線性表中給定值的元素個數(shù);使用已學(xué)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)完成一些擴展任務(wù),提高學(xué)生分析問題、解決問題的能力,如統(tǒng)計二叉樹的結(jié)點個數(shù);靈活應(yīng)用編寫的方法,實現(xiàn)不同的功能要求,培養(yǎng)學(xué)生對實驗總體結(jié)構(gòu)配置、方法外特性的認(rèn)識,如利用隊列和堆棧實現(xiàn)單鏈表的逆序排列。
總之,在課程實驗組織中,做到有對整體結(jié)構(gòu)加以介紹的說明;有給學(xué)生完成實驗的思路提示;對有一定難度的任務(wù)還給出具有參考價值的實現(xiàn)作為參照。這樣,根據(jù)課程實驗?zāi)繕?biāo)和學(xué)生的基礎(chǔ)、興趣設(shè)計客觀、可行的實驗要求和過程,符合人們認(rèn)識事物的特點,避免了因為要求難度太大挫傷學(xué)生的學(xué)習(xí)熱情。
3實驗過程設(shè)計
如果僅僅依靠傳統(tǒng)的驗證型實驗,學(xué)生只是將課本中算法的對應(yīng)程序敲入計算機,運行一下程序、驗證一下結(jié)論而已,基本上沒有涉及到問題思考、分析分析、總體結(jié)構(gòu)設(shè)計、程序設(shè)計等軟件工程所強調(diào)的工作,而如果教師沒有嚴(yán)格要求、反復(fù)強調(diào)、嚴(yán)格考核,多數(shù)學(xué)生都不做預(yù)習(xí)準(zhǔn)備工作,更不用說養(yǎng)成分析、設(shè)計、比較和總結(jié)的習(xí)慣,結(jié)果是學(xué)生來作實驗了,但不了解實驗的目標(biāo)、流程、問題產(chǎn)生的原因,實驗效果、課程學(xué)習(xí)效果大打折扣。
3.1實驗過程的規(guī)范
首先嚴(yán)格規(guī)范實驗流程,讓學(xué)生反復(fù)體會從接受任務(wù)到分析、設(shè)計、編碼、測試的軟件開發(fā)過程[5]。在最初的兩三個實驗時,由教師根據(jù)實驗題目指導(dǎo)學(xué)生一步一步完成圖4所示內(nèi)容:①問題描述,即實驗要解決問題的描述;②基本要求,即實驗要達到的具體要求;③測試數(shù)據(jù),即設(shè)計能達到測試目的的測試數(shù)據(jù);④算法思想,即描述解決相應(yīng)問題的算法思想;⑤類劃分,即分析問題所需的類,并給出類的邏輯功能描述;⑥源程序,即有充分注釋的參考實現(xiàn)源程序清單;⑦測試情況,即程序的測試情況以及必要的分析和說明。由于數(shù)據(jù)結(jié)構(gòu)實驗尚未要求進行較強功能軟件的開發(fā),故上述過程中雖然涉及了軟件工程思想和軟件開發(fā)過程,但一般并不強調(diào)過分詳細(xì)的需求分析、概要設(shè)計、詳細(xì)設(shè)計等步驟,也不必要求提供詳細(xì)的使用手冊。在隨后的整個課程實驗過程中,對學(xué)生嚴(yán)格要求、反復(fù)強調(diào)必須嚴(yán)格遵守圖4的實驗過程,并采用抽查等方式保證其嚴(yán)格執(zhí)行。
3.2關(guān)注點的分離
為了將數(shù)據(jù)結(jié)構(gòu)與Java語言、軟件工程有效結(jié)合,要求在課程的實驗過程中也始終與理論教學(xué)中一樣,按圖5所示的三個典型步驟來解決所遇到的數(shù)據(jù)結(jié)構(gòu)和算法問題:①抽象,即分析問題需求,抽象出一個解決該問題的適當(dāng)?shù)臄?shù)學(xué)模型(抽象數(shù)據(jù)類型ADT);②接口設(shè)計,即對應(yīng)地設(shè)計一個規(guī)格說明來描述ADT應(yīng)支持的操作,并將這個規(guī)格說明用Java接口來表示;③實現(xiàn),即選擇合適的數(shù)據(jù)結(jié)構(gòu)和算法來實現(xiàn)上述Java接口,最后對各種不同實現(xiàn)的代價進行分析和比較。這樣的步驟清楚地區(qū)分了ADT的接口與實現(xiàn),體現(xiàn)了軟件工程中分離關(guān)注點的重要原則[6],同時很好地利用了Java語言在抽象、封裝等方面的優(yōu)勢。
4實驗保障措施
通過已有的實驗過程發(fā)現(xiàn),僅有實驗任務(wù)組織和實驗過程設(shè)計是不夠的,還必須要有良好的動手習(xí)慣培養(yǎng)、基本知識積累以及編程能力提高等作為保障措施,才能較好地達到所提出的課程實驗?zāi)繕?biāo)。
4.1動手習(xí)慣的培養(yǎng)
部分學(xué)生沒有動手的習(xí)慣,實踐教學(xué)中應(yīng)注重培養(yǎng)學(xué)生的動手習(xí)慣,特別是培養(yǎng)記錄、畫圖、打草稿等基本的動手習(xí)慣,避免學(xué)生對知識把握不準(zhǔn)、似是而非。如在講解、演示或討論時,讓學(xué)生跟隨教師動手在草稿紙上畫圖、記錄,講解完立即就剛剛所學(xué)內(nèi)容的部分關(guān)鍵步驟再抽查學(xué)生重新講解,并要求輔以圖、表等(當(dāng)然抽查也可以在下一次課進行),如果存在問題可以由其他同學(xué)糾正,最后由教師進一步分析、總結(jié),讓學(xué)生深刻體會動手習(xí)慣對知識學(xué)習(xí)所起的鞏固作用。
4.2簡單知識的積累
部分學(xué)生不注重積累那些功能簡單的小算法,實踐教學(xué)中教師應(yīng)注重培養(yǎng)學(xué)生對簡單知識的理解、記憶、積累,經(jīng)常抽查,在面對那些較為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)和算法時,充分分析、分解其中涉及到的基本知識點之間、算法之間的聯(lián)系,提示學(xué)生注意類的小型化、原子化,只有長期注重對基本知識點的理解、記憶和積累,才能避免遇到問題時無從下手,避免理論與實踐脫節(jié)。
4.3編程能力的提高
由于前導(dǎo)課程如C語言、Java等掌握不好、認(rèn)識不深、基礎(chǔ)不牢,不少學(xué)生編程能力較弱,缺乏把數(shù)據(jù)結(jié)構(gòu)和算法轉(zhuǎn)化成代碼實現(xiàn)的能力,部分學(xué)生甚至不能把一些簡單的算法轉(zhuǎn)換成完整的程序,以及缺乏基本的排錯能力,都大大影響了這些學(xué)生學(xué)習(xí)這門課的積極性和效果。
為了使實驗過程清晰并降低實現(xiàn)的難度、提高可操作性,要求學(xué)生一開始所設(shè)計的ADT不一定功能很完備,只要具有那些典型的、能初步表現(xiàn)問題需求的基本功能即可,隨著上述步驟的一輪操作結(jié)束,根據(jù)問題的需求,進一步完善現(xiàn)有的ADT及其實現(xiàn)。讓學(xué)生既在運用中逐步體會了軟件工程原理和應(yīng)用,又對通過不斷運用Java的基本知識,提高了編程能力。
另外,加強現(xiàn)場指導(dǎo)、交流、溝通,及時發(fā)現(xiàn)學(xué)生的困難,有針對性地幫助學(xué)生提高認(rèn)識、解決問題,以及實驗完成后進行分析總結(jié),集中討論實驗中的一些普遍問題,都是提升實驗效果的有力措施。
5結(jié)語
基于實驗在數(shù)據(jù)結(jié)構(gòu)教學(xué)中的重要地位,精心的任務(wù)組織、科學(xué)的過程設(shè)計和嚴(yán)格的保障措施是十分必要的。一段時間的運行表明,上述做法對于促進學(xué)生在學(xué)習(xí)過程中充分發(fā)揮主觀能動作用,增強對數(shù)據(jù)對象特征的理解、數(shù)據(jù)組織方法的掌握、軟件開發(fā)過程的熟悉、程序?qū)崿F(xiàn)技能的培養(yǎng)以及抽象邏輯思維能力的提高等方面都起到了積極的作用。
參考文獻:
[1] 楊紅賓. 數(shù)據(jù)結(jié)構(gòu)課程改革探討[J]. 教育