C語言程序設計基礎課件 04 函數_第1頁
C語言程序設計基礎課件 04 函數_第2頁
C語言程序設計基礎課件 04 函數_第3頁
C語言程序設計基礎課件 04 函數_第4頁
C語言程序設計基礎課件 04 函數_第5頁
已閱讀5頁,還剩41頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

函數C語言程序設計基礎目錄CONTENTS01庫函數020304自定義函數函數的參數傳遞與返回值遞歸函數05局部變量、全局變量與變量作用域06函數綜合應用01庫函數庫函數概述函數的概念函數是一段可重復調用、功能相對獨立完整的程序段,是模塊化程序設計的基礎。C語言程序由一個main()函數和零個或多個其他函數組成,函數可分布在不同文件中,編譯后與庫函數代碼鏈接形成可執行程序。使用函數的優點使用函數可避免重復書寫代碼,將代碼分成模塊,便于編寫、跟蹤和理解程序。函數的分類函數分為庫函數和自定義函數。庫函數是系統預先定義的公共函數,使用時需包含相應頭文件;自定義函數是根據特殊需求設計的。導例:平方根表問題描述問題分析算法描述程序實現運行結果程序分析輸出100以內整數的平方根表,要求每行輸出10個。輸出表頭,每行輸出行號,和對應的行列值10個平方根程序輸出一個10×10的表格,每行10個平方根值,從0.00到9.95,格式整齊。強調了#include<math.h>的必要性,以及如何通過循環和格式化輸出實現表格的打印。程序通過嵌套循環實現,外層循環控制行,內層循環計算并輸出每行的平方根,使用printf格式化輸出保留兩位小數。方案1通過牛頓迭代法手動計算平方根,但代碼復雜且效率低。方案2直接調用庫函數sqrt(),代碼簡潔且準確。導例:平方根表程序實現#include<stdio.h>#include<math.h>intmain(){intm,n;printf("");for(n=0;n<10;n++)printf("%7d",n); //輸出表頭printf("\n");for(m=0;m<10;m++){printf("%d",m);for(n=0;n<10;n++)printf("%7.2f",sqrt(m*10+n)); //調用庫函數sqrt()printf("\n");}return0;}導例:隨機生成撲克牌問題描述隨機生成一個1-54之間的數,輸出對應的撲克牌花色和面值030201040506問題分析算法描述程序實現運行結果程序分析每張撲克牌有花色和面值兩個屬性,可通過隨機函數rand()生成隨機數,通過取模和整除操作確定花色和面值,利用switch語句輸出對應結果。隨機生成1個整數,根據該數值判別撲克牌的花色和面值。程序通過srand(time(NULL))初始化隨機種子,然后調用rand()生成隨機數,通過一系列條件判斷和switch語句輸出撲克牌的花色和面值。。多次運行程序,輸出如'spadeA'、'club8'等隨機撲克牌結果,驗證了隨機性。說明使用隨機函數的方法,包括初始化隨機種子、生成隨機數等。導例:隨機生成撲克牌程序實現#include<stdio.h> //使用庫函數printf()、scanf()和符號常量NULL#include<stdlib.h> //使用庫函數rand()和srand()#include<time.h> //使用庫函數time()intmain(){intcard,suit,rank;srand((unsigned)time(NULL)); //初始化隨機種子為當前系統時間card=rand()%54+1; //隨機產生1~54之間的數if(card==53) printf("redjoker"); //大王elseif(card==54) printf("blackjoker"); //小王else{suit=(card-1)/13; //花色switch(suit){case0:printf("spade");break; //黑桃case1:printf("heart");break; //紅桃case2:printf("club");break; //梅花case3:printf("diamond");break; //方塊

}rank=card%13; //面值switch(rank){case0:printf("K");break;case1:printf("A");break;case11:printf("J");break;case12:printf("Q");break;default:printf("%d",rank);break;}printf("\n");}return0;}庫函數使用方法頭文件使用庫函數時,需在程序前面用#include命令包含相應的頭文件。#include指令有#include<文件名>和#include\文件名\兩種形式,前者到系統指定目錄查找,后者先在當前目錄查找。頭文件內容頭文件包含符號常量定義、類型定義及函數原型等,包含頭文件相當于進行函數聲明。預處理過程在預處理階段,頭文件的內容會被復制到源程序中#include指令的位置,完成函數的聲明。常用庫函數數學函數在VC6.0環境下,使用數學函數需包含頭文件math.h,如sin()、cos()、tan()等。隨機函數C語言提供了srand()和rand()函數產生隨機數,需包含頭文件stdlib.h和time.h。隨機數是偽隨機數,可通過設置隨機種子使每次產生的隨機數不同。02自定義函數導例:階乘累加和問題描述問題分析算法描述程序實現運行結果程序分析從鍵盤輸入1個整數,計算1~n的各個數的階乘的累加和,即1+2!+3!+…+n!。定義函數factorial(),在main()函數中輸入整數n,循環調用factorial()函數并累加結果。輸入20,程序輸出2561327494111820300,驗證了程序的正確性。說明自定義函數的定義、聲明和調用方法,以及累加和變量類型的選擇。程序中定義了factorial()函數計算階乘,主函數通過循環調用該函數并累加結果,最后輸出累加和。可使用for語句循環實現,也可定義一個函數專門計算階乘。使用函數可提高代碼復用性。導例:階乘累加和程序實現#include<stdio.h>doublefactorial(inti); //函數聲明intmain(void){ inti,n;doublesum=0;printf("Enter1integers:");scanf("%d",&n);for(i=1;i<=n;i++)sum=sum+factorial(i); //函數調用printf("1!+2!+3!+…+%d!=%.0f\n",n,sum);return0;}doublefactorial(inti) //函數定義{intj;doubleresult=1;for(j=1;j<=i;j++)result=result*j;returnresult;}導例:素數判斷問題描述輸入兩個整數m和n(m<n),輸出區間[m,n]內的所有素數,每行輸出10個030201040506問題分析算法描述程序實現運行結果程序分析定義一個函數prime()判斷素數,主函數中通過循環調用該函數并輸出結果。定義函數prime(),在main()函數中輸入m和n,循環調用prime()函數并輸出素數程序中定義了prime()函數判斷素數,主函數通過循環調用該函數并輸出結果,每行10個素數。。輸入100和300,程序輸出區間內的素數,每行10個,格式整齊。明使用隨機函數的方法,包括初始化隨機種子、生成隨機數等。導例:素數判斷程序實現#include<stdio.h>#include<math.h>intmain(){ intcount=0,i,m,n; intprime(inti);//函數聲明

scanf("%d%d",&m,&n);for(i=m;i<=n;i++){if(i%2==1&&prime(i)||i==2)//函數調用{ printf("%6d",i);count++; if(count%10==0) printf("\n");}}return0;}

intprime(inti)//函數定義{intj,x;if(i==1)return0;x=sqrt(i);for(j=2;j<=x;j++)if(i%j==0)return0; return1;}函數的定義、聲明和調用函數的定義函數定義包括函數頭和函數體兩部分。函數頭由函數類型、函數名和形參表組成;函數體由函數實現過程和return語句組成。函數的調用函數調用指定被調用函數的名字和所需信息,將實參傳遞給形參并執行函數體后返回結果。調用標準庫函數需包含相應頭文件,調用自定義函數需有對應的函數定義。函數的聲明在函數調用前,若函數未定義,需進行函數聲明。聲明目的是告訴編譯器函數的相關信息,保證調用正確。函數調用過程分析函數調用過程程序從main()函數開始執行。遇到函數調用時,主函數暫停執行,執行被調用函數,執行完畢后返回主函數繼續執行。棧的作用系統通過工作棧保存返回信息,保證函數嵌套調用的正確執行。棧是后進先出的數據結構,函數調用時將當前函數的運行環境和返回地址進棧,被調用函數執行結束后出棧。03函數的參數傳遞與返回值導例:富翁與騙子問題描述一個騙子對富翁說:“你每天只需存入一分錢,第二天存入兩分錢,依此類推,以后每天存入的資金是前一天的2倍,存期一個月。可以從存入第一天起每天支取30萬,直到30天期滿。”編寫程序計算30天后富翁支取了多少錢,存入多少錢?富翁是否虧損,虧損多少?如果獲利,獲利多少?存入金額大于取現金額的最少天數是多少?030201040506問題分析算法描述程序實現運行結果程序分析定義兩個函數deposit()和withdraw()分別計算存入和支取資金,通過比較兩者大小判斷盈虧。定義函數prime(),在main()函數中輸入m和n,循環調用prime()函數并輸出素數定義兩個函數deposit()和withdraw()分別計算存入和支取資金。主函數通過調用這兩個函數,比較兩者大小判斷盈虧。。輸出30天存入和支取的資金,判斷盈虧情況,輸出存入金額大于取現金額的最少天數。說明參數傳遞過程和返回值的使用,以及函數調用的邏輯。導例:富翁與騙子導例:富翁與騙子程序實現#include<stdio.h>intdeposit(intday);intwithdraw(intcount,intday);intmain(){inti,dep,draw,profit; dep=deposit(30);draw=withdraw(300000,30);printf("30天存入%d元錢\n",dep);printf("30天取得%d元錢\n",draw);profit=draw-dep;if(profit>0)printf("富翁獲利%d元錢\n",profit);elseprintf("富翁虧損%d元錢\n",-profit);for(i=1;i<=30;i++)if((deposit(i)-withdraw(300000,i))>0){printf("存入金額大于取現金額的最少天數是%d天\n",i);break;}return0;}

intdeposit(intday) //存入資金總和{inti; longdep=1,number=1; for(i=1;i<day;i++){number*=2;dep+=number;}return(dep/100);}

intwithdraw(intcount,intday) //支取資金總和{longdraw;draw=count*day;returndraw;}導例:數字三角形問題描述從鍵盤輸入一個整數n,輸出數字三角形。030201040506問題分析算法描述程序實現運行結果程序分析定義函數Rt()處理數字三角形,根據n值輸出相應的三角形。輸入整數n,主函數調用Rt()函數輸出數字三角形。定義一個Rt()處理數字三角形,主函數通過調用這個函數,輸出相應的三角形。。輸出數字三角形。說明參數傳遞和返回值的特點,以及函數無返回值的情況。導例:數字三角形程序實現#include<stdio.h>intmain(){intn;voidRt(intn);scanf("%d",&n);Rt(n);return0;}

voidRt(intn){inti,j;for(i=1;i<=n;i++) {for(j=1;j<=i;j++) printf("%-4d",j); putchar('\n'); }}函數的參數傳遞值傳遞方式值傳遞將實參的值復制給形參,形參的改變不會影響實參。在函數定義時,形參為普通類型,調用時系統為形參分配存儲空間,調用結束后釋放。地址傳遞方式地址傳遞將實參地址傳遞給形參,對形參的處理就是對實參的處理。當函數參數為指針類型或數組類型時采用地址傳遞方式。傳遞方式的選擇若希望實參值不變,采用值傳遞;若希望實參值改變或返回多個值,采用地址傳遞。函數的返回值有返回值函數有返回值函數在函數執行結束后返回一個結果,由return語句給出。return語句結束函數運行并返回表達式的值。無返回值函數無返回值函數只完成特定處理,不返回計算結果,函數類型為void,return語句只結束函數執行。函數返回值的注意事項無論函數是否有返回值,都應明確指定返回值類型。函數體中要有對應的return;語句。04遞歸函數導例:假幣問題(三分法)問題描述有n個硬幣,已知有一個是假幣,而且它的重量比真幣小,現在有一個天平,問最多需要稱幾次可以把那個假幣找出來。。030201040506問題分析算法描述程序實現運行結果程序分析定義可采用二分法或三分法,三分法更高效。定義函數fake(),根據硬幣數量遞歸計算稱重次數。定義函數fake(),根據硬幣數量遞歸計算稱重次數。主函數通過調用這個函數,采用遞歸算法,獲得假幣次數。。輸入硬幣數,輸出稱重次數說明遞歸函數的定義和調用方法,以及遞歸出口的重要性。導例:假幣問題(三分法)程序實現#include<stdio.h>intfake(intcoin);main(){intcoin;printf("輸入硬幣數:");scanf("%d",&coin);printf("需要稱%d次\n",fake(coin));//遞歸函數調用}intfake(intcoin){intnumber;switch(coin){case1:number=0;break;case2:case3:number=1;break;default:number=1+fake(coin/3);}returnnumber;}導例:

Fibonacci數列問題描述從鍵盤輸入一個整數n,輸出斐波那契數列(Fibonacci)的前n項。要求每行打印10個數后換行。。030201040506問題分析算法描述程序實現運行結果程序分析可采用遞歸或非遞歸方法,遞歸方法易理解但效率低。定義函數fib(),遞歸計算斐波那契數列的某一項。實現函數聲明、定義和調用,注意遞歸出口的設置。輸出斐波那契數列的前n項。說明遞歸函數的定義和調用方法,以及遞歸的效率問題。導例:Fibonacci數列程序實現#include<stdio.h>intfib(intk);main(){intn,value,count=0;printf("Enter1integers\n:");scanf("%d",&value);for(n=0;n<value;n++){printf("%10d",fib(n));count++;if(count%5==0)printf("\n");}}

intfib(intn){intf;if(n==0)f=1;elseif(n==1)f=1;elsef=fib(n-1)+fib(n-2);returnf;}遞歸函數的執行過程遞歸將問題分解為子問題,通過函數自身調用解決子問題。遞歸的基本思想系統通過工作棧保存返回信息,保證遞歸調用的正確執行。遞歸過程中,每次遞歸調用時將當前函數的運行環境和返回地址進棧,遞歸結束后出棧。遞歸的執行過程遞歸函數要設置遞歸出口,避免無限制遞歸導致棧溢出。同時要找出遞歸公式,將原問題分解為子問題。遞歸的注意事項遞歸函數的效率分析遞歸的性能問題遞歸增加系統開銷,時間上執行調用與返回的額外工作占用CPU時間,空間上每次遞歸需分配存儲空間。遞歸與非遞歸的比較遞歸程序易讀,但效率低;非遞歸程序效率高,但編程難度大、可讀性差。應根據實際情況選擇使用。05局部變量、全局變量與變量作用域導例:公園人數統計問題描述統計某公園A門和B門進出人數和公園總人數。。030201040506問題分析算法描述程序實現運行結果程序分析定義函數分別計算A門和B門進出人數,使用全局變量統計總人數。采用模塊化設計,通過函數調用統計人數。定義全局變量和局部變量,函數聲明、定義和調用。輸出公園總人數。說明局部變量的作用域和生存周期,以及全局變量的使用。導例:公園人數統計程序實現#include<stdio.h>intsum=0;/*全局變量*/intmain(){chargate;intflag,i,num;/*局部變量*/voidam(int,int);voidbm(int,int);for(i=1;i<=3;i++){printf("輸入公園a/b門進入/離開人數:");scanf("%c%d%d",&gate,&flag,&num);if(gate=='a')am(flag,num);elseif(gate=='b')bm(flag,num);getchar();}printf("公園總人數是%d人\n",sum);return0;}

voidin(intn){sum+=n;}voidout(intn){sum-=n;}

voidam(intflag,intnum) {if(flag==1){printf("a門本次進入%d人\n",num);in(num); }else{printf("a門本次離開%d人\n",num);out(num); }}

voidbm(intflag,intnum) {if(flag==1){printf("b門本次進入%d人\n",num);in(num); }else{printf("b門本次離開%d人\n",num);out(num); }}局部變量和全局變量局部變量局部變量在函數內部或復合語句中定義,作用域限于所在函數或語句塊。函數級局部變量在不同函數中可同名,互不干擾;復合語句級局部變量作用域限于復合語句。全局變量全局變量在函數外部定義,作用域從定義處到文件結束。使用全局變量需遵循“先定義后使用”原則,必要時進行外部變量聲明。變量作用域和生存期的區別變量作用域是指變量可訪問的代碼塊范圍,生存期是指變量存在的時間段。局部變量生存期一般為函數執行周期,全局變量生存期為整個程序運行期。變量的作用域和生存期局部變量的作用域和生存期函數級局部變量作用域限于函數,復合語句級局部變量作用域限于復合語句。靜態局部變量在程序運行期間一直存在,再次調用函數時保留上次的值。全局變量的作用域和生存期全局變量作用域為定義處到文件結束,生存期為整個程序運行期。使用全局變量可加強函數間的數據聯系,但會降低函數獨立性。不同類型變量的比較全局變量、局部變量、靜態全局變量、靜態局部變量在作用域、分配內存空間等方面存在差異。靜態變量改變了變量的存儲方式或作用域。06函數綜合應用導例:模擬銀行ATM機存取款問題描述模擬銀行ATM機存取款,實現查詢、存款、取款、轉賬、修改密碼等功能。030201040506問題分析算法描述程序實現運行結果程序分析用模塊化設計,將各項功能用不同函數實現。定義全局變量保存存款余額和密碼,劃分模塊確定各函數功能,主函數根據用戶選擇調用相應函數。實現函數聲明、定義和調用,注意密碼驗證和菜單選擇的邏輯。實現ATM機的各項功能。說明模塊化設計的優點和全局變量的使用問題,應盡量使用局部變量提高程序質量。導例:模擬銀行ATM機存取款程序實現#include<stdio.h>#include<conio.h>#include<stdlib.h>doublekey=123456,balance=0;//定義全局變量,保存密碼和存款余額intmenu(void); voidcheck(void);voiddeposit(void);voidwithdraw(void);voidtransfer(void);voidchangekey(void);

intmain(){intpassword,times=1,choice;do{times++;printf("請輸入密碼(6位數字):");scanf("%d",&password);if(password!=key)if(times>3){printf("密碼輸入三次錯誤!按任意鍵退出!\n");getch();exit(0);}elseprintf("密碼輸入錯誤!請再次輸入密碼!\n");}while(password!=key&×<=3);

choice=menu(); //顯示菜單項,獲取操作類型while(choice!=0) //若輸入類型為0,循環結束{switch(choice){case1:check();break; //函數調用,查詢case2:deposit();break; //函數調用,存款case3:withdraw();break; //函數調用,取款case4:transfer();break;case5:changekey();break; default:printf("輸入錯誤,請重新輸入選擇項:");break;//輸入錯誤提示}choice=menu(); //繼續輸入操作類型}return0;}

intmenu(void) //定義菜單函數{intchoice;printf("********銀行ATM機存取款管理系統********\n");printf("********0--退出系統\n");printf("********1--查詢賬戶余額\n");printf("********2--存款\n");printf("********3--取款\n");printf("********4--轉賬\n");printf("********4--修改密碼\n");printf("請輸入選擇項:");scanf("%d",&choice); //輸入操作類型returnchoice;}

voidcheck(void) //定義存款余額查詢函數{printf("當前存款余額為:%.2f\n",balance);}

voiddeposit(void) //定義銀行存款函數{intnumber;printf("請輸入存款金額:");scanf("%d",&number); //輸入操作金額balance+=number;printf("當前存款余額為:%.2f\n",balance);}導例:模擬銀行ATM機存取款voidwithdraw(void) //定義銀行取款函數{intnumber;printf("請輸入取款款金額:");scanf("%d",&number); //輸入操作金額if(balance<number)printf("余額不足,不能取款");elsebalance-=number;printf("當前存款余額為:%.2f\n",balance);}

voidtransfer(void) //定義銀行轉賬函數{intaccount,number;printf("請輸入要轉入的賬號:");scanf("%d",&account);printf("請輸入轉賬金額:");scanf("%d",&number); //輸入操作金額if(balance<number)printf("余額不足,不能轉賬");else{balance-=number;printf("轉賬成功!轉出金額為:%d,當前存款余額為:%.2f\n",number,balance);}}

voidchangekey(void) //定義銀行修改密碼函數{intkey1,key2;printf("請輸入要修改的密碼(6位數字):");scanf("%d",&key1);printf("請再次輸入要修改的密碼(6位數字):");scanf("%d",&key2);if(key1==key2){printf("密碼修改成功!");key=key1;}elseprintf("密碼修改不成功!");} 導例:貸款計算器問題描述設計一款簡單的貸款計算器,計算等額本金或等額本息還款方式下的月供、利息總額和還款總額。030201040506問題分析算法描述程序實現運行結果程序分析采用模塊化設計,將輸入、查詢、計算等功能用不同函數實現。定義全局變量保存貸款信息,設計菜單函數和各功能函數,根據用戶選擇調用相應函數。實現函數聲明、定義和調用,注意還款方式的計算邏輯。輸出貸款的還款信息。說明全局變量的使用問題,可采用其他數據結構替代全局變量。導例:貸款計算器程序實現#include<stdio.h>#include<math.h>intpattern=0,year=0; //pattern還款方式doubleloan=0,rate=0,discount=0;//loan貸款總額,rate年利率,discount折扣intmenu(void);voidinput(void);voidshow(void);voidpay(void);

intmain(){intchoice;while(1){choice=menu();if(choice==0)break;switch(choice){case1:input();break;case2:show();break;case3:pay();break;default:printf("輸入錯誤!");}}return0;}intmenu(void) //菜單界面{intch;printf("\n--------貸款計算器--------\n");printf("輸入貸款信息請按1\n");printf("顯示貸款信息請按2\n");printf("顯示還款信息請按3\n");printf("退出請按0\n");printf("請輸入選擇:");scanf("%d",&ch);return(ch);}voidinput()//信息輸入{printf(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論