版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
C程序設(shè)計專題輔導(dǎo)課
基本函數(shù)程序設(shè)計
函數(shù)知識要點定義函數(shù)、聲明函數(shù)、調(diào)用函數(shù)的一致函數(shù)參數(shù)的傳遞
——傳值
——傳地址(指針概念)局部變量和全局變量靜態(tài)變量(局部、全局)函數(shù)知識結(jié)構(gòu)化程序設(shè)計思想
——函數(shù)組織問題(多文件)函數(shù)嵌套求解復(fù)雜問題遞歸函數(shù)命令行參數(shù)宏(符號常量)與帶參數(shù)的宏函數(shù)是獨立的程序模塊庫函數(shù):如C語言系統(tǒng)提供:
scanf()、printf()、sqrt()等函數(shù)自定義函數(shù),如排序sort-選擇法、插入法main()是一個函數(shù)C程序由一個main(),以及0個或多個其他函數(shù)構(gòu)成函數(shù)定義函數(shù)類型函數(shù)名(形參表)
/*函數(shù)首部*/{ /*函數(shù)體*/
函數(shù)實現(xiàn)過程
return表達(dá)式;}函數(shù)處理結(jié)果回送給調(diào)用函數(shù);函數(shù)類型是void,無return只能返回一個值函數(shù)返回值的類型沒有分號形參類型1參數(shù)1,類型2參數(shù)2,……,類型n參數(shù)n參數(shù)之間用逗號分隔,每個參數(shù)前面的類型都必須分別寫明多個形參類型相同,不能寫成列表形式:類型
參數(shù)1,參數(shù)2;函數(shù)類型函數(shù)名(形參表){
函數(shù)實現(xiàn)過程
return表達(dá)式;}無返回值的函數(shù)定義void
函數(shù)名(參數(shù)表) /*函數(shù)首部*/{ /*函數(shù)體*/
函數(shù)實現(xiàn)過程
return;
/*可以省略return*/}這類函數(shù)通常用于屏幕輸出等不能省略否則,函數(shù)類型被默認(rèn)定義為int函數(shù)調(diào)用調(diào)用標(biāo)準(zhǔn)庫函數(shù)時,在程序的最前面用#include包含相應(yīng)的頭文件調(diào)用自定義函數(shù)時,調(diào)用函數(shù)中必須有與被調(diào)用函數(shù)定義相一致的函數(shù)申明函數(shù)聲明函數(shù)類型函數(shù)名(參數(shù)表);函數(shù)必須先定義后調(diào)用,將主調(diào)函數(shù)放在被調(diào)函數(shù)的后面,就像變量先定義后使用一樣。如果自定義函數(shù)在主調(diào)函數(shù)的后面,就需要在函數(shù)調(diào)用前,加上函數(shù)原型聲明。函數(shù)聲明:說明函數(shù)的類型和參數(shù)的情況,以保證編譯時能判斷對該函數(shù)的調(diào)用是否正確。函數(shù)定義第1行(函數(shù)首部),以分號結(jié)束。變量與函數(shù)局部變量和全局變量靜態(tài)局部變量局部變量和全局變量局部變量在函數(shù)內(nèi)定義的變量(包括形參)作用范圍:本函數(shù)內(nèi)部定義在復(fù)合語句內(nèi)的變量作用范圍:復(fù)合語句內(nèi)部全局變量 與局部變量同名問題在函數(shù)以外定義的變量,不從屬于任一函數(shù)。作用范圍:從定義處到源文件結(jié)束(包括各函數(shù))static
類型名變量表作用范圍:局部變量生命周期:數(shù)據(jù)被保留,類似全局變量靜態(tài)局部變量結(jié)構(gòu)化程序設(shè)計采用自頂向下和逐步求精相結(jié)合的方式來解決復(fù)雜的問題把大問題分解成若干小問題,小問題再進(jìn)一步分解成若干更小的問題,直到問題已相對簡單,容易處理為止。當(dāng)所有的子問題都得到了解決(已通過函數(shù)實現(xiàn)),整個問題(程序)也就解決了。每一次分解都是對上一層的問題進(jìn)行細(xì)化和逐步求精,最終形成一種類似樹形的層次結(jié)構(gòu)。函數(shù)的組織結(jié)構(gòu)化程序設(shè)計寫程序時,用main()解決整個問題,它調(diào)用解決小問題的函數(shù)這些函數(shù)又進(jìn)一步調(diào)用解決更小問題的函數(shù),從而形成函數(shù)的嵌套調(diào)用main()函數(shù)1函數(shù)2……函數(shù)m函數(shù)1_1函數(shù)1_2函數(shù)m_1函數(shù)m_n……程序結(jié)構(gòu)例10-1設(shè)計一個常用圓形體體積計算器,采用命令方式輸入1、2、3,分別選擇計算球體、圓柱體、圓錐體的體積,并輸入計算所需相應(yīng)參數(shù)。分析:main()函數(shù):輸入1、2、3選擇計算3種體積,其他輸入結(jié)束計算設(shè)計一個控制函數(shù)cal(),經(jīng)它辨別圓形體的類型再調(diào)用計算球體、圓柱體、圓錐體體積的函數(shù)設(shè)計單獨的函數(shù)計算不同圓形體的體積程序解析-計算常用圓形體體積3層結(jié)構(gòu),5個函數(shù)降低程序的分析設(shè)計、編寫、調(diào)試的復(fù)雜度可讀性好程序結(jié)構(gòu)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("其他-退出程序運行\(zhòng)n");
printf(“請輸入計算命令:”);
scanf("%d",&sel); if(sel<1||sel>3)
break; /*輸入非1~3,循環(huán)結(jié)束*/
else
cal(sel); /*輸入1~3,調(diào)用cal()*/ }return0;}/*常用圓形體體積計算器的主控函數(shù)*/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);}所有函數(shù)的原型聲明全部放在main()的前面,這樣各函數(shù)的調(diào)用方式及調(diào)用順序的改變時,函數(shù)的定義無需改變。10.1.2函數(shù)的嵌套調(diào)用順序調(diào)用int
main(void){……y=fact(3);……z=mypow(3.5,2);
……}doublefact(intn){……}doublemypow(doublex,inn){……}mainfactmypowmainfactmypow函數(shù)的嵌套調(diào)用在一個函數(shù)中再調(diào)用其它函數(shù)的情況稱為函數(shù)的嵌套調(diào)用。如函數(shù)A調(diào)用函數(shù)B,函數(shù)B再調(diào)用函數(shù)C,一個調(diào)用一個地嵌套下去,構(gòu)成了函數(shù)的嵌套調(diào)用。函數(shù)的嵌套調(diào)用嵌套調(diào)用int
main(void){……cal(sel);
……}voidcal(int
sel){ ……
vol_ball()……}doublevol_ball(){ ……}maincalvol_ballmaincalvol_ball文件包含程序文件模塊為了避免一個文件過長,可以把程序分別保存為幾個文件。一個大程序會由幾個文件組成,每一個文件又可能包含若干個函數(shù)。保存有一部分程序的文件稱為程序文件模塊。程序-文件-函數(shù)大程序-若干程序文件模塊各程序文件模塊分別編譯,再連接整個程序只允許有一個main()函數(shù)問題:如何把若干程序文件模塊連接成一個完整的可執(zhí)行程序?文件包含建立工程文件文件包含格式#include<需包含的文件名>#include“需包含的文件名”作用把指定的文件模塊內(nèi)容插入到#include所在的位置,當(dāng)程序編譯連接時,系統(tǒng)會把所有#include指定的文件拼接生成可執(zhí)行代碼。文件包含在程序開始編譯前,系統(tǒng)會把#include指定的文件的內(nèi)容插入,以替換該行include指令,然后開始編譯.將例10-1的5個函數(shù)分別存儲在2個.C文件上,要求通過文件包含把它們聯(lián)結(jié)起來。例10-2注意編譯預(yù)處理命令,以#開頭。在程序編譯時起作用,不是真正的C語句,行尾沒有分號。如果使用<>,將使用C語言的標(biāo)準(zhǔn)頭文件,即在系統(tǒng)的include文件夾中搜索如果使用“”,則首先在當(dāng)前工作文件夾中搜索,后在系統(tǒng)的include文件夾中搜索。工程文件為了把多個文件模塊連接成一個完整程序,除了#include文件包含外,還可以定義工程文件,把需要連接在一起的文件名加入到該工程文件中,經(jīng)程序連接后,便可生成完整的可執(zhí)行文件。TC環(huán)境中,以文本方式編輯一個工程文件(.prj),將各源程序名稱加入其中,然后Build。VC環(huán)境,參見實驗指導(dǎo)書。#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;} 全局變量與程序文件模塊局部變量作用范圍:函數(shù)(復(fù)合語句)內(nèi)部生命周期:從函數(shù)調(diào)用開始-函數(shù)調(diào)用結(jié)束全局變量 作用范圍:從定義處到源文件結(jié)束生命周期:從程序執(zhí)行開始-程序運行結(jié)束靜態(tài)局部變量作用范圍:局部變量生命周期:全局變量外部變量(extern)在某個程序文件模塊中定義了全局變量,該全局變量可以在整個程序的所有文件模塊中起作用在其他模塊中如果要使用該全局變量,必須將它聲明為外部變量只起說明作用,不分配存儲單元,對應(yīng)的存儲單元在全局變量定義處分配??捎糜谌肿兞渴褂梦恢孟扔谠撟兞康亩x位置intx;voidmain(){………}
文件名file1.cexternx;/*使用file1.c中的全局變量x*/f1(){………}
文件名file2.c擴大全局變量的作用域staticintx;voidmain(){………}使全局變量只限于本文件引用,而不能被其他文件引用
文件名file1.cexternx;/*使用file1.c中的全局變量x*/intf1(){………}
文件名file2.c無法引用靜態(tài)全局變量函數(shù)與程序文件模塊外部函數(shù)函數(shù)能夠被程序中的其他程序文件模塊調(diào)用在其他文件模塊中調(diào)用該函數(shù)前,聲明為外部函數(shù)extern
函數(shù)類型函數(shù)名(參數(shù)表說明);一般可省略externexternintf1();int
main(void){………f1();………}
文件名file1.cintf1(){………}
文件名file2.c調(diào)用另一模塊中的函數(shù)externintf1();int
main(void){………f1();………}staticintf1(){………}內(nèi)部函數(shù)使函數(shù)只能在本程序文件模塊中被調(diào)用static
函數(shù)類型函數(shù)名(參數(shù)表說明);
文件名file1.c
文件名file2.c無法調(diào)用宏定義#define宏名標(biāo)識符宏定義字符串編譯時,把程序中所有與宏名相同的字符串,用宏定義字符串替代#definePI3.14說明:宏名一般用大寫字母,以與變量名區(qū)別宏定義不是C語句,后面不得跟分號宏名與宏定義字符串之間用空格分隔宏定義字符串中間可以有空格,以回車結(jié)束多用于符號常量要具體分析#definePI3.14;voidmain(){doubled;d=2*PI;
printf("%f\n",d);}替換成d=2*3.14;;程序仍正確。宏定義可以嵌套使用#definePI3.14#defineS2*PI*PI宏定義可以寫在程序中任何位置,它的作用范圍從定義書寫處到文件尾。可以通過“#undef”強制指定宏的結(jié)束范圍。宏基本定義#defineA“Thisisthefirstmacro”voidf1(){
printf(“A\n”);}#defineB“Thisisthesecondmacro”
A的有效范圍voidf2(){
printf(B); B的有效范圍}#undefBint
main(void){f1();f2();return0;}例10-6宏的作用范圍10.3.2帶參數(shù)的宏定義例:#definef(a)a*a*a
int
main(void)/*水仙花數(shù)*/{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)各位數(shù)字的立方和等于它本身的數(shù)。例如153的各位數(shù)字的立方和是13+53+33=153=x+y*x+y*x+y(f(x)+f(y)+f(z)==i)f(x+y)=(x+y)3?要適當(dāng)?shù)丶尤肜ㄌ?,以提高替換后的運算優(yōu)先級帶參數(shù)的宏定義實現(xiàn)簡單的函數(shù)功能例10-7簡單的帶參數(shù)的宏定義。#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;編譯時被替換帶參數(shù)的宏定義不是函數(shù),宏與函數(shù)是兩種不同的概念宏可以實現(xiàn)簡單的函數(shù)功能示例用宏實現(xiàn)兩個變量值的交換與函數(shù)的區(qū)別在哪里?#defineF(x)x-2#defineD(x)x*F(x)intmain(){
printf("%d,%d",D(3),D(D(3))); return0;}宏定義閱讀帶宏定義的程序,先全部替換好,最后再統(tǒng)一計算不可一邊替換一邊計算,更不可以人為添加括號D(3)=x*F(x) 先用x替換展開 =x*x-2進(jìn)一步對F(x)展開,這里不能加括號 =3*3-2=7 最后把x=3代進(jìn)去計算D(D(3))=D(x*x-2)先對D(3)用x替換展開, =x*x-2*F(x*x-2)拿展開后的參數(shù)對D進(jìn)一步進(jìn)行宏替換 =x*x-2*x*x-2-2拿展開后的參數(shù)對F進(jìn)一步進(jìn)行宏替換 =3*3-2*3*3-2-2=-13 最后把x=3代進(jìn)去計算運行結(jié)果:7-13結(jié)果分析宏定義應(yīng)用示例定義宏LOWCASE,判斷字符c是否為小寫字母。
#defineLOWCASE(c)(((c)>='a')&&((c)<='z'))
定義宏CTOD將數(shù)字字符(‘0’~‘9’)轉(zhuǎn)換為相應(yīng)的
十進(jìn)制整數(shù),-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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度生日蛋糕原料供應(yīng)與加工生產(chǎn)合同樣本3篇
- 2024年度保險合同:某企業(yè)在2024年度的保險合同3篇
- 2024年度建筑水電安裝工程財務(wù)管理合同
- 2025版高考英語一輪總復(fù)習(xí)第二部分基礎(chǔ)語法講練專題一詞法篇第8講非謂語動詞
- 2024年汽車機電產(chǎn)品研發(fā)與市場推廣合作合同3篇
- 2024版健康養(yǎng)老地產(chǎn)房東租房合同模板3篇
- 2024年期國際商務(wù)居間服務(wù)中英協(xié)議范本版B版
- 2024年度南寧離婚財產(chǎn)分割協(xié)議2篇
- 2024至2030年中國捕蝦籠行業(yè)投資前景及策略咨詢研究報告
- 2024年度碎石采購與供應(yīng)合同書3篇
- 廣東順德華僑中學(xué)2025屆高二上數(shù)學(xué)期末檢測模擬試題含解析
- DB1331T019-2022 雄安新區(qū)巖土基準(zhǔn)層劃分導(dǎo)則
- 五年級上冊小數(shù)遞等式計算200道及答案
- 安全漏洞挖掘技術(shù)
- 江蘇省南京市鼓樓區(qū)2023-2024學(xué)年六年級上學(xué)期期末數(shù)學(xué)試卷
- 2024年吉林省長春市南關(guān)區(qū)四年級數(shù)學(xué)第一學(xué)期期末監(jiān)測試題含解析
- 中醫(yī)基礎(chǔ)理論(一)
- 2024至2030年中國空壓機市場深度評估及市場競爭策略研究報告
- 浙江省杭州市上城區(qū)2023-2024學(xué)年九年級上學(xué)期期末考試科學(xué)試題
- 第四屆“長城杯”網(wǎng)絡(luò)安全大賽(高校組)初賽備賽試題庫-中(多選題部分)
- 三年級數(shù)學(xué)脫式計算題-800道
評論
0/150
提交評論