




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C程序設計專題輔導課
基本函數程序設計
函數知識要點定義函數、聲明函數、調用函數的一致函數參數的傳遞
——傳值
——傳地址(指針概念)局部變量和全局變量靜態變量(局部、全局)函數知識結構化程序設計思想
——函數組織問題(多文件)函數嵌套求解復雜問題遞歸函數命令行參數宏(符號常量)與帶參數的宏函數是獨立的程序模塊庫函數:如C語言系統提供:
scanf()、printf()、sqrt()等函數自定義函數,如排序sort-選擇法、插入法main()是一個函數C程序由一個main(),以及0個或多個其他函數構成函數定義函數類型函數名(形參表)
/*函數首部*/{ /*函數體*/
函數實現過程
return表達式;}函數處理結果回送給調用函數;函數類型是void,無return只能返回一個值函數返回值的類型沒有分號形參類型1參數1,類型2參數2,……,類型n參數n參數之間用逗號分隔,每個參數前面的類型都必須分別寫明多個形參類型相同,不能寫成列表形式:類型
參數1,參數2;函數類型函數名(形參表){
函數實現過程
return表達式;}無返回值的函數定義void
函數名(參數表) /*函數首部*/{ /*函數體*/
函數實現過程
return;
/*可以省略return*/}這類函數通常用于屏幕輸出等不能省略否則,函數類型被默認定義為int函數調用調用標準庫函數時,在程序的最前面用#include包含相應的頭文件調用自定義函數時,調用函數中必須有與被調用函數定義相一致的函數申明函數聲明函數類型函數名(參數表);函數必須先定義后調用,將主調函數放在被調函數的后面,就像變量先定義后使用一樣。如果自定義函數在主調函數的后面,就需要在函數調用前,加上函數原型聲明。函數聲明:說明函數的類型和參數的情況,以保證編譯時能判斷對該函數的調用是否正確。函數定義第1行(函數首部),以分號結束。變量與函數局部變量和全局變量靜態局部變量局部變量和全局變量局部變量在函數內定義的變量(包括形參)作用范圍:本函數內部定義在復合語句內的變量作用范圍:復合語句內部全局變量 與局部變量同名問題在函數以外定義的變量,不從屬于任一函數。作用范圍:從定義處到源文件結束(包括各函數)static
類型名變量表作用范圍:局部變量生命周期:數據被保留,類似全局變量靜態局部變量結構化程序設計采用自頂向下和逐步求精相結合的方式來解決復雜的問題把大問題分解成若干小問題,小問題再進一步分解成若干更小的問題,直到問題已相對簡單,容易處理為止。當所有的子問題都得到了解決(已通過函數實現),整個問題(程序)也就解決了。每一次分解都是對上一層的問題進行細化和逐步求精,最終形成一種類似樹形的層次結構。函數的組織結構化程序設計寫程序時,用main()解決整個問題,它調用解決小問題的函數這些函數又進一步調用解決更小問題的函數,從而形成函數的嵌套調用main()函數1函數2……函數m函數1_1函數1_2函數m_1函數m_n……程序結構例10-1設計一個常用圓形體體積計算器,采用命令方式輸入1、2、3,分別選擇計算球體、圓柱體、圓錐體的體積,并輸入計算所需相應參數。分析:main()函數:輸入1、2、3選擇計算3種體積,其他輸入結束計算設計一個控制函數cal(),經它辨別圓形體的類型再調用計算球體、圓柱體、圓錐體體積的函數設計單獨的函數計算不同圓形體的體積程序解析-計算常用圓形體體積3層結構,5個函數降低程序的分析設計、編寫、調試的復雜度可讀性好程序結構main()cal()vol_ball()vol_cylind()vol_cone()例10-1源程序#definePI3.141592654voidcal(int
sel);
int
main(void){int
sel;
while(1){
printf("1-計算球體體積\n");
printf("2-計算圓柱體積\n");
printf("3-計算圓錐體積\n");
printf("其他-退出程序運行\n");
printf(“請輸入計算命令:”);
scanf("%d",&sel); if(sel<1||sel>3)
break; /*輸入非1~3,循環結束*/
else
cal(sel); /*輸入1~3,調用cal()*/ }return0;}/*常用圓形體體積計算器的主控函數*/voidcal(intsel){doublevol_ball(void);
doublevol_cylind(void);
doublevol_cone(void);switch(sel){ case1: printf("球體積為:%.2f\n",vol_ball()); break;case2:
printf("圓柱體積為:%.2f\n",vol_cylind()); break;case3:
printf("圓錐體積為:%.2f\n",vol_cone()); break; }}/*計算球體體積V=4/3*PI*r*r*r*/doublevol_ball(){doubler;
printf("請輸入球的半徑:");
scanf("%lf",&r);return(4.0/3.0*PI*r*r*r);}/*計算圓柱體積V=PI*r*r*h*/doublevol_cylind(){doubler,h;
printf("請輸入圓柱的底圓半徑和高:");
scanf("%lf%lf",&r,&h);
return(PI*r*r*h);}/*計算圓錐體積V=h/3*PI*r*r*/doublevol_cone(){doubler,h;
printf("請輸入圓錐的底圓半徑和高:");
scanf("%lf%lf",&r,&h);
return(PI*r*r*h/3.0);}所有函數的原型聲明全部放在main()的前面,這樣各函數的調用方式及調用順序的改變時,函數的定義無需改變。10.1.2函數的嵌套調用順序調用int
main(void){……y=fact(3);……z=mypow(3.5,2);
……}doublefact(intn){……}doublemypow(doublex,inn){……}mainfactmypowmainfactmypow函數的嵌套調用在一個函數中再調用其它函數的情況稱為函數的嵌套調用。如函數A調用函數B,函數B再調用函數C,一個調用一個地嵌套下去,構成了函數的嵌套調用。函數的嵌套調用嵌套調用int
main(void){……cal(sel);
……}voidcal(int
sel){ ……
vol_ball()……}doublevol_ball(){ ……}maincalvol_ballmaincalvol_ball文件包含程序文件模塊為了避免一個文件過長,可以把程序分別保存為幾個文件。一個大程序會由幾個文件組成,每一個文件又可能包含若干個函數。保存有一部分程序的文件稱為程序文件模塊。程序-文件-函數大程序-若干程序文件模塊各程序文件模塊分別編譯,再連接整個程序只允許有一個main()函數問題:如何把若干程序文件模塊連接成一個完整的可執行程序?文件包含建立工程文件文件包含格式#include<需包含的文件名>#include“需包含的文件名”作用把指定的文件模塊內容插入到#include所在的位置,當程序編譯連接時,系統會把所有#include指定的文件拼接生成可執行代碼。文件包含在程序開始編譯前,系統會把#include指定的文件的內容插入,以替換該行include指令,然后開始編譯.將例10-1的5個函數分別存儲在2個.C文件上,要求通過文件包含把它們聯結起來。例10-2注意編譯預處理命令,以#開頭。在程序編譯時起作用,不是真正的C語句,行尾沒有分號。如果使用<>,將使用C語言的標準頭文件,即在系統的include文件夾中搜索如果使用“”,則首先在當前工作文件夾中搜索,后在系統的include文件夾中搜索。工程文件為了把多個文件模塊連接成一個完整程序,除了#include文件包含外,還可以定義工程文件,把需要連接在一起的文件名加入到該工程文件中,經程序連接后,便可生成完整的可執行文件。TC環境中,以文本方式編輯一個工程文件(.prj),將各源程序名稱加入其中,然后Build。VC環境,參見實驗指導書。#include<stdio.h> /*
prog10-1.c */int
main(void){externint
Add(inta,intb); externint
Sub(inta,intb);
intx,y,z; charch;
scanf("%d%c%d",&x,&ch,&y);
if(ch=='+')
z=Add(x,y);
elseif(ch=='-')
z=Sub(x,y);
else
printf("運算符輸入錯誤!\n");
printf("%d%c%d=%d\n",x,ch,y,z); return0; } /*prog10-2.c*/int
Add(inta,intb)
{
intc;c=a+b; returnc;} /*prog10-3.c*/int
Sub(inta,intb)
{
intc;c=a-b; returnc;} 全局變量與程序文件模塊局部變量作用范圍:函數(復合語句)內部生命周期:從函數調用開始-函數調用結束全局變量 作用范圍:從定義處到源文件結束生命周期:從程序執行開始-程序運行結束靜態局部變量作用范圍:局部變量生命周期:全局變量外部變量(extern)在某個程序文件模塊中定義了全局變量,該全局變量可以在整個程序的所有文件模塊中起作用在其他模塊中如果要使用該全局變量,必須將它聲明為外部變量只起說明作用,不分配存儲單元,對應的存儲單元在全局變量定義處分配。可用于全局變量使用位置先于該變量的定義位置intx;voidmain(){………}
文件名file1.cexternx;/*使用file1.c中的全局變量x*/f1(){………}
文件名file2.c擴大全局變量的作用域staticintx;voidmain(){………}使全局變量只限于本文件引用,而不能被其他文件引用
文件名file1.cexternx;/*使用file1.c中的全局變量x*/intf1(){………}
文件名file2.c無法引用靜態全局變量函數與程序文件模塊外部函數函數能夠被程序中的其他程序文件模塊調用在其他文件模塊中調用該函數前,聲明為外部函數extern
函數類型函數名(參數表說明);一般可省略externexternintf1();int
main(void){………f1();………}
文件名file1.cintf1(){………}
文件名file2.c調用另一模塊中的函數externintf1();int
main(void){………f1();………}staticintf1(){………}內部函數使函數只能在本程序文件模塊中被調用static
函數類型函數名(參數表說明);
文件名file1.c
文件名file2.c無法調用宏定義#define宏名標識符宏定義字符串編譯時,把程序中所有與宏名相同的字符串,用宏定義字符串替代#definePI3.14說明:宏名一般用大寫字母,以與變量名區別宏定義不是C語句,后面不得跟分號宏名與宏定義字符串之間用空格分隔宏定義字符串中間可以有空格,以回車結束多用于符號常量要具體分析#definePI3.14;voidmain(){doubled;d=2*PI;
printf("%f\n",d);}替換成d=2*3.14;;程序仍正確。宏定義可以嵌套使用#definePI3.14#defineS2*PI*PI宏定義可以寫在程序中任何位置,它的作用范圍從定義書寫處到文件尾。可以通過“#undef”強制指定宏的結束范圍。宏基本定義#defineA“Thisisthefirstmacro”voidf1(){
printf(“A\n”);}#defineB“Thisisthesecondmacro”
A的有效范圍voidf2(){
printf(B); B的有效范圍}#undefBint
main(void){f1();f2();return0;}例10-6宏的作用范圍10.3.2帶參數的宏定義例:#definef(a)a*a*a
int
main(void)/*水仙花數*/{int
i,x,y,z;for(i=1;i<1000;i++){x=i%10;y=i/10%10;z=i/100;if(x*x*x+y*y*y+z*z*z==i)
printf(“%d\n”,i);} return0;}#definef(a)(a)*(a)*(a)各位數字的立方和等于它本身的數。例如153的各位數字的立方和是13+53+33=153=x+y*x+y*x+y(f(x)+f(y)+f(z)==i)f(x+y)=(x+y)3?要適當地加入括號,以提高替換后的運算優先級帶參數的宏定義實現簡單的函數功能例10-7簡單的帶參數的宏定義。#include<stdio.h>#defineMAX(a,b)(a)>(b)?(a):(b)#defineSQR(x)(x)*(x)intmain(void){
intx,y;
scanf(“%d%d”,&x,&y); x=MAX(x,y); /*引用宏定義*/ y=SQR(x); /*引用宏定義*/
printf(“%d%d\n”,x,y); return0;}
#definef(a,b,t)t=a;a=b;b=t;
intmain()
{ intx,y,t;
scanf(“%d%d”,&x,&y);
f(x,y,t)
printf(“%d%d\n”,x,y); return0;}t=x;x=y;y=t;編譯時被替換帶參數的宏定義不是函數,宏與函數是兩種不同的概念宏可以實現簡單的函數功能示例用宏實現兩個變量值的交換與函數的區別在哪里?#defineF(x)x-2#defineD(x)x*F(x)intmain(){
printf("%d,%d",D(3),D(D(3))); return0;}宏定義閱讀帶宏定義的程序,先全部替換好,最后再統一計算不可一邊替換一邊計算,更不可以人為添加括號D(3)=x*F(x) 先用x替換展開 =x*x-2進一步對F(x)展開,這里不能加括號 =3*3-2=7 最后把x=3代進去計算D(D(3))=D(x*x-2)先對D(3)用x替換展開, =x*x-2*F(x*x-2)拿展開后的參數對D進一步進行宏替換 =x*x-2*x*x-2-2拿展開后的參數對F進一步進行宏替換 =3*3-2*3*3-2-2=-13 最后把x=3代進去計算運行結果:7-13結果分析宏定義應用示例定義宏LOWCASE,判斷字符c是否為小寫字母。
#defineLOWCASE(c)(((c)>='a')&&((c)<='z'))
定義宏CTOD將數字字符(‘0’~‘9’)轉換為相應的
十進制整數,-1表示出錯。
#defineCTOD(c)(((c)>='0')&&((c)<='9')?c-'0':-1)
2007試題#include<stdio.h>#defineP(a)a*a+5#defineQ(a,b)a*bintmain(){
printf("%d",P(3)/Q(2,3));return0;}3*3+5/2*3
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025木材產品購銷合同范本
- 不動產房產贈與合同協議書
- 學校演播室裝修協議
- 電影合作拍攝協議書
- 懷孕離婚協議書
- 柑桔產業幫扶協議書
- 工傷回家調養協議書
- 2025年03月浙江嘉興市南湖區事業單位公開招聘29人-統考筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 2025年03月四川攀枝花市仁和區考調事業單位工作人員8人筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 化學試題2025年東北三省四城市聯考暨沈陽市高三質量監測(二)及答案
- 國家糧食和物資儲備局直屬聯系單位招聘筆試真題2024
- 2024年新食品安全法相關試題及答案
- 2025年河北省保定市徐水區中考一模語文試題(原卷版+解析版)
- 貿易術語及應用及試題及答案
- 淘寶網店轉讓合同范本
- 新疆維吾爾自治區普通高職(專科)單招政策解讀與報名課件
- 勞務派遣標書項目實施方案
- 我譯網面試題及答案
- 合伙經營機械合同范本
- 中國急性缺血性卒中診治指南(2023)解讀
- 2025年四川省成都高新區管委會員額制人才招聘80人歷年高頻重點模擬試卷提升(共500題附帶答案詳解)
評論
0/150
提交評論