




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C語言教學-函數與編譯預處理voidmain(){inta,b,m;intmax(int,int);scanf("%d,%d",&a,&b);m=max(a,b);printf("max=%d",m);}intmax(intx,inty){intt;if(x>y)t=x;elset=y;returnt;}例:輸入兩個數,輸出其中較大的數。6.1模塊化程序設計與函數6.1.1模塊與函數例6.1輸入3個數,將3個數按從大到小的順序輸出。輸出時,如果該數大于等于85,就跟在該數后面輸出字符A;若小于85且大于等于70,則輸出B;若小于70且大于等于60,則輸出C;若小于60,則輸出D。分析:可分解成3部分:輸入、排序和輸出。(1)輸入可用scanf完成scanf(“%f,%f,%f”,&a,&b,&c);(2)3個數的排序voidsortabc(){floatt;if(a<b){t=a;a=b;b=t;}if(b<c){t=b;b=c;c=t;}if(a<b){t=a;a=b;b=t;}}(3)判別等級和輸出分數以及等級chargrade(floatx){if(x>=85)return(‘A’);elseif(x>=70)return(‘B’);elseif(x>=60)return(‘C’);elsereturn(‘D’);}voidputabc(){charg;g=grade(a);printf(“%6.1f:%c”,a,g);g=grade(b);printf(“%6.1f:%c”,b,g);g=grade(c);printf(“%6.1f:%c”,c,g);}floata,b,c;voidmain(){scanf(“%f,%f,%f”,&a,&b,&c);sortabc();putabc();}6.1.2模塊設計原則1.模塊獨立(1)每個模塊完成一個相對獨立的特定子功能。(2)模塊之間的關系力求簡單(3)數據的局部化2.模塊規模適當3.分解模塊要注意層次6.1.3算法描述算法是解決某一特定問題的方法和步驟。例6.2設計算法找出a、b兩數中的較大者,并輸出。(1)輸入兩個數(2)找出其中的大數(3)輸出大數開始a<b?交換a、b輸入a、b輸出a結束YN例6.3用輾轉相除法求兩個正整數的最大公約數(1)a除以b,余數存于r;(2)如果r不為0,則將b的值賦給a,r的值賦給b,重復(1),否則執行(3)(3)輸出b的值,它就是最大公約數循環開始開始r=a%b輸入a、ba=b;b=r結束輸出awhiler!=0求最m與n的最小公倍數的算法,具體步驟如下:(1)計算m*n的乘積,送變量r;(2)若m等于n,則輸出最小公倍數r/m,算法結束;(3)若m大于n,計算m-n,結果送m;否則計算n-m,結果送n(4)轉(2)或(3)6.2函數的定義與調用從用戶使用函數的角度來看,函數有兩種:標準庫函數和用戶自定義函數6.2.1標準庫函數庫函數詳見附錄Ⅲmath.h頭文件對(sin(x)、cos(x)、exp(x)、atof()、ceil()、floor()、fmod()、log()、log10()、pow()、pow10()、sqrt()、abs()、labs()、fabs())等數學函數做了聲明。stdio.h頭文件中對scanf()、printf()、gets()、puts()、getchar()、putchar()等標準輸入/輸出函數做了聲明。#include<math.h>#include<stdio.h>main(){doublea,b;scanf(“%lf”,&a);b=sin(a);printf(“%6.4lf”,b);}6.2.2函數的定義一般形式為:類型名函數名(參數類型說明及列表){局部變量說明語句序列}intmax(inta,intb){intt;if(a>b)t=a;elset=b;returnt;}如果函數不提供返回值,則可以定義函數為空類型,void。如果函數有返回值,必須用return語句。如果函數類型與return語句的表達式類型不一致,則以函數的類型為準。例:自定義函數power(x,n),求x的n次乘方。floatpower(floatx,intn){inti;floatt=1;for(i=1;i<=n;i++)t=t*x;returnt;}(1)y=power(3,3);(2)printf(“%6.2f”,power(2,3));6.2.3函數的調用1.函數的聲明函數的聲明與該函數定義時給出的函數類型中形參名、形參個數、類型、次序相一致。一般形式為:類型名函數名(參數類型說明列表);例:floatpower(float,int);voidputdata(inta);例6.4編寫計算x的n次乘方的程序。(1)輸入x和n(2)調用power函數進行乘冪運算(3)打印運算結果voidmain(){floatx,y;intn;floatpower(float,int);scanf("%f,%d",&x,&n);y=power(x,n);printf("%8.2f",y);}floatpower(floatx,intn){inti;floatt=1;for(i=1;i<=n;i++)t=t*x;returnt;}函數聲明可省略的情況:(1)當函數定義在主調函數之前(2)當函數的類型為int2.函數的調用有參函數調用:函數名(實參表達式1,實參表達式2,……);無參數數調用:函數名();函數語句調用:scanf(“%d”,&a);表達式調用:x+power(x,3);printf(“%8.2f”,power(x,3));y=sin(x+power(sin(x),3));3.函數的嵌套調用intf1(){……}intf2(){……f1();……}voidmain(){……f2();}f2()f1()main()f2()f1()例6.5編程求組合分析:若定義函數fac(k)求k的階乘,則求組合可以通過調用階乘函數完成。longfac(intk){longf=1;inti;for(i=1;i<=k;i++)f=f*i;returnf;}longcomb(intn,intm){longc;c=fac(m)/(fac(n)*fac(m-n));returnc;}voidmain(){intn,m;longc;scanf("%d,%d",&n,&m);c=comb(n,m);printf("%ld",c);}voidmain(){inta,b,m;intmax(int,int);scanf("%d,%d",&a,&b);m=max(a,b);printf("max=%d",m);}intmax(intx,inty){intt;if(x>y)t=x;elset=y;returnt;}例6.6輸入兩個數,輸出其中較大的數。6.2.4參數的傳遞函數名(實參表達式1,實參表達式2,……)實參1形參1實參2形參2voidmain(){inta,b,m;intmax(int,int);scanf("%d,%d",&a,&b);m=max(a,b);printf("max=%d",m);}intmax(intx,inty){intt;if(x>y)t=x;elset=y;returnt;}例6.6輸入兩個數,輸出其中較大的數。幾點說明:(1)形參是變量,被函數調用時才分配內存。返回時,形參占用的內存空間被釋放。(2)實參可以是變量、常量和表達式,但必須有確定的值,例:y=power(x,4);y=power(x,i*2);(3)形參和實參類型必須一致。(4)單向值傳遞例6.7求最大公約數intdivisor(inta,intb){intr;do{r=a%b;a=b;b=r;}while(r!=0);returna;}voidmain(){inta,b,d;scanf("%d,%d",&a,&b);if(a>b)d=divisor(a,b);elsed=divisor(b,a);printf("a=%d,b=%d\n",a,b);printf("d=%d",d);}實現兩個數的互換voidmain(){intx;inty;scanf("%d,%d",&x,&y);swap(x,y);printf("%d,%d",x,y);}voidswap(intx,inty){intt;t=x;x=y;y=t;}(2009.3).有以下程序#include
<stdio.h>int
f(int
x,int
y){
return
((y-x)*x);}main(){
int
a=3,b=4,c=5,d;
d=f(f(a,b),f(a,c));
printf("%d\n",d);}程序運行后的輸出結果是A)10B)9C)8D)7B(2009.3).有以下程序#include
<stdio.h>int
fun(int
x,int
y){
if(x==y)
return
(x);
else
return((x+y)/2);}main(){
int
a=4,b=5,c=6;
printf("%d\n",fun(2*a,fun(b,c)));}程序運行后的輸出結果是A)3B)6C)8D)12B6.3函數的遞歸調用(1)直接遞歸voida(){…….a();……}(2)間接遞歸voida()voidb(){……{……b();a();…….……}}例6.8用遞歸計算n!分析:設求n!的函數為fac(n),函數體內求n!,可用n*fac(n-1)。于是fac(n)的函數體內再次調用fac()函數。longfac(intn){longf;if(n==0)f=1;elsef=n*fac(n-1);returnf;}voidmain(){longy;intn;scanf("%d",&n);y=fac(n);printf("%d!=%ld",n,y);}fac(3)n=33*fac(2)return6n=22*fac(1)return2n=11*fac(0)return1n=0return1main()fac()fac()fac()fac()(1)遞歸邊界條件(2)遞歸定義是使問題向邊界條件轉化的規則例6.9用遞歸算法求m與n的最大公約數分析:遞歸邊界為m%n==0。若m%n!=0,則求n與(m%n)的最大公約數。以此類推,直到新的n=0,其最大公約數就是新的m。intgcd(intm,intn){intg;if(n==0)g=m;elseg=gcd(n,m%n);returng;}voidmain(){intm,n;scanf("%d,%d",&m,&n);printf("gcd=%d",gcd(m,n));}gcd(21,15)m=21n=15gcd(15,6)return3m=15n=6gcd(6,3)return3m=6n=3gcd(3,0)return3m=3n=0return3main()gcd()gcd()gcd()gcd()例6.10漢諾塔游戲abc(1)遞歸邊界條件:n=1,直接把金片從a移到c(2)將n-1個金片從a經過c移到b;
將第n個金片移動到c;
再將n-1個金片從b經過a移到cvoidhanoi(intn,inta,intb,intc){if(n==1)printf("%d->%d\n",a,c);else{hanoi(n-1,a,c,b);printf("%d->%d\n",a,c);hanoi(n-1,b,a,c);}}voidmain(){intn;printf("inputn:");scanf("%d",&n);hanoi(n,1,2,3);}hanoi(3,1,2,3)n=3a=1,b=2,c=3hanoi(2,1,3,2)n=2第二層a=1,b=3,c=2hanoi(1,1,2,3)輸出1->2hanoi(1,3,1,2)n=1第三層a=1,b=2,c=3輸出1->3完成第一個金片的移動n=1a=3,b=1,c=2輸出3->2abcn=3a=1,b=2,c=3hanoi(2,1,3,2)輸出1->3hanoi(2,2,1,3)n=2a=2,b=1,c=3hanoi(1,2,3,1)輸出2->3第二個金片移到chanoi(1,1,2,3)n=1a=2,b=3,c=1輸入2->1最小的金片移到a上n=1a=1,b=2,c=3輸入1->3最小的金片移到c上(2009.9)有以下程序#include<stdio.h>fun(intx){if(x/2>0)fun(x/2);printf(“%d”,x);}main(){fun(6);printf(“\n”);}程序運行后的輸出結果是【15】。1366.4變量作用域與存儲方式6.4.1變量的作用域變量有效的范圍稱為變量的作用域,按作用域范圍可分為兩種,即局部變量和全局變量。1.局部變量voidf1(){intt=2;a*=t;b/=t;}main(){inta,b;printf("Entera,b:");scanf("%d,%d",&a,&b);f1();printf("a=%d,b=%d",a,b);}Error:Undefinedsymbol'a'infunctionf1Error:Undefinedsymbol'b'infunctionf1Warning:'t'isassignedavaluethatisneverusedinfunctionf1局部變量的好處在于可以在不同的函數中讓變量重名,減輕命名的煩惱。voidf1(){inta=3,b=2;a*=b;b/=2;printf("a=%d,b=%d",a,b);}main(){inta=4,b=3;f1();printf("a=%d,b=%d",a,b);}2.全局變量inta,b;voidf1(){intt1,t2;t1=a*2;t2=b*3;b=100;printf("t1=%d,t2=%d\n",t1,t2);}main(){a=2;b=4;f1();rintf("a=%d,b=%d",a,b);}3.外部變量的使用在一個文件中的全局變量的作用域可以擴展到其他文件,即一個文件中的全局變量可以在另一個文件中作為外部變量使用。語句格式如下:extern類型說明符外部變量名;詳見例子:file1.cfile2.c例6.11全局變量的定義和聲明intvs(intl,intw){externinth;intv;v=l*w*h;returnv;}voidmain(){externintw,h;intl=5;printf("v=%d",vs(l,w));}intl=3,w=4,h=5;6.4.2變量的存儲方式變量的存儲方式可分為靜態存儲和動態存儲。1.自動變量自動變量的類型說明符為auto{inti,j,k;charc;……}{autointi,j,k;autocharc;……}自動變量的特點:(1)其作用域僅限于該變量的結構內intkv(inta){autointx,y;{autocharc;…….}……}//a,x,y的作用域(2)只有定義該變量的函數被調用時才給它分配存儲單元,開始它的生存期。main(){autointa,p;printf(“inputanumber:\n”);scanf(“%d”,&a);if(a>0){ints=a+a;p=s*a;}printf(“s=%d,p=%d\n”,s,p);}錯誤:s只在復合語句內有效(3)不同的個體中允許使用同名的變量名。例6.12同名變量的使用voidmain(){autointa,s=100,p=100;printf("\ninputanumber:\n");scanf("%d",&a);if(a>0){autoints,p;s=a+a;p=a*a;printf("s=%dp=%d\n",s,p);}printf("s=%dp=%d\n",s,p);}2.靜態變量一般形式:static類型名變量名(1)靜態局部變量靜態局部變量在函數內定義,生存期整個程序;但作用域還是在函數內部;若未賦初值,初始值為0;靜態局部變量可以保存前一次被調用后留下來的值。例6.13自動變量的使用voidmain(){inti;voidf();for(i=1;i<=5;i++)f();}voidf(){autointj=0;++j;printf("%d\n",j);}若將auto改為static,運行結果將會如何?(2)靜態全局變量非靜態全局變量的作用域可以擴展到整個源程序,靜態全局變量的作用域局限于一個源文件內。3.寄存器變量關鍵字:register
寄存器變量只限于整型、字符型和指針型的局部變量。寄存器變量是動態變量,而且數目有限,一般僅允許說明兩個寄存器變量。例6.14編寫程序計算s=1+4+9+16+…+100voidmain(){registerinti,s=0;printf("s=");for(i=1;i<=10;i++){s+=i*i;printf("%d+",i*i);}printf("\b=%d",s);}例:函數的調用main(){inti=2,p;p=f(i,++i);printf("%d",p);}intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}(2009.3).設函數中有整型變量n,為保證其在未賦初值的情況下初值為0,應該選擇的存儲類別是A)autoB)registerC)staticD)auto或registerC(2009.9)有以下程序
#include<stdio.h>voidfun(intp){intd=2;p=d++;printf(“%d”,p);}main(){inta=1;fun(a);printf(“%d\n”,a);}
程序運行后的輸出結果是
A)32B)12C)21D)22C2009.9)有以下程序
#include<stdio.h>intf(intn);main(){inta=3,s;s=f(a);s=s+f(a);printf(“%d\n”,s);}intf(intn){staticinta=1;n+=a++;returnn;}
程序運行以后的輸出結果是
A)7B)8C)9D)10C(2009.9)有以下程序#include<stdio.h>inta=5;voidfun(intb){inta=10;a+=b;printf(“%d”,a);}main(){intc=20;fun(c);a+=c;printf(“%d\n”,a);}程序運行后的輸出結果是【11】。30256.5編譯預處理預處理是指在進行詞法掃描和語法分析之前所作的工作。預處理命令是”#”開頭的行,如包含命令#include、宏定義命令#define等預處理命令。預處理包括宏定義、文件包含、條件編譯。6.5.1宏定義宏定義的功能是用一個標識符來表示一個字符串,標識符稱為宏名。在編譯預處理時,對程序中所有出現的宏名,都用宏定義中的字符串去代換,稱為宏代換。#define標識符字符串#definemax30無參數的宏定義一般形式:#define標識符字符串#defineL(x*x+2*x+x)voidmain(){intx,y;printf(“inputanumber:”);scanf(“%d”,&x);y=L*L+2*L+10;printf(“y=%d\n”,y);}y=(x*x+2*x+x)*(x*x+2*x+x)+2*(x*x+2*x+x)+10(1)宏代換時,只是一種簡單的代換(2)宏定義不是C語句,不用加分號(3)其作用域為宏定義起到源程序結束#definePI3.1415926voidmain(){……}#undefPIf1(){…k=2*PI;}(4)用引號括起來的宏名,不進行宏代換#defineHello100voidmain(){printf(“Hello”);printf(“\n”);}(5)宏定義允許嵌套#definePI3.14159#definePPI*x*xprintf(“%f”,P);(6)宏名一般用大寫字母2.帶參數的宏定義一般形式:#define宏名(形參表)字符串調用形式:宏名(實參表);#defineL(x)(x*x+2*x+x)y=L(5)y=(5*5+2*5+5)(1)宏名和形參表之間不能有空格(2)只是符號代換,不存在值傳遞#definepower(y)(y)*(y)voidmain(){floatx,y;scanf(“%f”,&x);y=power(sin(x)+1);printf(“y=%6.4f\n”,y);}#defineSQR(y)((y)*(y))intsqr(inty){return((y)*(y));}main(){inti,j;for(i=1,j=1;i<=5;){printf(“%d”,sqr(i++));printf(“%d\n”,SQR(j++));}}(2009.9)有以下程序
#include<stdio.h>#definef(x)x*x*xmain(){inta=3,s,t;s=f(a+1);t=f((a+1));printf(“%d,%d\n’,s,t);}
程序運行后的輸出結果是
A)10,64B)10,10C)64,10D)64,64A(2009.3).有以下程序#include
<stdio.h>#define
PT
3.5
;#define
S(x)
PT*x*x
;main(){
int
a=1,b=2
;
printf("%4.1f\n",S(a+b));}程序運行后的輸出結果是A)14.0B)31.5C)7.5D)程序有錯無輸出結果D6.5.2文件包含#include”文件名”#include<文件名>
使用尖括號是表示在包含文件目錄中查找;使用雙引號則表示首先在當前的源文件目錄中查找,若未找到才到包含目錄中去查找。6.5.3條件編譯(1)#ifdef標識符程序段1#else
程序段2#endif(2)#ifndef標識符程序段1#else程序段2#endif(3)
#if表達式程序段1#else
程序段2#endif#defineplus(A,B)A+Bmain(){inta=1,b=2,c=4,sum;sum=plus(a++,b++)/c;printf(“sum=%d”,sum);}6.6函數設計舉例例6.15編寫求最小公倍數的程序分析:設正整數a、b的最大公約數為d,最小公倍數為c,則c=(a*b)/d最大公約數的函數為:intdivisor(inta,intb)帶入參數a、b,返回最大公約數最小公倍數的函數為:intmultiple(inta,intb)帶入參數a、b
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 混凝土培訓課件-地鐵
- 《時尚尖端展示畫卷》課件
- 愛崗敬業奉獻教師演講稿(16篇)
- 離婚財產分割不公平上訴狀(3篇)
- 銷售人員辭職報告(27篇)
- 公司職責培訓心得體會(20篇)
- 酒店營銷重點工作計劃(15篇)
- 2025小學師德師風心得體會(17篇)
- 深交所培訓課件下載
- 《助力學生成長:課件制作與教學應用》
- 生理學面部肌膚皮膚管理基礎知識護膚種類介紹培訓成品模板兩篇
- 駕校訓練場地安全生產檢查表
- (完整版)混凝土樁鉆芯法檢測題庫
- 稅務行政執法證據淺析
- 氬弧焊接施工方案
- 排拉表標準格式
- 教科版四年級下冊科學全冊教案
- 園林史課件-第7講-中國園林的成熟期(元明清初)和成熟后期(清中、末)-私家園林
- 商業攝影課件
- 三軸攪拌樁安全操作規程
- 上海市中學藝術課程標準(征求意見稿)說明
評論
0/150
提交評論