• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      Android平臺(tái)上基于卷積神經(jīng)網(wǎng)絡(luò)的手寫(xiě)數(shù)字識(shí)別實(shí)驗(yàn)

      2017-11-09 08:46:51朱虎明緱水平田小林焦李成張小華
      計(jì)算機(jī)教育 2017年11期
      關(guān)鍵詞:程序設(shè)計(jì)教材

      朱虎明,羅 政,緱水平,田小林,焦李成,張小華

      (西安電子科技大學(xué) 電子工程學(xué)院,陜西 西安 710071)

      劉喜平, 萬(wàn)常選, 舒 蔚, 駱?biāo)刮?/p>

      (江西財(cái)經(jīng)大學(xué) 信息管理學(xué)院, 江西 南昌 330013)

      Android平臺(tái)上基于卷積神經(jīng)網(wǎng)絡(luò)的手寫(xiě)數(shù)字識(shí)別實(shí)驗(yàn)

      朱虎明,羅 政,緱水平,田小林,焦李成,張小華

      (西安電子科技大學(xué) 電子工程學(xué)院,陜西 西安 710071)

      卷積神經(jīng)網(wǎng)絡(luò)算法由于良好的性能已經(jīng)廣泛使用在自動(dòng)駕駛、語(yǔ)音識(shí)別和圖像分類等領(lǐng)域,為增強(qiáng)學(xué)生學(xué)習(xí)和利用卷積神經(jīng)網(wǎng)絡(luò)算法的能力,文章設(shè)計(jì)在Android平臺(tái)上基于TensorFlow卷積神經(jīng)網(wǎng)絡(luò)的手寫(xiě)數(shù)字識(shí)別實(shí)驗(yàn),并說(shuō)明實(shí)施過(guò)程,同時(shí)介紹卷積神經(jīng)網(wǎng)絡(luò)算法、Android平臺(tái)相關(guān)技術(shù)原理和實(shí)驗(yàn)過(guò)程。

      卷積神經(jīng)網(wǎng)絡(luò); 手寫(xiě)數(shù)字識(shí)別;Android; TensorFlow

      1 背 景

      2006年加拿大多倫多大學(xué)的Hinton教授提出了基于“逐層訓(xùn)練”和“精調(diào)”的兩階段策略,解決深度神經(jīng)網(wǎng)絡(luò)中參數(shù)訓(xùn)練的難題,此后紐約大學(xué)的LeCun、蒙特利爾大學(xué)的Bengio和斯坦福大學(xué)的Andrew Ng等人對(duì)深度神經(jīng)網(wǎng)絡(luò)展開(kāi)研究,并提出深度自編碼器(Deep Auto Encoder)、深度置信網(wǎng)(Deep Belief Networks)、卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks)等深度模型[1]。深度神經(jīng)網(wǎng)絡(luò)獲得學(xué)術(shù)界和工業(yè)界的廣泛關(guān)注,在圍棋和德州撲克等領(lǐng)域獲得突破性進(jìn)展,而且深度學(xué)習(xí)的相關(guān)課程也逐漸進(jìn)入高校。在國(guó)內(nèi),吳立德教授在復(fù)旦大學(xué)開(kāi)設(shè)了深度學(xué)習(xí)課程;在國(guó)外,一些知名高校也開(kāi)設(shè)了深度學(xué)習(xí)課程,如斯坦福大學(xué)、牛津大學(xué)、紐約大學(xué)等。目前,深度學(xué)習(xí)在本科教學(xué)中目前涉及的內(nèi)容還比較少,為幫助學(xué)生更好的理解和學(xué)習(xí)算法,筆者設(shè)計(jì)在Android平臺(tái)上進(jìn)行深度學(xué)習(xí)實(shí)驗(yàn),實(shí)驗(yàn)以卷積神經(jīng)網(wǎng)絡(luò)為例,利用TensorFlow深度學(xué)習(xí)框架并將其應(yīng)用于手寫(xiě)體識(shí)別。

      卷積神經(jīng)網(wǎng)絡(luò)是近年發(fā)展起來(lái)并引起廣泛重視的一種高效識(shí)別方法。20世紀(jì)60年代,Hubel和Wiesel在研究貓腦皮層中的神經(jīng)元時(shí)發(fā)現(xiàn)其獨(dú)特的網(wǎng)絡(luò)結(jié)構(gòu)可以有效地降低反饋神經(jīng)網(wǎng)絡(luò)的復(fù)雜性,繼而提出卷積神經(jīng)網(wǎng)絡(luò)?,F(xiàn)在,卷積神經(jīng)網(wǎng)絡(luò)已經(jīng)成為眾多科學(xué)領(lǐng)域的研究熱點(diǎn)之一,特別是在模式分類領(lǐng)域,由于卷積神經(jīng)網(wǎng)絡(luò)算法避免了對(duì)圖像手工提取特征等步驟,因而得到更為廣泛的應(yīng)用。

      隨著智能終端在全球范圍內(nèi)的普及,目前主流的智能手機(jī)操作系統(tǒng)有谷歌公司的Android系統(tǒng)、蘋果公司的iOS系統(tǒng)和微軟公司的Windows Phone系統(tǒng),由于Android系統(tǒng)的開(kāi)源特性,使得華為、三星、小米等廠商的手機(jī)都采用了Android操作系統(tǒng)。2017年5月,NetMarketShare數(shù)據(jù)網(wǎng)站公布了手機(jī)操作系統(tǒng)市場(chǎng)份額,其中Android系統(tǒng)的占有率是65.19%,排名居首。鑒于Android系統(tǒng)越來(lái)越廣的使用領(lǐng)域,目前高校開(kāi)設(shè)了很多基于Android系統(tǒng)的實(shí)驗(yàn)類課程[23]。

      2015年11月9日,Google發(fā)布并開(kāi)源第二代人工智能學(xué)習(xí)系統(tǒng)TensorFlow[4],其命名源于本身的運(yùn)行原理。Tensor(張量)意味著N維數(shù)組,F(xiàn)low(流)意味著基于數(shù)據(jù)流圖的計(jì)算,TensorFlow為張量從流圖的一端流動(dòng)到另一端的計(jì)算,TensorFlow是將復(fù)雜的數(shù)據(jù)輸入至人工智能神經(jīng)網(wǎng)中進(jìn)行分析和處理過(guò)程的系統(tǒng),它可在小到一部智能手機(jī)、大到數(shù)千臺(tái)數(shù)據(jù)中心服務(wù)器的各種設(shè)備上運(yùn)行。

      2 卷積神經(jīng)網(wǎng)絡(luò)算法介紹

      卷積神經(jīng)網(wǎng)絡(luò)是一種前饋神經(jīng)網(wǎng)絡(luò)[5],其基本結(jié)構(gòu)一般包括兩層:其一為特征提取層,每個(gè)神經(jīng)元的輸入與前一層的局部感受相連,并提取該局部的特征[5],一旦該局部特征被提取后,它與其他特征間的位置關(guān)系也隨之確定下來(lái);其二是特征映射層,網(wǎng)絡(luò)的每個(gè)計(jì)算層由多個(gè)特征映射組成,每個(gè)特征映射是一個(gè)平面,平面上所有神經(jīng)元的權(quán)值相等。

      卷積神經(jīng)網(wǎng)絡(luò)主要用來(lái)識(shí)別位移、縮放及扭曲不變性的二維圖像[68]。由于卷積神經(jīng)網(wǎng)絡(luò)的卷積層通過(guò)訓(xùn)練數(shù)據(jù)進(jìn)行學(xué)習(xí),所以在使用時(shí),避免了顯式的特征提取,而隱式地從訓(xùn)練數(shù)據(jù)中進(jìn)行學(xué)習(xí);再者由于同一特征映射面上的神經(jīng)元權(quán)值相同,所以網(wǎng)絡(luò)可以并行學(xué)習(xí)。

      本次實(shí)驗(yàn)的卷積神經(jīng)網(wǎng)絡(luò)是由兩個(gè)卷積層(conv)、兩個(gè)池化層(pool)和兩個(gè)全連接層(fc)以及一個(gè)softmax組成。第一層卷積層有32個(gè)5*5的卷積核,網(wǎng)絡(luò)采用了Relu(Recti fi ed Linear Unit 修正線性函數(shù))作為激活函數(shù)。第二層是最大池化層,求取特征圖后,用大小為2*2池化窗口對(duì)特征圖進(jìn)行池化操作。第三層中,有64個(gè)5*5的卷積核,同樣采用Relu作為激活函數(shù)。第四層也是池化窗口為2*2的最大池化層。第五層是全連接層,有1024個(gè)神經(jīng)元。為了減少過(guò)擬合,在輸出層之前加入dropout算子。只在訓(xùn)練過(guò)程中啟用dropout。第六層也是全連接層,有10個(gè)神經(jīng)元。最后添加一個(gè)softmax層,將網(wǎng)絡(luò)輸出值轉(zhuǎn)換成概率值,網(wǎng)絡(luò)結(jié)構(gòu)如圖1所示。

      3 實(shí)驗(yàn)步驟

      實(shí)驗(yàn)過(guò)程分為兩個(gè)部分,訓(xùn)練過(guò)程和推理過(guò)程。在訓(xùn)練過(guò)程中,首先要建立卷積神經(jīng)網(wǎng)絡(luò)的網(wǎng)絡(luò)結(jié)構(gòu),同時(shí)設(shè)置訓(xùn)練過(guò)程的一些超參數(shù),如學(xué)習(xí)率、動(dòng)力因子、最大迭代次數(shù)等,接著使用訓(xùn)練集對(duì)網(wǎng)絡(luò)參數(shù)進(jìn)行訓(xùn)練,但在部分情況下,會(huì)把訓(xùn)練集劃分出一部分作為驗(yàn)證集用來(lái)交叉驗(yàn)證。推理過(guò)程是用測(cè)試集對(duì)模型進(jìn)行驗(yàn)證。實(shí)驗(yàn)流程如圖2所示。

      圖1 卷積神經(jīng)網(wǎng)絡(luò)網(wǎng)絡(luò)結(jié)構(gòu)

      圖2 實(shí)驗(yàn)流程

      3.1 訓(xùn)練過(guò)程

      卷積神經(jīng)網(wǎng)絡(luò)訓(xùn)練過(guò)程在計(jì)算機(jī)上完成,分為3個(gè)步驟:①建立卷積神經(jīng)網(wǎng)絡(luò)網(wǎng)絡(luò)結(jié)構(gòu);②利用帶有GPU的計(jì)算機(jī)訓(xùn)練模型;③保存模型。

      (1)建立卷積神經(jīng)網(wǎng)絡(luò)網(wǎng)絡(luò)結(jié)構(gòu)。

      TensorFlow深度學(xué)習(xí)框架提供了python語(yǔ)言的API接口,因此利用python編程語(yǔ)言編寫(xiě)訓(xùn)練代碼,建立卷積神經(jīng)網(wǎng)絡(luò)的網(wǎng)絡(luò)結(jié)構(gòu),本次實(shí)驗(yàn)參考TensorFlow官方給出的Deep MNIST for Experts模型訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò)。

      (2)利用帶有GPU的計(jì)算機(jī)訓(xùn)練模型。

      在建立好網(wǎng)絡(luò)結(jié)構(gòu)之后,下一步是訓(xùn)練模型,訓(xùn)練模型的時(shí)間一般比推理時(shí)間長(zhǎng)很多,且模型的超參數(shù)會(huì)影響正確率,所以一般需要多次訓(xùn)練,一般采用安裝有GPU的計(jì)算機(jī)進(jìn)行訓(xùn)練,由于GPU強(qiáng)大的計(jì)算能力,可以大大縮短深度神經(jīng)網(wǎng)絡(luò)的訓(xùn)練時(shí)間。

      本次實(shí)驗(yàn)采用的是MNIST數(shù)據(jù)集,手寫(xiě)數(shù)字MNIST數(shù)據(jù)庫(kù)包含一個(gè)訓(xùn)練樣本集和一個(gè)測(cè)試樣本集,訓(xùn)練樣本集包含60,000個(gè)樣例,測(cè)試樣本集包含10,000個(gè)樣例。圖片被歸一化成一張放在中間部位的28*28像素的灰度圖。該數(shù)據(jù)集包含0~9共10類阿拉伯?dāng)?shù)字。數(shù)據(jù)集共包含4個(gè)文件,它們分別是訓(xùn)練樣本數(shù)據(jù)集、訓(xùn)練數(shù)據(jù)樣本標(biāo)簽集、測(cè)試用例數(shù)據(jù)集和測(cè)試用例數(shù)據(jù)標(biāo)簽集。MNIST的部分樣例如圖3所示。

      圖3 MNIST數(shù)據(jù)集樣例

      本實(shí)驗(yàn)中,訓(xùn)練優(yōu)化方法分別采用Adagrad、GradienDescent和Adam,其中GradienDescent優(yōu)化方法測(cè)試了多組參數(shù),對(duì)比識(shí)別的準(zhǔn)確率(見(jiàn)表1)發(fā)現(xiàn),GradientDescent(學(xué)習(xí)率為0.001)的正確率最高,因此網(wǎng)絡(luò)采用GradientDescent(學(xué)習(xí)率為0.001)的優(yōu)化算法。

      (3)保存模型。

      在模型訓(xùn)練結(jié)束后,使用TensorFlow的API函數(shù)tf.g fi le.FastGFile()將模型保存為.pb文件,該函數(shù)既能保存模型的結(jié)構(gòu),又能夠保存模型中參數(shù)的值。

      表1 優(yōu)化算法對(duì)比表

      3.2 推理過(guò)程

      推理過(guò)程分為兩個(gè)步驟:①搭建Android平臺(tái)上的卷積神經(jīng)網(wǎng)絡(luò)系統(tǒng);②系統(tǒng)性能測(cè)試。

      (1)搭建Android平臺(tái)上的卷積神經(jīng)網(wǎng)絡(luò)。

      本次實(shí)驗(yàn)所用到的集成開(kāi)發(fā)軟件為Android工具Android studio IDE,設(shè)計(jì)開(kāi)發(fā)的Android應(yīng)用程序分為兩個(gè)部分,第一部分是UI界面的設(shè)計(jì),第二部分是將采集的測(cè)試樣本進(jìn)行推理。

      UI界面設(shè)計(jì)主要是和用戶進(jìn)行交互,實(shí)驗(yàn)中使用了兩個(gè)Button和一個(gè)Bitmap控件。系統(tǒng)界面布局如圖4所示,本次實(shí)驗(yàn)中Android應(yīng)用通過(guò)Bitmap和Canvas操作使得界面自適應(yīng)屏幕大小。通過(guò)Android觸控屏記錄手寫(xiě)過(guò)程的軌跡,并將手寫(xiě)軌跡存儲(chǔ)為圖像數(shù)據(jù)即可生成了手寫(xiě)體數(shù)據(jù)。執(zhí)行圖像預(yù)處理,即后臺(tái)處理生成bitmap,作為模型的輸入。一個(gè)Button用作清屏,另一個(gè)Button用作觸發(fā)推理事件,即調(diào)用訓(xùn)練好的模型進(jìn)行推理,并且將返回推理結(jié)果更新到界面上。

      圖4 系統(tǒng)界面布局

      接下來(lái)是將TensorFlow移植到Android平臺(tái)上,首先編譯在Android平臺(tái)上調(diào)用TensorFlow模型需要的jar包和so文件;接著將訓(xùn)練好的模型pb文件放入項(xiàng)目中app/src/main/assets位置,添加jar包和so文件;接下來(lái)是創(chuàng)建接口和實(shí)現(xiàn)調(diào)用,分為四步:導(dǎo)入jar包、導(dǎo)入so文件、Tensor fl ow 接口初始化和模型的調(diào)用。

      然后接下來(lái)的主要工作就是安卓項(xiàng)目的編譯以及將編譯完的apk文件安裝到手機(jī),這部分內(nèi)容與一般的安卓項(xiàng)目沒(méi)有區(qū)別。

      (2)系統(tǒng)性能測(cè)試。

      基于卷積神經(jīng)網(wǎng)絡(luò)的手寫(xiě)數(shù)字識(shí)別APP設(shè)計(jì)完成且安裝到Android設(shè)備后,在運(yùn)行時(shí),利用Android的觸屏功能記錄軌跡,手寫(xiě)完成后,單擊測(cè)試按鈕,調(diào)用模型,進(jìn)行識(shí)別,并輸出結(jié)果到用戶界面。在測(cè)試完成后,單擊清除按鈕,會(huì)將繪圖區(qū)域內(nèi)生成的手寫(xiě)數(shù)字以及識(shí)別結(jié)果清除。

      4 實(shí)驗(yàn)結(jié)果展示

      本次實(shí)驗(yàn)結(jié)果如圖5、圖6所示,由圖5可知,在Android上實(shí)現(xiàn)的手寫(xiě)數(shù)字識(shí)別算法取得了較好的識(shí)別效果。圖6則是無(wú)法正確識(shí)別的實(shí)例,比如當(dāng)字符比較小的時(shí)候或者字符出現(xiàn)在Bitmap的邊緣的時(shí)候,識(shí)別效果不太理想。

      筆者下一步將著重從圖像預(yù)處理方面改善因字符太小和書(shū)寫(xiě)位置偏離中心位置等原因造成手寫(xiě)數(shù)字識(shí)別度不高的問(wèn)題。

      圖5 手寫(xiě)數(shù)字識(shí)別圖—識(shí)別正確

      圖6 手寫(xiě)數(shù)字識(shí)別圖—識(shí)別錯(cuò)誤

      [1] Hinton G E, Salakhutdinov R R. Reducing the dimensionality of data with neural networks[J]. Science, 2006(5786): 504-507

      [2] 劉春.以Android應(yīng)用為案例的軟件工程教學(xué)[J]. 計(jì)算機(jī)教育,2015(11):75-77.

      [3] 劉成明,李瑋瑋. Android手機(jī)開(kāi)發(fā)課程的案例教學(xué)法[J]. 計(jì)算機(jī)教育, 2015(14): 37-40.

      [4] Abadi M, Agarwal A, Barham P, et al. TensorFlow: Large-Scale machine learning on heterogeneous distributed systems[EB/OL].(2016-03-14)[2017-04-05]. http://download. tensor fl ow.ong/paper/white paper 2015.pdf.

      [5] 吳岸城. 神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)[M]. 北京: 電子工業(yè)出版社. 2016.

      [6] 周飛燕, 金林鵬, 董軍. 卷積神經(jīng)網(wǎng)絡(luò)研究綜述[J]. 計(jì)算機(jī)學(xué)報(bào), 2017(7): 1-23.

      [7] 余濱, 李紹滋, 徐素霞, 等. 深度學(xué)習(xí): 開(kāi)啟大數(shù)據(jù)時(shí)代的鑰匙[J]. 工程研究——跨學(xué)科視野中的工程, 2014(3): 234-235.

      [8] 焦李成, 楊淑媛, 劉芳, 等. 神經(jīng)網(wǎng)絡(luò)七十年: 回顧與展望[J]. 計(jì)算機(jī)學(xué)報(bào), 2016(8): 1697-1716.

      1672-5913(2017)11-0159-04

      G642

      西安電子科技大學(xué)新實(shí)驗(yàn)開(kāi)發(fā)與新實(shí)驗(yàn)設(shè)備研制及實(shí)驗(yàn)教學(xué)改革(SY1408)。

      朱虎明,男,副教授,研究方向?yàn)楦咝阅苡?jì)算及其應(yīng)用,zhuhum@mail.xidian.edu.cn。

      (編輯:史志偉)

      教材建設(shè)

      器—術(shù)—道:程序設(shè)計(jì)教材建設(shè)經(jīng)驗(yàn)談

      劉喜平, 萬(wàn)常選, 舒 蔚, 駱?biāo)刮?/p>

      (江西財(cái)經(jīng)大學(xué) 信息管理學(xué)院, 江西 南昌 330013)

      文章編號(hào):1672-5913(2017)11-0163-04

      中圖分類號(hào):G642

      摘 要:介紹編程能力培養(yǎng)的3個(gè)層次:器—術(shù)—道,分析這3個(gè)層次對(duì)能力的要求,然后探討《C程序設(shè)計(jì):方法與實(shí)踐》教材在夯實(shí)編程之器、提煉編程之術(shù)、引導(dǎo)編程之道3個(gè)方面中的做法。

      關(guān)鍵詞:程序設(shè)計(jì); 教材; C語(yǔ)言; 器—術(shù)—道

      基金項(xiàng)目:江西省2013年度普通本科高校卓越工程師教育培養(yǎng)計(jì)劃項(xiàng)目(贛教高字[2013]78 號(hào));江西省高等學(xué)校省級(jí)教改立項(xiàng)重點(diǎn)項(xiàng)目(JXJG-16-4-6);江西財(cái)經(jīng)大學(xué)“3+7+x”專業(yè)主干課程建設(shè)項(xiàng)目(教務(wù)通知字[2017]33號(hào))。

      作者簡(jiǎn)介:劉喜平,男,副教授,研究方向?yàn)閿?shù)據(jù)庫(kù)和數(shù)據(jù)挖掘,lewislxp@gmail.com;

      萬(wàn)常選(通信作者),男,教授,研究方向?yàn)樾畔z索和數(shù)據(jù)挖掘,wanchangxuan@263.net。

      0 引 言

      程序設(shè)計(jì)的境界有3種:器—術(shù)—道。在程序設(shè)計(jì)能力培養(yǎng)方面,一般由“器”入門,通過(guò)熟悉“術(shù)”,最終達(dá)到“道”的境界。在編寫(xiě)程序設(shè)計(jì)教材的時(shí)候,要注意這3個(gè)層次的內(nèi)容安排,并注意它們之間的過(guò)渡。

      1 編程中的“器術(shù)道”

      1.1 編程中的“器”

      《易經(jīng)》曰“形而下者謂之器”,說(shuō)得通俗一些,“器”就是具體工具。在編程中,“器”首先指編程語(yǔ)言,如Java、C/C++。“器”的另一層意思是具體特性。要學(xué)好一門語(yǔ)言,首先要掌握語(yǔ)言的基本特性,如選擇、循環(huán)、函數(shù)等;其次要掌握好這門語(yǔ)言的獨(dú)特特性,如指針操作之于C?!捌鳌钡牡谌龑右馑际蔷唧w的開(kāi)發(fā)和調(diào)試工具。學(xué)任何語(yǔ)言的時(shí)候,初學(xué)者都要熟練掌握一種開(kāi)發(fā)和調(diào)試工具,如C/C++編程,在Linux下要學(xué)會(huì)使用GDB調(diào)試,在Windows下,要會(huì)使用Visual Studio或者其他工具開(kāi)發(fā)。

      1.2 編程中的“術(shù)”

      “術(shù)”是中國(guó)古人對(duì)技藝、技巧、技能的一個(gè)稱謂,比如武術(shù)?!靶g(shù)”強(qiáng)調(diào)的是應(yīng)用,是對(duì)“器”非常熟練基礎(chǔ)上的靈活運(yùn)用。

      在編程中,“術(shù)”對(duì)應(yīng)套路、思路和算法。比如,在C文件編程中,要把一個(gè)二進(jìn)制文件中的某些記錄刪除,直觀的做法是:逐個(gè)記錄掃描,如果記錄需要?jiǎng)h除,則將后面的記錄往前挪動(dòng)。兩種常見(jiàn)的套路是:①創(chuàng)建一個(gè)新的文件,將需要保留的數(shù)據(jù)復(fù)制到新文件中,需要?jiǎng)h除的記錄則跳過(guò),最后將舊文件刪除,將新文件重命名為舊文件,這種刪除套路稱為硬刪除;②軟刪除,不真正地刪除記錄,而是標(biāo)上記號(hào)。這兩種套路各有優(yōu)缺點(diǎn),需要靈活選用。再比如,在一個(gè)應(yīng)用中如果需要將商品按照銷量排序,那么需要用到某種排序算法;如果經(jīng)常需要排序的話,需要考慮用某種數(shù)據(jù)結(jié)構(gòu),如B樹(shù)、堆等。

      1.3 編程中的“道”

      《易經(jīng)》說(shuō)“形而上者謂之道”,也就是說(shuō),“道”是對(duì)事物蘊(yùn)含思想、哲理的反思。掌握了編程之“道”的人,看透了編程工具和語(yǔ)言背后的差別,不再執(zhí)著于某種工具和語(yǔ)言,通常談?wù)摰氖羌軜?gòu)、設(shè)計(jì)模式、框架、抽象、分解等概念。如果要用一個(gè)簡(jiǎn)單的詞語(yǔ)概括編程中的“道”,那就是常說(shuō)的“計(jì)算思維”[1]。

      舉兩個(gè)簡(jiǎn)單的例子說(shuō)明“道”和“術(shù)”在編程上的區(qū)別。對(duì)于二分查找算法,得“術(shù)”者看到的是這個(gè)算法的運(yùn)用前提(數(shù)據(jù)存儲(chǔ)在線性表中且有序)、算法的基本思路等,而得“道”者看到的是這個(gè)算法背后的分治思想;當(dāng)應(yīng)用某一種框架的時(shí)候,得“術(shù)”者看到的是這個(gè)框架的組成、交互方式等,得“道”者看到的是這個(gè)框架背后的思維,如模型、視圖和控制相分離的原則。

      2 編程中的“器術(shù)道”在程序設(shè)計(jì)教材中的體現(xiàn)

      面向初學(xué)者的程序設(shè)計(jì)課程的目標(biāo),是讓學(xué)生掌握“器”,熟悉“術(shù)”,并引導(dǎo)他們感悟“道”。

      2.1 夯實(shí)編程之“器”

      C程序設(shè)計(jì)是一門非常基礎(chǔ)的課程,在“器”這個(gè)層面上,必須要掌握兩部分:一是C語(yǔ)言的知識(shí)點(diǎn);二是C語(yǔ)言的開(kāi)發(fā)和調(diào)試工具。

      大部分教材介紹C語(yǔ)言知識(shí)點(diǎn)的時(shí)候,把這些知識(shí)點(diǎn)分割成若干個(gè)條塊。一種常見(jiàn)的知識(shí)點(diǎn)劃分見(jiàn)圖1,其中虛線框部分可以并列,其先后順序比較隨意。

      圖1 C語(yǔ)言知識(shí)點(diǎn)條塊結(jié)構(gòu)圖

      這種條塊式結(jié)構(gòu)的優(yōu)點(diǎn)是:結(jié)構(gòu)清晰,方便教學(xué)。學(xué)校的教學(xué)實(shí)踐,初期也采取這種教學(xué)模式,但是在實(shí)踐中發(fā)現(xiàn),這種條塊式結(jié)構(gòu)存在以下不足:

      (1)知識(shí)點(diǎn)之間的滲透不夠。

      (2)教學(xué)初期的例子比較簡(jiǎn)單、單調(diào)。

      (3)學(xué)生的綜合訓(xùn)練比較少。

      考慮到這些問(wèn)題,筆者采取一種新的層級(jí)式結(jié)構(gòu):先介紹C語(yǔ)言的內(nèi)核,再系統(tǒng)地介紹C語(yǔ)言知識(shí)點(diǎn),這個(gè)內(nèi)核包含的內(nèi)容如下。

      · C程序的構(gòu)成;

      · 最常見(jiàn)的數(shù)據(jù)類型:int、 fl oat和 double、char 4種基本數(shù)據(jù)類型;

      · 輸入輸出:printf和scanf函數(shù)(只介紹常用的格式控制符);

      · 常量和變量的概念;

      · 運(yùn)算符與表達(dá)式:算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、賦值運(yùn)算符;

      · 語(yǔ)句:簡(jiǎn)單語(yǔ)句、語(yǔ)句塊、if語(yǔ)句、for語(yǔ)句、while語(yǔ)句;

      · 函數(shù)調(diào)用。

      在此基礎(chǔ)上,系統(tǒng)地介紹C語(yǔ)言的知識(shí)點(diǎn)。按照順序分別是:數(shù)據(jù)類型與輸入輸出、運(yùn)算符與表達(dá)式、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、函數(shù)、指針與數(shù)組、C程序運(yùn)行原理、結(jié)構(gòu)體、文件和其他。在這些章節(jié)中,有幾個(gè)部分值得特別介紹。

      (1)數(shù)據(jù)類型與輸入輸出。這一部分與其他教材差別很大。除了基本數(shù)據(jù)類型及其輸入和輸出,也介紹了:

      · 數(shù)組、字符串及其輸入輸出。這里介紹了數(shù)組是如何創(chuàng)建、初始化和遍歷的(用for、while語(yǔ)句),還介紹了puts、gets等常見(jiàn)的字符串輸入和輸出函數(shù),但沒(méi)有直接引入指針的概念。

      · 文本文件輸入輸出,包括fscanf和fprintf兩個(gè)格式化輸入輸出函數(shù)。

      (2)循環(huán)結(jié)構(gòu)。在介紹循環(huán)結(jié)構(gòu)的時(shí)候,引入了選擇排序、冒泡排序、楊輝三角、字符串單詞統(tǒng)計(jì)、文本文件字符統(tǒng)計(jì)等例子,一方面讓學(xué)生更好地掌握復(fù)雜的循環(huán)結(jié)構(gòu),另一方面加強(qiáng)了知識(shí)點(diǎn)的融合,擴(kuò)大了知識(shí)面。

      (3)C程序運(yùn)行原理。這一章包含了所有系統(tǒng)底層的介紹,包括計(jì)算機(jī)的存儲(chǔ)器體系結(jié)構(gòu)、程序的內(nèi)存布局、變量的存儲(chǔ)類型等。這一章的目的是更好地培養(yǎng)學(xué)生的系統(tǒng)觀。

      (4)文件。由于在前面章節(jié)中已經(jīng)對(duì)文本文件的讀寫(xiě)操作進(jìn)行了很多演練,因此這一章主要圍繞二進(jìn)制文件的讀寫(xiě)進(jìn)行。特別地介紹了二進(jìn)制文件記錄的讀、寫(xiě)、刪、查等操作場(chǎng)景。通過(guò)這些例子,可以讓學(xué)生更熟悉文件操作,也更側(cè)重實(shí)際應(yīng)用。

      通過(guò)這樣的安排,不僅加強(qiáng)了知識(shí)點(diǎn)之間的融合,而且大大提高了例題的多樣性,還可以在教學(xué)過(guò)程中安排更多的綜合訓(xùn)練,比如文本文件處理。

      另一方面,“器”還強(qiáng)調(diào)對(duì)工具的使用,這里最主要的是調(diào)試工具。筆者在教材中安排一章介紹常見(jiàn)開(kāi)發(fā)環(huán)境的使用(介紹了Visual Studio Community和Code::Blocks),可以幫助初學(xué)者掌握調(diào)試技巧。

      2.2 提煉編程之“術(shù)”

      程序設(shè)計(jì)中的“術(shù)”就是應(yīng)用基本的程序設(shè)計(jì)知識(shí)點(diǎn)解決問(wèn)題的模式[2]、套路和算法。因此,它是知識(shí)點(diǎn)的綜合應(yīng)用,是一些解決問(wèn)題的有效思路。為了讓學(xué)生盡快熟悉編程之術(shù),在教材中采取了以下策略。

      (1)精選例題,從例題中引申出編程之術(shù)。筆者安排了綜合性、有代表性的例子,例如在循環(huán)結(jié)構(gòu)這一章,介紹了選擇排序和冒泡排序兩種排序算法;在函數(shù)這一章,安排了輸出日歷以及簡(jiǎn)單四則運(yùn)算的例子,通過(guò)分析這些問(wèn)題,學(xué)生可以學(xué)習(xí)到程序分解的過(guò)程以及關(guān)于日期的操作;在結(jié)構(gòu)體這一章,介紹了基于鏈表的學(xué)生學(xué)籍信息管理實(shí)例,讓學(xué)生掌握與記錄操作相關(guān)的套路;在文件這一章,展示了如何從二進(jìn)制文件中刪除滿足某些條件的記錄的思路。

      (2)注重總結(jié),提煉出編程之術(shù)。初學(xué)者往往不善于總結(jié),因此教材中加入了大量的總結(jié)和提煉。首先,每一章結(jié)束后都有本章小結(jié),對(duì)本章的知識(shí)點(diǎn)、常見(jiàn)套路和算法進(jìn)行了總結(jié)。其次,在一些代表性的例題后面,對(duì)例題中的關(guān)鍵算法進(jìn)行了總結(jié)。第三,介紹一些知識(shí)點(diǎn)的時(shí)候,順便介紹該知識(shí)點(diǎn)相關(guān)的常見(jiàn)套路。例如介紹了字符之后,總結(jié)大小寫(xiě)字符之間的轉(zhuǎn)換等;在介紹浮點(diǎn)數(shù)的時(shí)候,提醒浮點(diǎn)數(shù)比較的注意事項(xiàng);在介紹循環(huán)結(jié)構(gòu)的時(shí)候,提煉窮舉算法的思想和注意事項(xiàng);在講解遞歸函數(shù)調(diào)用的時(shí)候,總結(jié)遞歸這一技巧應(yīng)用的要點(diǎn)。

      (3)及時(shí)訓(xùn)練,鞏固編程之術(shù)。在習(xí)題和實(shí)驗(yàn)中,設(shè)計(jì)了相關(guān)題目,要求學(xué)生及時(shí)應(yīng)用學(xué)到的套路和算法。

      在編程實(shí)踐中,還有大量與編程風(fēng)格和編程效率有關(guān)的經(jīng)驗(yàn)和技巧,這些也屬于“術(shù)”的范疇。這些內(nèi)容在教材中的8個(gè)“編程實(shí)踐”章節(jié)中有所涉及,如代碼風(fēng)格、命名、程序計(jì)時(shí)、軟件測(cè)試、實(shí)用字符串處理、程序設(shè)計(jì)與操作系統(tǒng)、中文處理等。這8個(gè)章節(jié)的內(nèi)容可以擴(kuò)大學(xué)生的知識(shí)面,激發(fā)學(xué)生的興趣。在實(shí)際教學(xué)中,這8個(gè)章節(jié)不一定由教師講授,完全可以讓學(xué)生自學(xué)。

      2.3 感悟編程之“道”

      對(duì)初學(xué)者來(lái)說(shuō),編程之“道”,或者說(shuō)計(jì)算思維,往往比較抽象,難以理解。因此,需要對(duì)學(xué)生加以引導(dǎo)和點(diǎn)化。本教材中,很多地方都點(diǎn)出了程序背后的“道”。

      (1)專門開(kāi)辟了一個(gè)章節(jié)“復(fù)雜問(wèn)題的求解算法”,介紹了很多面向問(wèn)題求解的思想,如分治、貪心、動(dòng)態(tài)規(guī)劃和回溯。對(duì)于每種思想,描述了其思維模式,指出其應(yīng)用范圍和優(yōu)缺點(diǎn),并給出多個(gè)例子演示其應(yīng)用。這樣,對(duì)于這些抽象思想,學(xué)生就有了比較感性的認(rèn)識(shí)。

      (2)在介紹知識(shí)點(diǎn)的時(shí)候適時(shí)點(diǎn)化。比如,緩存的思想在計(jì)算機(jī)硬件和軟件中經(jīng)常用到。教材在介紹計(jì)算機(jī)存儲(chǔ)體系的時(shí)候,不是直接介紹這些存儲(chǔ)器,而是把內(nèi)存看作CPU和磁盤之間的緩存,L2 cache看作CPU和內(nèi)存之間的緩存,L1 cache又是CPU和L2 cache之間的高速緩存。最后,指出其中存在緩存思路的反復(fù)應(yīng)用:為了彌補(bǔ)高速處理器和低速存儲(chǔ)器之間的速度差異,可以在它們之間插入一個(gè)更小但更快的存儲(chǔ)器,換句話說(shuō),中間存儲(chǔ)器是低速存儲(chǔ)器的高速緩存。

      類似這樣的例子還有很多。通過(guò)這些例子,點(diǎn)出一些典型的計(jì)算思維,也許學(xué)生不一定馬上就能夠應(yīng)用這些思維解決問(wèn)題,但是可以引導(dǎo)學(xué)生從一個(gè)更高的角度看待問(wèn)題,這對(duì)學(xué)生理解程序設(shè)計(jì)的本質(zhì)和計(jì)算機(jī)系統(tǒng)無(wú)疑是有巨大幫助的。

      當(dāng)然,真正讓學(xué)生感悟這些“道”,還需要教師在教學(xué)過(guò)程中的引導(dǎo)。

      3 教材結(jié)構(gòu)

      教材《C程序設(shè)計(jì):方法與實(shí)踐》[3](以下簡(jiǎn)稱本教材)的前身是2009年出版的《C語(yǔ)言與程序設(shè)計(jì)方法》第1版[4]和第2版[5]。在本教材正式出版之前,初稿于2015—2016年在本校試用了兩年,并根據(jù)反饋意見(jiàn)進(jìn)行了修改、定稿,最后由清華大學(xué)出版社于2017年5月出版。

      3.1 教材的章節(jié)內(nèi)容

      本教材的章節(jié)目錄和內(nèi)容見(jiàn)表1。

      與現(xiàn)有教材相比,本教材在結(jié)構(gòu)上有所突破,在內(nèi)容組織上有所創(chuàng)新,精選了例題,并強(qiáng)調(diào)工程化和規(guī)范化的開(kāi)發(fā),這些在前面都已提到,此處不再重復(fù)。

      表1 教材目錄和章節(jié)內(nèi)容

      3.2 教材的輔助資源

      為了配合這本教材的使用,筆者在書(shū)中安排了9個(gè)實(shí)驗(yàn),其中每個(gè)實(shí)驗(yàn)包含了若干個(gè)實(shí)驗(yàn)項(xiàng)目。每個(gè)實(shí)驗(yàn)經(jīng)過(guò)精心設(shè)計(jì),題目類型多樣,可以有效地鞏固所學(xué)內(nèi)容。

      另外,為了方便教師教學(xué),教材編寫(xiě)組精心準(zhǔn)備了前13章的教學(xué)課件,該教學(xué)課件是作者教學(xué)中使用并若干次修改和增補(bǔ)而來(lái),內(nèi)容非常豐富,可以直接用于教學(xué)。

      4 結(jié) 語(yǔ)

      在本教材出版之前,筆者在教學(xué)實(shí)踐中一直在思考和嘗試,進(jìn)行了一系列的教學(xué)改革。本教材的出版是筆者的教學(xué)成果之一。跟本教材配套,筆者在教學(xué)方法上進(jìn)行了一系列的調(diào)整,如實(shí)施了翻轉(zhuǎn)教學(xué)、加大了實(shí)踐訓(xùn)練的力度等。實(shí)踐證明,圍繞這一教材展開(kāi)的教學(xué)改革有明顯成效,學(xué)生的學(xué)習(xí)興趣明顯提升,實(shí)踐動(dòng)手能力有大的改進(jìn)。

      參考文獻(xiàn):

      [1] Wing J M. Computational thinking [J]. Communications of the ACM, 2006, 49(3): 33-35.

      [2] 張俊, 張彥鐸. 模式在程序設(shè)計(jì)教學(xué)中的應(yīng)用[J]. 計(jì)算機(jī)教育, 2010(3): 108-111.

      [3] 劉喜平, 萬(wàn)常選, 舒蔚. C程序設(shè)計(jì): 方法與實(shí)踐[M]. 北京: 清華大學(xué)出版社, 2017.

      [4] 萬(wàn)常選, 舒蔚, 駱?biāo)刮? C語(yǔ)言與程序設(shè)計(jì)方法[M]. 北京: 科學(xué)出版社, 2005.

      [5] 萬(wàn)常選, 舒蔚, 駱?biāo)刮? C語(yǔ)言與程序設(shè)計(jì)方法[M]. 2版. 北京:科學(xué)出版社, 2009.

      (編輯:孫怡銘)

      猜你喜歡
      程序設(shè)計(jì)教材
      教材精讀
      教材精讀
      教材精讀
      教材精讀
      教材精讀
      基于Visual Studio Code的C語(yǔ)言程序設(shè)計(jì)實(shí)踐教學(xué)探索
      教材精讀
      從細(xì)節(jié)入手,談PLC程序設(shè)計(jì)技巧
      電子制作(2019年9期)2019-05-30 09:42:04
      高職高專院校C語(yǔ)言程序設(shè)計(jì)教學(xué)改革探索
      OBE理念下基于Greenfoot的Java程序設(shè)計(jì)課程教學(xué)改革
      辽源市| 松潘县| 临潭县| 蓬安县| 措美县| 邳州市| 九台市| 秦安县| 乐至县| 甘肃省| 叙永县| 永丰县| 岳池县| 衡东县| 自治县| 四子王旗| 淄博市| 淮阳县| 澳门| 双牌县| 通江县| 淮安市| 朝阳市| 于都县| 上蔡县| 黎城县| 鄯善县| 青浦区| 卢龙县| 合江县| 霸州市| 九龙城区| 志丹县| 陕西省| 彰化县| 聂拉木县| 凤庆县| 尼勒克县| 武清区| 桂阳县| 东阿县|