張化川,楊林,黎在萬
(重慶郵電大學(xué)軟件工程學(xué)院,重慶 400065)
基于計(jì)算思維的計(jì)算機(jī)表達(dá)式教學(xué)方法實(shí)踐
張化川,楊林,黎在萬
(重慶郵電大學(xué)軟件工程學(xué)院,重慶 400065)
針對(duì)計(jì)算機(jī)表達(dá)式教學(xué)中普遍存在重知識(shí)輕運(yùn)用,甚至有些教材中有違反計(jì)算機(jī)編譯原理等問題,提出按照運(yùn)算符的優(yōu)先級(jí)、結(jié)合律以及運(yùn)算符中操作數(shù)的順序確定運(yùn)算符的執(zhí)行順序和按照運(yùn)算符的語義在馮·諾依曼機(jī)上逐個(gè)計(jì)算表達(dá)式中運(yùn)算符的兩步教學(xué)方法。學(xué)生在運(yùn)用該方法的過程中,學(xué)習(xí)數(shù)據(jù)類型、變量和運(yùn)算符等相關(guān)的知識(shí)和技術(shù),培養(yǎng)其程序流程的編程思維方式,真正落實(shí)CDIO工程教育思想中“做中學(xué)”和“基于項(xiàng)目教育和學(xué)習(xí)”的方針,培養(yǎng)學(xué)生的“計(jì)算思維”能力。
重慶市研究生教育教學(xué)改革研究項(xiàng)目(No.yjg143008)、全日制專業(yè)碩士研究生實(shí)踐創(chuàng)新能力提升研究(No.yjg153037)、重慶市大學(xué)生創(chuàng)新創(chuàng)業(yè)訓(xùn)練計(jì)劃項(xiàng)目、重慶郵電大學(xué)教學(xué)改革研究項(xiàng)目(No.XJG1215)
表達(dá)式是計(jì)算機(jī)語言的核心內(nèi)容,在程序設(shè)計(jì)課程的教學(xué)中具有重要地位,但實(shí)際的教學(xué)過程中,注重語法等方面的知識(shí)傳授,對(duì)語義等方面的知識(shí)重視不夠,也沒有將所涉及到的基礎(chǔ)知識(shí)系統(tǒng)組織起來講授,缺少運(yùn)用這些知識(shí)解決實(shí)現(xiàn)問題的教學(xué)內(nèi)容,導(dǎo)致學(xué)生只能從一般的數(shù)學(xué)角度理解計(jì)算機(jī)表達(dá)式,不能理解計(jì)算機(jī)表達(dá)式在計(jì)算機(jī)中的運(yùn)算過程,沒有真正理解計(jì)算機(jī)表達(dá)式,出現(xiàn)閱讀、編寫和調(diào)試程序等困難情況,最終嚴(yán)重影響了學(xué)生編程能力的培養(yǎng)。
本文在CDIO工程教育思想指導(dǎo)下,分析了目前教學(xué)中存在的主要問題,根據(jù)計(jì)算機(jī)編譯表達(dá)式的基本原理,提出了按照運(yùn)算符的優(yōu)先級(jí)、結(jié)合律以及運(yùn)算符中操作數(shù)的順序確定運(yùn)算符的執(zhí)行順序和按照運(yùn)算符的語義在馮·諾依曼機(jī)上逐個(gè)計(jì)算表達(dá)式中運(yùn)算符的兩步教學(xué)方法。
在這種教學(xué)方法下,學(xué)生在確定表達(dá)式中運(yùn)算符的執(zhí)行順序和計(jì)算運(yùn)算符的過程中,學(xué)習(xí)數(shù)據(jù)類型、變量和運(yùn)算符等相關(guān)的知識(shí)和技術(shù),培養(yǎng)其程序流程的編程思維方式,真正落實(shí)CDIO工程教育思想中“做中學(xué)”和“基于項(xiàng)目教育和學(xué)習(xí)”的方針[1-2],培養(yǎng)學(xué)生的“計(jì)算思維”,探尋一種計(jì)算思維能力培養(yǎng)“落地”[3]的新方法。
2006年3月,美國卡內(nèi)基·梅隆大學(xué)計(jì)算機(jī)科學(xué)系主任周以真(Jeannette M.Wing)教授在美國計(jì)算機(jī)權(quán)威期刊Communications of the ACM雜志上給出,并定義了計(jì)算思維(Computational Thinking)。周教授認(rèn)為:計(jì)算思維是運(yùn)用計(jì)算機(jī)科學(xué)的基礎(chǔ)概念進(jìn)行問題求解、系統(tǒng)設(shè)計(jì),以及人類行為理解等涵蓋計(jì)算機(jī)科學(xué)之廣度的一系列思維活動(dòng)[4-5]。
計(jì)算思維即運(yùn)用計(jì)算機(jī)科學(xué)的基礎(chǔ)概念去求解問題 、設(shè)計(jì)系統(tǒng)和理解人類的行為[6-7]。計(jì)算思維包含兩個(gè)A[4,8]:Abstraction抽象,計(jì)算思維同時(shí)在多個(gè)抽象層次上同時(shí)進(jìn)行,計(jì)算思維定義層次間的關(guān)系;Automa鄄tion自動(dòng)化,即計(jì)算思維的思考方式是:使抽象層次及其關(guān)系機(jī)械化。
計(jì)算機(jī)表達(dá)式來源于數(shù)學(xué)表達(dá)式,表示了計(jì)算機(jī)中的一個(gè)操作序列,從計(jì)算思維角度來講,就是將計(jì)算機(jī)中的一個(gè)操作序列抽象為表達(dá)式,將操作抽象為運(yùn)算符,序列抽象為運(yùn)算符的優(yōu)先級(jí)和結(jié)合律,以及運(yùn)算符操作數(shù)的計(jì)算順序,將操作的對(duì)象抽象為變量和數(shù)據(jù)類型,并Automation自動(dòng)化地計(jì)算這個(gè)操作序列。因此,計(jì)算機(jī)表達(dá)式的教學(xué)重點(diǎn)為,根據(jù)表達(dá)式的數(shù)學(xué)特性確定表達(dá)式中運(yùn)算符的計(jì)算順序,并在馮·諾依曼體系結(jié)構(gòu)(又稱馮·諾依曼機(jī))上Automation自動(dòng)化地計(jì)算這個(gè)操作序列。在確定運(yùn)算符的計(jì)算順序中,學(xué)習(xí)運(yùn)算符的優(yōu)先級(jí)和結(jié)合律,從數(shù)學(xué)的抽象層次理解掌握表達(dá)式,在計(jì)算表達(dá)式過程中,學(xué)習(xí)運(yùn)算符所規(guī)定的操作步驟,學(xué)習(xí)理解運(yùn)算符的語義,學(xué)習(xí)理解變量及數(shù)據(jù)類型,從計(jì)算機(jī)技術(shù)層次理解掌握表達(dá)式。
本文根據(jù)計(jì)算機(jī)編譯表達(dá)式的原理,提出了按照運(yùn)算符的優(yōu)先級(jí)、結(jié)合律以及運(yùn)算符中操作數(shù)的順序確定運(yùn)算符的執(zhí)行順序和按照運(yùn)算符的語義在馮·諾依曼機(jī)上逐個(gè)計(jì)算表達(dá)式中運(yùn)算符的兩步教學(xué)方法。
學(xué)生在確定表達(dá)式中運(yùn)算符的執(zhí)行順序和計(jì)算運(yùn)算符的過程中,學(xué)習(xí)數(shù)據(jù)類型、變量和運(yùn)算符等相關(guān)的知識(shí)和技術(shù),培養(yǎng)程序流程的編程思維方式。
從本質(zhì)上講,計(jì)算機(jī)表達(dá)式描述的是一個(gè)計(jì)算機(jī)中的操作序列,并沒有要求滿足交換律和結(jié)合律等數(shù)學(xué)定律,在實(shí)際編程中,程序員也不會(huì)關(guān)注這些數(shù)學(xué)定律,而是關(guān)注按照表達(dá)式規(guī)定操作順序,逐個(gè)進(jìn)行運(yùn)算,最后能否得預(yù)期的結(jié)果。因此,確定表達(dá)式中運(yùn)算符的順序,是一個(gè)程序員必須掌握的方法。
計(jì)算機(jī)語言很多,對(duì)表達(dá)式的編譯方法有一定的區(qū)別,但都基于相同的原理和方法,這些原理和方法都要落腳到表達(dá)式的遞歸定義,表達(dá)式的遞歸定義實(shí)際上規(guī)定了表達(dá)式的語法。為了便于理解,我們給出了如下的遞歸定義。
(1)常量和變量等是表達(dá)式;
(2)表達(dá)式經(jīng)過運(yùn)算符運(yùn)算后仍然是一個(gè)表達(dá)式。
“遞歸”這種方法,在中學(xué)數(shù)學(xué)的數(shù)學(xué)歸納法中已深入學(xué)習(xí),很容易從遞歸或遞推兩個(gè)方向理解遞歸定義,遞推方向的順序剛好是表達(dá)式的運(yùn)算順序,遞歸過程就是確定一個(gè)表達(dá)式中運(yùn)算順序的過程,這也是編譯表達(dá)式的數(shù)學(xué)基礎(chǔ)。我們將這個(gè)過程總結(jié)如下:
(1)根據(jù)優(yōu)先級(jí)和結(jié)合性找到表達(dá)式中最后計(jì)算的運(yùn)算符;
(2)根據(jù)這個(gè)運(yùn)算符規(guī)定的操作數(shù)順序依次計(jì)算所包含的表達(dá)式,然后再計(jì)算這個(gè)運(yùn)算符;
(3)若表達(dá)式已是變量或常量,不用計(jì)算。
C++標(biāo)準(zhǔn)文檔[9-10]中,計(jì)算機(jī)語言中的大多數(shù)運(yùn)算符都沒有規(guī)定操作數(shù)的計(jì)算順序,只有少部分運(yùn)算符,如邏輯運(yùn)算符,規(guī)定了操作數(shù)的計(jì)算順序,導(dǎo)致了不同的編譯器可能計(jì)算順序不同,但在一個(gè)編譯器上計(jì)算順序一定是確定的,這可能導(dǎo)致編寫的表達(dá)式出現(xiàn)兼容性問題,在教學(xué)中需要重復(fù)強(qiáng)調(diào)。為了便于講解和學(xué)習(xí),本文假設(shè)沒有規(guī)定操作數(shù)計(jì)算順序的運(yùn)算符,它的操作數(shù)計(jì)算順序都是從左到右依次計(jì)算。
確定了表達(dá)式中運(yùn)算符的計(jì)算順序后,再根據(jù)運(yùn)算符的語義,在馮·諾依曼機(jī)上依次計(jì)算所有運(yùn)算符。從硬件上講,計(jì)算機(jī)的種類很多,但直到現(xiàn)在,仍然沒有突破馮·諾依曼體系結(jié)構(gòu),仍然是程序設(shè)計(jì)的理論基礎(chǔ),所以選擇從邏輯上在馮·諾依曼機(jī)上運(yùn)行表達(dá)式。
學(xué)生在確定表達(dá)式中運(yùn)算符的執(zhí)行順序和計(jì)算運(yùn)算符的過程中,學(xué)習(xí)數(shù)據(jù)類型、變量和運(yùn)算符等相關(guān)的知識(shí)和技術(shù)。
(1)變量和數(shù)據(jù)類型
變量的概念來源于數(shù)學(xué)中的“變量”,具有數(shù)學(xué)層次的抽象特性,也具有計(jì)算機(jī)技術(shù)層面的抽象特性,即代表計(jì)算機(jī)中的內(nèi)存,這也導(dǎo)出了數(shù)據(jù)類型的概念。從數(shù)學(xué)層次理解變量比較容易,教學(xué)的重點(diǎn)是從計(jì)算機(jī)技術(shù)層面掌握變量及數(shù)據(jù)類型的概念。
從計(jì)算機(jī)技術(shù)層面來講,變量代表的就是計(jì)算機(jī)中的一塊內(nèi)存,涉及到變量名、數(shù)據(jù)類型、存貯的值等概念,內(nèi)存的首地址、內(nèi)存的長度等術(shù)語,還涉及到為變量分配內(nèi)存、從變量中取數(shù)據(jù),將數(shù)據(jù)存到變量等3個(gè)基礎(chǔ)操作,這些是教學(xué)的重點(diǎn)也是教學(xué)的難點(diǎn)。
如圖1所示,描述了變量相關(guān)教學(xué)內(nèi)容之間的關(guān)系,便于從計(jì)算機(jī)技術(shù)層面掌握相關(guān)的概念。
圖1 變量相關(guān)教學(xué)內(nèi)容間的關(guān)系
(2)運(yùn)算符
從計(jì)算機(jī)技術(shù)層面講,運(yùn)算符表示了一個(gè)操作序列,包含語法和語義兩方面的內(nèi)容,運(yùn)算符語法相對(duì)比較好理解,語義是教學(xué)的重點(diǎn),它規(guī)定了運(yùn)算符表示的操作序列以及操作對(duì)象的要求,每個(gè)運(yùn)算符還應(yīng)有一個(gè)運(yùn)算結(jié)果,因此,運(yùn)算符的主要教學(xué)內(nèi)容包括操作對(duì)象、操作序列、運(yùn)算結(jié)果及類型轉(zhuǎn)換等內(nèi)容。這些在計(jì)算機(jī)語言標(biāo)準(zhǔn)文本中都有詳細(xì)的規(guī)定,但對(duì)學(xué)生是新的內(nèi)容,是教學(xué)的難點(diǎn)。下面舉例說明教學(xué)的過程。
國內(nèi)外大部分高校都將C++列為計(jì)算機(jī)大類專業(yè)入門語言,并被程序員廣泛使用。因此本文選用C++語言中具有代表性的數(shù)學(xué)表達(dá)式和計(jì)算機(jī)中特殊的表達(dá)式,舉例闡述運(yùn)用本文提出的教學(xué)方法進(jìn)行教學(xué)的過程。
表達(dá)式x=c*f+(f/u-i%3)中c、f、u、i分別為char、float、unsigned、int類型的變量,該表達(dá)式不僅囊括了幾乎所有算術(shù)運(yùn)算,同時(shí)也涉及到不同數(shù)據(jù)類型間的轉(zhuǎn)換,因此極具代表性。轉(zhuǎn)換規(guī)則表大部分教材[11-13]中都有描述,本文不再累述,下文將舉例說明。
圖 2采用本文兩步教學(xué)法確定的表達(dá)式執(zhí)行順序
(1)表達(dá)式中運(yùn)算符的計(jì)算順序
1)根據(jù)運(yùn)算符的優(yōu)先級(jí)和結(jié)合律確定表達(dá)式x= c*f+(f/u-i%3)中最后執(zhí)行的運(yùn)算符為“=”。
2)根據(jù)運(yùn)算符“=”的操作數(shù)的順序依次計(jì)算表達(dá)式x和c*f+(f/u-i%3)。由于表達(dá)式x中沒有運(yùn)算符,因此不需要計(jì)算,只需計(jì)算表達(dá)式c*f+(f/u-i%3)。
3)根據(jù)運(yùn)算符的優(yōu)先級(jí)和結(jié)合律確定表達(dá)式c*f+(f/u-i%3)中最后執(zhí)行的運(yùn)算符為“+”。
4)根據(jù)運(yùn)算符“+”的操作數(shù)的順序依次計(jì)算表達(dá)式c*f和(f/u-i%3)。
5)表達(dá)式c*f運(yùn)算符只有 “*”,直接計(jì)算表達(dá)式c*f,在圖2中標(biāo)記為①。
6)根據(jù)運(yùn)算符的優(yōu)先級(jí)和結(jié)合律確定表達(dá)式 (f/ u-i%3)中最后執(zhí)行的運(yùn)算符為“-”。表達(dá)式(f/u-i%3)中的“()”的作用為改變運(yùn)算符的優(yōu)先級(jí),并無其他語義。
7)根據(jù)運(yùn)算符“-”的操作數(shù)的順序依次計(jì)算表達(dá)式f/u和i%3。在圖2中分別標(biāo)記為②、③。
8)直接計(jì)算表達(dá)式(f/u-i%3)中的運(yùn)算符“-”,在圖2中標(biāo)記為④。
9)直接計(jì)算表達(dá)式c*f+(f/u-i%3)中的運(yùn)算符“+”,在圖2中標(biāo)記為⑤。
10)直接計(jì)算表達(dá)式x=c*f+(f/u-i%3)中的運(yùn)算符“=”,在圖2中標(biāo)記為⑥。
(2)按順序計(jì)算表達(dá)式中的運(yùn)算符
1)根據(jù)運(yùn)算符“*”的語義直接計(jì)算表達(dá)式c*f。從變量c中值取出一個(gè)char類型的值轉(zhuǎn)換為double,再從變量f中取出一個(gè)float類型的值轉(zhuǎn)換為double,相乘后得到一個(gè)double類型的值。
2)根據(jù)運(yùn)算符“/”的語義直接計(jì)算表達(dá)式f/u。從變量f中取出一個(gè)float類型的值轉(zhuǎn)換為double,再從變量u中取出一個(gè)unsigned char型的值轉(zhuǎn)換為double,相除后得到一個(gè)double類型的值。
3)根據(jù)運(yùn)算符“%”的語義直接計(jì)算表達(dá)式i%3。從變量i中取出一個(gè)int類型的值對(duì)3取余,得到一個(gè)int類型的值。
4)根據(jù)運(yùn)算符“-”的語義直接計(jì)算表達(dá)式(f/u-i% 3)。將(的計(jì)算結(jié)果與轉(zhuǎn)換成double類型的(的計(jì)算結(jié)果相減,得到一個(gè)double類型的值。
5)根據(jù)運(yùn)算符“+”的語義直接計(jì)算表達(dá)式c*f+(f/u-i%3)。將(的計(jì)算結(jié)果與(的計(jì)算結(jié)果相加,得到一個(gè)double類型的值。
⑥根據(jù)運(yùn)算符“=”的語義直接計(jì)算表達(dá)式x=c*f+(f/u-i%3)。將(的計(jì)算得到的double類型的值存到表達(dá)式x的指定內(nèi)存中,得到變量x。
圖3 確定u=i++-,a=++i執(zhí)行順序的過程
根據(jù)前面講述的方法,在圖3中,標(biāo)出了該表達(dá)式的計(jì)算順序,計(jì)算次序如下。
①根據(jù)“++”的語義計(jì)算表達(dá)式i++。i++中的“++”為后增量,將1加到變量i中,并得到原來的值(未加1的整數(shù))。
②根據(jù)運(yùn)算符“=”的語義計(jì)算表達(dá)式u=i++。將①得到的值存在到表達(dá)式u指定的內(nèi)存中,得到變量u。
③根據(jù)“++”的語義計(jì)算表達(dá)式++i。++i中的“++”為前增量,將1加到變量i中,并得到變量i(左值lval鄄ue)。
④根據(jù)運(yùn)算符“=”的語義計(jì)算表達(dá)式a=++i。將③變量i的值存取出,存到表達(dá)式a指定的內(nèi)存中。
⑤根據(jù)運(yùn)算符“,”的語義計(jì)算表達(dá)u=i++,a=++i。運(yùn)算符“,”的語義是從左到右依次計(jì)算各個(gè)表達(dá)式,結(jié)果是最后一個(gè)表達(dá)式的計(jì)算,即④得到的變量a。
本文選取表達(dá)式作為教學(xué)研究實(shí)踐內(nèi)容,提出了按照運(yùn)算符的優(yōu)先級(jí)、結(jié)合律以及運(yùn)算符中操作數(shù)的順序確定運(yùn)算符的執(zhí)行順序和按照運(yùn)算符的語義在馮·諾依曼機(jī)上逐個(gè)計(jì)算表達(dá)式中運(yùn)算符的兩步教學(xué)方法,該方法在傳授語法知識(shí)的同時(shí),更加注重語義等方面知識(shí)的傳授。學(xué)生運(yùn)用該方法在確定表達(dá)式中運(yùn)算符的執(zhí)行順序和計(jì)算運(yùn)算符的過程中,系統(tǒng)學(xué)習(xí)數(shù)據(jù)類型、變量和運(yùn)算符等相關(guān)的知識(shí)和技術(shù),真正理解計(jì)算機(jī)表達(dá)式在計(jì)算機(jī)中的運(yùn)算過程,真正理解計(jì)算機(jī)表達(dá)式,為閱讀、編寫和調(diào)試程序打下堅(jiān)實(shí)基礎(chǔ),真正落實(shí)了CDIO工程教育思想中“做中學(xué)”和“基于項(xiàng)目教育和學(xué)習(xí)”的方針,培養(yǎng)了學(xué)生的“計(jì)算思維”能力。
[1]李竹林.基于CDIO教育理念的高校計(jì)算機(jī)專業(yè)課程教學(xué)改革探討[J].教育與職業(yè),2012(20):127-128.
[2]查建中.論“做中學(xué)”戰(zhàn)略下的CDIO模式[J].高等工程教育研究,2008(03):1-6.
[3]馮博琴.對(duì)于計(jì)算思維能力培養(yǎng)“落地”問題的探討[J].中國大學(xué)教學(xué),2012(09):6-9.
[4]Jeannette M.Wing.Computational Thinking[J].Communication of the ACM,2006,49(3):33-35.
[5]姚天昉.在程序設(shè)計(jì)課程中引入“計(jì)算思維”的實(shí)踐[J].中國大學(xué)教學(xué),2012(02):61-62.
[6]韓秋楓,孔波,李祁.大學(xué)計(jì)算機(jī)課程引入基于計(jì)算思維的問題探究式教學(xué)的思考[J].計(jì)算機(jī)工程與科學(xué),2014(04):186:190.
[7]陳杰華,戴麗娟.以培養(yǎng)計(jì)算思維為核心的程序設(shè)計(jì)實(shí)驗(yàn)教學(xué)[J].實(shí)驗(yàn)技術(shù)與管理,2011(01):125~127.
[8]董榮勝.計(jì)算思維與計(jì)算機(jī)導(dǎo)論[J].計(jì)算機(jī)科學(xué),2009(04):50~52.
[9]Kenneth Slonneger,Barry L.Kurtz.Formal Syntax and Semantics of Programming Languages:a Laboratory Based Approach[M].USA:Addison-Wesley Pub.Co.,1995.
[10]Internationg Standard-C++Standard ISO/IEC14882[M].American National Standards Institute,1998.
[11]錢能.C++程序設(shè)計(jì)教程——設(shè)計(jì)思想與實(shí)現(xiàn)[M].北京:清華大學(xué)出版社,2009.
[12]譚浩強(qiáng).C程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2009.
[13]葉乃文,王丹.Java語言程序設(shè)計(jì)教程[M].北京:機(jī)械工業(yè)出版社,2010.
Practice of Com puter Expression Teaching Method Based on Com putational Thinking
ZHANG Hua-chuan,YANG Lin,LIZai-wan
(School of Software Engineering,Chongqing University of Posts and Telecommunications,Chongqing 400065)
According to ignoring knowledge application,even violating compilation principle of computer about teaching programming expression, puts forward two steps teachingmethod.According to operator priority,associative property,and the sequential of operation number in the two sides of the operator,we can determine the order of executing operator and calculating expressions one by one in the John von Neu鄄mann machine.Applies thismethod,students are going to lean the knowledge and technologies about data types,variables and operators, and it is going to train way of programming thinking.It really implements the policy of CDIO engineering education thinking of learning by doing and educating and learning in project,and trains the ability of Computational Thinking.
張化川(1979-),男,四川大竹人,碩士,實(shí)驗(yàn)師,從事領(lǐng)域?yàn)橛?jì)算機(jī)基礎(chǔ)課程的教學(xué)以及神經(jīng)網(wǎng)絡(luò)研究工作
2017-03-09
2017-04-20
1007-1423(2017)13-0007-05
10.3969/j.issn.1007-1423.2017.13.002
計(jì)算機(jī)語言;計(jì)算思維;表達(dá)式;CDIO
楊林(1995-),男,山東青島人,本科,從事領(lǐng)域?yàn)檐浖Q芯抗ぷ?/p>
黎在萬(1995-),女,四川瀘縣人,本科,從事領(lǐng)域?yàn)檐浖Q芯抗ぷ?/p>
Programming Languages;Computational Thinking;Programming Expression;CDIO