董鑫正+單緬+傅曉陽
摘要:針對c++教學中知識點較多并且零散的問題,通過分析知識點之間的邏輯關系,提出以函數(shù)、變量、流程控制3個核心知識點為中心的橫向分類和縱向分層的知識點結(jié)構(gòu)圖。
關鍵詞:c++;知識點;函數(shù);變量;流程控制
對于大部分學生來講,從編程零基礎到掌握程序設計的基本思想和方法,需要轉(zhuǎn)變思維方式,從新的角度去認識和分析問題,有一定的困難要克服。c++課程本身包含很多零散的知識點,且有較強的實踐性,學習起來也有一定的困難。承擔學生與課程之間橋梁角色的教師,如何根據(jù)學生的認知特點和課程中知識點之間的固有聯(lián)系,有效組織知識結(jié)構(gòu),合理安排教學計劃,以達到理想的教學效果,是一個值得探討的問題。
1.知識點的聚類
針對c++語言包含很多零散知識點的問題,通過知識點之間的聯(lián)系,采用層次聚類的思想來構(gòu)建知識點的樹狀圖,發(fā)現(xiàn)核心知識點,實現(xiàn)知識點“由多到少”。樹狀圖共有四層,首層是表示c++全部知識點的根結(jié)點,第二層是核心知識點,第三層是主題知識點,對應教材上的章,第四層是基本知識點,對應每一章包含的多個具體的知識點。常見的c++教材上關于章節(jié)的安排,可以看作是第四層到第三層聚類。本文的重點在于第三層到第二層的聚類,從而發(fā)現(xiàn)核心知識點,幫助學生抓住重點,掌握本質(zhì)。
1.1主題知識點
c++教材上章節(jié)的劃分實際上都屬于基本知識點到主題知識點的聚類。這里參考文獻的章節(jié)劃分,根據(jù)實際的教學安排有部分調(diào)整,整理后的主題知識點見表1。
1.2核心知識點
通過教學實踐的總結(jié)以及對主題知識點和基本知識點的進一步分析發(fā)現(xiàn),所有的內(nèi)容圍繞3個核心的知識點展開,即程序設計的基本概念:函數(shù)、變量、流程控制。把表1中的主題知識點按這3個核心知識點進行劃分,結(jié)果如圖1(橫向來看)所示。
函數(shù)是c++中的基本概念,也是c++程序的基本組成部分。圍繞函數(shù)展開的主題知識點有主函數(shù)、自定義函數(shù)、多文件結(jié)構(gòu)、類、構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、靜態(tài)成員函數(shù)、運算符重載、模板。主要內(nèi)容包含主函數(shù)、自定義函數(shù)、類成員函數(shù)、模板函數(shù)等。
變量也是C++中的基本概念,變量包含四要素:名稱、類型、值、地址。相關的概念有常量和字面量:常量也包含四要素,但值不能修改;字面量包含三要素,類型、值和地址,沒有名稱,直接用值,且值不能修改。類型是變量的四要素之一,與類型相關的章節(jié)都屬于變量相關的內(nèi)容。圍繞變量展開的主題知識點有:基本類型和變量、表達式、多文件結(jié)構(gòu)、數(shù)組、指針、引用、結(jié)構(gòu)、類、繼承、模板。主要內(nèi)容包含基本類型、構(gòu)造類型、類類型、類模板等。
函數(shù)和變量包含的主題知識點中有3個是重疊的:多文件結(jié)構(gòu)、類、模板,這3個主題知識點即涉及函數(shù)部分,也涉及變量部分。
流程控制相對簡單,體現(xiàn)在兩個方面:一是內(nèi)容較少,只包含兩個主題知識點;二是比較獨立,與另外兩個核心知識點之間沒有相互交叉。主要內(nèi)容是流程控制,即順序、分支和循環(huán)3種流程控制結(jié)構(gòu)。
2.知識點的展開
知識點的聚類從橫向上對知識點進行分類,實現(xiàn)了知識點“由多到少”的目標;而知識點的展開則基于學生的認知規(guī)律,從縱向上對知識點由淺人深,以盡量減少學生學習時遇到的困難。這里的基本原則是以問題為驅(qū)動,逐步完善解決問題的方法,一方面我們要解決的問題或示例從簡單到復雜;另一方面,我們采用的解決問題的方法根據(jù)問題的規(guī)模和類型逐步擴展。這里方法的展開也以函數(shù)、變量、流程控制3個核心概念為基礎,分層遞進。從縱向來看,可分為單函數(shù)和基本類型、多函數(shù)和構(gòu)造類型、面向?qū)ο?個層次,如圖1(縱向來看)所示。
3個層次的遞進依據(jù)兩條線索,一是函數(shù),二是變量,即3個核心知識點的前兩個。函數(shù)從單個確定函數(shù)原型的主函數(shù)到多個用戶自定義函數(shù)。變量的擴展主要體現(xiàn)在數(shù)據(jù)類型,如圖2所示,為了突出重點,省略了枚舉類型、聯(lián)合類型、空類型等。從基本類型到構(gòu)造類型,再到類類型,前兩個層次中變量和函數(shù)是分離的,在第3層類類型中,變量和函數(shù)統(tǒng)一到類的概念里,成為成員變量和成員函數(shù)。
2.1單函數(shù)和基本類型
單函數(shù)即只有一個主函數(shù)。最簡單的C++程序由一個主函數(shù)組成,主函數(shù)是c++程序的人口,每個程序有且僅有一個主函數(shù)。函數(shù)是C++程序的基本組成單元,從而引入了函數(shù)的概念。
變量包含名稱、類型、值、地址四要素,定義變量之前先要有類型,c++中最簡單的類型是基本類型,基本類型包括整型、字符型、浮點型和布爾型。運算符主要包含算術運算符、關系運算符、邏輯運算符,使用運算符把變量連接起來組成表達式,表達式可以作為更復雜的語句的子表達式,或者加上分號成為獨立的語句。
流程控制包含順序、分支、循環(huán)3種結(jié)構(gòu),分支包含if和switch兩種形式,循環(huán)包含while、do....while、for 3種形式。
掌握了主函數(shù)、變量和基本類型、流程控制等基本概念,便掌握程序設計的基礎,可以用來解決基本的數(shù)學計算問題,如累加求和、判斷素數(shù)等問題。
2.2多函數(shù)和構(gòu)造類型
對于稍微復雜一些的問題,只有一個主函數(shù)已經(jīng)不能很好地解決問題,這時就需要引入自定義函數(shù)。自定義函數(shù)主要包含兩方面的內(nèi)容,一是函數(shù)的定義、聲明與調(diào)用;二是幾種特殊的函數(shù)形式,如遞歸、內(nèi)聯(lián)、重載、默認參數(shù)函數(shù)等。當程序中的函數(shù)很多時,為了方便組織管理,會放在多個文件中,并提供相應的頭文件,便有了多文件結(jié)構(gòu)。對于變量,也需要考慮在多文件結(jié)構(gòu)下的情況,主要是針對全局變量。單函數(shù)、單文件的程序主要用于實驗驗證,多函數(shù)、多文件結(jié)構(gòu)才是工程項目中的一般形式。
變量方面,在基本類型上作進一步的擴展,引入了4種新的構(gòu)造類型:數(shù)組、指針、引用和結(jié)構(gòu)體。構(gòu)造類型實際上提供了新類型的構(gòu)造方法,從而提供在4種基本類型的基礎上構(gòu)造任意組合類型的可能。這里的重點是如何用構(gòu)造類型定義變量及該類型變量的特性。對于結(jié)構(gòu)體類型,除了定義變量,還需要掌握定義新的結(jié)構(gòu)體類型的方法。雖然C++的關鍵字struct和class有基本一致的功能(除了默認的成員訪問權(quán)限不同),本文中的struct僅用于定義C語言樣式的結(jié)構(gòu)體。
自定義函數(shù)和構(gòu)造類型的引入,為我們解決復雜問題提供了基本的表達方法。尤其是結(jié)構(gòu)體變量的引入,以基本類型為基礎,通過多次嵌套組合成合適的構(gòu)造類型,從而使表達復雜的數(shù)據(jù)結(jié)構(gòu)成為可能。
說到函數(shù)與變量的關系,重點在于不同類型的變量作為函數(shù)參數(shù)所表現(xiàn)的差異。調(diào)用函數(shù)時使用的參數(shù)叫實參,定義函數(shù)時的參數(shù)叫形參,實參向形參的傳遞方式是值傳遞,即實參的值單向傳遞給形參。當參數(shù)類型是指針或引用時,在函數(shù)中對形參所指向變量的修改會影響到實參所指向的變量,數(shù)組作為函數(shù)參數(shù)時按指針類型處理。當參數(shù)類型非指針或引用時,在函數(shù)中對形參的修改則不會影響實參變量。
2.3面向?qū)ο?/p>
以上兩個層次屬于面向過程的內(nèi)容,第三個層次是面向?qū)ο蟮膬?nèi)容。對于大型的工程項目,面向過程的方法顯得力不從心,而面向?qū)ο蠓椒▌t提供了更高程度的抽象,以便于對問題的描述和工程的組織。
我們?nèi)匀粡暮瘮?shù)和變量的角度來理解面向?qū)ο?。前面提到過函數(shù)和變量的關系,一方面變量可以作為函數(shù)參數(shù)或返回值,另一方面變量可以作為變量的成員(通過使用結(jié)構(gòu)體)。以此為基礎,現(xiàn)在提出兩個問題引導學生:函數(shù)可以作為函數(shù)參數(shù)或返回值嗎?函數(shù)可以作為變量的成員嗎?對于第一個問題,可以接受函數(shù)作為參數(shù)或返回函數(shù)的函數(shù)稱為高階函數(shù),c++并不支持,但c++中通過函數(shù)指針可以實現(xiàn)以函數(shù)作為另一個函數(shù)參數(shù),只是并不作為初學者的重點內(nèi)容。對于第二個問題,函數(shù)可以作為變量的成員,這樣變量便可以擁有數(shù)據(jù)成員和函數(shù)成員,這便是面向?qū)ο蟮臉?gòu)造基礎。
類概念的引入,便是在結(jié)構(gòu)體的基礎之上增加了對函數(shù)成員的支持。這樣,對類的認識,可以從成員變量、成員函數(shù)的角度來理解。當然,也有特殊的成員函數(shù),比如構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù),都是新的概念,需要與成員變量結(jié)合起來理解。類的訪問控制實現(xiàn)了對封裝性的支持,靜態(tài)成員使成員函數(shù)或成員數(shù)據(jù)能夠不依賴于對象而獨立存在,友元使類的非成員函數(shù)能訪問類的非公有成員以提高效率。類的繼承提供了高效的代碼復用機制,并通過虛函數(shù)實現(xiàn)了對多態(tài)性的支持。運算符重載是特殊的函數(shù)重載,主要是為了提高可讀性。模板是泛型編程技術,實現(xiàn)了類型的參數(shù)化。
異常處理屬于流程控制,使我們能夠?qū)栴}的檢測和問題的解決分離,這樣程序的問題檢測部分可以不必了解如何處理問題。
3.結(jié)語
根據(jù)C++的3個核心知識點即函數(shù)、變量、流程控制,橫向上進行分類以求由繁到簡,縱向進行分層以求由淺入深,是引導學生初步掌握包含較多零散知識點的程序設計課程的一種有效方法。在教學實踐中,以文中提出的知識點結(jié)構(gòu)圖為參考,強調(diào)初學者要抓住重點、夯實基礎,建立新的知識點與核心知識點的聯(lián)系,使整體的教學效果有了一定的提升。