版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C程序設(shè)計(jì)專題輔導(dǎo)課
基本函數(shù)程序設(shè)計(jì)
函數(shù)知識(shí)要點(diǎn)定義函數(shù)、聲明函數(shù)、調(diào)用函數(shù)的一致函數(shù)參數(shù)的傳遞
——傳值
——傳地址(指針概念)局部變量和全局變量靜態(tài)變量(局部、全局)函數(shù)知識(shí)結(jié)構(gòu)化程序設(shè)計(jì)思想
——函數(shù)組織問(wèn)題(多文件)函數(shù)嵌套求解復(fù)雜問(wèn)題遞歸函數(shù)命令行參數(shù)宏(符號(hào)常量)與帶參數(shù)的宏函數(shù)是獨(dú)立的程序模塊庫(kù)函數(shù):如C語(yǔ)言系統(tǒng)提供:
scanf()、printf()、sqrt()等函數(shù)自定義函數(shù),如排序sort-選擇法、插入法main()是一個(gè)函數(shù)C程序由一個(gè)main(),以及0個(gè)或多個(gè)其他函數(shù)構(gòu)成函數(shù)定義函數(shù)類型函數(shù)名(形參表)
/*函數(shù)首部*/{ /*函數(shù)體*/
函數(shù)實(shí)現(xiàn)過(guò)程
return表達(dá)式;}函數(shù)處理結(jié)果回送給調(diào)用函數(shù);函數(shù)類型是void,無(wú)return只能返回一個(gè)值函數(shù)返回值的類型沒(méi)有分號(hào)形參類型1參數(shù)1,類型2參數(shù)2,……,類型n參數(shù)n參數(shù)之間用逗號(hào)分隔,每個(gè)參數(shù)前面的類型都必須分別寫明多個(gè)形參類型相同,不能寫成列表形式:類型
參數(shù)1,參數(shù)2;函數(shù)類型函數(shù)名(形參表){
函數(shù)實(shí)現(xiàn)過(guò)程
return表達(dá)式;}無(wú)返回值的函數(shù)定義void
函數(shù)名(參數(shù)表) /*函數(shù)首部*/{ /*函數(shù)體*/
函數(shù)實(shí)現(xiàn)過(guò)程
return;
/*可以省略return*/}這類函數(shù)通常用于屏幕輸出等不能省略否則,函數(shù)類型被默認(rèn)定義為int函數(shù)調(diào)用調(diào)用標(biāo)準(zhǔn)庫(kù)函數(shù)時(shí),在程序的最前面用#include包含相應(yīng)的頭文件調(diào)用自定義函數(shù)時(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ù)聲明:說(shuō)明函數(shù)的類型和參數(shù)的情況,以保證編譯時(shí)能判斷對(duì)該函數(shù)的調(diào)用是否正確。函數(shù)定義第1行(函數(shù)首部),以分號(hào)結(jié)束。變量與函數(shù)局部變量和全局變量靜態(tài)局部變量局部變量和全局變量局部變量在函數(shù)內(nèi)定義的變量(包括形參)作用范圍:本函數(shù)內(nèi)部定義在復(fù)合語(yǔ)句內(nèi)的變量作用范圍:復(fù)合語(yǔ)句內(nèi)部全局變量 與局部變量同名問(wèn)題在函數(shù)以外定義的變量,不從屬于任一函數(shù)。作用范圍:從定義處到源文件結(jié)束(包括各函數(shù))static
類型名變量表作用范圍:局部變量生命周期:數(shù)據(jù)被保留,類似全局變量靜態(tài)局部變量結(jié)構(gòu)化程序設(shè)計(jì)采用自頂向下和逐步求精相結(jié)合的方式來(lái)解決復(fù)雜的問(wèn)題把大問(wèn)題分解成若干小問(wèn)題,小問(wèn)題再進(jìn)一步分解成若干更小的問(wèn)題,直到問(wèn)題已相對(duì)簡(jiǎn)單,容易處理為止。當(dāng)所有的子問(wèn)題都得到了解決(已通過(guò)函數(shù)實(shí)現(xiàn)),整個(gè)問(wèn)題(程序)也就解決了。每一次分解都是對(duì)上一層的問(wèn)題進(jìn)行細(xì)化和逐步求精,最終形成一種類似樹形的層次結(jié)構(gòu)。函數(shù)的組織結(jié)構(gòu)化程序設(shè)計(jì)寫程序時(shí),用main()解決整個(gè)問(wèn)題,它調(diào)用解決小問(wèn)題的函數(shù)這些函數(shù)又進(jìn)一步調(diào)用解決更小問(wèn)題的函數(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è)計(jì)一個(gè)常用圓形體體積計(jì)算器,采用命令方式輸入1、2、3,分別選擇計(jì)算球體、圓柱體、圓錐體的體積,并輸入計(jì)算所需相應(yīng)參數(shù)。分析:main()函數(shù):輸入1、2、3選擇計(jì)算3種體積,其他輸入結(jié)束計(jì)算設(shè)計(jì)一個(gè)控制函數(shù)cal(),經(jīng)它辨別圓形體的類型再調(diào)用計(jì)算球體、圓柱體、圓錐體體積的函數(shù)設(shè)計(jì)單獨(dú)的函數(shù)計(jì)算不同圓形體的體積程序解析-計(jì)算常用圓形體體積3層結(jié)構(gòu),5個(gè)函數(shù)降低程序的分析設(shè)計(jì)、編寫、調(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-計(jì)算球體體積\n");
printf("2-計(jì)算圓柱體積\n");
printf("3-計(jì)算圓錐體積\n");
printf("其他-退出程序運(yùn)行\(zhòng)n");
printf(“請(qǐng)輸入計(jì)算命令:”);
scanf("%d",&sel); if(sel<1||sel>3)
break; /*輸入非1~3,循環(huán)結(jié)束*/
else
cal(sel); /*輸入1~3,調(diào)用cal()*/ }return0;}/*常用圓形體體積計(jì)算器的主控函數(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; }}/*計(jì)算球體體積V=4/3*PI*r*r*r*/doublevol_ball(){doubler;
printf("請(qǐng)輸入球的半徑:");
scanf("%lf",&r);return(4.0/3.0*PI*r*r*r);}/*計(jì)算圓柱體積V=PI*r*r*h*/doublevol_cylind(){doubler,h;
printf("請(qǐng)輸入圓柱的底圓半徑和高:");
scanf("%lf%lf",&r,&h);
return(PI*r*r*h);}/*計(jì)算圓錐體積V=h/3*PI*r*r*/doublevol_cone(){doubler,h;
printf("請(qǐng)輸入圓錐的底圓半徑和高:");
scanf("%lf%lf",&r,&h);
return(PI*r*r*h/3.0);}所有函數(shù)的原型聲明全部放在main()的前面,這樣各函數(shù)的調(diào)用方式及調(diào)用順序的改變時(shí),函數(shù)的定義無(wú)需改變。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)用在一個(gè)函數(shù)中再調(diào)用其它函數(shù)的情況稱為函數(shù)的嵌套調(diào)用。如函數(shù)A調(diào)用函數(shù)B,函數(shù)B再調(diào)用函數(shù)C,一個(gè)調(diào)用一個(gè)地嵌套下去,構(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文件包含程序文件模塊為了避免一個(gè)文件過(guò)長(zhǎng),可以把程序分別保存為幾個(gè)文件。一個(gè)大程序會(huì)由幾個(gè)文件組成,每一個(gè)文件又可能包含若干個(gè)函數(shù)。保存有一部分程序的文件稱為程序文件模塊。程序-文件-函數(shù)大程序-若干程序文件模塊各程序文件模塊分別編譯,再連接整個(gè)程序只允許有一個(gè)main()函數(shù)問(wèn)題:如何把若干程序文件模塊連接成一個(gè)完整的可執(zhí)行程序?文件包含建立工程文件文件包含格式#include<需包含的文件名>#include“需包含的文件名”作用把指定的文件模塊內(nèi)容插入到#include所在的位置,當(dāng)程序編譯連接時(shí),系統(tǒng)會(huì)把所有#include指定的文件拼接生成可執(zhí)行代碼。文件包含在程序開始編譯前,系統(tǒng)會(huì)把#include指定的文件的內(nèi)容插入,以替換該行include指令,然后開始編譯.將例10-1的5個(gè)函數(shù)分別存儲(chǔ)在2個(gè).C文件上,要求通過(guò)文件包含把它們聯(lián)結(jié)起來(lái)。例10-2注意編譯預(yù)處理命令,以#開頭。在程序編譯時(shí)起作用,不是真正的C語(yǔ)句,行尾沒(méi)有分號(hào)。如果使用<>,將使用C語(yǔ)言的標(biāo)準(zhǔn)頭文件,即在系統(tǒng)的include文件夾中搜索如果使用“”,則首先在當(dāng)前工作文件夾中搜索,后在系統(tǒng)的include文件夾中搜索。工程文件為了把多個(gè)文件模塊連接成一個(gè)完整程序,除了#include文件包含外,還可以定義工程文件,把需要連接在一起的文件名加入到該工程文件中,經(jīng)程序連接后,便可生成完整的可執(zhí)行文件。TC環(huán)境中,以文本方式編輯一個(gè)工程文件(.prj),將各源程序名稱加入其中,然后Build。VC環(huán)境,參見實(shí)驗(yà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("運(yùn)算符輸入錯(cuò)誤!\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ù)合語(yǔ)句)內(nèi)部生命周期:從函數(shù)調(diào)用開始-函數(shù)調(diào)用結(jié)束全局變量 作用范圍:從定義處到源文件結(jié)束生命周期:從程序執(zhí)行開始-程序運(yùn)行結(jié)束靜態(tài)局部變量作用范圍:局部變量生命周期:全局變量外部變量(extern)在某個(gè)程序文件模塊中定義了全局變量,該全局變量可以在整個(gè)程序的所有文件模塊中起作用在其他模塊中如果要使用該全局變量,必須將它聲明為外部變量只起說(shuō)明作用,不分配存儲(chǔ)單元,對(duì)應(yīng)的存儲(chǔ)單元在全局變量定義處分配??捎糜谌肿兞渴褂梦恢孟扔谠撟兞康亩x位置intx;voidmain(){………}
文件名file1.cexternx;/*使用file1.c中的全局變量x*/f1(){………}
文件名file2.c擴(kuò)大全局變量的作用域staticintx;voidmain(){………}使全局變量只限于本文件引用,而不能被其他文件引用
文件名file1.cexternx;/*使用file1.c中的全局變量x*/intf1(){………}
文件名file2.c無(wú)法引用靜態(tài)全局變量函數(shù)與程序文件模塊外部函數(shù)函數(shù)能夠被程序中的其他程序文件模塊調(diào)用在其他文件模塊中調(diào)用該函數(shù)前,聲明為外部函數(shù)extern
函數(shù)類型函數(shù)名(參數(shù)表說(shuō)明);一般可省略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ù)表說(shuō)明);
文件名file1.c
文件名file2.c無(wú)法調(diào)用宏定義#define宏名標(biāo)識(shí)符宏定義字符串編譯時(shí),把程序中所有與宏名相同的字符串,用宏定義字符串替代#definePI3.14說(shuō)明:宏名一般用大寫字母,以與變量名區(qū)別宏定義不是C語(yǔ)句,后面不得跟分號(hào)宏名與宏定義字符串之間用空格分隔宏定義字符串中間可以有空格,以回車結(jié)束多用于符號(hào)常量要具體分析#definePI3.14;voidmain(){doubled;d=2*PI;
printf("%f\n",d);}替換成d=2*3.14;;程序仍正確。宏定義可以嵌套使用#definePI3.14#defineS2*PI*PI宏定義可以寫在程序中任何位置,它的作用范圍從定義書寫處到文件尾??梢酝ㄟ^(guò)“#undef”強(qiáng)制指定宏的結(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ù)丶尤肜ㄌ?hào),以提高替換后的運(yùn)算優(yōu)先級(jí)帶參數(shù)的宏定義實(shí)現(xiàn)簡(jiǎn)單的函數(shù)功能例10-7簡(jiǎn)單的帶參數(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ù),宏與函數(shù)是兩種不同的概念宏可以實(shí)現(xiàn)簡(jiǎn)單的函數(shù)功能示例用宏實(shí)現(xiàn)兩個(gè)變量值的交換與函數(shù)的區(qū)別在哪里?#defineF(x)x-2#defineD(x)x*F(x)intmain(){
printf("%d,%d",D(3),D(D(3))); return0;}宏定義閱讀帶宏定義的程序,先全部替換好,最后再統(tǒng)一計(jì)算不可一邊替換一邊計(jì)算,更不可以人為添加括號(hào)D(3)=x*F(x) 先用x替換展開 =x*x-2進(jìn)一步對(duì)F(x)展開,這里不能加括號(hào) =3*3-2=7 最后把x=3代進(jìn)去計(jì)算D(D(3))=D(x*x-2)先對(duì)D(3)用x替換展開, =x*x-2*F(x*x-2)拿展開后的參數(shù)對(duì)D進(jìn)一步進(jìn)行宏替換 =x*x-2*x*x-2-2拿展開后的參數(shù)對(duì)F進(jìn)一步進(jìn)行宏替換 =3*3-2*3*3-2-2=-13 最后把x=3代進(jìn)去計(jì)算運(yù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表示出錯(cuò)。
#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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年版的軟件購(gòu)買與技術(shù)支持合同
- 服裝銷售店長(zhǎng)下半年工作計(jì)劃10篇
- 春季工作計(jì)劃模板8篇
- 2025年度全球十大風(fēng)險(xiǎn)報(bào)告
- 創(chuàng)建文明城市倡議書范文合集九篇
- 員工辭職申請(qǐng)書匯編6篇
- 2025年高模量玻璃纖維布項(xiàng)目發(fā)展計(jì)劃
- 新安江生態(tài)補(bǔ)償報(bào)告
- 煤業(yè)企業(yè)調(diào)度室管理制度匯編
- 計(jì)劃生育-婦產(chǎn)科教學(xué)課件
- 建筑工地塔吊智能化發(fā)展趨勢(shì)分析
- 電梯年終工作總結(jié)2篇
- 導(dǎo)醫(yī)接待工作的常見問(wèn)題與應(yīng)對(duì)策略
- 《客戶的分級(jí)》課件
- 信息技術(shù)與小學(xué)語(yǔ)文閱讀教學(xué)深度融合的策略研究
- 大連市船舶運(yùn)輸與經(jīng)濟(jì)發(fā)展的市場(chǎng)研究報(bào)告
- GB/T 2881-2023工業(yè)硅
- DB3302T 1156-2023 水利水務(wù)設(shè)施基礎(chǔ)感知點(diǎn)位設(shè)置規(guī)范
- 內(nèi)科醫(yī)生的醫(yī)患關(guān)系與患者滿意度
- 小學(xué)生低年級(jí)語(yǔ)文閱讀能力評(píng)價(jià)標(biāo)準(zhǔn)及評(píng)價(jià)辦法
- 案例:伊通河中段水環(huán)境綜合整治工程
評(píng)論
0/150
提交評(píng)論