• 
    

    
    

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

      “程序設計基礎”課程函數(shù)設計教學方法探討

      2009-06-20 08:45:46王桂平
      計算機教育 2009年10期
      關鍵詞:教學

      文章編號:1672-5913(2009)10-0116-04

      摘要:本文針對“程序設計基礎”課程介紹了以在線實踐為導向的教學思路,并對其中的函數(shù)設計教學,提出了新穎的教學過程:承上啟下、因勢利導地引入函數(shù)的概念和作用;循序漸進地講解函數(shù)的設計方法;以及通過遞歸函數(shù)設計來提高學生對函數(shù)功能的理解和對函數(shù)設計技巧的掌握。

      關鍵詞:程序設計基礎;在線實踐導向;函數(shù)設計;遞歸函數(shù);教學

      中圖分類號:G642

      文獻標識碼:B

      1引言

      在文獻[1]中,作者針對“程序設計基礎”課程提出了以在線實踐為導向的教學思路,其主要思想為:以學科競賽為驅動、以在線實踐為導向、以課程設計進行強化。這種教學思路以程序設計思想和方法的培養(yǎng)為主,以程序設計語言教學為輔。

      我們在教學中以ACM/ICPC程序設計競賽為驅動,激發(fā)學生的學習興趣和競爭意識,培養(yǎng)學生的主動思維能力。另外,我們在課程的教學中根據(jù)教學的需要選取國內(nèi)外著名OJ(Online Judge,在線評判)網(wǎng)站上的試題作為例題和練習題,以培養(yǎng)學生獨立分析問題、解決問題的能力,以及分組討論、團隊協(xié)作、文檔組織等能力。在課程的最后階段,我們通過課程設計強化學生的學習效果。

      為了適應以在線實踐為導向的教學思路,在文獻[1]中,我們重新設計了“程序設計基礎”課程的理論教學內(nèi)容和實踐教學內(nèi)容。其中理論教學內(nèi)容的設置和課時安排如表1所示。

      從表1可以看出,理論教學內(nèi)容安排的思路是:先用盡可能少的時間講解編寫一個C/C++程序所需的最小語法知識集,然后講解常用的程序設計思想和方法;最后是課程設計。

      函數(shù)設計的教學是“程序設計基礎”課程的一個重點內(nèi)容。本文針對這部分內(nèi)容的教學,提出了新穎的教學過程。在以往的教學中,函數(shù)設計一般是放在程序控制結構、數(shù)組等內(nèi)容之后,前后教學內(nèi)容的設置并沒有直接聯(lián)系,使得學生難以理解函數(shù)的概念、功能和設計方法。

      我們在教學中采取新穎的方法和過程自然地引入數(shù)

      學函數(shù)的使用、循序漸進地介紹函數(shù)的設計方法、以及通過遞歸函數(shù)設計來提高學生對函數(shù)功能的理解和對函數(shù)設計技巧的掌握。

      教改課題項目:浙江財經(jīng)學院2008年教學科研重大課題《以學科競賽為驅動和以在線實踐為導向的程序設計課程教學改革》(課題編號:JK200812)。

      作者簡介:王桂平(1979-),男,江西省安福縣人,講師,在讀博士,浙江財經(jīng)學院信息學院教師。主要研究方向:算法分析與設計,圖像處理與模式識別。

      2承上啟下、因勢利導地引入函數(shù)

      學生對知識點的理解需要一個過程,而且這個過程越自然越利于學生接受知識點。所以我們在教學過程中盡早地引入函數(shù)的概念,自然地過渡到函數(shù)設計。

      2.1從數(shù)學函數(shù)的使用入手

      我們所設計的第1部分教學內(nèi)容是以數(shù)值型數(shù)據(jù)的處理為線索,以簡單數(shù)學計算或數(shù)學應用題目為例子來講解C/C++語言語法知識,如報數(shù)游戲、閏年的判斷、求三角形面積、素數(shù)和完數(shù)的判斷、Fibonacci數(shù)列各項遞推、迭代法求平方根等等。以這些數(shù)學應用為例講解語言語法,學生更容易接受,因為這些數(shù)學應用問題學生已經(jīng)在高等數(shù)學甚至初等數(shù)學中就已經(jīng)學過了,現(xiàn)在只是用編寫程序的方法去求解。

      在進行數(shù)據(jù)處理時,經(jīng)常要進行一定的運算,才能得到結果,運算是通過運算符和表達式來實現(xiàn)的。所以我們在介紹完C/C++語言中的數(shù)據(jù)(變量和常量)后,就自然地過渡到運算符和表達式了。

      在進行數(shù)據(jù)處理時,僅有運算符和表達式往往是不夠的,經(jīng)常還需要使用到數(shù)學函數(shù)。因此,我們在介紹完運算符和表達式后,緊接著就向學生介紹數(shù)學函數(shù)的使用。

      盡管這時學生對函數(shù)的概念和功能還一知半解,一開始也不能正確地使用數(shù)學函數(shù),但我們認為從數(shù)學函數(shù)的使用入手,能較早地讓學生接觸到函數(shù)的使用,也能讓學生更自然地接受函數(shù)的概念。特別是學生在學初等數(shù)學時,已經(jīng)具備了數(shù)學上函數(shù)、函數(shù)的自變量、函數(shù)值等概念,這些概念有助于學生初步理解程序設計語言中的函數(shù)、函數(shù)參數(shù)、函數(shù)返回值等概念。

      例如,要對2.5開3次方根,即要求2.51/3。老師向學生介紹了數(shù)學函數(shù)pow的原型后,學生一開始可能將pow函數(shù)的調(diào)用錯誤地寫成如下的形式:

      double x = 2.5, y = 1.0/3, z;

      z = double pow( x, y );

      z = double pow( double x, double y );

      等等。導致這些錯誤的原因是學生還沒有函數(shù)原型的概念,老師只要將這些錯誤的調(diào)用形式糾正過一兩次,學生就能舉一反三,正確地使用數(shù)學函數(shù)。

      2.2從二重循環(huán)過渡到函數(shù)設計

      我們在“算法及控制結構”這一節(jié)內(nèi)容的教學中,是以二重循環(huán)的使用作為結尾的,如輸出100~200之內(nèi)的所有素數(shù)、輸出6~10000之間的完數(shù)等等。這些程序的main函數(shù)代碼比較長,這樣,當我們在講解函數(shù)時,就很自然地引入函數(shù)對main函數(shù)的功能進行分解。

      例如,要輸出100~200之內(nèi)的素數(shù),可以用一個2重循環(huán)實現(xiàn)。但如果有一個函數(shù)prime,能夠實現(xiàn)判斷一個正整數(shù)m是否為素數(shù)。其調(diào)用形式是:prime(m)。調(diào)用該函數(shù)后返回值如果為1,則m為素數(shù);如果為0,則m為合數(shù)。因此我們只需要用如下的代碼就可以輸出100~200之內(nèi)的所有素數(shù):

      for( int m =100; m<=200; m++ )

      {

      if( prime(m) )

      printf( "%d ", m );

      }

      在這個例子中,我們把“輸出100~200之內(nèi)所有素數(shù)”的功能需求進行分解,把“判斷一個整數(shù)是否為素數(shù)”的功能用prime函數(shù)去實現(xiàn)。這就是函數(shù)的功能所在。

      通過這樣的講解,學生能較自然地理解函數(shù)的功能,也更容易接受函數(shù)的概念。

      3循序漸進地講解函數(shù)設計(基礎篇)

      從二重循環(huán)過渡到函數(shù)的功能和概念后,我們采取以下教學方法,使得學生能在較短的時間里掌握函數(shù)的設計方法。

      3.1循序漸進,步步深入

      在講解函數(shù)的定義和調(diào)用時,對其中的知識點,我們采取以下順序進行講解:函數(shù)的定義、函數(shù)的參數(shù)、函數(shù)的返回值、函數(shù)的調(diào)用。

      我們認為,按照這樣的順序進行講解是合理的,因為學生已經(jīng)掌握了數(shù)學函數(shù)的使用,已經(jīng)能初步理解函數(shù)的相關概念了,我們按照這樣的順序講解可以循序漸進地進入到自定義函數(shù)的定義和調(diào)用上。在這個過程中,我們將教學的重點放在函數(shù)形參、實參和函數(shù)返回值上。

      3.2切中要害,見招拆招

      很多初學者對函數(shù)比較頭疼,不知道該如何設計函數(shù)。具體體現(xiàn)在:

      (1) 不知道函數(shù)是否有參數(shù),有幾個參數(shù),是否有返回值,隨意地設置函數(shù)的參數(shù)和返回值。

      (2) 不明確函數(shù)要處理的數(shù)據(jù)是哪些,不明白函數(shù)形參的作用是什么,形參的值是在什么時候被“賦予”的。初學者經(jīng)常在函數(shù)里通過輸入語句給形參輸入數(shù)據(jù)。例如,初學者可能在定義上述prime函數(shù)時輸入數(shù)據(jù)到形參x中:

      int prime( int x )

      {

      printf( "%d", &x );

      }

      對于第1個問題,我們的解釋是:程序設計者希望采用怎樣的形式去調(diào)用函數(shù),這種函數(shù)調(diào)用形式里有幾個參數(shù),分別是什么類型,是以此來確定函數(shù)的形參個數(shù)和類型;程序設計者希望函數(shù)執(zhí)行以后是否得到一個結果,這個結果是什么類型的,是什么含義,是否需要返回到主調(diào)函數(shù)中,以此來確定函數(shù)的返回值及其類型、含義等。

      對于第2個問題,我們的解釋是:函數(shù)形參是在函數(shù)調(diào)用時,通過實參與形參之間的數(shù)據(jù)傳遞,從而“被賦予”了值。只要沒有函數(shù)調(diào)用發(fā)生,就不會給形參分配存儲空間;當函數(shù)調(diào)用發(fā)生時,為形參分配存儲空間,并把實參的值賦值給形參。

      對于上述解釋,我們以前面講過的二重循環(huán)例子來進一步闡述。即輸出100~200之內(nèi)所有素數(shù),要求:1)定義一個函數(shù)prime,用于判斷x是否為素數(shù),如果為素數(shù),返回1,否則返回0;2)在主函數(shù)中調(diào)用prime函數(shù),用于判斷100~200之間的每個數(shù)是否為素數(shù)。

      根據(jù)題目的意思,主調(diào)函數(shù)中調(diào)用prime函數(shù)的形式是prime(199),即判斷199是否為素數(shù),如果為素數(shù)則返回1,否則返回0。因此,prime函數(shù)的原型為:

      int prime( int x );

      另外,在prime函數(shù)里,是要判斷形參x是否為素數(shù),這個x的值不是在prime函數(shù)里通過輸入語句輸進去的,也不是采用賦值的方式“賦予”給它的,而是在主調(diào)函數(shù)中調(diào)用prime函數(shù)時,如prime(199),把實參199的值傳遞給形參x的,因此這時執(zhí)行prime函數(shù),形參x的值就是199,調(diào)用prime函數(shù)就是要判斷199是否為素數(shù)。

      講解并演示這些過程后,我們在課堂上可以通過一些練習題進一步考查學生對利用函數(shù)進行功能分解、函數(shù)設計、函數(shù)調(diào)用的理解。

      3.3精選例題,事半功倍

      我們所設計的第1部分教學內(nèi)容是以數(shù)值型數(shù)據(jù)的處理為線索,以簡單數(shù)學計算或數(shù)學應用題為例子來講解的,函數(shù)的設計也不例外。例如,我們通過以下例子來講解函數(shù)的嵌套調(diào)用。

      拋物線y = x2/(2*p)繞它的對稱軸x = 0旋轉所成的曲面就是旋轉拋物面。放在焦點F(0, p/2)處的光源所發(fā)出的光,經(jīng)過拋物面各點反射之后就成為平行光束,如圖1。可以利用這一性質制造需要發(fā)射平行光的燈具,例如:探照燈,汽車的車前燈等。請編寫程序驗證這個性質。

      題目的意思是,如圖1所示,從焦點F發(fā)射的任意光線,比如圖中的兩條光線L和L',經(jīng)過拋物面反射后,反射光線R和R'都平行y軸。

      要證明反射光線R平行y軸,只要證明∠1 = ∠3,而∠1和∠2是相等的,所以只要證明∠2=∠3即可,即只要證明FC = FT,這里點C是光線L與拋物線的交點,點T是拋物線在C點的切線與y軸的交點。

      以下編寫程序,實現(xiàn):任意給定拋物線參數(shù)p和發(fā)射光線斜率k,輸出線段FC和FT的長度。

      在本題中,我們設計以下3個函數(shù)來實現(xiàn)程序的全部功能:

      (1) main函數(shù):在main函數(shù)中輸入拋物線參數(shù)p和直線參數(shù)k,接下來所有工作都是通過調(diào)用solve函數(shù)實現(xiàn)的。

      (2) solve函數(shù):求交點C和交點F的坐標,并調(diào)用length函數(shù)求線段FC和FT的長度并輸出。solve函數(shù)有兩個形參,即拋物線參數(shù)p和直線參數(shù)k,沒有返回值。solve函數(shù)的原型為:

      void solve(double p, double k);

      (3) length函數(shù):求平面上兩點(x1,y1)和(x2,y2)的距離,即連接這兩點的線段的長度。該函數(shù)有4個形參,為這兩個點的坐標;返回值為求的線段長度。length函數(shù)的原型為:

      double length( double x1, double y1,

      double x2, double y2 );

      通過這道題目的講解,學生在求解比較復雜的數(shù)學應用題時,能根據(jù)需要對程序的功能進行分解并用不同的函數(shù)實現(xiàn)。

      4遞歸函數(shù)設計(提高篇)

      在以前的教學中,函數(shù)設計通常需要2~3周才能講完。而在目前的教學中,我們將函數(shù)重載、有默認參數(shù)的函數(shù)等內(nèi)容剔除掉后,學生能夠在1周(3個理論課時+2個實驗課時)的教學中初步掌握函數(shù)的設計方法。在后續(xù)章節(jié)的教學中,我們列舉的很多例題也需要通過設計函數(shù)來實現(xiàn),所以在后續(xù)的教學中一直在進一步加強學生對函數(shù)設計方法的掌握。另外,我們將遞歸函數(shù)的設計放在“遞歸與搜索”這一章當中來講解,作為函數(shù)設計的提高階段。

      遞歸是很多算法的基礎,如搜索、分治等,也是課程的一個難點。學生在掌握了一般函數(shù)的設計方法后,在利用遞歸思想進行搜索求解時需要注意以下兩個問題:

      (1) 如何設計遞歸函數(shù)遞歸函數(shù)的設計主要面臨以下幾個問題:

      ① 需要將什么信息傳遞給下一層遞歸調(diào)用?——由此確定遞歸函數(shù)有幾個參數(shù),各參數(shù)含義是什么。

      ② 每一層遞歸函數(shù)調(diào)用后會得到一個怎樣的結果?這個結果是否需要返回到上一層?——由此確定遞歸函數(shù)的返回值,及返回值的含義。

      ③ 在每一層遞歸函數(shù)的執(zhí)行過程中,在什么情形下需要遞歸調(diào)用下一層?以及遞歸前該做什么準備工作?遞歸返回后該做什么恢復工作?——由此確定遞歸函數(shù)中遞歸調(diào)用的細節(jié)。

      ④ 遞歸函數(shù)執(zhí)行到什么程度就可以不再需要遞歸調(diào)用下去了?——應該在適當?shù)臅r候終止遞歸函數(shù)的繼續(xù)遞歸調(diào)用,也就是要確定遞歸的終止條件。

      (2) 如何調(diào)用遞歸函數(shù)進行求解

      調(diào)用遞歸函數(shù)進行求解:在main函數(shù)(或其他函數(shù))中應該采取怎樣的形式調(diào)用遞歸函數(shù)?也就是從怎樣的初始狀態(tài)出發(fā)進行搜索,通常也就是確定實參的值。

      我們在教學中以一些經(jīng)典的競賽題目為例來闡述上述方法,如有這樣一道例題:有17種硬幣,硬幣的面值是平方數(shù)12, 22, 32, …, 172,即1, 4, 9, …, 289。問要支付一定額的貨幣,有多少種支付方法。

      例如,若要支付總額為10的貨幣,則有四種方法:10個面值為1的貨幣;1個面值為4的貨幣和6個面值為1的貨幣;2個面值為4的貨幣和2個面值為1的貨幣;1個面值為9的貨幣和1個面值為1的貨幣。

      在本題中,為避免求得重復的支付方案,我們需要按硬幣面值從小到大的順序依次選用合適的硬幣,如果當前選用的硬幣面值總額小于需要支付的貨幣總額n,則繼續(xù)選用;如果等于,則我們找到一種方案,不再考慮其他貨幣,而是繼續(xù)下一個方案的選擇;如果大于,則放棄該方案,繼續(xù)下一個方案的選擇。

      我們設計一個遞歸函數(shù)build來求貨幣總額n的支付方案數(shù),build函數(shù)的設計思路是:

      ●確定build函數(shù)的參數(shù):需要支付的貨幣金額、現(xiàn)已求得的支付方案數(shù)、當前選用的硬幣面值總額、當前最后選用的硬幣是第幾種硬幣這些信息需要傳遞到下一層遞歸調(diào)用。因此確定build函數(shù)有4個參數(shù):n、count、sum、j,分別對應上述4種信息。

      ●確定build函數(shù)的返回值:每次build遞歸調(diào)用結束后,求得的是當前找到的方案數(shù),最上層的build函數(shù)執(zhí)行完后,得到的結果是最終找到的方案數(shù),因此build有返回值,為int型。

      ●確定在什么情況下要遞歸調(diào)用下一層build函數(shù):分別考慮第i種貨幣(i取值為j、j+1、…、17),如果選用該種貨幣(sum的值增加i*i)后,sum仍小于n,則遞歸調(diào)用build函數(shù):build( n, count, sum, i);從該遞歸調(diào)用返回后,sum的值要減去i*i,

      表示棄用第i種貨幣,繼續(xù)考察下一種貨幣。

      ●確定build函數(shù)的終止條件:如果當前選用硬幣面值總額sum等于或大于n時,不再遞歸調(diào)用下去,其中前一種情形還需將count的值加1,表示找到一種支付方案。

      根據(jù)上述分析,設計的build函數(shù)如下:

      int build(int n, int count, int sum,int j)

      {

      int i; //循環(huán)變量

      for( i=1; i<=17; i++ )//搜索所有面值的硬幣

      {

      if( i

      sum += i*i; //選用面值為i*i的硬幣

      //找到一種支付方案

      if( sum==n )return ++count;

      //超出了支付總額,不再搜索

      if( sum>n )return count;

      //沒超出則遞歸調(diào)用build函數(shù)繼續(xù)搜索

      count = build( n, count, sum, i );

      sum -= i*i; //棄用面值為i*i的硬幣

      }

      return count;

      }

      build函數(shù)設計好以后,在主函數(shù)中,只要采取以下語句調(diào)用build函數(shù)就可以求得貨幣總額n的支付方案數(shù)count:

      count = build( n, 0, 0, 0 );

      4個實參的值代表問題的初始狀態(tài):需支付的貨幣總額為n、現(xiàn)已求得的支付方案數(shù)為0、當前選用的硬幣面值總額為0、當前最后選用的硬幣是第0種硬幣。

      通過這些搜索題目的講解,學生能在理解搜索思想的同時掌握遞歸函數(shù)的設計技巧,從而進一步提高函數(shù)設計能力。

      5結束語

      函數(shù)設計是“程序設計基礎”課程的一個重點,也是學生普遍感到難以掌握的一個知識點。本文在以在線實踐為導向的教學思路基礎上,詳細的介紹了我們在函數(shù)設計教學中采取的教學方法和過程,這些方法和過程都是以在線實踐為導向的教學思路的具體體現(xiàn)。

      參考文獻:

      [1] 王桂平,馮睿. 以在線實踐為導向的程序設計課程教學新思路[J]. 計算機教育,2008(22):100-102.

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

      [3] 謝偉增,李瑾. C語言程序設計中的重點:函數(shù)與指針[J]. 河南廣播電視大學學報,2003,16(4):65-66.

      [4] 羅碧波. C/C++語言程序中函數(shù)調(diào)用解決辦法[J]. 計算機時代,2007(5):66-67.

      猜你喜歡
      教學
      微課讓高中數(shù)學教學更高效
      甘肅教育(2020年14期)2020-09-11 07:57:50
      「微寫作」教學實踐的思考
      “以讀促寫”在初中寫作教學中的應用
      如何讓高中生物教學變得生動有趣
      甘肅教育(2020年12期)2020-04-13 06:25:34
      談高中音樂欣賞教學中的“聽、看、想、說、動”
      “自我診斷表”在高中數(shù)學教學中的應用
      東方教育(2017年19期)2017-12-05 15:14:48
      對外漢語教學中“想”和“要”的比較
      唐山文學(2016年2期)2017-01-15 14:03:59
      對識譜教學的認識與思考
      《可以預約的雪》教學探索與思考
      中學語文(2015年6期)2015-03-01 03:51:42
      對高等數(shù)學教學的一些思考
      琼结县| 海林市| 荔波县| 通河县| 海阳市| 嵩明县| 科技| 绿春县| 安泽县| 桦甸市| 临海市| 瑞安市| 万载县| 长葛市| 昔阳县| 武胜县| 象山县| 临猗县| 兴城市| 壶关县| 涿鹿县| 黔江区| 阳山县| 威远县| 沁阳市| 宁安市| 邛崃市| 长岛县| 宁陕县| 遂溪县| 方正县| 高州市| 克什克腾旗| 新竹县| 青冈县| 会宁县| 桃江县| 伊金霍洛旗| 贵定县| 共和县| 宁德市|