案例教學和宏觀概念的函數教學方法

前言:尋找寫作靈感?中文期刊網用心挑選的案例教學和宏觀概念的函數教學方法,希望能為您的閱讀和創作帶來靈感,歡迎大家閱讀并分享。

案例教學和宏觀概念的函數教學方法

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

關鍵詞:程序設計;C語言;函數;案例教學;模塊化設計

函數是C語言程序設計中非常重要的概念,是進行系統功能抽象從而實現模塊化程序設計的基礎[1]。要求學生掌握函數的定義與調用方法、函數的參數與返回值、局部變量與全局變量等基礎概念,但是在實際教學中發現有些同學在學完函數后,仍然無法區分函數定義與函數調用,存在對函數的基本概念理解不夠透徹的問題,也就導致在實際編程中無法靈活運用函數。已有不少學者探討了函數的教學方法,王桂平等[2]從數學函數的使用入手,因勢利導地引入函數的概念,方紅琴等[3]總結了函數教學的三個難點,并且從引入環節下功夫,起到事半功倍的效果,周百順[4]討論了C語言中函數分解與定義的原則。這些研究大都強調了在函數引入中案例的重要性,但是仍然未能解決對函數基本概念理解不清的問題。本文提出突出案例教學和宏觀概念的函數教學方法,在引入函數概念和講解函數定義與調用區別兩個環節采用適當的案例輔助學生理解,并且強調建立函數的宏觀概念,包括函數要先定義后調用、參數從主調函數傳遞到被調函數等。這里的宏觀概念是相對于具體的語法細節來說的。另外,提出了理解函數基本的概念的兩個新視角,即從黑箱角度看待函數的輸入與輸出,從函數的獨立性角度理解局部變量。在教學實踐中,突出案例教學,強調宏觀概念,采用新穎的視角理解函數中的基本概念,起到了良好的效果。

1為什么需要函數

C語言課程在函數之前已經講解了變量與數據類型、流程控制語句以及數組的概念[5],同學已經能夠完成計算閏年、迭代求方程的根、對成績排序之類的任務,那么為什么還要講解函數這個概念呢?這個問題至關重要,如果學生能理解為什么需要使用函數,那就很容易理解后面講解的具體語法格式,否則,學生會陷入具體的語法問題中,不知道自己在干什么,為什么這么做。在實際教學中,可以通過具體的案例來講解使用函數的必要性。函數是進行功能抽象從而實現模塊化設計的工具,同時也可以用來減少程序中重復的代碼,因此可以從模塊化程序設計和減少重復代碼需要兩個角度來講解。

1.1模塊化程序設計的需要

在實際教學中,可以結合2018年中興公司的案例來引入模塊化程序設計。“2018年上半年美國政府宣布了對中興的禁令,禁止美國公司向中興銷售零部件和相關技術,引發了中興股價大跌。我們知道中興是全世界第四大手機生產商,市值達一千兩百億人民幣,怎么會輕易被美國控制呢?這是因為中興手機使用了美國高通公司的驍龍處理器,一旦高通公司不再提供處理器,中興就無法繼續生產手機。“從這個事件我們可以看到,像中興這樣的廠商無法自己生產手機中的所有零部件,而是需要使用其他公司提供的部件,而且還是核心部件。因此手機的生產是需要全球很多公司的分工與合作才能完成的。當然,分工合作的前提是產品被劃分成很多相對獨立的模塊,只要模塊之間的接口定義好了,每個廠家可以專注于改進模塊內部的結構,提高模塊的性能,而不會對合作的其他公司造成影響。“那么在程序設計中如何實現分工合作呢?答案就是函數,一個函數就是一個模塊,使用函數就可以實現模塊化程序設計,從而實現程序設計的分工合作。”這一案例結合當下熱點新聞,容易激發學生的興趣。通過類比手機的模塊化生產,引導學生思考如何實現程序的模塊化設計,從而引入函數的概念。

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

在程序設計中,有時需要多次使用某個功能,就需要多次重復編寫實現該功能的代碼,這使得程序存在冗長、不便于修改的問題。那么如何減少重復代碼呢?有的同學可能想到是循環。的確,循環有減少重復代碼的功能,但這只是針對重復代碼連續出現的情況。如果代碼是在程序中不同的位置重復出現,則難以用循環消除重復。因此,有必要引入另一種減少代碼重復的機制,也即是函數。在教學實踐中,使用下面的例子來講解如何使用函數消除重復。在程序Pro1中,兩個if語句完成的功能是一樣的,都是從兩個整數中求出最大值,只不過針對的具體整數不一樣。由于兩個if語句中間有一個輸入語句,因此無法使用循環來消除重復。如果把這部分代碼抽象成一個函數max,功能就是求兩個整數的最大值,然后在主函數中兩次調用max,這就消除了重復代碼。通過該實例中兩個程序的對比,學生可以理解函數是如何減少重復代碼的。同學們對函數有了這樣一個基本概念后,就很容易理解后續的語法格式了。

2函數的定義與調用

關于函數的使用,有兩個最基本的操作,定義與調用。要求學生一定要弄清定義和調用的區別與聯系,如表1所示。從時間順序來看,這兩個操作是先定義,后調用。從概念來看,函數定義就是指明功能是如何一步一步實現的,函數調用就是這個功能的一次使用。但是這兩者又需要聯合起來完成功能的使用,如果只有定義沒有調用,則該功能永遠都不會被執行,如果只有調用沒有定義,則功能沒有實現,會在連接階段產生錯誤。為加深對定義與調用之間關系的理解,仍然采用手機的案例。“舉個例子,手機是可以實現通信功能,用戶可以使用手機進行通信。當然在用戶使用之前,要有生產商先把手機生產出來。廠商生產手機需要考慮通信功能如何實現,采用什么協議,電路如何設計,但是用戶使用手機通信時不需要考慮這些問題,只需要輸入號碼,按撥號按鈕就可以。手機對用戶來說是一個黑箱,即用戶看不到里面的結構,只能通過界面操作手機。“那么廠商生產手機相當于我們定義一個函數,用戶使用手機相當于調用一個函數。所以函數要先定義,后使用,這應該就容易理解了。“在編寫函數時,我們既是函數的生產者,又是函數的使用者,所以要及時在這兩個身份之間轉換。作為生產者,就是要關注函數的功能如何實現。作為使用者,只需要給定參數,不需要了解函數中的功能是如何一步一步實現的。”當然,這里對區別與聯系的講解僅針對函數最基本的概念,并沒有涉及參數、返回值等具體語法格式。這主要是為了讓學生建立關于函數的宏觀概念,明白函數先定義后調用的使用流程。在明確這一宏觀概念的基礎上,后續教學再逐步細化,這樣才能避免學生一開始就陷入細節問題中。

3從黑箱角度理解函數接口

在上述函數定義與調用概念的講解中,提到在調用函數時要給定參數。那么,這個參數又是什么概念呢?我們知道一個函數代表一個特定的功能,而一個功能一般都會有輸入和輸出??梢园褏道斫鉃楹瘮档妮斎?,而返回值理解為函數的輸出。在調用函數時,只需知道參數和返回值的格式即可,無需了解函數內部是怎么實現的,因此函數就是一個黑箱。同時,調用函數時需給定合適的參數,處理其返回值,因此參數和返回值就構成了函數的接口。圖2展示了函數與黑箱的類比,通過這種類比,學生就容易理解參數的概念。當然,定義函數時程序員要實現函數的功能,這時就要關注函數內部的結構了。調用函數時要給定參數,那么在定義函數時就應該預留空間來保存這些參數。因此參數又分為實際參數和形式參數。調用函數時給定的參數稱為實際參數,而定義函數時預留的存儲空間稱為形式參數。在調用函數時,實際參數會傳遞給形式參數,使得被調用函數運行時形參具有實際的數據。我們仍然通過圖1中的程序Pro2來講解函數的參數。首先看max函數的定義。從第一行可以看到,max函數有兩個參數x和y,都是整數類型,一個返回值,也是整數類型。x和y是在函數定義中使用的參數,因此是形式參數。那么max函數實現了什么功能呢?我們可以看到在花括號中,定義了整型變量m,如果x大于y,把x賦值給m。否則,把y賦值給m。這樣,m就是x和y中最大的一個。因此,max函數的功能就是求兩個整數的最大值。最后通過return語句返回了這個最大值。然后我們看主函數中對max函數的調用。首先,第4行由輸入函數scanf給變量a和b輸入值。第5行使用變量a和b調用max函數,并且把返回值賦給變量m1,即a和b的最大值,這里a和b是實際參數。從這個例子我們可以看到,首先使用形式參數x和y定義max函數,來實現求最大值的功能。然后在主函數中使用實際參數a和b調用max,從而求出了a和b的最大值。

4函數調用過程演示

在之前的教學中,同學已了解到C語言的程序總是從主函數開始執行。現在有了自定義函數后,程序中有了多個函數,牢記這一點尤為重要。以圖3中的程序為例,程序從主函數開始執行,在主函數中調用max函數。這里需要分清主調函數和被調函數的概念。由于是在主函數中調用max函數,因此主函數是主調函數(callingfunction),max函數是被調函數(calledfunction)。當然,主調函數并非總是主函數,比如,如果在max函數中又調用了printf函數,那么針對這次調用,max是主調函數,printf是被調函數。在調用函數max時,程序的流程控制從主函數轉移到了max函數中,如圖3中虛線①所示,這時實參傳遞給了形參,如圖3中實線①和②所示。被調函數執行結束時,控制又從max函數轉移回主函數中,如圖3中虛線②所示,并且由return語句把最大值返回到調用的位置,如圖3中實線③所示,賦值給變量m1。在講解了上述程序調用過程的細節后,應當再次強調,從總體上看,參數是從主調函數傳到被調函數,返回值是從被調函數返回到主調函數。這個參數傳遞是單向的,僅能從主調函數到被調函數,而不能反向傳遞。這是由值傳遞決定的,明確這樣一個概念有助于后續理解指針類型參數如何實現反向傳遞[6]。該調用過程可以通過單步執行演示,以觀察控制的轉移以及參數的變化。單步執行能夠非常直觀地演示函數調用過程,加深同學們的理解。并且,單步執行是發現程序邏輯錯誤的重要手段,有助于培養同學調試程序的能力。因此,不但要給學生演示,也要求學生在上機中進行實際操作。之前在單步執行時一直在使用stepover按鈕,現在可以跟同學們說明stepinto和stepout的用法,如圖4所示。如果某行有函數調用,那么在這行上點擊stepinto按鈕會使得控制轉移到被調用函數中,在被調函數中繼續單步執行,而stepover按鈕會使得這一行當做一個整體執行,然后執行下一行。在被調函數中執行時,可以點擊stepover單步執行,如果點擊stepout,則會結束當前函數的單步執行,返回到函數被調用的位置繼續執行。

5從函數獨立性角度看待局部變量

函數是完成特定功能的模塊,提供了參數和返回值作為與主調函數傳遞數據的渠道。除此之外,函數應該是相對獨立的,也就是內部的數據不應該受外界干擾。因此,函數內部定義的變量默認都是局部的,也就是只能在函數內部訪問,而不能在函數之外訪問。這就是局部變量。從這個角度理解局部變量的概念是比較容易的。在實際教學中發現有些同學在學習了函數后,會出現在一個函數中試圖使用另一個函數中變量的問題?,F在,應該強調參數和返回值是函數與外界傳遞數據的渠道,一個函數中定義的變量是不能在其他函數中使用的,否則參數和返回值就失去了意義。與局部變量相對應的是全局變量。全局變量是在所有函數之外定義的變量,在變量定義之后的所有函數中都可以使用。由于全局變量可以在多個函數中使用,因此也是這些函數之間共享數據(或者傳遞數據)的一個渠道。但是由于全局變量破壞了函數的獨立性,所以不鼓勵過多使用全局變量。

6結束語

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

參考文獻:

[1]汪紅兵,姚琳,武航星,張敏.C語言程序設計課程中的計算思維探析[J].中國大學教學,2014(9):59-62.

[2]王桂平.“程序設計基礎”課程函數設計教學方法探討[J].計算機教育,2009(10):116-119.

[3]方紅琴.點面結合突破C程序設計函數教學中的重難點[J].計算機教育,2008(22):130-131.

[4]周百順.C語言程序設計中的函數分解與函數定義[J].計算機教育,2015(4):59-62.

[5]E.Balagurusamy.ProgramminginANSIC[M].北京:清華大學出版社,2011.

[6]陳圣磊,王紅霞,劉林源.C語言程序設計中文件操作部分的教學方法探討[J].計算機教育,2017(2):167-170.

[7]陳圣磊,劉林源.調試技術在C語言程序設計教學中的作用探討[J].電腦知識與技術,2015,11(24):80-82.

[8]邢如意.Linux系統下計算機C語言的編程技巧分析[J].電腦知識與技術,2014,10(36):8674-8675,8690.

作者:陳圣磊 劉林源 王紅霞 單位:南京審計大學電子商務系

亚洲精品一二三区-久久