韋萍萍 崔忠偉
摘 要:針對計算思維培養問題以及C語言程序設計教學現狀,通過分析計算思維的關鍵內容及表述體系,提出了如何在C程序設計教學中培養計算思維的一般方法。
關鍵詞:C語言;程序設計;計算思維;邏輯
中圖分類號:TP311.1 文獻標識碼:A 文章編號:2095-1302(2018)01-0-03
0 引 言
目前,提出的人類認識、改造世界的思維方式有以下三種:
(1)以數學學科為代表的采用演繹、推理方法的邏輯思維;
(2)以實驗、觀察、數據收集、分析、歸納為主要研究形式的實證思維;
(3)以利用計算技術通過構建系統進行問題求解為主要研究形式的計算思維(以計算學科為代表);
(4)目前還存在爭議的以大數據背景下的數據計算為主要研究形式的數據思維[1]。
計算思維的概念由麻省理工大學Seymour Papert教授于1996年提出[2],但真正讓計算思維概念引起學者關注的代表人物是美國卡內基梅隆大學(CMU)的周以真教授[3]。多年來,眾多學者不僅定義了計算思維概念,更在計算機教育中多次探討了其實現、挑戰等。周以真教授認為,計算思維是運用計算機科學的基礎概念求解問題、設計系統,及人類行為理解等涵蓋了計算機科學的一系列思維活動。計算思維雖然擁有諸多計算機科學的特征,但其本身卻并非是計算機科學的專屬[4]。工作、生活中的問題及解決方法也可用計算機思維的概念來描述。
1 計算思維的關鍵內容
1.1 計算思維的思路
對于計算思維的內涵定義,學者們目前并未達成共識,周以真教授給出其特征,并建議大家對其進行擴展。
作為人類認識世界、改造世界的科學思維,各種思維方式必須具備不同的區分依據,確立一種思維模式的主要依據是它產生結論的方式和判斷結論的標準[5]。邏輯思維以三段式推理規則和重言式公理作為工具,對已知進行演繹,通過推理得到結論。而判斷結論的合理性只在乎推導過程的正確性、合理性,無論是否符合事實。因此符合邏輯推理是邏輯思維判定結論的標準。實證思維以觀察、實驗得到的結論為假設(定律或原理),再經過新的實驗、觀察或推理得出新的結論,且該結論必須與以往的實驗結論不矛盾,要經得起實驗的驗證。因此,實驗是實證思維判斷結論的標準。
隨著科技的進步,人類認識世界的能力大大提升,也極大地推進了人類改造世界的能力。人們試圖構造、實現自然界不存在的事物,但自然界不存在的事物既不同于由實證思維得到的自然規律,也不同于依靠邏輯推導得到的結論,它具有可構造、可實現、可重復、可驗證、可表達等特性,比如建筑設計。以自然界知識為前提,設計可行的方案,創造自然界原本不存在的事物,這就是計算思維。
計算思維的標志是有限性、確定性和機械性[3]。計算思維通過對問題進行描述、規劃,對處理對象進行抽象、資源調配、算法設計等操作而得到結論(實施方案),判斷結論的標準為方案的可行性。只要方案滿足計算思維的三個標志,即視為可行。而如何求解問題,將理論實現的過程轉換為現實可實現的過程是計算思維的核心。計算機的出現,使該核心得以實現和發展。從思維的角度看,計算機科學主要研究計算思維的概念、方法和內容,并發展成為解決問題的一種思維模式[4]。
1.2 計算思維的表述體系
前ACM主席Denning為了方便各學科理解計算原理,提出“偉大的計算原理”,并將其歸納為7個類別,陳國梁等在此基礎上增加了“抽象”類,提出了表1中基于“偉大的計算原理”構建的計算思維表述體系框架[6]。
2 計算思維在C語言中的案例分析
2010年9月發表的九校聯盟(C9)計算機基礎教學發展戰略聯合聲明指出:把“計算思維能力的培養”作為計算機基礎教學的核心任務[7]。表明計算思維能力已成為當今復合型創新人才不可或缺的基本素質。
在計算機學科中,計算機程序設計語言用以描述問題求解的實現步驟,學習程序設計語言是培養計算思維能力的有效方法。以下以C語言為例討論其支持計算思維體系框架的知識點。
2.1 C語言基本知識點
C語言作為算法描述語言,初學者需掌握數據存儲基本結構、結構化程序設計、模塊化等知識點。
2.1.1 數據存儲基本結構
需要解決某個問題必定會涉及其所要處理的數據,組織數據形成一定的邏輯關系,使其對應不同的數據結構。但無論多復雜的數據結構,均可以由一些基本的數據結構單元所組成。
以數據存儲位置的連貫性進行分類,C語言中的基本數據結構單元如圖1所示。
2.1.2 結構化程序設計
結構化程序設計方法指出,任何一個程序均可用三種基本控制結構(順序、選擇、循環)來構造,其采用的原則為“自頂向下,逐步求精”,模塊化與計算思維的方法一致。在C語言中,用if語句來實現選擇結構,用while、do…while、for語句來實現循環結構。
2.1.3 模塊化
龐大的系統伴隨著冗長的代碼,給閱讀、修改帶來了困難。將項目任務分成多個能獨立完成某項功能的模塊,可提供模塊間的通訊方式,使系統的結構規劃更加清晰,契合培養計算思維的表述體系。
2.2 案例分析示例
在程序設計教學中,應將計算思維的訓練滲透到解題步驟中,遵循“問題分析及抽象——算法設計——程序設計——測試”過程。在該過程中,問題分析及抽象是關鍵,對問題的分解、建模將直接影響問題的可解性、高效性。下文為案例的部分解題分析,旨在體現計算思維的部分訓練過程。
案例1 從鍵盤輸入一個數a,在屏幕上輸出一個由星號組成的菱形,星號之間空一個空格,最長一行星號數量為a,比如a=7,則輸出圖案如圖2所示。
解題分析:
(1)問題分析及抽象
此問題只輸出星號,且每行星號數量不同。可采用DOS系統和圖形界面兩種模式在屏幕上顯示圖形。在DOS系統下,字符按照從上到下,從左到右的順序輸出;在圖形模式下,字符按照給定的坐標輸出。此例采用DOS系統模式輸出。
(2)算法設計
此例并不做復雜的數據處理,無需采用聚類等算法,只需觀察其輸出規律,控制輸出的行數、每行的星號數及第一個星號前的空格數即可。其中輸出行數采用一個外層循環控制,輸出的每行星號數及第一個星號前的空格數分別用兩個同級的循環來控制。
其中,a表示最長行星號數,即總行數;i表示外層循環的控制變量,以控制輸出行數;m表示每行第一個星號前的空格數,初始值為a,變化規律為先遞減2,在a/2+1行后遞增2;n表示每行輸出的星號數,初始值為1,變化規律為先遞增2,在a/2+1行后遞減2;j表示兩個內層循環的循環控制變量。算法見表2所列。
表2 菱形星號圖輸出算法
算法1:菱形星號圖輸出算法
輸入:無 輸出:菱形圖
1. 輸入a
2. i=1; m=a; n=1
3. for i=1 to a
4. for j=1 to m 輸出1個空格
5. for j=1 to n 輸出”* ”
6. 如果i<=a/2+1 那么m=m-2; n=n+2
7. 否則m=m+2; n=n-2
案例2 設計一個能夠和小孩玩撲克接龍游戲的機器。游戲規則:將一副撲克平均分成兩份,每個人將牌面反扣。兩個人依次從上到下取牌放到接牌區,如圖3所示。當手上取到的牌與接牌區的任一張牌相同時,兩張相同牌之間的所有牌歸出牌人,擁有牌數為零者則輸。
問題分析及抽象:
程序界面可采用圖形模式,通過檢測按鍵或鼠標的動作出牌。
此問題需要處理54張牌面數據。將牌面數據分成機器區、孩子區、接牌區三類。機器區和孩子區的撲克牌初始化后隨機抽取平分,每一份牌的順序與初始化的順序有關,接牌區牌的順序與牌本身出現的順序有關。由上述描述可知,可采用三個隊列存儲撲克牌數據,通過一維數組實現。程序模塊如圖4所示。
設數組a[]、b[]、c[]分別代表機器、孩子、接牌區的撲克牌。
初始化牌:54張撲克牌位置隨機排列,將前27張分給a數組,后27張分給b數組。模塊的輸入、輸出參數是兩個數組名。
出牌:對每個出牌方取當前隊列(數組a或b)中的第一個元素。模塊的輸入參數是數組名,輸出參數是第1張牌。
接牌檢測:將通過出牌操作拿到的牌與數組c中的元素自后往前進行比對,若均不同則加至數組c尾部,當有相同的牌面時,將相同元素位置及其后的所有牌移動到出牌方隊列的尾部。接牌區數組名、出牌方數組名、出牌方第1張牌是模塊的輸入參數,無輸出參數。
3 結 語
程序設計是培養計算思維的重要方法,就如何使用計算機科學的基本概念、基本方法來解決問題進行訓練。無論采用哪種策略來教學,都應將計算思維的訓練貫穿其中,重點在于問題的分解、模塊化、模塊間的通訊方式等,因此案例的選擇應具有代表性、典型性。
當然,計算思維的養成需要一段時間的積累,更需要計算思維的熟練使用,直至擁有移植此方法來處理除計算機問題之外問題的能力,因此程序設計教學任重而道遠。
參考文獻
[1]蔣宗禮.計算思維之我見[J].中國大學教學,2013(9):5-10.
[2] Seymour Papert.An Exploration in the Space of Mathematics Educations[J]. International Journal of Computers for Mathematical Learning, 1996,1(1):95-123.
[3] Jeannette M Wing. Computational Thinking[J].Communications of the ACM, 2006, 49(3):33-35.
[4]李廉.計算思維——概念與挑戰[J].中國大學教學,2012(1):7-12.
[5]李廉.關于計算思維的特質性[J].中國大學教學,2014(11):7-14.
[6]陳國良,董榮勝.計算思維的表述體系[J].中國大學教學,2013(12):22-26.
[7]九校聯盟(C9)計算機基礎教學發展戰略聯合聲明[J].中國大學教學,2010(9):4.
[8]黃磊,傅籬,申壽云.基于AT89C51的C語言實驗與實踐教學改革與探索[J].物聯網技術,2016,6(6):119-120.