袁麗華 習(xí)騰彥
關(guān)鍵詞:算法;數(shù)據(jù)結(jié)構(gòu);范式;方法論;世界觀
1 引言
自從賓夕法尼亞大學(xué)誕生人類首臺(tái)計(jì)算機(jī)以來,計(jì)算機(jī)技術(shù)得到飛速的發(fā)展,同時(shí),計(jì)算機(jī)技術(shù)融入了社會(huì)各行業(yè)的專業(yè)技術(shù)之中,推動(dòng)著各種領(lǐng)域技術(shù)的革新和發(fā)展。社會(huì)各行各業(yè)亟需具有專業(yè)知識(shí)和計(jì)算機(jī)素養(yǎng)的復(fù)合人才。高等院校肩負(fù)著培養(yǎng)各類專業(yè)大學(xué)生在計(jì)算機(jī)應(yīng)用方面的知識(shí)和素養(yǎng)。C 語言多年來一直是應(yīng)用領(lǐng)域很廣的計(jì)算機(jī)語言之一,既可用于編寫操作系統(tǒng)又可用于應(yīng)用軟件開發(fā),國內(nèi)絕大多數(shù)理工科專業(yè)將C語言設(shè)置成為本專業(yè)的基礎(chǔ)課程,甚至是核心課程??梢?,C 語言在計(jì)算機(jī)教育與應(yīng)用以及計(jì)算機(jī)人才培養(yǎng)方面具有重要的地位和作用。
目前C語言的課程改革主要涉及兩個(gè)方面,一是教學(xué)方法的改革,二是課堂思政建設(shè)。C語言教學(xué)改革的新方法新理念層出不窮,引入了任務(wù)驅(qū)動(dòng)、線上線下混合教學(xué)、課堂翻轉(zhuǎn)等方法,注重培養(yǎng)學(xué)生計(jì)算思維能力、編程能力等。例如,劉杰等以O(shè)BE 理念制定教學(xué)目標(biāo),優(yōu)化教學(xué)內(nèi)容,采用線下線上混合的教學(xué)模式,構(gòu)建可持續(xù)改進(jìn)的考核評價(jià)體系,保證教學(xué)過程的良性循環(huán)[1]。熊啟軍等注重實(shí)踐教學(xué),結(jié)合多媒體的應(yīng)用,將微視頻融入C語言程序設(shè)計(jì)的實(shí)驗(yàn)教學(xué)之中[2]。朱新波采用任務(wù)驅(qū)動(dòng)方法,運(yùn)用設(shè)計(jì)教學(xué)機(jī)器人,激發(fā)學(xué)生的學(xué)習(xí)興趣,增強(qiáng)學(xué)生的實(shí)踐能力[3]。袁麗華提出采用承上啟下的教學(xué)模式幫助學(xué)生接受新知識(shí),同時(shí)兼顧應(yīng)用和鞏固已有的知識(shí)[4]。
2016年12月習(xí)近平總書記在全國高校思想政治工作會(huì)議上強(qiáng)調(diào)高校思想政治工作關(guān)系高校培養(yǎng)什么樣的人、如何培養(yǎng)人以及為誰培養(yǎng)人這個(gè)根本問題[5]。習(xí)近平總書記指出要堅(jiān)持把立德樹人作為中心環(huán)節(jié),把思想政治工作貫穿教育教學(xué)全過程,實(shí)現(xiàn)全程育人、全方位育人,努力開創(chuàng)我國高等教育事業(yè)發(fā)展新局面[5]。近年來,高等院校很重視課堂思政的建設(shè),作為高校人才培養(yǎng)在德育方面的重要手段和環(huán)節(jié)。各高校C語言課程的思政建設(shè)也有條不紊地開展和實(shí)施,目前C語言的課程思政建設(shè)主要停留在思政元素的挖掘和設(shè)計(jì)上[6-8],但是C語言蘊(yùn)含的哲學(xué)思想鮮有研究。解放軍國際關(guān)系學(xué)院的宣克祥指出“計(jì)算機(jī)教學(xué)不但要給學(xué)生傳授計(jì)算機(jī)科學(xué)技術(shù),更要給學(xué)生講清計(jì)算機(jī)科學(xué)的思想淵源和計(jì)算機(jī)技術(shù)當(dāng)中豐富的哲學(xué)方法。只有這樣,我們才能傳授知識(shí),啟迪智慧,真正培育出屬于我們民族自己的創(chuàng)造能力和精神”[9]。本文將探討C語言的標(biāo)準(zhǔn)、算法、數(shù)據(jù)結(jié)構(gòu)、結(jié)構(gòu)化語言等中蘊(yùn)含的哲學(xué)思想,將C語言的課程建設(shè)提高到哲學(xué)層面,引導(dǎo)學(xué)生形成正確的世界觀和方法論。
2 C 語言的范式
“范式(Paradigm) ”這一概念是由托馬斯·庫恩在《科學(xué)革命的結(jié)構(gòu)》[10]中首先提出來的,他認(rèn)為每一門科學(xué)的發(fā)展階段都有其獨(dú)特的內(nèi)在結(jié)構(gòu),這種結(jié)構(gòu)的模型被定義為“范式”?!胺妒健本哂袣v史性,是科學(xué)技術(shù)各個(gè)發(fā)展階段的規(guī)則、習(xí)慣和工具。C語言的發(fā)展史和C語言標(biāo)準(zhǔn)的進(jìn)化史即為C語言各階段發(fā)展的“范式”,成為各個(gè)階段采用C語言編程的規(guī)則、習(xí)慣和工具。
圖1以年代進(jìn)化的形式非常直觀地呈現(xiàn)出了C語言的發(fā)展歷程。跟隨圖1的時(shí)間軸,可以了解到C語言的前身是1960年的ALGOL語言,這是一門面向問題的高級語言,偏離硬件遠(yuǎn),因此,基于上述缺點(diǎn),它并不適合于編寫系統(tǒng)程序。在此基礎(chǔ)上,劍橋大學(xué)于1963 年公布了Combined Programing Language(CPL) ,雖然改善了ALGOL離硬件遠(yuǎn)的缺點(diǎn),但CPL存在規(guī)模較大的不足,仍然不適合系統(tǒng)軟件的編寫。1967 年,Matin Richards在CPL語言的基礎(chǔ)上將其簡化成了Basic Combined Programming Language(BCPL) ,而且Matin Richards同樣來自劍橋大學(xué)。三年后,也就是1970年,來自貝爾實(shí)驗(yàn)室的Ken Thompson又對BCPL 進(jìn)行了簡化與修改,并將其取名為B語言。1972年,美國貝爾實(shí)驗(yàn)室的Dennis Ritchie在BCPL和B語言的基礎(chǔ)上設(shè)計(jì)出新的語言,標(biāo)志C語言的誕生。之后,UNIX的內(nèi)核和應(yīng)用程序全部被C語言改寫。從此,C 語言成為UNIX環(huán)境下使用最廣泛的主流編程語言。
在C語言誕生之后,圖1時(shí)間軸上的后續(xù)的年代演示了C語言各個(gè)發(fā)展階段的C語言標(biāo)準(zhǔn)的進(jìn)化歷程。1978年,丹尼斯里奇(Dennis Ritchie) 和布萊恩科爾尼干(Brian Kernighan) 合作出版了《The C Program?ming Language》著作,被當(dāng)作那時(shí)期的非正式的C語言標(biāo)準(zhǔn)說明,這一階段的C 語言被譽(yù)為“K&R C”。1983年,美國國家標(biāo)準(zhǔn)委員會(huì)(American National Stan?dards Committee,ANSC) 下屬計(jì)算機(jī)與信息處理部(X3)成立了“X3J11技術(shù)委員會(huì)”負(fù)責(zé)制定“一個(gè)無二義性的硬件無關(guān)的C語言標(biāo)準(zhǔn)”,并制定了C語言標(biāo)準(zhǔn)草案。1989年,ANSI正式通過C語言標(biāo)準(zhǔn)草案并且成為美國國家標(biāo)準(zhǔn),后被稱為C89標(biāo)準(zhǔn)。1990年,在C 語言標(biāo)準(zhǔn)委員會(huì)ISO/IEC JTC1/SC22/WG14(ISO/IEC聯(lián)合技術(shù)第I委員會(huì)第22分委員會(huì)第14工作組)的努力下,國際標(biāo)準(zhǔn)化組織(ISO) 批準(zhǔn)了ANSI C成為國際標(biāo)準(zhǔn)。于是ISO C(又稱為C90) 就這樣誕生了。1995年對C90進(jìn)行了細(xì)微的技術(shù)擴(kuò)充,經(jīng)過技術(shù)擴(kuò)充后的C90被改稱為C95。1999年,ANSI和ISO又通過了最新版本的C語言標(biāo)準(zhǔn)和技術(shù)勘誤文檔,該標(biāo)準(zhǔn)被稱為C99。2011年12月8日,ISO/IEC JTC1/SC22/WG14正式發(fā)布了C11標(biāo)準(zhǔn)。C語言標(biāo)準(zhǔn)作為“范式”,推動(dòng)了C語言在不同領(lǐng)域的應(yīng)用和發(fā)展。圖2歸納了C 語言的一些主要運(yùn)用,既可用于編寫操作系統(tǒng)又可用于應(yīng)用軟件開發(fā),應(yīng)用軟件方面涉及數(shù)據(jù)庫、辦公軟件、服務(wù)器、數(shù)據(jù)處理等。
3 算法蘊(yùn)含的哲學(xué)思想
“算法+數(shù)據(jù)結(jié)構(gòu)=程序”這一公式,最早是由瑞士著名計(jì)算機(jī)科學(xué)家尼克勞斯·沃思(Nikiklaus Wirth) 提出的。數(shù)據(jù)結(jié)構(gòu)的概念是指將兩種數(shù)據(jù)類型,基本數(shù)據(jù)類型和復(fù)合數(shù)據(jù)類型,以結(jié)構(gòu)化的組織方式在計(jì)算機(jī)上對數(shù)據(jù)進(jìn)行存儲(chǔ);而算法就是如何利用這些結(jié)構(gòu)化的數(shù)據(jù)來解決實(shí)際問題的方法,可以理解為詳盡的實(shí)施步驟。簡而言之,數(shù)據(jù)結(jié)構(gòu)是程序處理問題的數(shù)據(jù)載體,而算法是程序解決“怎樣做”的問題。
算法是編程的方法論,是計(jì)算機(jī)程序的核心或靈魂。通常有兩種方式來處理較為復(fù)雜的問題:第一種是自頂向下,逐步細(xì)化的方式;第二種方式則是自下而上,逐步積累。C語言采用的是自頂向下,逐步細(xì)化的方法,這個(gè)處理方式是C語言編程的方法論。C語言通過模塊化設(shè)計(jì)將復(fù)雜的問題分解為若干個(gè)小問題,從而實(shí)現(xiàn)逐步細(xì)化功能。C語言的模塊化編程依賴于函數(shù),這是C語言的最大特點(diǎn)。C語言是函數(shù)化的語言,至少包含一個(gè)主函數(shù),即main函數(shù)。圖3是C 語言模塊化程序設(shè)計(jì)示意圖,表達(dá)了C語言解決復(fù)雜問題的一般思路和方法,解決問題的通用的方法論。主函數(shù)是通過調(diào)用f1、f2和f3這三個(gè)函數(shù)來完成總?cè)蝿?wù)要求,換句話來說,對一個(gè)復(fù)雜問題,細(xì)化成了三個(gè)功能問題f1、f2和f3;而f1再細(xì)化分解成f4和f5,f2則通過調(diào)用f6、f7和f8來實(shí)現(xiàn),f3則分解為f8和f9;其中f6調(diào)用了f5,f8調(diào)用了f7。
圖3充分說明了C程序設(shè)計(jì)的方法論是采用自頂而下,逐步細(xì)化的思想,體現(xiàn)了“分而治之”的策略。C 語言采用結(jié)構(gòu)化的語言實(shí)現(xiàn)函數(shù)的模塊化,通過順序結(jié)構(gòu)、選擇結(jié)構(gòu)以及循環(huán)結(jié)構(gòu)三種基本結(jié)構(gòu)完成結(jié)構(gòu)化編程。三種結(jié)構(gòu)的示意圖如圖4所示,選擇和循環(huán)結(jié)構(gòu)還可以派生成其他形式。三種結(jié)構(gòu)有一個(gè)共同特點(diǎn),每種結(jié)構(gòu)都是單入口以及單出口?;谶@一特性,可以依據(jù)任務(wù)的要求,將不同數(shù)量的三種結(jié)構(gòu),像搭積木似的完成需要的功能。
算法具有以下特點(diǎn)[11]:
(1) 有窮性:算法不能是無限的操作步驟,實(shí)際上,“有窮性”是指“在合理的范圍之內(nèi)”,但是“合理的范圍”通常是由人們的常識(shí)和需要而定,并無嚴(yán)格標(biāo)準(zhǔn)。
(2) 確定性:算法中不能包含模棱兩可、條件不清晰的步驟,每一個(gè)步驟都必須是確定的。
(3) 有零個(gè)或多個(gè)輸入:執(zhí)行算法時(shí)需要從外界獲取必要的信息,單個(gè)輸入或者多個(gè)輸入,算法也可以沒有輸入。
(4) 有一個(gè)或多個(gè)輸出:算法是為了解決實(shí)際問題,“解”就是輸出,算法具有至少一個(gè)解。沒有輸出的算法是沒有意義的。
(5) 有效性:算法中的每一個(gè)步驟都是行之有效的,并得到確定的結(jié)果。
算法可用多種形式表示,常用的有用自然語言表達(dá)的算法步驟、流程圖、偽代碼和程序的源代碼。以求解5!為例,表1羅列了這四種常用的算法表示方法。
4 C 語言數(shù)據(jù)結(jié)構(gòu)的哲學(xué)思想體現(xiàn)
唯物辯證法認(rèn)為世界上一切事物都不是孤立存在的,而是和周圍其他事物相互聯(lián)系的,整個(gè)世界就是一個(gè)普遍聯(lián)系著的有機(jī)整體。C語言有豐富的數(shù)據(jù)結(jié)構(gòu),大體可分為基本類型、構(gòu)造類型、指針類型、枚舉類型和空類型,如圖5所示。C語言的各種數(shù)據(jù)結(jié)構(gòu)之間的內(nèi)在聯(lián)系能夠充分體現(xiàn)唯物辯證法的聯(lián)系觀點(diǎn):(1) 數(shù)組、結(jié)構(gòu)體、共用體等類型的數(shù)據(jù)都與基本數(shù)據(jù)類型有著緊密的聯(lián)系,它們都是由基本數(shù)據(jù)類型構(gòu)造而成;(2) 指針也與基本數(shù)據(jù)類型密切相關(guān),在定義指針變量時(shí),必須為指針變量指定“基本類型”,其作用是為定義的指針變量指定指向的變量類型;(3) 指針、結(jié)構(gòu)體、共用體也能構(gòu)造出各自相應(yīng)的數(shù)組數(shù)據(jù)。
基本類型數(shù)據(jù)是C語言數(shù)據(jù)的核心和基礎(chǔ),有4 種最常用的基本類型數(shù)據(jù),它們是整型、字符型、單精度浮點(diǎn)型和雙精度浮點(diǎn)型。每種類型有不同的輸入輸出引用格式,系統(tǒng)為它們分配不同的存儲(chǔ)空間,具體值羅列在表2中[4]。表3匯總了C語言各種數(shù)據(jù)類型定義的一般形式,一般形式中的類型符與表2中的類型符一致,具體運(yùn)用時(shí)即為表2中羅列的某種基本類型。這表明各類數(shù)據(jù)之間的關(guān)聯(lián)性。
基本類型處理的是簡單的單個(gè)變量或數(shù)據(jù)。數(shù)組則是處理批量數(shù)據(jù),并且同一數(shù)組具有相同的數(shù)據(jù)類型,數(shù)據(jù)類型仍然為4種基本類型。指針是C語言獨(dú)有的數(shù)據(jù)類型。指針的引入使得數(shù)據(jù)的訪問除了按變量名的直接訪問方式外,多了一種間接的訪問方式。這種訪問方式能依據(jù)變量地址來訪問,大大提高程序運(yùn)行速度。此外,通過調(diào)用以指針變量為參數(shù)的函數(shù),實(shí)現(xiàn)修改多個(gè)變量值的目的,而普通變量作為函數(shù)的參數(shù)只能得到一個(gè)返回值。表3中的前3種數(shù)據(jù)的類型的種類是固定的,常用表2羅列的4種類型,但是表3羅列的最后兩種數(shù)據(jù),結(jié)構(gòu)體和共用體,屬于用戶自定義的數(shù)據(jù)結(jié)構(gòu),它們是根據(jù)用戶需求自定義生成,因而具有無限種類型。指針和用戶自定義數(shù)據(jù)也可以定義相應(yīng)的數(shù)組變量處理對應(yīng)的批量數(shù)據(jù)??梢?,C語言處理的數(shù)據(jù)由簡單到復(fù)雜,由單個(gè)變量到批量數(shù)組,由單一類型數(shù)據(jù)到成員表列的多類型合成數(shù)據(jù),由有限種類的數(shù)據(jù)到自定義無限種類,數(shù)據(jù)訪問方式由直接訪問到間接訪問。C語言的數(shù)據(jù)結(jié)構(gòu)體現(xiàn)了唯物辯證法的聯(lián)系與發(fā)展的世界觀。
5 結(jié)構(gòu)化語言的哲學(xué)思想體現(xiàn)
5.1 選擇結(jié)構(gòu)的哲學(xué)思想體現(xiàn)
唯物辯證法認(rèn)為事物是矛盾的統(tǒng)一體,包含著相互矛盾對立的兩個(gè)方面,主張“一分為二”全面的觀點(diǎn)分析問題和處理問題。C語言提供了全面分析問題的選擇結(jié)構(gòu),而選擇控制語句有if語句、條件運(yùn)算符和switch語句,其中應(yīng)用面最廣的是if語句。If-else語句具有“一分為二”的哲學(xué)理念,對給定的條件進(jìn)行判斷后,形成兩條分支,條件成立執(zhí)行if中的語句,相反,如果不成立則執(zhí)行else中的語句。else為if的對立面,else不帶條件,不能單獨(dú)使用,必須和if結(jié)合在一起,充分體現(xiàn)了矛盾的對立與統(tǒng)一性。if語句有三種常用的表現(xiàn)形式:
(1) if(表達(dá)式)語句
(2) if(表達(dá)式)語句1
else 語句2
(3) if(表達(dá)式1) 語句1
else if(表達(dá)式2) 語句2
else if(表達(dá)式3) 語句3
┆
else if(表達(dá)式m) 語句m
else 語句m+
形式(1) 只考慮條件成立的分支,形式(2) 是典型的“二選一”模式,而形式(3) 則對應(yīng)“多選一”的情況。If語句的選擇控制結(jié)構(gòu)把可能遇到的問題情況都考慮到了,有利于我們?nèi)娴胤治鰡栴}。
5.2 循環(huán)結(jié)構(gòu)的哲學(xué)思想體現(xiàn)
眾所周知唯物辯證法的量變和質(zhì)變之間的關(guān)系,事物的發(fā)展和變化始終從量變開始,量變是質(zhì)變的前提和必要準(zhǔn)備。而質(zhì)變是量變的必然結(jié)果。質(zhì)變又為事物新的量變而開辟道路,使事物在新質(zhì)的基礎(chǔ)上開始新的量變。事物的發(fā)展就是這樣不斷由量變到質(zhì)變,又在新質(zhì)的基礎(chǔ)上開始事物新的量變,如此循環(huán)往復(fù),不斷變化。計(jì)算機(jī)語言用循環(huán)結(jié)構(gòu)來實(shí)現(xiàn)周而復(fù)始的變化,到達(dá)量變到質(zhì)變的飛躍。C語言提供了三種循環(huán)控制語句,分別是while語句、do-while語句和for語句,三種語句功能相似,但略有不同,可以互相替換。通常引入循環(huán)控制變量來控制循環(huán)的進(jìn)程(對應(yīng)量變)和終止(對應(yīng)質(zhì)變)。首先在進(jìn)入循環(huán)結(jié)構(gòu)之前,對循環(huán)控制變量設(shè)置初值,然后每運(yùn)行一次循環(huán)體,循環(huán)變量就會(huì)累加一個(gè)步長,從而讓循環(huán)控制變量的值不斷趨近于循環(huán)終止條件,如此循環(huán)反復(fù),使循環(huán)控制變量形成量變積累,直到循環(huán)條件不滿足,跳出循環(huán)結(jié)構(gòu),達(dá)到質(zhì)變,循環(huán)終止,執(zhí)行循環(huán)結(jié)構(gòu)的后續(xù)語句。在應(yīng)用循環(huán)語句編程時(shí),最忌諱的是“死循環(huán)”,死循環(huán)產(chǎn)生不了量變到質(zhì)變的飛躍,循環(huán)無休無止,程序無法正常結(jié)束,得不到正常的結(jié)果。因此,在編程中必須杜絕死循環(huán)情況的出現(xiàn)。
6 結(jié)論
本文首先回顧了C語言的發(fā)展歷程,指出C語言標(biāo)準(zhǔn)的進(jìn)化史可視為其在各個(gè)發(fā)展階段的“范式”,推動(dòng)著C語言的應(yīng)用。隨后進(jìn)一步闡述了算法、數(shù)據(jù)結(jié)構(gòu)和結(jié)構(gòu)化語言蘊(yùn)含的方法論和世界觀。通過對C 語言哲學(xué)思想的剖析,為C語言的課堂思政建設(shè)奠定堅(jiān)實(shí)的基礎(chǔ),有利于培養(yǎng)學(xué)生的辯證唯物主義世界觀。C語言具有符號語言的特點(diǎn),后續(xù)將繼續(xù)研究C 語言中的語言哲學(xué)思想。另外,馮·諾依曼提出了計(jì)算機(jī)哲學(xué)思想,C語言作為一門經(jīng)典的計(jì)算機(jī)設(shè)計(jì)語言,具有計(jì)算機(jī)哲學(xué)思想研究價(jià)值和意義,后續(xù)也將進(jìn)一步加以研究。