




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C語言程序設計教案第5章函數授課內容第5章函數任課教師授課形式理實一體任課班級教學方法本節采用以教師為主導,在教學過程中同時采用提問法、討論法和互動式教學方法。教學重點掌握怎樣編寫函數與調用功能函數的能力。教學難點能熟練地在程序設計中用函數實現一些常用算法。教學目標教學目標(1)理解使用稱為“函數”的小程序塊構造程序模塊的好處。(2)熟悉C標準庫中常見的庫函數,并能在程序中靈活地運用它們。(3)根據實際需要能夠自己定義功能函數并會調用它們,掌握函數聲明的必要條件。(4)理解函數之間的信息(參數)傳遞機制。技能目標(1)能編寫和閱讀模塊化結構程序。(2)掌握函數的定義及調用方式。(3)掌握局部變量和全局變量的區別和典型用法。(4)掌握運用函數處理多個任務的能力。素質目標(1)通過學習函數和模塊化程序設計思想,培養學生在工作、生活中遇到困難時,能夠積極面對,將大問題劃分成小問題依次去解決。(2)通過學習預處理程序,使同學們明白不打無準備之仗。現在我們要好好學習專業知識,這樣在工作中才能更好的去完成任務。(3)通過程序常見錯誤分析與改正,使學生明白更加美好的人生,需要積累、不斷改正缺點。(4)通過遞歸函數的學習,明白言傳身教的重要性。思政目標分而治之的思想、增強團結、合作意識教學步驟及內容教學步驟及內容教學步驟及內容教學步驟及內容教學步驟及內容教學步驟及內容教學步驟及內容教學步驟及內容教學步驟及內容教學步驟及內容教學步驟及內容:教學過程:復習舊課導出新課二、講授新課5.1函數概述5.1.1函數引入前幾章內容已涉及函數的概念,例如,標準輸入scanf()函數、標準輸出函數printf()函數及其他函數。這一類函數稱為C語言的標準庫函數,是由C語言開發環境事先提供給編程人員的。編程人員實際編程時只需調用這些函數即可,至于這些函數是如何實現功能的編程人員不必知曉。有了C語言的標準庫函數,編程人員既加強了所編程序的功能,又提高了編程效率。但在實際編程中,若程序的規模比較大,將所有代碼都寫在main()函數中,會使main()函數變得十分龐雜,不易于程序的閱讀和維護。這時可以利用函數將程序劃分成多個小的模塊,從而方便理解和修改程序。模塊化程序設計思想是指將一個較大的程序分為若干個程序模塊,每個模塊用來實現一個特定的功能。在C語言中,用函數來實現模塊的功能。一個C程序可由一個main()函數和若干個其他函數構成。由main()函數調用其他函數,其他函數可以相互調用。同一個函數可以被一個或多個函數調用任意次。例如,在學校組織學生打掃教室衛生這項活動中,一般由老師組織學生來進行。其中,一部分學生擦窗戶,一部分學生擦桌子,一部分學生掃地。編寫程序就像打掃衛生一樣,main()函數如同組織學生的老師,功能是控制每一步程序的執行,定義的其他函數就好比是各部分學生,分別完成特定的功能。在C語言中可以從不同的角度對函數分類。1.從函數定義角度看函數可分為庫函數和用戶定義函數兩種。(1)庫函數。庫函數是由系統提供的,用戶不必自己定義,也不必在程序中作類型說明,只需在程序前包含該函數原型的頭文件,即可在程序中直接調用。例如,調用printf()函數和scanf()函數時需要在程序開頭包含stdio.h頭文件;調用sqrt()函數和log()函數時需要包含math.h頭文件;調用strcpy()函數和strlen()函數時需要包含string.h頭文件。(2)用戶定義函數。由用戶按需要編寫的函數。對于用戶自定義函數,不僅要在程序中定義函數本身,而且在主調函數模塊中還必須對該被調函數進行類型說明,然后才能使用。2.從對函數返回值的需求狀況看C語言函數又可分為有返回值函數和無返回值函數兩種。(1)有返回值函數。此類函數被調用執行完后將向調用者返回一個執行結果,稱為函數返回值,例如,數學函數。由用戶定義的需要返回函數值的函數,必須在函數定義和函數說明中明確返回值的類型。(2)無返回值函數。此類函數用于完成某項特定的處理任務,執行完成后不向調用者返回函數值。這類函數并非真的沒有返回值,程序設計者也不關心它,此時大家關心的是它的處理過程。由于函數無需返回值,用戶在定義函數時,可制定它的返回為“空類型”,說明符為void。3.從主調函數和被調函數之間數據傳送的角度看C語言函數又可分為無參函數和有參函數。(1)無參函數。函數定義、函數說明及函數調用中均不帶參數,主調函數和被調函數之間不進行參數傳送。函數通常用來完成一組制定的功能,可以返回或不返回函數值。(2)有參函數。在函數定義及函數說明時都有參數,稱為形式參數(簡稱“形參”)。在函數調用時也必須給出參數,稱為實際參數(簡稱“實參”)。進行函數調用時,主調函數將把實參的值傳送給形參,供被調函數使用。4.從功能角度看C語言提供了極為豐富的庫函數,這些庫函數又可從功能角度分為多種類型。在C語言中,所有的函數定義都是平行的,也就是說,在一個函數的函數體內,不能再定義另一個函數,即不能嵌套定義。但函數之間允許相互調用,也允許嵌套調用,習慣上把調用者稱為主調函數。函數還可以自己調用自己,稱為遞歸調用。main()函數是主函數,它可以調用其他函數,而不允許被其他函數調用。5.1.2函數的定義函數的定義一般格式如下:函數類型函數名(形參及其類型){ 局部變量定義語句; 可執行語句序列;}其中,(1)函數類型函數返回值的數據類型,可以是基本數據類型、void類型、指針類型等。(2)函數名是一個有效、唯一的標識符,符合標識符的命名規則。函數名不僅用來標識函數、調用函數,同時它本身還存儲著該函數的內存首地址。(3)形參是實現函數功能所要用到的傳輸數據,它是函數間進行交流通信的唯一途徑。由于形參是由變量充當的,所有必須定義類型,定義形參時,在函數名后的括號中定義,形參可以為空,表示沒有參數,也可以由多個參數組成,參數之間用逗號隔開。(4)函數體是由{}括起來的一組復合語句,一般包含兩部分:聲明部分和執行部分。其中,聲明部分主要是完成函數功能時所需要使用的變量的定義,執行部分則是實現函數功能的主要程序段。(5)對于有返回值的函數,必須用帶表達式的return語句來結束函數的允許,返回值的類型應與函數類型相同。如果return語句中表達式的值與函數定義的類型不一致,則以函數定義類型為準,并自動將return語句中的表達式的值轉換為函數返回值的類型。5.1.3函數的調用函數的使用是通過函數調用語句來完成的。函數調用是指一個函數暫時中斷本函數的運行,轉去執行另一個函數的過程。C語言是通過main()函數來調用其他函數,其他函數之間可相互調用,但不能調用main()函數。函數被調用時獲得程序控制權,調用完成后,返回到調用函數中斷處繼續運行。函數調用的一般格式如下:函數名(實際參數列表)按被調用函數在main()函數中出現的位置和完成的功能進行劃分,函數調用有以下3種方式。(1)把函數調用作為一個語句。例如,printf("sum=%d\n",sum);,以獨立函數語句的方式調用函數。(2)在表達式中調用函數,這種表達式稱為函數表達式。例如,c=4*max(a,b);,是一個賦值表達式,把4*max的值賦予變量c。(3)將函數調用作為另一個函數的實參。例如,printf("max=%d\n",max(a,b));,把max調用的返回值又作為printf()函數的實參來使用。5.1.4函數的聲明編譯程序在處理函數調用時,必須從程序中獲得完成函數調用所必需的接口信息。函數的聲明是指對函數類型、名稱等的說明。為函數調用提供接口信息,對函數原型的聲明是一條程序說明語句。函數原型的聲明就是在函數定義的基礎上去掉函數體,后面加上分號“;”。函數聲明定義的一般格式如下:函數類型函數名(形參及其類型);例如,intmax(inta,intb);之所以需要函數的聲明,是為了獲得調用函數的權限。如果在調用之前定義或聲明了函數,則可以調用該函數。被聲明的函數往往定義在其他的文件或庫函數中。可以把不同類型的庫函數聲明放在不同的庫文件中,然后在設計的程序中包含該文件。例如,#include"math.h",其中math.h文件包含了很多數學函數的原型聲明。這樣做的好處是方便調用和保護源代碼。庫函數的定義代碼已經編譯成機器碼,對用戶而言是不透明的,但用戶可以通過庫函數的原型獲得參賽說明并使用這些函數,完成程序設計的需要。對于用戶自定義函數,也可以這樣處理。和使用庫函數不同的是,經常把自己設計的函數放在調用函數后。例如,習慣先設計main()函數,再設計定義的函數,這時候需要超前調用自定義函數,在調用之前需要進行函數原型聲明。C語言規定以下3種情況,可以不在主調函數中對被調函數進行聲明:(1)如果被調函數寫在主調函數的前面,可以不必進行聲明。(2)如果函數的返回值為整型或字符型,可以不必進行聲明。(3)如果在所有函數定義之前,在源程序文件的開頭,即在函數的外部已經對函數進行了聲明,則在各個調用函數中不必再對所調用的函數進行聲明。5.1.5函數的參數傳遞函數調用需要向子函數傳遞數據,一般是通過實參將數值傳遞給形參。實參向形參的參數傳遞有兩種形式:值傳遞和地址傳遞。值傳遞是指單向的數據傳遞(將實參的值賦給形參),傳遞完成后,對形參的任何操作都不會影響實參的值。地址傳遞是指將實參的地址傳遞給形參,使形參指向的數據和實參指向的數據相同,因而被調函數的操作會直接影響實參指向的數據。5.1.6返回語句和函數返回值一般情況下,主調函數調用完被調函數后,都希望能夠得到一個確定的值。在C語言中,函數返回值是通過return語句來實現的。函數返回值一般格式如下:return(表達式);return表達式;return;5.1.7函數的嵌套調用與遞歸調用1.函數的嵌套調用嵌套調用是指在調用一個函數并執行該函數過程中,又調用另一個函數的情況。圖5-2給出了函數的嵌套調用示意圖,main()函數實現了對fun1()函數和fun2()函數的調用。由于main()函數首先調用fun()1函數,fun1()函數又對fun2()函數進行調用,fun1()函數中嵌套了fun2()函數。2.函數的遞歸調用函數的遞歸調用是指函數直接或間接地調用其本身。遞歸調用有兩種方式:直接遞歸調用和間接遞歸調用。其中,直接遞歸函數是指在一個函數中直接調用自身。間接遞歸調用是指在一個函數中調用其他函數,而在其他函數中又調用了本函數。遞歸調用的過程分為兩個階段:遞推和回歸。遞推階段是指從原問題出發,按遞歸公式遞推,最終達到遞歸終止條件,從而將一個復雜問題分解為一個相對簡單且可以直接求解的子問題。回歸階段是指將子問題的結果逐層代入遞歸公式求值,最終求得原問題的解。5.2變量的作用域與生命期5.2.1變量的作用域在C語言中,用戶名命名的標識符都有一個有效的作用域。不同的作用域允許相同的變量和函數出現,同一作用域變量和函數不能重復。依據變量作用域的不同,C語言變量可以分為局部變量和全局變量兩大類。局部變量是指在函數內部或復合語句內部定義的變量。函數的形參也屬于局部變量。全局變量是指在函數外部定義的變量。有時將局部變量稱為內部變量,全局變量稱為外部變量。5.2.2變量的生命期變量的生命期是指變量值在程序運行過程中的存在時間。C語言變量的生存期分為靜態生命期和動態生命期。一個程序占用的內存空間通常分為兩個部分:程序區和數據區,數據區也可以分為靜態存儲區和動態存儲區。程序區中存放的是可執行程序的機器指令。靜態存儲區中存放的是靜態數據。動態存儲區中存放的是動態數據,如動態變量。動態存儲區分為堆內存區和棧內存區,堆和棧是不同的數據結構,棧由系統管理,堆由用戶管理。靜態變量是指main()函數執行前就已經分配內存的變量,其生存期為整個程序執行期;動態變量是在程序執行到該變量聲明的作用域才臨時分配內存,其生存期僅在其作用域內。生存期和作用域是不同的概念,分別從時間和空間上對變量的使用進行界定,相互關聯又不完全一致。例如,靜態變量的生存期貫穿整個程序,但作用域是從聲明位置開始到文件結束。5.2.3變量的存儲類型變量的存儲類型有4種,分別由4個關鍵字表示:auto(自動)、register(寄存器)、static(靜態)和extern(外部)。1.auto類型自動變量是指用auto定義的變量,可默認auto。自動類型變量值是不確定的,如果初始化,則賦初始值操作是在調用時進行的,且每次調用都要重新賦初值。在函數中定義的自動變量是只在該函數nei1有效,函數被調用時分配存儲空間,調用結束就釋放。在復合語句中定義的自動變量只在該復合語句中有效,退出復合語句后,便不能再使用,否則將引起錯誤。2.register類型寄存器變量是指用register定義的變量是一種特殊的自動變量。這種變量建議編譯程序將變量中的數據存放在寄存器中,而不像一般的自動變量,占用內存單元,可以大大提高變量的存取速度。一般情況下,變量的值都是存儲在內存中的。為提高執行效率,C語言允許將局部變量的值存放到寄存器中,這種變量就稱為寄存器變量。3.static類型全局變量和局部變量都可以用static來聲明,但意義不同。全局變量總是靜態存儲,默認值為0。全局變量前加上static表示該變量只能在本程序文件內使用,其他文件無使用權限。對于全局變量,static關鍵字主要用于在程序包含多個文件時限制變量的使用范圍,對于只有一個文件的程序有無static都是一樣的。局部變量定義在函數體內部,用static來聲明時,該變量為靜態局部變量。靜態局部變量屬于靜態存儲,在程序執行過程中,即使所在函數調用結束也不釋放。靜態局部變量定義并不初始化,則自動賦數字“0”(整型和實型)或'\0'(字符型)。每次調用定義靜態局部變量的函數時,不再重新為該變量賦初值,只是保留上次調用結束時的值,所以要注意多次調用函數時靜態局部變量每次的值。4.extern類型在默認情況下,在文件域中用extern聲明(主要不是定義)的變量和函數都是外部的。但對于作用域范圍之外的變量和函數,需要使用extern進行引用行聲明。對外部變量的聲明,只是聲明該變量是在外部定義過的一個全局變量,在這里引用。而對外部變量的定義,則是要分配存儲單元。一個全局變量只能定義一次,可以多次引用。用extern聲明外部變量的目的是可以在其他的文件中調用。5.2.4內部函數和外部函數根據函數能否被其他源程序文件調用,將函數分為內部函數和外部函數。1.內部函數內部函數是指一個函數只能被它所在文件中的其他函數調用。在定義內部函數時,可使用關static進行修飾。一般格式如下:static 類型標識符 函數名(形參列表) {函數體}例如,static float max(floata,floatb){ …}使用內部函數,可以使該函數只限于它所在的文件,即使其他文件中有同名的函數也不會相互干擾,因為內部函數不能被其他文件中的函數所調用。2.外部函數外部函數是指在一個源程序文件中定義的函數除了可以被本文件中的函數調用外,還可以被其他文件中的函數調用。在定義外部函數時,可使用關鍵字extern進行修飾,一般格式如下:extern 類型標識符函數名(形參列表)例如,externchardel_str(charr1)5.3預處理程序5.3.1宏定義宏定義是用預處理命令#define實行的預處理,它分為兩種形式:帶參的宏定義與不帶參數的宏定義。1.不帶參數的宏定義不帶參數的宏定義也稱為字符串的宏定義,它用來指定一個標識符代表一個字符串常量。一般格式如下:#define 標識符 字符串其中:標識符就是宏的名字,簡稱宏,字符串是宏的替換正文,通過宏定義,使得標識符等同于字符串。例如,define PI3.14其中,PI是宏名,字符串3.14是替換正文。預處理程序將程序中以PI作為標識符出現的地方都用3.14替換,這種替換稱為宏替換或宏擴展。這種替換的優點在于,用一個有意義的標識符代替一個字符串,便于記憶,易于修改,提高了程序的可移植性。2.帶參數的宏定義C語言的預處理命令允許使用帶參數的宏,帶參數的宏在展開時,不是進行簡單的字符串替換,而是進行參數替換。帶參數的宏定義一般形式如下:#define 標識符(參數表) 字符串例如,#define SUM(a,b)(a+b) 其中,SUM是宏名,a和b是函數形式參數,(a+b)是計算兩個參數之和的表達式。5.3.2文件包含“文件包含”是指把指定文件的全部內容包含到本文件中。文件包含控制行的一般形式如下:#include "文件名"或#include<文件名>例如,#include <stdio.h>在編譯預處理時,就把stdio.h頭文件的內容與當前的文件連在一起進行編譯。同樣此命令對用戶自己編寫的文件也適用。使用文件包含命令的優點:在程序設計中常常把一些公用性符號常量、宏、變量和函數的說明等集中起來組成若干文件,使用時可以根據需要將相關文件包含進來,這樣可以避免在多個文件中輸入相同的內容,也為程序的可移植性、可修改性提供了良好的條件。5.3.3條件編譯一般情況下,源程序中所有的行都參加編譯。但是有時希望對其中一部分內容只在滿足一定條件時才進行編譯,也就是對一部分內容指定編譯條件,這就是“條件編譯”。有時希望當滿足某條件時對一組語句進行編譯,而當條件不滿足時則編譯另一組語句。條件編譯命令有以下3種形式。(1)使用#ifdef的形式。#ifdef 標識符 程序段1#esle 程序段2#endif此語句的作用是當標識符已經被#define命令所定義時,條件為真,編譯程序段1;否則條件為假,編譯程序段2。它與選擇結構的if語句類似,else語句也可以沒有。(2)使用#ifndef的形式。#ifndef 標識符 程序段1#else 程序段2#endif此語句的作用是當標識符未被#define命令所定義時,條件為真,編譯程序段1;否則條件為假,編譯程序段2。與上面的條件編譯類似,else語句也可以沒有。(3)使用#if的形式。#if 表達式 程序段1#else 程序段2#endif它的作用與if-else語句類似,當表達式的值為非0時,條件為真,編譯表達式后的程序段1,否則條件為假,編譯程序段2。5.3.4特殊符號處理編譯預處理程序可以識別一些特殊的符號,并對于在源程序中出現的這些符號將用于合適的值進行替換,從而可以實現某種程度上的編譯控制。常見的定義好的供編譯預處理程序識別和處理的特殊符號如下所示(不同的編譯器還可以定義自己的特殊函數的符號)。_FILE_:包含當前程序文件名的字符串。_LINE_:表示當前行號的整數。_DATE_:包含當前日期的字符串。_STDC_:若編譯器遵循ANSIC標準,則它是個非0值。_TIME_:包含當前時間的字符串。5.4常見錯誤分析5.4.1使用庫函數時忘記包含頭文件不少初學者容易忘記,在使用庫函數時需要用“#include”命令將該原型函數的頭文件包含進來。5.4.2忘記對所調用的函數進行函數原型聲明若函數的返回值不是整型或字符型,并且函數的定義在主調函數之后,那么在調用函數前必須對函數進行原型聲明。5.4.3函數的實參和形參類型不一致函數一旦被定義,就可多次調用,但必須保證形參和實參數據類型一致。若實參和形參數據類型不一致,則按不同類型數值的賦值規則進行轉換。5.4.4使用未賦值的自動變量未進行初始化時,自動變量的值是不確定的,在使用時要特別注意。5.5分組實現函數功能應用實戰5.5.1實戰背景隨著軟件系統的規模越來越龐大,軟件開發過程中的分?越來越明細,靠單兵作戰來實現復雜系統越來越難。各種新知識、新技術不斷推陳出新,需要團隊合作,眾人拾柴火焰高,要求組織成員之間相互依賴、相互關聯、共同合作,提高工作效率,依靠團隊合作的力量創造奇跡。5.5.2實戰目的(1)掌握函數定義及調用方式。(2)具備將較復雜的問題進行抽象分解成若干個功能塊,并能編寫相應的功能函數。5.5.3實戰內容將班級的學生分成三個小組,對輸入不超過50個的整數,分別負責編寫數據輸入函數、數據排序函數和數據輸出函數。5.5
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 南宮市優多皮草有限公司(企業信用報告)
- 中國鉑催化劑項目創業計劃書
- 部編版小學語文三年級作文指導計劃
- 動物王國的奧秘童話類作文10篇
- 社會保障與民生救助在數字化轉型中的角色-洞察闡釋
- 煙草品牌競爭力比較-洞察闡釋
- 移動醫療影像遠程診斷-洞察闡釋
- 數據驅動的監管模式創新-洞察闡釋
- 冰淇淋衛生風險評估模型構建-洞察闡釋
- 美麗的鶯蘿600字12篇
- 浙江中考科學模擬試卷含答案(5份)
- 家庭油煙機知識培訓課件
- 魯蘇省界收費站重大節假日期間應對突發事件應急預案
- 2025年中考物理二輪復習:浮力實驗題 能力提升練習題(含答案解析)
- 食品企業標準模板
- 綜合醫院品牌建設與傳播-深度研究
- 火車的知識科普
- 小學二年級數學萬以內口算題
- 媒體應急管理預案
- 福建省莆田市(2024年-2025年小學六年級語文)統編版期末考試(下學期)試卷及答案
- 服裝行業跨境電商研究報告
評論
0/150
提交評論