• 
    

    
    

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

      ?

      突出案例教學和宏觀概念的函數(shù)教學方法探討

      2019-12-16 01:48陳圣磊劉林源王紅霞
      電腦知識與技術(shù) 2019年29期
      關(guān)鍵詞:模塊化設計C語言案例教學

      陳圣磊 劉林源 王紅霞

      摘要:函數(shù)是c語言程序設計中重要的教學內(nèi)容,在實際教學中發(fā)現(xiàn)學生存在囿于細節(jié)知識、缺乏宏觀視野的問題。提出了突出案例教學和宏觀概念的函數(shù)教學方法,以手機案例引入函數(shù)概念并講解函數(shù)定義與調(diào)用的區(qū)別,強調(diào)建立函數(shù)定義與調(diào)用關(guān)系、參數(shù)傳遞方向這樣一些宏觀概念,提出了理解函數(shù)接口和局部變量概念的新視角,在教學實踐中取得了良好的效果。

      關(guān)鍵詞:程序設計;c語言;函數(shù);案例教學;模塊化設計

      中圖分類號:G642

      文章編號:1009-3044(2019)29-0163-04

      函數(shù)是C語言程序設計中非常重要的概念,是進行系統(tǒng)功能抽象從而實現(xiàn)模塊化程序設計的基礎。要求學生掌握函數(shù)的定義與調(diào)用方法、函數(shù)的參數(shù)與返回值、局部變量與全局變量等基礎概念,但是在實際教學中發(fā)現(xiàn)有些同學在學完函數(shù)后,仍然無法區(qū)分函數(shù)定義與函數(shù)調(diào)用,存在對函數(shù)的基本概念理解不夠透徹的問題,也就導致在實際編程中無法靈活運用函數(shù)。

      已有不少學者探討了函數(shù)的教學方法,王桂平等從數(shù)學函數(shù)的使用人手,因勢利導地引人函數(shù)的概念,方紅琴等總結(jié)了函數(shù)教學的三個難點,并且從引入環(huán)節(jié)下功夫,起到事半功倍的效果,周百順討論了C語言中函數(shù)分解與定義的原則。這些研究大都強調(diào)了在函數(shù)引入中案例的重要性,但是仍然未能解決對函數(shù)基本概念理解不清的問題。本文提出突出案例教學和宏觀概念的函數(shù)教學方法,在引入函數(shù)概念和講解函數(shù)定義與調(diào)用區(qū)別兩個環(huán)節(jié)采用適當?shù)陌咐o助學生理解,并且強調(diào)建立函數(shù)的宏觀概念,包括函數(shù)要先定義后調(diào)用、參數(shù)從主調(diào)函數(shù)傳遞到被調(diào)函數(shù)等。這里的宏觀概念是相對于具體的語法細節(jié)來說的。另外,提出了理解函數(shù)基本的概念的兩個新視角,即從黑箱角度看待函數(shù)的輸入與輸出,從函數(shù)的獨立性角度理解局部變量。在教學實踐中,突出案例教學,強調(diào)宏觀概念,采用新穎的視角理解函數(shù)中的基本概念,起到了良好的效果。

      1為什么需要函數(shù)

      C語言課程在函數(shù)之前已經(jīng)講解了變量與數(shù)據(jù)類型、流程控制語句以及數(shù)組的概念,同學已經(jīng)能夠完成計算閏年、迭代求方程的根、對成績排序之類的任務,那么為什么還要講解函數(shù)這個概念呢?

      這個問題至關(guān)重要,如果學生能理解為什么需要使用函數(shù),那就很容易理解后面講解的具體語法格式,否則,學生會陷入具體的語法問題中,不知道自己在干什么,為什么這么做。在實際教學中,可以通過具體的案例來講解使用函數(shù)的必要性。函數(shù)是進行功能抽象從而實現(xiàn)模塊化設計的工具,同時也可以用來減少程序中重復的代碼,因此可以從模塊化程序設計和減少重復代碼需要兩個角度來講解。

      1.1模塊化程序設計的需要

      在實際教學中,可以結(jié)合2018年中興公司的案例來引入模塊化程序設計。

      “2018年上半年美國政府宣布了對中興的禁令,禁止美國公司向中興銷售零部件和相關(guān)技術(shù),引發(fā)了中興股價大跌。我們知道中興是全世界第四大手機生產(chǎn)商,市值達一千兩百億人民幣,怎么會輕易被美國控制呢?這是因為中興手機使用了美國高通公司的驍龍?zhí)幚砥?,一旦高通公司不再提供處理器,中興就無法繼續(xù)生產(chǎn)手機。

      “從這個事件我們可以看到,像中興這樣的廠商無法自己生產(chǎn)手機中的所有零部件,而是需要使用其他公司提供的部件,而且還是核心部件。因此手機的生產(chǎn)是需要全球很多公司的分工與合作才能完成的。當然,分工合作的前提是產(chǎn)品被劃分成很多相對獨立的模塊,只要模塊之間的接口定義好了,每個廠家可以專注于改進模塊內(nèi)部的結(jié)構(gòu),提高模塊的性能,而不會對合作的其他公司造成影響。

      “那么在程序設計中如何實現(xiàn)分工合作呢?答案就是函數(shù),一個函數(shù)就是一個模塊,使用函數(shù)就可以實現(xiàn)模塊化程序設計,從而實現(xiàn)程序設計的分工合作。”

      這一案例結(jié)合當下熱點新聞,容易激發(fā)學生的興趣。通過類比手機的模塊化生產(chǎn),引導學生思考如何實現(xiàn)程序的模塊化設計,從而引入函數(shù)的概念。

      1.2減少程序中重復代碼的需要

      在程序設計中,有時需要多次使用某個功能,就需要多次重復編寫實現(xiàn)該功能的代碼,這使得程序存在冗長、不便于修改的問題。那么如何減少重復代碼呢?

      有的同學可能想到是循環(huán)。的確,循環(huán)有減少重復代碼的功能,但這只是針對重復代碼連續(xù)出現(xiàn)的情況。如果代碼是在程序中不同的位置重復出現(xiàn),則難以用循環(huán)消除重復。因此,有必要引入另一種減少代碼重復的機制,也即是函數(shù)。

      在教學實踐中,使用下面的例子來講解如何使用函數(shù)消除重復。在程序Prol中,兩個if語句完成的功能是一樣的,都是從兩個整數(shù)中求出最大值,只不過針對的具體整數(shù)不一樣。由于兩個if語句中間有一個輸入語句,因此無法使用循環(huán)來消除重復。如果把這部分代碼抽象成一個函數(shù)max,功能就是求兩個整數(shù)的最大值,然后在主函數(shù)中兩次調(diào)用max,這就消除了重復代碼,如程序Pr02所示。

      通過該實例中兩個程序的對比,學生可以理解函數(shù)是如何減少重復代碼的。同學們對函數(shù)有了這樣一個基本概念后,就很容易理解后續(xù)的語法格式了。

      2函數(shù)的定義與調(diào)用

      關(guān)于函數(shù)的使用,有兩個最基本的操作,定義與調(diào)用。要求學生一定要弄清定義和調(diào)用的區(qū)別與聯(lián)系,如表1所示。從時間順序來看,這兩個操作是先定義,后調(diào)用。從概念來看,函數(shù)定義就是指明功能是如何一步一步實現(xiàn)的,函數(shù)調(diào)用就是這個功能的一次使用。但是這兩者又需要聯(lián)合起來完成功能的使用,如果只有定義沒有調(diào)用,則該功能永遠都不會被執(zhí)行,如果只有調(diào)用沒有定義,則功能沒有實現(xiàn),會在連接階段產(chǎn)生錯誤。

      為加深對定義與調(diào)用之間關(guān)系的理解,仍然采用手機的案例?!芭e個例子,手機是可以實現(xiàn)通信功能,用戶可以使用手機進行通信。當然在用戶使用之前,要有生產(chǎn)商先把手機生產(chǎn)出來。廠商生產(chǎn)手機需要考慮通信功能如何實現(xiàn),采用什么協(xié)議,電路如何設計,但是用戶使用手機通信時不需要考慮這些問題,只需要輸入號碼,按撥號按鈕就可以。手機對用戶來說是一個黑箱,即用戶看不到里面的結(jié)構(gòu),只能通過界面操作手機。

      “那么廠商生產(chǎn)手機相當于我們定義一個函數(shù),用戶使用手機相當于調(diào)用一個函數(shù)。所以函數(shù)要先定義,后使用,這應該就容易理解了。

      “在編寫函數(shù)時,我們既是函數(shù)的生產(chǎn)者,又是函數(shù)的使用者,所以要及時在這兩個身份之間轉(zhuǎn)換。作為生產(chǎn)者,就是要關(guān)注函數(shù)的功能如何實現(xiàn)。作為使用者,只需要給定參數(shù),不需要了解函數(shù)中的功能是如何一步一步實現(xiàn)的。”

      當然,這里對區(qū)別與聯(lián)系的講解僅針對函數(shù)最基本的概念,并沒有涉及參數(shù)、返回值等具體語法格式。這主要是為了讓學生建立關(guān)于函數(shù)的宏觀概念,明白函數(shù)先定義后調(diào)用的使用流程。在明確這一宏觀概念的基礎上,后續(xù)教學再逐步細化,這樣才能避免學生一開始就陷人細節(jié)問題中。

      3從黑箱角度理解函數(shù)接口

      在上述函數(shù)定義與調(diào)用概念的講解中,提到在調(diào)用函數(shù)時要給定參數(shù)。那么,這個參數(shù)又是什么概念呢?

      我們知道一個函數(shù)代表一個特定的功能,而一個功能一般都會有輸入和輸出。可以把參數(shù)理解為函數(shù)的輸入,而返回值理解為函數(shù)的輸出。在調(diào)用函數(shù)時,只需知道參數(shù)和返回值的格式即可,無需了解函數(shù)內(nèi)部是怎么實現(xiàn)的,因此函數(shù)就是一個黑箱。同時,調(diào)用函數(shù)時需給定合適的參數(shù),處理其返回值,因此參數(shù)和返回值就構(gòu)成了函數(shù)的接口。圖2展示了函數(shù)與黑箱的類比,通過這種類比,學生就容易理解參數(shù)的概念。當然,定義函數(shù)時程序員要實現(xiàn)函數(shù)的功能,這時就要關(guān)注函數(shù)內(nèi)部的結(jié)構(gòu)了。

      調(diào)用函數(shù)時要給定參數(shù),那么在定義函數(shù)時就應該預留空間來保存這些參數(shù)。因此參數(shù)又分為實際參數(shù)和形式參數(shù)。調(diào)用函數(shù)時給定的參數(shù)稱為實際參數(shù),而定義函數(shù)時預留的存儲空間稱為形式參數(shù)。在調(diào)用函數(shù)時,實際參數(shù)會傳遞給形式參數(shù),使得被調(diào)用函數(shù)運行時形參具有實際的數(shù)據(jù)。

      我們?nèi)匀煌ㄟ^圖1中的程序Pro2來講解函數(shù)的參數(shù)。首先看max函數(shù)的定義。從第一行可以看到,max函數(shù)有兩個參數(shù)x和v,都是整數(shù)類型,一個返回值,也是整數(shù)類型。x和v是在函數(shù)定義中使用的參數(shù),因此是形式參數(shù)。

      那么max函數(shù)實現(xiàn)了什么功能呢?我們可以看到在花括號中,定義了整型變量m,如果x大于v,把x賦值給m。否則,把v賦值給m。這樣,m就是x和v中最大的一個。因此,max函數(shù)的功能就是求兩個整數(shù)的最大值。最后通過return語句返回了這個最大值。

      然后我們看主函數(shù)中對max函數(shù)的調(diào)用。首先,第4行由輸入函數(shù)scanf給變量a和b輸入值。第5行使用變量a和b調(diào)用max函數(shù),并且把返回值賦給變量m1,即a和b的最大值,這里a和b是實際參數(shù)。

      從這個例子我們可以看到,首先使用形式參數(shù)x和v定義max函數(shù),來實現(xiàn)求最大值的功能。然后在主函數(shù)中使用實際參數(shù)a和b調(diào)用max,從而求出了a和b的最大值。

      4函數(shù)調(diào)用過程演示

      在之前的教學中,同學已了解到C語言的程序總是從主函數(shù)開始執(zhí)行。現(xiàn)在有了自定義函數(shù)后,程序中有了多個函數(shù),牢記這一點尤為重要。以圖3中的程序為例,程序從主函數(shù)開始執(zhí)行,在主函數(shù)中調(diào)用max函數(shù)。

      這里需要分清主調(diào)函數(shù)和被調(diào)函數(shù)的概念。由于是在主函數(shù)中調(diào)用max函數(shù),因此主函數(shù)是主調(diào)函數(shù)(callingfunction),max函數(shù)是被調(diào)函數(shù)(called function)。當然,主調(diào)函數(shù)并非總是主函數(shù),比如,如果在max函數(shù)中又調(diào)用了prinff函數(shù),那么針對這次調(diào)用,max是主調(diào)函數(shù),printf是被調(diào)函數(shù)。

      在調(diào)用函數(shù)max時,程序的流程控制從主函數(shù)轉(zhuǎn)移到了max函數(shù)中,如圖3中虛線①所示,這時實參傳遞給了形參,如圖3中實線①和②所示。被調(diào)函數(shù)執(zhí)行結(jié)束時,控制又從max函數(shù)轉(zhuǎn)移回主函數(shù)中,如圖3中虛線②所示,并且由return語句把最大值返回到調(diào)用的位置,如圖3中實線③所示,賦值給變量m1。

      在講解了上述程序調(diào)用過程的細節(jié)后,應當再次強調(diào),從總體上看,參數(shù)是從主調(diào)函數(shù)傳到被調(diào)函數(shù),返回值是從被調(diào)函數(shù)返回到主調(diào)函數(shù)。這個參數(shù)傳遞是單向的,僅能從主調(diào)函數(shù)到被調(diào)函數(shù),而不能反向傳遞。這是由值傳遞決定的,明確這樣一個概念有助于后續(xù)理解指針類型參數(shù)如何實現(xiàn)反向傳遞。

      該調(diào)用過程可以通過單步執(zhí)行演示,以觀察控制的轉(zhuǎn)移以及參數(shù)的變化。單步執(zhí)行能夠非常直觀地演示函數(shù)調(diào)用過程,加深同學們的理解。并且,單步執(zhí)行是發(fā)現(xiàn)程序邏輯錯誤的重要手段,有助于培養(yǎng)同學調(diào)試程序的能力。因此,不但要給學生演示,也要求學生在上機中進行實際操作。

      之前在單步執(zhí)行時一直在使用step over按鈕,現(xiàn)在可以跟同學們說明stepinto和step out的用法,如圖4所示。如果某行有函數(shù)調(diào)用,那么在這行上點擊step into按鈕會使得控制轉(zhuǎn)移到被調(diào)用函數(shù)中,在被調(diào)函數(shù)中繼續(xù)單步執(zhí)行,而step over按鈕會使得這一行當做一個整體執(zhí)行,然后執(zhí)行下一行。在被調(diào)函數(shù)中執(zhí)行時,可以點擊step over單步執(zhí)行,如果點擊step out,則會結(jié)束當前函數(shù)的單步執(zhí)行,返回到函數(shù)被調(diào)用的位置繼續(xù)執(zhí)行。

      5從函數(shù)獨立性角度看待局部變量

      函數(shù)是完成特定功能的模塊,提供了參數(shù)和返回值作為與主調(diào)函數(shù)傳遞數(shù)據(jù)的渠道。除此之外,函數(shù)應該是相對獨立的,也就是內(nèi)部的數(shù)據(jù)不應該受外界干擾。因此,函數(shù)內(nèi)部定義的變量默認都是局部的,也就是只能在函數(shù)內(nèi)部訪問,而不能在函數(shù)之外訪問。這就是局部變量。

      從這個角度理解局部變量的概念是比較容易的。在實際教學中發(fā)現(xiàn)有些同學在學習了函數(shù)后,會出現(xiàn)在一個函數(shù)中試圖使用另一個函數(shù)中變量的問題?,F(xiàn)在,應該強調(diào)參數(shù)和返回值是函數(shù)與外界傳遞數(shù)據(jù)的渠道,一個函數(shù)中定義的變量是不能在其他函數(shù)中使用的,否則參數(shù)和返回值就失去了意義。

      與局部變量相對應的是全局變量。全局變量是在所有函數(shù)之外定義的變量,在變量定義之后的所有函數(shù)中都可以使用。由于全局變量可以在多個函數(shù)中使用,因此也是這些函數(shù)之間共享數(shù)據(jù)(或者傳遞數(shù)據(jù))的一個渠道。但是由于全局變量破壞了函數(shù)的獨立性,所以不鼓勵過多使用全局變量。

      6結(jié)束語

      C語言課程有很多的細節(jié)知識,同時又借鑒了很多人類社會組織如何運行的道理,比如函數(shù)是實現(xiàn)模塊化以及分工合作的基礎。本文認為在教學中應該強調(diào)宏觀概念,同時突出案例教學,這樣才能建立整體概念,有助于理解細節(jié)知識。另外,提出了從黑箱角度看待函數(shù)的參數(shù)與返回值,從函數(shù)獨立性角度看待局部變量,這兩個視角能夠加深同學的理解。從實踐來看,這些教學方法起到了良好的效果。

      猜你喜歡
      模塊化設計C語言案例教學
      基于Visual Studio Code的C語言程序設計實踐教學探索
      基于C語言的計算機軟件編程
      汽車裝配工藝模塊化設計研究
      高職高專院校C語言程序設計教學改革探索
      案例教學在機械創(chuàng)新設計課程中的應用
      馬克思主義基本原理概論課案例教學的幾點思考
      論子函數(shù)在C語言數(shù)據(jù)格式輸出中的應用
      临湘市| 禹州市| 嘉善县| 西和县| 乡宁县| 霍城县| 建湖县| 龙陵县| 遵化市| 青田县| 邵阳县| 古田县| 泽库县| 车致| 怀来县| 确山县| 岐山县| 荥阳市| 辰溪县| 屯昌县| 巴东县| 南澳县| 惠东县| 耒阳市| 沅江市| 宁津县| 界首市| 辰溪县| 家居| 武强县| 新竹县| 和田市| 基隆市| 北流市| 溧水县| 库尔勒市| 大关县| 达拉特旗| 贵德县| 涡阳县| 乐东|