版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第6章函數(shù)
C語言程序設(shè)計(基于CDIO思想)在C程序中,模塊以函數(shù)的形式來體現(xiàn),所以說C程序是由函數(shù)構(gòu)成的語言,是函數(shù)式的語言。本章介紹用戶如何定義函數(shù)以及調(diào)用、聲明函數(shù)的規(guī)則;變量的作用域和存儲特性;編譯預(yù)處理命令。2函數(shù)的定義、調(diào)用和聲明主要內(nèi)容1函數(shù)的參數(shù)傳遞2嵌套調(diào)用和遞歸調(diào)用
3變量的作用域、變量的存儲類型54編譯預(yù)處理
研究式學(xué)習(xí)—C程序設(shè)計(第五章)3為什么引入函數(shù)?模塊4大系統(tǒng)模塊1模塊2模塊3C程序由若干小函數(shù)組成常用的某些功能可以獨立成一個函數(shù),提高程序的可重用性、可靠性、可維護性
研究式學(xué)習(xí)—C程序設(shè)計(第五章)4函數(shù)的概念C程序的組織:函數(shù)是C程序的基本組成部分,C語言程序由一個或多個函數(shù)組成,但至少、且只能包含一個主函數(shù)。C語言的函數(shù)可以分為三類:主函數(shù):main()標(biāo)準(zhǔn)庫函數(shù):由系統(tǒng)提供,如gets(),puts()等。自定義函數(shù):由用戶編寫文件1文件2….文件n
函數(shù)1函數(shù)2…函數(shù)n程序只有一個main函數(shù)
研究式學(xué)習(xí)—C程序設(shè)計(第五章)56.1求多個階乘之和(函數(shù)的定義、調(diào)用和聲明)我們先研究在一個main()函數(shù)里完成的程序
#include"stdio.h"main(){intj;longintt,s=0;for(t=1,j=1;j<=3;j++)t=t*j;s+=t;for(t=1,j=1;j<=5;j++)t=t*j;s+=t;for(t=1,j=1;j<=8;j++)t=t*j;s+=t;printf(“3!+5!+8!=%ld\n”,s);}編程計算3!+5!+8!三個求階乘的循環(huán)語句類似,重復(fù)累贅,可重用性、可靠性、可維護性差!
6把求階乘的程序段獨立寫成一個函數(shù):main(){longs=0;s=fact(3)+fact(5)+fact(8);printf(“3!+5!+8!=%ld\n”,s);}#include"stdio.h"longfact(intn){longt=1;intj;for(j=1;j<=n;j++)t*=j;returnt;}函數(shù)nn!程序運行結(jié)果:3!+5!+8!=40446
6.1.1分析與設(shè)計7例6_3求3到10的階乘和#include"stdio.h"main(){longs=0;inti;longfact(intn);/*函數(shù)的聲明*/for(i=3;i<=10;i++)s=s+fact(i);printf("3!+5!+6!+...+10!=%ld\n",s);}longfact(intn){longt=1;intj;for(j=1;j<=n;j++)t*=j;returnt;}6.1.1分析與設(shè)計
研究式學(xué)習(xí)—C程序設(shè)計(第五章)86.1.2函數(shù)的定義和調(diào)用
{}類型標(biāo)識符函數(shù)名(形式參數(shù)表)命名規(guī)則與變量名同,函數(shù)名不能重復(fù)函數(shù)返回值的類型,若不說明類型,一律自動按整型處理。當(dāng)函數(shù)無返回值時用void作為類型定義符。若無參數(shù),可寫void函數(shù)頭:函數(shù)體函數(shù)頭函數(shù)的定義
研究式學(xué)習(xí)—C程序設(shè)計(第五章)9{
說明部分;語句部分;}當(dāng)函數(shù)要返回一個值時,必須通過return語句返回,其形式如下:return(表達式);
函數(shù)的定義函數(shù)體:例如:long
fact(intn){long
t=1;intj;for(j=1;j<=n;j++)t*=j;returnt;}類型應(yīng)該和函數(shù)頭中的類型一致,有沖突時,服從于函數(shù)頭中的類型,return后的括號可有可無
研究式學(xué)習(xí)—C程序設(shè)計(第五章)10函數(shù)的定義(返回的作用)例6_4返回一個整數(shù)的絕對值的函數(shù)定義intabsint(intx){if(x>=0)returnx;elsereturn-x;}例6_5無返回值的void函數(shù)voidpok(){printf(“0k”);return;}程序的執(zhí)行從當(dāng)前函數(shù)返回其上級(調(diào)用它的函數(shù))
釋放該函數(shù)的參數(shù)及變量所占用的內(nèi)存空間。
向上級函數(shù)返回一個值(函數(shù)的類型不是void時)只能通過一個return語句返回一個值可以缺省函數(shù)體內(nèi)不能再定義函數(shù)
(不能嵌套定義)intff1(){…
floatff2(){
…}}函數(shù)的定義就是給出:函數(shù)的名字函數(shù)的返回值類型函數(shù)的形參名字與類型函數(shù)的實現(xiàn)語句(函數(shù)體)定義相當(dāng)于寫劇本,并沒有被執(zhí)行(上演)11
6.1.3函數(shù)原型、函數(shù)聲明與函數(shù)調(diào)用
1.函數(shù)原型調(diào)用函數(shù)時,系統(tǒng)需要知道下列信息:函數(shù)類型函數(shù)名函數(shù)的參數(shù)(個數(shù)、類型及順序)知道這些信息后,系統(tǒng)就可以找到該函數(shù)。這些信息描述了函數(shù)的模型,是函數(shù)的用戶界面,我們稱為函數(shù)原型。如:intabsint(int);voidpok();126.1.3函數(shù)原型、函數(shù)聲明與函數(shù)調(diào)用2.函數(shù)的聲明在函數(shù)調(diào)用前,C系統(tǒng)需要知道函數(shù)的原型,才能保證函數(shù)的正確調(diào)用,因此當(dāng)函數(shù)調(diào)用在前,定義在后時(當(dāng)函數(shù)為int型時,也可不聲明),必須用函數(shù)原型聲明,以便C系統(tǒng)獲取相關(guān)信息。聲明時參數(shù)名可以缺省,但類型名不可以缺省,如:
intff1(intage,charsex);或:
intff1(int,char);聲明中的參數(shù)名相當(dāng)于注釋,以便系統(tǒng)檢查調(diào)用時實參的位置,所以可以缺省
研究式學(xué)習(xí)—C程序設(shè)計(第五章)136.1.3函數(shù)原型、函數(shù)聲明與函數(shù)調(diào)用
3.函數(shù)的調(diào)用函數(shù)必須通過調(diào)用才能被執(zhí)行,函數(shù)調(diào)用的功能是:u
實參數(shù)向形參數(shù)傳遞數(shù)據(jù)。(由演員擔(dān)當(dāng)角色)u
為參數(shù)和函數(shù)體內(nèi)的變量分配內(nèi)存空間。u
中斷當(dāng)前函數(shù)的執(zhí)行,把執(zhí)行流程轉(zhuǎn)向被調(diào)用函數(shù)的入口,執(zhí)行被調(diào)用函數(shù)。函數(shù)調(diào)用形式為:函數(shù)名(實參表列)如:pok();函數(shù)無返回值c=max(a,b);printf(“max=%d”,max(a,b));//函數(shù)有返回值,調(diào)用表達式作為其他表達式的一部分。以下語句有錯?c=max(inta,intb);max(a,b);a=pok();
研究式學(xué)習(xí)—C程序設(shè)計(第五章)14
例6_6單向值傳遞舉例
例6_6單向值傳遞舉例
例6_6單向值傳遞舉例main(){floatnum=5.76,result;
floatmult10(float);result=mult10(num);printf(“result=%f\n”,result);printf(“num=%f\n”,num);}floatmult10(intn)
{n*=10;
return(n);}調(diào)用mult10時:實參變量num的值新分配的形參單元n
復(fù)制到返回時:
numn在內(nèi)存mnu與n是兩個不同的存儲單元,如果同名呢?“值傳遞”是單向傳遞
研究式學(xué)習(xí)—C程序設(shè)計(第五章)15例6_7求s=s1+s2+s3+s4的值floatfc(intn)/*求1+1/2+1/3+…+1/n的值*/
{floats;inti;s=0;for(i=1;i<=n;i++)s+=1/(float)i;;}求s=s1+s2+s3+s4的值。其中:
s1=1+1/2+1/3+…+1/50s2=1+1/2+1/3+…+1/100s3=1+1/2+1/3+…+1/150s4=1+1/2+1/3+…+1/200main()/*主函數(shù)*/{floatsum;sum=fc(50)+fc(100)+fc(150)+fc(200);printf(“sum=%f”,sum);}166.1.3實戰(zhàn)演練1.以下程序通過調(diào)用max()函數(shù)求a,b中的大數(shù),請寫出max()函數(shù)的定義。#include"stdio.h"main(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("max=%d",c);}176.1.3實戰(zhàn)演練2.下面的函數(shù)可以輸出數(shù)字金子塔,請寫出main()函數(shù)調(diào)用它,輸出3、5、7以內(nèi)的數(shù)字金字塔。#include"stdio.h"voidpyra(intn){inti,j;for(i=1;i<=n;i++){for(j=1;j<=n-i;j++)printf("");printf("%d",i);printf("\n");}}186.1.3實戰(zhàn)演練3.以下程序求三角形的面積,請寫出pb函數(shù)和area函數(shù)的定義。#include"math.h"#include"stdio.h"
main(){inta,b,c;scanf("%d,%d,%d",&a,&b,&c);
if(pb(a,b,c))printf("area=%d",area(a,b,c));elseprintf(“inputerror!);}196.2成績統(tǒng)計(函數(shù)的參數(shù)傳遞)
有10個同學(xué)的某科考試成績存入s數(shù)組,求他們的平均分,并對成績由高到低排序。6.2.1分析與設(shè)計1.數(shù)據(jù)結(jié)構(gòu)設(shè)計數(shù)據(jù)如何存放,是要考慮的第一個問題。10個數(shù)據(jù)要存入計算機中,需要存入有10個元素的一維數(shù)組中,程序主要就是對這個數(shù)組操作。2.總體設(shè)計可以將其劃分成三個函數(shù)實現(xiàn),average()函數(shù)實現(xiàn)求10個同學(xué)的平均分,sort()函數(shù)完成10個同學(xué)成績的排序,main()函數(shù)完成數(shù)據(jù)的定義、輸入,并調(diào)用average()函數(shù)求出平均分,調(diào)用sort()函數(shù)完成排序。206.2.1分析與設(shè)計
3.排序函數(shù)的分析與設(shè)計排序函數(shù)的頭是什么樣子?排序就是將數(shù)組中的數(shù)據(jù)排序,不需要返回值,因此函數(shù)類型是void,其次要考慮函數(shù)有幾個參數(shù),是什么類型?送給排序函數(shù)進行排序的對象是個一維數(shù)組,這是排序函數(shù)的第一個參數(shù),其次由于每次需要排序的數(shù)目不同,因此還必須有第二個參數(shù),告知該函數(shù)需要排序的數(shù)據(jù)個數(shù),這個參數(shù)肯定是個int型變量,這樣我們就有下面該函數(shù)的輪廓:voidsort(一維數(shù)組,intn){
用某種算法對該數(shù)組排序}
研究式學(xué)習(xí)—C程序設(shè)計(第五章)21數(shù)組名作函數(shù)的參數(shù)(地址傳遞)對一組整形數(shù)據(jù)排序的函數(shù):voidsort(一維數(shù)組,intn){
用某種算法對該數(shù)組排序}數(shù)據(jù)個數(shù)voidsort(ints[],intn){
用某種算法對該數(shù)組排序}C語言允許一維數(shù)組作形參時,可不定義大小發(fā)生調(diào)用時,實參數(shù)組的首地址傳給形參數(shù)組,這樣實參數(shù)組和形參數(shù)組共用同一段內(nèi)存單元,對形參數(shù)組的操作就是對實參數(shù)組的操作
研究式學(xué)習(xí)—C程序設(shè)計(第五章)22voidsort(ints[],intn){intj,t,k;for(j=0;j<n-1;j++)for(k=j+1;k<n;k++)if(s[j]<s[k])
{t=s[j];s[j]=s[k];s[k]=t;}
main(){intj,a[]={60,70,55,89,90,100,67,88,76,95};
sort(a,10);for(j=0;j<10;j++)printf(“%d,”,a[j]);printf("平均分=%d",average(a,10));}例6_8用三個函數(shù)求10個同學(xué)的平均分及成績排序
發(fā)生調(diào)用時對s數(shù)組的排序,就是對a數(shù)組的排序average(ints[],intn){inti,pj=0;for(i=0;i<n;i++)pj=pj+s[i];return(pj/n);}
研究式學(xué)習(xí)—C程序設(shè)計(第五章)23函數(shù)間的參數(shù)傳遞在函數(shù)被調(diào)用時才分配形參的存儲單元實參可以是常量、變量或表達式實參類型必須與形參相符單個變量傳遞時是傳遞參數(shù)值,即單向傳遞數(shù)組作為參數(shù)時的情況:*數(shù)組元素作實參,與單個變量一樣,是“值傳遞”*數(shù)組名作參數(shù),形、實參數(shù)都應(yīng)是數(shù)組名,類型要
一樣,傳送的是數(shù)組首地址,是“地址傳遞”246.2.3實戰(zhàn)演練1.完善成績統(tǒng)計程序,寫一個函數(shù)求成績的最高分,再寫一個函數(shù)求不及格人數(shù),在main()函數(shù)中調(diào)用它們。分析:求成績最高分的函數(shù)基本框架如下:maxf(ints[],intn){intmax,i;…returnmax}求不及格人數(shù)的函數(shù)與maxf()函數(shù)基本框架相似。256.2.3實戰(zhàn)演練2.已有如下main()函數(shù),它調(diào)用add1函數(shù)使a數(shù)組的各個元素加1,請寫出add1函數(shù)的定義#include<stdio.h>main(){inti;staticinta[]={0,1,2,3,4,5,6,7,8,9};add1(a,10);for(i=0;i<10;i++)printf("%d",a[i]);}
研究式學(xué)習(xí)—C程序設(shè)計(第五章)26“地址傳遞”舉例main(){inti;staticinta[]={0,1,2,3,4,5,6,7,8,9};add1(a,10);for(i=0;i<10;i++)printf(“%d”,a[i]);}
12345678910
0123456789ab調(diào)用時a數(shù)組的首址送給b數(shù)組,使形參數(shù)組與實參數(shù)組占用同樣的存儲區(qū)域,b[i]++實際上就是a[i]++。調(diào)用前后數(shù)組內(nèi)容的變化編程:將一維數(shù)組中每個元素的值加上1后顯示出來voidadd1(intb[],intn){inti;for(i=0;i<n;i++)b[i]++;}276.3計算10組數(shù)中的三角形面積(嵌套調(diào)用和遞歸調(diào)用)在main()函數(shù)中用隨機函數(shù)產(chǎn)生10組數(shù),每組三個數(shù),調(diào)用函數(shù)完成:三個數(shù)是三角形的邊,求三角形的面積。6.3.1分析與設(shè)計1.main()函數(shù)設(shè)計:在main()函數(shù)中,每組三個數(shù)用a,b,c來接收,隨機數(shù)用第5章介紹的rand()函數(shù)產(chǎn)生,用循環(huán)語句產(chǎn)生10組a,b,c的隨機數(shù),每產(chǎn)生一組就調(diào)用area()函數(shù)求三角形面積。求三角形面積函數(shù)area()設(shè)計該函數(shù)首先要判斷a,b,c是否為三角形的邊,通過調(diào)用pb()函數(shù)判是否是三角形的邊,函數(shù)返回0,說明a,b,c不是三角形的邊,否則是三角形的邊,則可計算三角形面積。main()函數(shù)調(diào)用area()函數(shù),該函數(shù)又調(diào)用pb()函數(shù)判是否是三角形的邊,形成嵌套調(diào)用。28例6_9用嵌套調(diào)用的方法計算10組數(shù)中的三角形面積#include<stdio.h>#include<stdlib.h>main(){inti,a,b,c,seed;floatmj;floatarea(inta,intb,intc);intpb(inta,intb,intc);printf("inputaintuger(seed):");scanf("%d",&seed); srand(seed); for(i=0;i<10;i++){a=rand()%50;b=rand()%50;c=rand()%50;mj=area(a,b,c);if(mj)printf("%d,%d,%d,mj=%.2f\n",a,b,c,mj);}}floatarea(inta,intb,intc){floats,m;if(pb(a,b,c))/*嵌套調(diào)用*/{s=(a+b+c)/2.0;m=sqrt(s*(s-a)*(s-b)*(s-c));return(m);}elsereturn0;}intpb(inta,intb,intc){intt=0;if(a+b>c&&a+c>b&&b+c>a)t=1;returnt;}
研究式學(xué)習(xí)—C程序設(shè)計(第五章)29函數(shù)的嵌套調(diào)用
C語言中的函數(shù)定義是互相獨立的,函數(shù)和函數(shù)之間沒有從屬關(guān)系,一個函數(shù)既可以被其它函數(shù)調(diào)用,也可以調(diào)用別的函數(shù),這就是嵌套調(diào)用main(){調(diào)用f1()函數(shù)}f1(){調(diào)用f2()函數(shù)}f2(){}
研究式學(xué)習(xí)—C程序設(shè)計(第五章)30intf1(inta,intb)/*定義f1函數(shù)*/{intc;a+=a;b+=b;c=f11(a,b);/*調(diào)用f11函數(shù)*/returnc*c;}intf11(inta,intb)/*定義f11函數(shù)*/{intc;c=a*b%3;returnc;}main(){intx=11,y=19;printf(“%d\n”,f1(x,y));/*調(diào)用f1函數(shù)*/}
a=22,b=38c=22*38%3=836%3=2運行結(jié)果:4函數(shù)的嵌套調(diào)用(例6_10)
研究式學(xué)習(xí)—C程序設(shè)計(第五章)31遞歸調(diào)用
intf2(intx){inta,b;…b=f1(a)..}intf1(intx){inta,b;…b=f2(a)..}intf1(intx){inty,z;if()…z=f1(y);/*遞歸調(diào)用*/...}有限次的直接或間接函數(shù)自身調(diào)用——遞歸調(diào)用recursion.32
遞歸調(diào)用
求n!的方法可以用遞歸的方法表達:5!=4!*5,4!=3!*4,3!=2!*3,2!=1!*2,1!=1,因此遞歸公式為:1(n=0,1)/*遞歸的終點*/n!=n(n-1)!(n>1)/*遞歸調(diào)用*/例6_11用遞歸的方法求n!#include"stdio.h"floatff(intn){floatf;if(n<0)printf("n<0dataerrar!");elseif(n==0||n==1)f=1;/*遞歸的終點*/elsef=ff(n-1)*n;/*遞歸調(diào)用*/returnf;}main(){intn;floaty;printf("inputaintegernumber:");scanf("%d",&n);y=ff(n);printf("%d!=%.0f\n",n,y);}程序運行結(jié)果:inputaintegernumber:55!=12033
遞歸調(diào)用
調(diào)用main()
{…ff(5);f=ff(4)*5;f=ff(3)*4;f=ff(2)*3;f=ff(1)*2;1202462返回
}調(diào)用返回346.3.4實戰(zhàn)演練1.在main()函數(shù)中隨機產(chǎn)生10個數(shù),調(diào)用even()函數(shù)判斷是否為偶數(shù),是偶數(shù)統(tǒng)計偶數(shù)的個數(shù),是奇數(shù),再調(diào)用prime()函數(shù)判斷是否為素數(shù),輸出其中的奇數(shù),素數(shù)。請?zhí)羁?。for(i=0;i<10;i++){a=rand()%50;if(even(
))cn++;}printf("\n偶數(shù)的個數(shù)為:%d\n",
);}inteven(intn){if(n%2==0)return1;else{printf("奇數(shù):%d,",n);
if(prime(
))printf(“素數(shù):%d,”,n);return
;}}356.3.4實戰(zhàn)演練2.有五個人坐在一起,問第五個人多少歲?他說比第四個人大2歲。問第四個人多少歲?他說比第三個人大2歲。問第三個人多少歲?他說比第二個人大2歲。問第二個人多少歲?他說比第一個人大2歲。最后問第一個人多少歲?他說10歲。請問第五個人多少歲?根據(jù)分析,有如下公式:age(n)=10(n=1)age(n-1)+2(n>1)程序如下,請?zhí)羁眨篴ge(intn){intc;if(n==1)c=10;elsec=
;/*遞歸調(diào)用*/return(
);}main(){printf(“%d”,age(5));}36
6.4我國人口何時增加到15億(變量的作用域)
我國現(xiàn)有人口13億,請用函數(shù)計算,當(dāng)人口每年增長率分別為2%,1.5%,1%,0.5%時,多少年后我國的人口增加到15億。要求:調(diào)用函數(shù)后,能夠得到兩個值,即需要幾年人口達到多少。6.4.1分析與設(shè)計該題要求函數(shù)返回兩個值(多少年,人口數(shù)),我們已經(jīng)知道,通過函數(shù)調(diào)用,可以用return語句返回一個值給調(diào)用函數(shù),如果想返回多個值,怎么辦呢?這道題可用return語句返回一個值,用全局變量再得到一個值,這涉及到變量的作用域問題?,F(xiàn)在我們編寫利用全局變量來完成寫一個函數(shù),送入人口增長率后,得到需要幾年,人口達到多少的函數(shù),在main()函數(shù)中調(diào)用該函數(shù)時,由于增長率是有規(guī)律的,可用循環(huán)語句產(chǎn)生增長率,完整的程序如下。37
6.4我國人口何時增加到15億(變量的作用域)
例6_12我國人口何時增加到15億#defineP1300000000floatpe;/*全局變量*/fun(floatx){intn=0;
pe=P;/*初始化pe變量為13億*/while(pe<1500000000){pe=pe*(1+x);/*計算人口數(shù)*/n++;/*計算年數(shù)*/}returnn;}
main(){floatrat=0.02;intm;while(rat>=0.001){m=fun(rat);printf("ratis%.3f,Itneeds%dyearsandthepopulationis%.0f\n",rat,m,pe); rat-=0.005; }}程序運行結(jié)果:ratis0.020,Itneeds8yearsandthepopulationis1523157120ratis0.015,Itneeds10yearsandthepopulationis1508702976ratis0.010,Itneeds15yearsandthepopulationis1509259520ratis0.005,Itneeds20yearsandthepopulationis1502308608
研究式學(xué)習(xí)—C程序設(shè)計(第五章)38floatf1(inta)/*定義f1函數(shù)*/{intb,c;
…}charf2(intx)/*定義f2函數(shù)*/{intb,j;
…}main()/*主函數(shù)*/{intm,n;
…}p,q作用域c1,c2作用域局部變量(函數(shù)體內(nèi)定義)作用域僅僅局限于定義它的函數(shù),在不同的函數(shù)內(nèi)可以定義同名的局部變量(f1、f2函數(shù)都有變量b)全局變量(函數(shù)體外定義):作用域從它定義的位置開始到本源文件結(jié)束,變量名不能重。(c1,c2的作用范圍?。﹊ntp=1,q=5;/*定義外部變量*/charc1,c2;/*定義外部變量*/
研究式學(xué)習(xí)—C程序設(shè)計(第五章)396.4.3實戰(zhàn)演練main(){floatr,area;printf(“r=?”);scanf(“%f”,&r);area=carea(r);printf(“r=%5.2f,carae=%5.2f,cl=%5.2f\n”,r,area,cl);}
1.已有如下main()函數(shù),請寫出carea()函數(shù),它接受圓的半徑r后,得到圓的面積及圓的周長(c1)。floatcl;/*定義全局變量c1*/floatcarea(floatr){floatar;ar=3.14*r*r;
cl=2*3.14*r;returnar;}40
6.4.3實戰(zhàn)演練
2.以下程序中main()函數(shù)調(diào)用avmaxmin()求出數(shù)組中的平均值、最大值和最小值,請寫出max、min變量的定義并填空。#include"stdio.h"#defineN10
avmaxmin(intscore[]){inti,pj=0;max=min=score[0];for(i=0;i<N;i++){pj=pj+score[i];if(max<
)max=score[i];if(min
)min=score[i];}return
;}main(){intscore[10]={56,78,45,78,98,46,55,67,87,90},ave;ave=avmaxmin(
);printf(“\naverage=%d,max=%d,min=%d\n”,ave/N,max,min);}416.5計算機出題、判卷、打分(變量的存儲類型)由計算機給小學(xué)生出5題兩位整數(shù)相加和5題兩位整數(shù)相乘的考試題,每題10分,滿分100,并由計算機判卷、打分。6.5.1分析與設(shè)計1.總體設(shè)計本題只需兩個函數(shù),一個出題、判卷、打分函數(shù)sc()以及main()函數(shù)。2.main()函數(shù)設(shè)計main()函數(shù)的任務(wù)是顯示菜單、接受用戶選擇、根據(jù)用戶選擇,調(diào)用函數(shù)做加法或乘法題。3.sc()函數(shù)的任務(wù):switch(n)語句選擇做加法還是做乘法,該函數(shù)的頭為:sc(intn)。出題:在循環(huán)體中用隨機函數(shù)出兩位整數(shù)相加或相乘的題,題目在屏幕上顯示(調(diào)用printf()函數(shù));學(xué)生通過鍵盤答題(調(diào)用scanf()函數(shù))。判卷:判斷答題是否正確,用選擇結(jié)構(gòu)即可。打分:答題正確要加10分,應(yīng)設(shè)計一個變量來統(tǒng)計分?jǐn)?shù)(p變量),該變量必須能保存上一次的值(做加法或做乘法的分?jǐn)?shù)),下一次調(diào)用該函數(shù)時,再繼續(xù)加分,應(yīng)將該變量設(shè)計為靜態(tài)局部變量。42sc(intn){inti,a,b,c,seed;staticintp=0;printf("inputaintuger(seed):");scanf("%d",&seed);srand(seed);for(i=0;i<5;i++){a=10+rand()%89;b=10+rand()%89;switch(n){case1:printf("%2d:%d+%d=",i+1,a,b);Break;
case2:printf("%2d:%d*%d=",i+1,a,b);break;default:exit(0);}scanf(“%d”,&c);switch(n)/*判斷答案*/{case1:if(c==a+b){printf("Right!\n");p+=10;} elseprintf("Wrong!\n");break;case2:if(c==a*b){printf("Right!\n");p+=10;} elseprintf("Wrong!\n");break;default:break;}}return(p);}例6_13計算機出題、判卷、打分43main(){intn,s=0;while(1){printf("*************\n");/*簡易菜單*/printf("1addition\n");printf("2multiplication\n");printf("0quit\n");printf("**************\n");scanf("%d",&n);/*選擇菜單*/
s=sc(n);/*調(diào)用函數(shù)*/printf("Yourscoreis%d.\n",s);/*輸出分?jǐn)?shù)*/}}例6_13計算機出題、判卷、打分
研究式學(xué)習(xí)—C程序設(shè)計(第五章)44變量的存儲區(qū)程序代碼區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)*存放可執(zhí)行程序的機器指令*存放需要占用固定存儲單元的變量*存放不需要占用固定存儲單元的變量C語言程序所占用的存儲空間通常分為三部分:
全局變量或靜態(tài)變量存放在靜態(tài)存儲區(qū)中,直到整個程序運行結(jié)束時才釋放存儲單元;局部變量或自動變量存放在動態(tài)存儲區(qū)中,函數(shù)調(diào)用結(jié)束時就釋放存儲單元。
研究式學(xué)習(xí)—C程序設(shè)計(第五章)45變量的完整定義一個變量的完整定義形式為:
存儲類型說明符數(shù)據(jù)類型說明符變量表如:staticintj;externfloatx等
定義變量時不但要說明變量的數(shù)據(jù)類型,還要說明變量的存儲類型。變量的存儲類型確定了變量的存儲方式、生存期和作用域。作用域:是指變量起作用的有效范圍。按變量的作用域可以把變量分為全局變量和局部變量。生存期:是指變量占用存儲空間的時限。按變量的生存期可以把變量分為靜態(tài)變量和動態(tài)變量。
研究式學(xué)習(xí)—C程序設(shè)計(第五章)46變量的存儲類型存儲類型說明符有:auto(自動)型:屬于臨時性存儲,其存儲空間可以被若干變量多次覆蓋使用register(寄存器)型(一般情況下不這樣指定)*存放在CPU的通用寄存器中,目的是提高執(zhí)行速度*long,double,float不能設(shè)為register型,因為超過寄存器長度static(靜態(tài))型:存放在靜態(tài)存儲區(qū)域中,生命期長extern(外部)型:用于定義或說明變量是外部的。
研究式學(xué)習(xí)—C程序設(shè)計(第五章)47局部變量的存儲類型:autostaticregister自動變量的使用:#在函數(shù)內(nèi)定義的變量,若沒有指定存儲類型就是自動變量。#自動變量是在動態(tài)存儲區(qū)內(nèi)分配單元的。調(diào)用函數(shù)時分配這些單元,返回時釋放這些單元#自動變量在每調(diào)用一次時都賦一次值,且默認(rèn)初值不確定voidtest_auto(){intva=0;printf(“auto=%d,”,va);++va;/*值不被保存*/}main(){inti;for(i=0;i<2;i++)test_auto();}va為自動變量,運行結(jié)果:auto=0,auto=0,48寄存器變量例6_14使用寄存器變量#include"stdio.h"main(){ints;s=power(5,3);printf(“%d\n”,s);}power(intx,registerintn)/*n為寄存器變量*/{intp;for(p=1;n;n--)p*=x;returnp;}程序運行結(jié)果為:125
研究式學(xué)習(xí)—C程序設(shè)計(第五章)49全局變量的存儲類型
extern(外部)和static(靜態(tài))externinti;intx,y;staticfloatf;main(){externintk;charch;…}intk;voidfc(){intv;…}外部變量:沒有說明為static的全局變量,可以被另外一個文件引用。但在引用它的文件中要用:extern說明*i是其它源程序文件定義的變量,引用時必須在本程序的開頭所有函數(shù)外用extern語句說明*x、y是外部變量,可在本源程序或其它源程序中被引用*f是靜態(tài)外部變量,只能在本源程序中引用,而不能被其它文件訪問*k是外部變量,在main()后定義,要在主函數(shù)中引用,需用extern說明*i,x,y,f,k都是全局量,x,y,k是定義在本文件的全局變量,作用域為定義之后,i是定義在其他文件中的全局變量,必須用extern說明,才能使用。f是其他文件不得引用的靜態(tài)全局變量。*v是局部變量,其作用域為fc()函數(shù)中*ch是局部變量,其作用域為主函數(shù)中注意:1.全局變量分為外部變量和靜態(tài)變量2.extern能用于說明變量,也能用于定義變量3.所有全局量都是在靜態(tài)存儲區(qū)分配存儲單元的,其默認(rèn)的初值為0
研究式學(xué)習(xí)—C程序設(shè)計(第五章)50使用外部變量時應(yīng)注意以下問題:u
在同一個源程序文件中使用外部變量時,如果使用在前,定義在后,必須用extern進行引用性聲明。u
使用另一個源程序文件中定義的外部變量,必須用extern聲明后,才能使用。u
當(dāng)全局變量和局部變量名相同時,在局部變量的作用范圍內(nèi),局部變量起作用,全局變量被屏蔽全局變量的存儲類型
extern(外部)和static(靜態(tài))51/*源程序文件f1.c*/#include"stdio.h"externinta=5;charc1=’a’,c2=’b’;main(){externintb;
charc2=’B’;printf(“%c\n”,c1-32);printf(“%c,%d\n”,c2,b*b);printf(“%d!=%d\n”,a,fact());}intb=2;/*定義外部變量b2*/
例6_15外部變量的使用方法/*源程序文件f2.c*/externinta;/*使用另一個源程序文件中定義的外部變量必須進行引用性聲明*/fact(){intk,p=1;for(k=1;k<=a;k++)p*=k;return(p);}程序運行結(jié)果:AB,45!=120
研究式學(xué)習(xí)—C程序設(shè)計(第五章)52變量存儲類型小結(jié)staticinta;autocharc;registerintj;externintb;a為內(nèi)部變量:不釋放a為外部變量:其他文件不能引用
說明b是全局變量,定義在其他文件中或定義在本文件中(但調(diào)用在前,必須用此句說明)如果在函數(shù)體外,也可能是定義全局變量。static具有永久和私有屬性
局部變量(私有)+永久(不釋放)
全局變量(永久)+私有(其他文件不能用)C,j一定是局部變量
研究式學(xué)習(xí)—C程序設(shè)計(第五章)53內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù):也稱為靜態(tài)函數(shù),只能在定義它的程序文件中被調(diào)用,而不能被其它文件中的函數(shù)所調(diào)用。*定義形式為:
static
類型標(biāo)識符函數(shù)名(形參表)外部函數(shù):除了內(nèi)部函數(shù),其余的函數(shù)都可以為其它文件調(diào)用。*定義形式:
extern
類型標(biāo)識符函數(shù)名(形參表)
*extern缺省時隱含為外部函數(shù),調(diào)用文件中也要用extern說明
研究式學(xué)習(xí)—C程序設(shè)計(第五章)54
6.5.4實戰(zhàn)演練
1.分析以下程序,寫出程序的結(jié)果voidtest_static(){staticintvs=0;printf(“static=%d\n”,vs);++vs;}main(){inti;for(i=0;i<4;i++)test_static();}運行結(jié)果:static=0static=1static=2static=3*靜態(tài)局部變量是在靜態(tài)存儲區(qū)分配存儲單元的,調(diào)用結(jié)束后其值不消失,但其它函數(shù)仍然不能訪問*靜態(tài)局部變量是在編譯過程中賦初值的,且只賦一次初值。多次調(diào)用時,上一次調(diào)用的結(jié)果就是下一次調(diào)用的初值調(diào)用次數(shù)vs初值vs結(jié)束值123401231234
研究式學(xué)習(xí)—C程序設(shè)計(第五章)556.5.4實戰(zhàn)演練
2.已有如下main()函數(shù),它通過5次函數(shù)調(diào)用fact()函數(shù)打印1到5的階乘值。請設(shè)計fact()函數(shù)。通過5次函數(shù)調(diào)用打印1到5的階乘值。1!=1,在1!的基礎(chǔ)上再乘2,就得2!(2!=1!*2),在2!的基礎(chǔ)上再乘3,就得3!(3!=2!*3),…,intfact(intx){staticintt=1;t*=x;returnt;}main(){inti;for(i=1;i<=5;i++)printf(“%d!=%d\n”i,fact(i));}
程序運行結(jié)果為:1!=12!=23!=64!=245!=120函數(shù)必須能保存上一次的階乘值!
去掉static?去掉for?56不用函數(shù)的方法,快速計算若干個三角形的面積。6.6.1分析與設(shè)計如要多次調(diào)用求三角形面積的函數(shù),就要多次進行參數(shù)的傳遞,多次返回三角形的面積,達不到快速計算的目的。如果用宏定義,就可不用參數(shù)傳遞和函數(shù)返回的時間,這樣可提高運行的速度。例6_16用帶參數(shù)的宏定義求三角形的面積#defineAREA(a,b,c)sqrt(s*(s-a)*(s-b)*(s-c))#defineS(a,b,c)(a+b+c)/2.0#definePB(a,b,c)if(a+b>c&&a+c>b&&b+c>a)t=1#include<stdio.h>#include<stdlib.h>#include"math.h"
6.6快速計算三角形的面積(編譯預(yù)處理)main(){inti,x,y,z,t=0;floats,ar; for(i=0;i<10;i++) {x=rand()%50; y=rand()%50; z=rand()%50; t=0; PB(x,y,z) if(t){s=S(x,y,z);ar=AREA(x,y,z);printf(“%d,%d,%d,ar=%.2f\n”,x,y,z,ar);}}}
研究式學(xué)習(xí)—C程序設(shè)計(第五章)57編譯預(yù)處理編譯預(yù)處理:是C語言區(qū)別于其它高級語言的一個重要特點。預(yù)處理程序是C語言編譯系統(tǒng)的組成部分,它負(fù)責(zé)分析和處理程序中使用的幾種預(yù)處理語句。預(yù)處理程序?qū)︻A(yù)處理語句的處理是在編譯程序的其它部分處理之前進行的。預(yù)處理語句主要包括如下三種:1.宏定義2.文件包括3.條件編譯(自學(xué))
研究式學(xué)習(xí)—C程序設(shè)計(第五章)58編譯預(yù)處理——宏定義*宏定義可分為兩種形式:1.不帶參的宏定義,形式為:
#define宏名字符串作用:是用一個指定的宏名(標(biāo)識符)來代替一個字符串。例如:#defimeN10
在編譯預(yù)處理時,預(yù)處理程序會把程序中該語句以后的所有N都用字符串“10”來替換。宏名用大寫字母表示,以區(qū)別于變量,宏名后的字符串可以是表達式或語句,并可以進行嵌套定義(引用已定義的宏名)。
59例6_17嵌套宏定義#defineX5/*用X代替5*/#defineYX+1/*用Y代替X+1(嵌套定義)*/#defineZY*X/2/*用Z代替Y*X/2(嵌套定義)*/#include"stdio.h"main(){inta=Y;/*替換為inta=5+1*/printf(“%d,”,Z);/*Z處替換為5+1*5/2*/printf(“%d\n”,--a);}程序的運行結(jié)果為:7,5編譯預(yù)處理——宏定義
研究式學(xué)習(xí)—C程序設(shè)計(第五章)60編譯預(yù)處理——宏定義2.帶參的宏定義,形式為:
#define
宏名(參數(shù)表)字符串注意:字符串中應(yīng)包含參數(shù)表中指定參數(shù)。
如:#defineCUBE(X)(X)*(X)*(X)…intb=0,a=3;b=CUBE(a);/*替換為b=(a)*(a)*(a)*/使用有參數(shù)的宏時請注意幾點:(1)在實參數(shù)為表達式時,字符串中的參數(shù)是否用括號括起來,將影響替換結(jié)果,如上例改為:#defineCUBE(X)X*X*X…intb=2,a=3;b=CUBE(b+a);/*替換為b=b+a*b+a*b+a,
*/
研究式學(xué)習(xí)—C程序設(shè)計(第五章)61編譯預(yù)處理——宏定義(2)有參的宏名和()間不能空格,否則有參宏變成無參宏.#defineCUBE(X)(X)*(X)*(X)intb=2,a=3;b=CUBE(a);/*替換為b=(X)(X)*(X)*(X)(a)*/帶參數(shù)的宏與函數(shù)的主要區(qū)別是宏定義不需調(diào)用及返回時的開銷,宏調(diào)用在編譯時進行簡單的字符串替換,宏調(diào)用多,將使編譯時間增加,源程序增長。
研究式學(xué)習(xí)—C程序設(shè)計(第五章)62文件包含:是指一個源文件可以將另外一個指定的源文件包括進來。其一般形式為:#include<包括文件名>*編譯系統(tǒng)按系統(tǒng)設(shè)定的標(biāo)準(zhǔn)目錄搜索包括文件或#include"包括文件路徑名"*編譯系統(tǒng)按指定路徑搜索
*未指定路徑名時,首先在當(dāng)前目錄中搜索
*找不到時再按系統(tǒng)設(shè)定的標(biāo)準(zhǔn)目錄搜索包括文件編譯預(yù)處理——文件包括功能是用相應(yīng)文件中的全部內(nèi)容來替換該預(yù)處理語句例如:f1.c源程序
#include“stdio.h”
#include<math.h>#include“file1.c”main(){….}編譯連接后,可執(zhí)行文件代碼f1.exe:stdio.h代碼math.h代碼file1.c代碼f1.c代碼
研究式學(xué)習(xí)—C程序設(shè)計(第五章)63編譯預(yù)處理——文件包含C語言編譯系統(tǒng)中以“.h”為擴展名的文件稱為頭文件,在使用C語言編譯系統(tǒng)提供的庫函數(shù)進行程序設(shè)計時,經(jīng)常需要在源程序中包含相應(yīng)的“頭文件”,如“stdio.h”、“string.h”等。用C語言設(shè)計程序時,通常將全局變量的定義、符號常量的定義、結(jié)構(gòu)類型的定義以及函數(shù)類型說明等語句放在頭文件中。這樣,對于需要該文件的源程序來講,都可以通過#include語句將其包含到程序中。正確使用#include語句,將會減少不必要的重復(fù)工作,提高編程效率。64
6.6.4實戰(zhàn)演練
1.已有以下程序,請完成MIN(a,b)宏定義,求a,b中的最小值。
#include“stdio.h”main(){inta,b;scanf(“%d,%d”,&a,&b)printf(“%d\n”,MIN(a,b));}65
6.6.4實戰(zhàn)演練
2.已有以下宏定義,求半徑為r的圓周長,寫一個程序使用該宏定義,求半徑為2到10的圓周長。#include“stdio.h”#definePI3.1415#defineCIRFER(r)2*PI*(r)
66
6.7綜合設(shè)計(單科成績分析統(tǒng)計程序)
編寫一個單科成績分析統(tǒng)計程序。使其能夠輸入N個同學(xué)的成績;能求平均分,最高分,最低分;能求各分?jǐn)?shù)段人數(shù)及求及格率;能對成績降序排列;并要求程序應(yīng)有友好的界面,可點菜完成各功能。6.7.1分析與設(shè)計1.數(shù)據(jù)結(jié)構(gòu)設(shè)計需要存入有N個元素的一維數(shù)組中,因為有多個函數(shù)都要對該數(shù)組操作,可將數(shù)組定義為全局變量,這樣可減少函數(shù)間的參數(shù)傳遞。定義如下:#defineN10intscore[N];2.總體設(shè)計劃分成5個函數(shù)實現(xiàn),input()實現(xiàn)N個數(shù)據(jù)的輸入;avmaxmin()實現(xiàn)求N個同學(xué)的平均分,最高分,最低分;sort()完成N個同學(xué)成績的排序;count()完成求各分?jǐn)?shù)段人數(shù)和及格率;main()完成系統(tǒng)集成,可通過點菜方式調(diào)以上函數(shù)。67
6.7綜合設(shè)計(單科成績分析統(tǒng)計程序)
3.各函數(shù)設(shè)計input()函數(shù)實現(xiàn)N個數(shù)據(jù)的輸入,只需在該函數(shù)中完成N次scanf()函數(shù)的輸入即可,由于score[N]數(shù)組定義為全局的,因此,各函數(shù)可直接對其操作,函數(shù)可設(shè)計為無參數(shù)的,函數(shù)定義如下:input(){inti;for(i=0;i<N;i++)scanf(“%d”,&score[i]);}count()函數(shù)完成求各分?jǐn)?shù)段人數(shù)和及格率,在該函數(shù)內(nèi)應(yīng)定義10個變量求10個分?jǐn)?shù)段,也可定義一個有10個元素的數(shù)組來存放,這樣程序更簡練,因為可以:68
6.7綜合設(shè)計(單科成績分析統(tǒng)計程序)
分?jǐn)?shù)是0—9時,cn[0]++;分?jǐn)?shù)是10—19時cn[1]++;…分
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 綜合素養(yǎng)提升的跨領(lǐng)域?qū)W習(xí)策略研究
- 科技驅(qū)動的校園環(huán)境改善策略
- IT行業(yè)保密協(xié)議(2024版)
- 2025年度智能廚電一體化購銷合同二零二五3篇
- 二零二五年度自助餐廳經(jīng)營承包合同3篇
- 漯河2024年河南漯河市沙澧河建設(shè)運行保障中心人才引進5人筆試歷年參考題庫附帶答案詳解
- 滁州安徽滁州明光市司法局招聘司法協(xié)理員7人筆試歷年參考題庫附帶答案詳解
- 高效能實驗的關(guān)鍵儀器的科學(xué)使用方法
- 淮安2025年江蘇淮安漣水縣公安局警務(wù)輔助人員招聘87人(一)筆試歷年參考題庫附帶答案詳解
- 二零二五年度蟲草產(chǎn)品研發(fā)與創(chuàng)新合同3篇
- 2024年小升初語文入學(xué)分班測試卷四(統(tǒng)編版)
- 流行文化對青少年價值觀的影響研究
- 2024年代理記賬工作總結(jié)6篇
- 電氣工程預(yù)算實例:清單與計價樣本
- VOC廢氣治理工程中電化學(xué)氧化技術(shù)的研究與應(yīng)用
- 煤礦機電設(shè)備培訓(xùn)課件
- 科技論文圖表等規(guī)范表達
- 高考寫作指導(dǎo)議論文標(biāo)準(zhǔn)語段寫作課件32張
- 2021年普通高等學(xué)校招生全國英語統(tǒng)一考試模擬演練八省聯(lián)考解析
- 紅色研學(xué)旅行課程的設(shè)計與實踐
- 幼兒園保育教育質(zhì)量指南評估指標(biāo)考核試題及答案
評論
0/150
提交評論