函數(shù)與帶參數(shù)宏《C語(yǔ)言程序設(shè)計(jì)及應(yīng)用教程》課件-PPT課件_第1頁(yè)
函數(shù)與帶參數(shù)宏《C語(yǔ)言程序設(shè)計(jì)及應(yīng)用教程》課件-PPT課件_第2頁(yè)
函數(shù)與帶參數(shù)宏《C語(yǔ)言程序設(shè)計(jì)及應(yīng)用教程》課件-PPT課件_第3頁(yè)
函數(shù)與帶參數(shù)宏《C語(yǔ)言程序設(shè)計(jì)及應(yīng)用教程》課件-PPT課件_第4頁(yè)
函數(shù)與帶參數(shù)宏《C語(yǔ)言程序設(shè)計(jì)及應(yīng)用教程》課件-PPT課件_第5頁(yè)
已閱讀5頁(yè),還剩45頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第第5 5章章 函數(shù)與帶參數(shù)宏函數(shù)與帶參數(shù)宏 ?C ?C語(yǔ)語(yǔ)言程序設(shè)計(jì)及應(yīng)用教程言程序設(shè)計(jì)及應(yīng)用教程? ?課件課件5.1 函數(shù)的聲明、定義與調(diào)用 5.1.1 5.1.1 函數(shù)的聲明與定義函數(shù)的聲明與定義5.1.2 5.1.2 函數(shù)調(diào)用函數(shù)調(diào)用5.1.3 5.1.3 函數(shù)參數(shù)傳遞函數(shù)參數(shù)傳遞5.1.4 5.1.4 主函數(shù)中的參數(shù)主函數(shù)中的參數(shù)函數(shù)的聲明與定義函數(shù)的聲明與定義1.1.函數(shù)聲明的意義:函數(shù)聲明的意義: 函數(shù)聲明是對(duì)所用到的函數(shù)的特征進(jìn)行必要的說(shuō)明。函數(shù)聲明是對(duì)所用到的函數(shù)的特征進(jìn)行必要的說(shuō)明。編譯系統(tǒng)以函數(shù)聲明中給出的信息為依據(jù),對(duì)調(diào)用表編譯系統(tǒng)以函數(shù)聲明中給出的信息為依據(jù),對(duì)調(diào)用表

2、達(dá)式進(jìn)行測(cè)試。達(dá)式進(jìn)行測(cè)試。2.2.函數(shù)聲明格式:函數(shù)聲明格式:類(lèi)型標(biāo)識(shí)符類(lèi)型標(biāo)識(shí)符 函數(shù)名函數(shù)名 標(biāo)識(shí)符標(biāo)識(shí)符 形參,標(biāo)識(shí)符形參,標(biāo)識(shí)符 形形參參 ;例:例:float area(float r); float area(float r); float area (float r) float s=0; s=3.14*r*r; return s; 函數(shù)體內(nèi)容函數(shù)體內(nèi)容3. 函數(shù)定義函數(shù)定義去掉去掉函數(shù)聲明結(jié)尾函數(shù)聲明結(jié)尾分分號(hào),加函數(shù)號(hào),加函數(shù)體。體。4. 函數(shù)函數(shù)定義例子定義例子5.1.2 函數(shù)調(diào)用函數(shù)調(diào)用函數(shù)名函數(shù)名實(shí)參表列實(shí)參表列例:例:printf(“c程序設(shè)計(jì)程序設(shè)計(jì)n);2. 使

3、用函數(shù)表達(dá)式:使用函數(shù)表達(dá)式: 例:例:y=sin(x)+log(fabs(pow(x,3);3. 函數(shù)作實(shí)參函數(shù)作實(shí)參 例:例:y=log(fabs(pow(x,3);1. 使用函數(shù)調(diào)用語(yǔ)句使用函數(shù)調(diào)用語(yǔ)句要返回值要返回值不要返回值不要返回值帶參數(shù)帶參數(shù)不帶參數(shù)不帶參數(shù)虛實(shí)結(jié)合的次序:從右虛實(shí)結(jié)合的次序:從右向左逐個(gè)結(jié)合向左逐個(gè)結(jié)合【例例】 int x=6; fun(x,x+=2);【例5-1】有返回值的函數(shù)調(diào)用方法。在主函數(shù)中,由鍵盤(pán)上輸入圓半徑r的值,調(diào)用子函數(shù)Area(),計(jì)算出圓面積,在主函數(shù)中輸出圓面積。#define PI float Area(float r) /函數(shù)的定義 f

4、loat s=0; s=PI*r*r; return s;void main() float r,s; printf(“請(qǐng)輸入圓的半徑r: ); scanf(“%f,&r); s=area(r); /函數(shù)調(diào)用 printf(s=%0.2fn,s);【例5-2】無(wú)返回值的函數(shù)調(diào)用方法。在子函數(shù)maxTwo()中輸出兩個(gè)數(shù)中的較大者。void maxTwo(int x,int y) int max=xy?x:y; printf(max=%d,max); void main() int m=10; int n=5; maxTwo(m,n);【例5-3】無(wú)參函數(shù) 調(diào)用。 下面是使用無(wú)參函數(shù)的打

5、印消息程序。#include printstar() printf(*n); printmess() printf( 中華民族復(fù)興百年強(qiáng)國(guó)之夢(mèng) n); main() printstar(); printmess; printstar(); 函數(shù)參數(shù)傳遞函數(shù)參數(shù)傳遞 1.傳值調(diào)用傳值調(diào)用 【例例5-4】函數(shù)的傳值調(diào)用,請(qǐng)分析數(shù)據(jù)交換子函數(shù)Swap()被調(diào)用前后,主函數(shù)內(nèi)的兩個(gè)整型變量m、n的結(jié)果。void Swap(int ia,int ib) int ic ic=ia; ia=ib; ib=ic;void main() int m=10; int n=5; printf(調(diào)用Swap()函數(shù)前

6、:m=%d,n=%dn,m,n); swap(m,n); printf(調(diào)用Swap()函數(shù)后:m=%d,n=%dn,m,n);2.傳址調(diào)用傳址調(diào)用【例5-5】利用傳址調(diào)用,編寫(xiě)一個(gè)生成、輸出斐波那契數(shù)列前N例如N=20項(xiàng),并統(tǒng)計(jì)出前nn#define N 20CreateFibonacci(int iF)int i; iF0=iF1=1; for(i=2;iN;i+) iFi=iFi-2+iFi-1;void PrintFibonacci(int iF)int i; puts( 斐波那契數(shù)列);for(i=0;iN;i+) printf(%dt,iFi); if(i+1)%10=0) pri

7、ntf(n); printf(n);int Sum(int iF,int n);void main()int i,FibonacciN,m,n;/生成斐波那契數(shù)列CreateFibonacci(Fibonacci);/輸出斐波那契數(shù)列PrintFibonacci(Fibonacci);/求數(shù)列前n項(xiàng)的和printf( 請(qǐng)輸入要求和的項(xiàng)數(shù)n(n%d): ,N);scanf(%d,&n);m=Sum(Fibonacci,n);printf(n 斐波那契數(shù)列前%d項(xiàng)的和:%4dn,n,m);/定義Sum函數(shù)int Sum(int iF,int n) int i,iTotal=0; for(i

8、=0;in;i+)iTotal+=iFi; return(iTotal);數(shù)組名可作函數(shù)數(shù)組名可作函數(shù)參數(shù)參數(shù)實(shí)參實(shí)參和形參都應(yīng)用數(shù)組名和形參都應(yīng)用數(shù)組名.2109score562312.88array例:例: 求學(xué)生的平均成績(jī)求學(xué)生的平均成績(jī) #include #include void main()void main() float average(float float average(float array10);array10); float score10, aver; float score10, aver; int i; int i; printf(Input 10 score

9、s: printf(Input 10 scores: n);n); for( i=0; i10; i+ ) for( i=0; i10; i+ ) scanf(%f, scanf(%f, &scorei);&scorei); printf(“n printf(“n);); aver=average(score); aver=average(score); printf(Average is: printf(Average is: %5.2f, aver);%5.2f, aver); float average(float array10) int i; float aver,s

10、um=array0; for( i=1; i10; i+ ) sum=sum+arrayi; aver=sum/10; return (aver);幾點(diǎn)說(shuō)明幾點(diǎn)說(shuō)明:v1形參數(shù)組和實(shí)參數(shù)組的類(lèi)型必須一致v2當(dāng)實(shí)參是一維數(shù)組時(shí),形參數(shù)組的長(zhǎng)度可以缺省,但一對(duì)方括號(hào)不得缺省。當(dāng)實(shí)參是二維數(shù)組時(shí),形參數(shù)組的行數(shù)可缺省,但列數(shù)不得缺省。v3形參和實(shí)參數(shù)組的長(zhǎng)度可以不相同,因?yàn)樵谡{(diào)用時(shí),只傳送首地址而不檢查形參數(shù)組的長(zhǎng)度。當(dāng)形參數(shù)組的長(zhǎng)度與實(shí)參數(shù)組不一致時(shí),雖不至于出現(xiàn)語(yǔ)法錯(cuò)誤(編譯能通過(guò)),但程序執(zhí)行結(jié)果將與實(shí)際不符,這是應(yīng)予以注意的。*5.1.4 主函數(shù)主函數(shù)main()中的參數(shù)中的參數(shù)(不講不講

11、在操作系統(tǒng)環(huán)境下的命令格式在操作系統(tǒng)環(huán)境下的命令格式: 命令命令 參數(shù)參數(shù)1 1 參數(shù)參數(shù)2 2 此格式也稱(chēng)為命令行此格式也稱(chēng)為命令行。 例:例: program str1 str2 str3 str4 str5 program str1 str2 str3 str4 str5 其中其中programprogram為為可執(zhí)行可執(zhí)行文件名文件名; ; 其后各跟其后各跟5 5個(gè)參數(shù)。個(gè)參數(shù)。 main(int argc,char main(int argc,char * *argvargv) intint argc argc:記錄命令行中命令與參數(shù)的個(gè)數(shù),記錄命令行中命令與參數(shù)的個(gè)數(shù),; char

12、 char * *argv: argv: 各各參數(shù)的值。參數(shù)的值。 【例例5-6】:設(shè)程序名為:設(shè)程序名為5-6.exe ,輸出命令行參數(shù)值。輸出命令行參數(shù)值。 #include main(int argc,char *argv) printf(參數(shù)個(gè)數(shù):參數(shù)個(gè)數(shù):%dn, argc); printf(第一個(gè)參數(shù):第一個(gè)參數(shù):%sn, argv0); printf(第二個(gè)參數(shù):第二個(gè)參數(shù):%sn, argv1); 在命令行輸入如下命令:在命令行輸入如下命令: 5-6.exe 11 22 輸出結(jié)果:參數(shù)個(gè)數(shù):輸出結(jié)果:參數(shù)個(gè)數(shù):3 第一個(gè)參數(shù):第一個(gè)參數(shù):11 第二個(gè)參數(shù):第二個(gè)參數(shù):22 函數(shù)

13、函數(shù)的嵌套調(diào)用的嵌套調(diào)用 不不允許嵌套定義允許嵌套定義,函數(shù),函數(shù)間平行的間平行的、獨(dú)立。獨(dú)立。 C C中的函數(shù)中的函數(shù): 允許允許嵌套嵌套調(diào)用調(diào)用。main( )調(diào)用函數(shù)調(diào)用函數(shù)a結(jié)束結(jié)束a函數(shù)函數(shù)b函數(shù)函數(shù)調(diào)用函數(shù)調(diào)用函數(shù)b5.2 函數(shù)的嵌套與遞歸調(diào)用輸入:輸入: 3 4輸出:輸出: The result is: 25【例例5-75-7】 輸入兩個(gè)整數(shù),求平方和輸入兩個(gè)整數(shù),求平方和#include int fun1(int x,int y);void main(void) int a,b; scanf(“%d%d,&a,&b); printf(“The result is

14、:%dn,fun1(a,b) );int fun1(int x,int y) int fun2(int m); return ( fun2(x)+fun2(y) );int fun2(int m) return (m*m);5.2.2 5.2.2 函數(shù)函數(shù)的遞歸調(diào)用的遞歸調(diào)用遞歸:遞歸:一個(gè)函數(shù)在它的函數(shù)一個(gè)函數(shù)在它的函數(shù)體內(nèi)體內(nèi)出現(xiàn)出現(xiàn)調(diào)用調(diào)用它它自身自身的語(yǔ)句的語(yǔ)句。f( )調(diào)調(diào)fint f(int x) int y; z=f(y); . return(2*z);遞歸遞歸: :在函數(shù)調(diào)用自身時(shí)在函數(shù)調(diào)用自身時(shí), ,要要給出結(jié)束遞歸的條件給出結(jié)束遞歸的條件。l先遞推再回歸先遞推再回歸l如:如

15、:n n!,!, 5 5!=5 !=5 4! 4! 4!=4 4!=4 3! 3! 3!=3 3!=3 2! 2! 2!=2 2!=2 1! 1! 1!=11!=1 0!=1 0!=1 1 (n=0,1) n!= n*(n-1)! (n1)#include long factorial(int n) long ip; if(n=0|n=1) ip=1; else ip=factorial(n-1)*n; return(ip);void main() int n;long m; printf(“請(qǐng)輸入一個(gè)整數(shù)請(qǐng)輸入一個(gè)整數(shù):); scanf(%d,&n); m=factorial(n);

16、 printf(%d! =%15d,n,m); 運(yùn)行:運(yùn)行:請(qǐng)輸入一個(gè)整數(shù):請(qǐng)輸入一個(gè)整數(shù):1010! = 3628800【例例5-85-8】 用遞歸方法求用遞歸方法求n!n! age(5) age(4) age(3) age(2) age(1) =2+age(4) =2+age(3) =2+age(2) =2+age(1) =10=18 =16 =14 =12【例例5-95-9】: 有有5 5個(gè)人,第個(gè)人,第5 5個(gè)人比第個(gè)人比第4 4個(gè)人大個(gè)人大2 2歲,第歲,第4 4個(gè)人比第個(gè)人比第3 3個(gè)人大個(gè)人大2 2歲歲,第第2 2個(gè)人比第個(gè)人比第1 1個(gè)人大個(gè)人大2 2歲,第歲,第1 1個(gè)人個(gè)人

17、1010歲,問(wèn)第歲,問(wèn)第5 5個(gè)人多大?個(gè)人多大? 10 n=1數(shù)學(xué)模型:數(shù)學(xué)模型:age(n)= age(n-1)+2 n1運(yùn)行結(jié)果:運(yùn)行結(jié)果:18age(int n) int c; if(n=1) c=10; else c=2+age(n-1); return(c); #include void main( ) printf(“%d n, age(5);5.3 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù) 根據(jù)函數(shù)能否被其它源文件調(diào)用,將函數(shù)分為內(nèi)部函根據(jù)函數(shù)能否被其它源文件調(diào)用,將函數(shù)分為內(nèi)部函數(shù)和外部函數(shù)。數(shù)和外部函數(shù)。5.3.1 5.3.1 內(nèi)部函數(shù)內(nèi)部函數(shù)靜態(tài)函數(shù)靜態(tài)函數(shù)只能被本文件中其它

18、函數(shù)所調(diào)用只能被本文件中其它函數(shù)所調(diào)用定義形式:定義形式: static static 類(lèi)型標(biāo)識(shí)符類(lèi)型標(biāo)識(shí)符 函數(shù)名函數(shù)名 形參表形參表 如:如: static int fun(int a, int b) static int fun(int a, int b)內(nèi)部函數(shù)作用域:僅限于定義它的所在文件。內(nèi)部函數(shù)作用域:僅限于定義它的所在文件。5.3.2 5.3.2 外部函數(shù)外部函數(shù)能被其它文件中的函數(shù)所調(diào)用能被其它文件中的函數(shù)所調(diào)用定義形式:定義形式: extern extern 類(lèi)型標(biāo)識(shí)符類(lèi)型標(biāo)識(shí)符 函數(shù)名函數(shù)名 形參表形參表 如:如:extern int fun(int a, int b)e

19、xtern int fun(int a, int b)省略省略externextern,隱含為外部函數(shù),隱含為外部函數(shù)調(diào)用此函數(shù)的文件中也要用調(diào)用此函數(shù)的文件中也要用externextern聲明所用函數(shù)是外聲明所用函數(shù)是外部函數(shù)部函數(shù)【例【例5-105-10】簡(jiǎn)單項(xiàng)選擇擇排序算法編寫(xiě)程序】簡(jiǎn)單項(xiàng)選擇擇排序算法編寫(xiě)程序 分析分析:該該問(wèn)題可以用問(wèn)題可以用2 2個(gè)函數(shù)解決個(gè)函數(shù)解決。主。主函數(shù)函數(shù)main( ) main( ) , 排序排序函數(shù)函數(shù)sort( ) sort( ) ,將各函數(shù)放入將各函數(shù)放入2 2個(gè)文件,用個(gè)文件,用externextern聲明實(shí)現(xiàn)各文件中函數(shù)的調(diào)用。聲明實(shí)現(xiàn)各文件中

20、函數(shù)的調(diào)用。void sort(int a,int n) int i,j,k,c; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(ajak) k=j; if(k!=i) c=ai; ai=ak; ak=c; f1.cmain() extern void sort(int a,int n); int a10,i; for(i=0;i10;i+) scanf(%d,&ai); sort(a,10); for(i=0;i(Y)?(X):(Y)5.4 5.4 帶參數(shù)的宏定義帶參數(shù)的宏定義28【例例5-115-11】:帶參數(shù)的宏的用法。求兩個(gè)數(shù)中的較大者。:

21、帶參數(shù)的宏的用法。求兩個(gè)數(shù)中的較大者。#include #define MAX(a,b) (ab)?a:bmain()float x,y,max; printf(請(qǐng)輸入兩個(gè)數(shù): );scanf(%f%f,&x,&y);max=MAX(x,y);printf(max=%0.2fn,max);2930#include #define L 5#define F(x) (4*x*x*x-6*x*x*L+L*L*L) /撓度曲線的導(dǎo)函數(shù)#define F1(x) (12*x*x-12*x*L) /導(dǎo)函數(shù)的導(dǎo)函數(shù)void main()double x1,x2, eps=1e-6; x1=2

22、; x2=x1-F(x1)/F1(x1); /由x1用宏調(diào)用計(jì)算出x2while(fabs(x2-x1)eps)x1=x2; x2=x1-F(x1)/F1(x1);x2=(x1+x2)/2;printf(最大撓度發(fā)生點(diǎn)在梁的:%0.2lf m處n,x2);5.5 庫(kù)函數(shù)及預(yù)處理命令#include1.1.由編譯系統(tǒng)提供的一系列函數(shù),以庫(kù)形式存放在系統(tǒng)中,由編譯系統(tǒng)提供的一系列函數(shù),以庫(kù)形式存放在系統(tǒng)中,不是不是C C語(yǔ)言文本的組成局部。語(yǔ)言文本的組成局部。2.2.調(diào)用形式:調(diào)用形式:函數(shù)名函數(shù)名 參數(shù)表參數(shù)表 3.3.注意在調(diào)用注意在調(diào)用C C語(yǔ)言庫(kù)函數(shù)時(shí),需要使用編譯預(yù)處理命令語(yǔ)言庫(kù)函數(shù)時(shí),

23、需要使用編譯預(yù)處理命令#include #include ,使相應(yīng)的頭文件包含到用戶源,使相應(yīng)的頭文件包含到用戶源程序中。程序中。32頭文件名函數(shù)類(lèi)型頭文件名函數(shù)類(lèi)型stdio.h標(biāo)準(zhǔn)輸入輸出庫(kù)函數(shù)time.h時(shí)間庫(kù)函數(shù)(大多是用于UNIX系統(tǒng))string.h字符串處理庫(kù)函數(shù)stdlib.h內(nèi)存分配、隨機(jī)數(shù)發(fā)生器、類(lèi)型轉(zhuǎn)換庫(kù)函數(shù)ctype.h字符判斷庫(kù)函數(shù)conio.h文本窗口庫(kù)函數(shù)(僅用于IBM PC及其兼容機(jī))dir.h文件目錄操作庫(kù)函數(shù)dos.hC程序與操作系統(tǒng)接口庫(kù)函數(shù)math.h數(shù)學(xué)運(yùn)算庫(kù)函數(shù)graphics.h圖形庫(kù)函數(shù)(僅適用于Turbo C系統(tǒng))表表5-15-1常用頭文件所包

24、含的庫(kù)函數(shù)類(lèi)型常用頭文件所包含的庫(kù)函數(shù)類(lèi)型5.6 函數(shù)綜合應(yīng)用舉例【5-135-13】編寫(xiě)一個(gè)萬(wàn)年歷程序,提示用戶輸入年份和月】編寫(xiě)一個(gè)萬(wàn)年歷程序,提示用戶輸入年份和月份信息,程序?qū)⑤敵鲈撃暝撛碌娜諝v。例如程序運(yùn)行份信息,程序?qū)⑤敵鲈撃暝撛碌娜諝v。例如程序運(yùn)行時(shí)輸入年份:時(shí)輸入年份:20212021年,月份年,月份:3:3月,現(xiàn)實(shí)的結(jié)果如圖月,現(xiàn)實(shí)的結(jié)果如圖5-35-3所示。所示。 分析:分析: 日歷表的主要打印兩局部:打印日歷表標(biāo)題局部和日歷表的主要打印兩局部:打印日歷表標(biāo)題局部和日歷的主體局部。日歷的主體局部。 打印主體局部,應(yīng)知道:打印主體局部,應(yīng)知道: 1 1要打印月的第一天是星期幾?

25、要打印月的第一天是星期幾? 以某個(gè)天的參考,用以下公式計(jì)算:以某個(gè)天的參考,用以下公式計(jì)算: 如:如: 1900 1900年年1 1月月1 1日為星期一。日為星期一。 那么:要打印月的第一天的星期那么:要打印月的第一天的星期 = = 要打印月的第一要打印月的第一天離天離19001900年年1 1月月1 1日的總天數(shù)日的總天數(shù) + 1 + 1% 7% 72要打印的月的總天數(shù)?要打印的月的總天數(shù)? A. 1、3、5、7、8、10、12月份月份: 31天;天; B. 4、6、9、11月月: 30天;天; C. 2月月: 閏年為閏年為28天,否那么為天,否那么為29天。天。 D. 閏年的判斷規(guī)那么閏年

26、的判斷規(guī)那么: 只要滿足以下兩個(gè)條件之一,就只要滿足以下兩個(gè)條件之一,就是閏年。是閏年。 條件條件1:能被:能被4整除,但不能被整除,但不能被100整除整除 條件條件2:能被:能被400整除整除日歷程序函數(shù)調(diào)用關(guān)系圖 函數(shù)說(shuō)明:函數(shù)說(shuō)明:main() /程序入口主函數(shù)程序入口主函數(shù)int readYear() /讀取用戶輸入的年份數(shù)據(jù)讀取用戶輸入的年份數(shù)據(jù)int readMonth() /讀取用戶輸入的月份數(shù)據(jù)讀取用戶輸入的月份數(shù)據(jù) void printMonth(int year, int month) /打印打印year年年month月的日歷表月的日歷表void printMonthTit

27、le(int year, int month) /打印日歷標(biāo)題打印日歷標(biāo)題 void printMonthBody(int year, int month) /打印日歷主體打印日歷主體 /獲取獲取year年年month月的第一天的星期數(shù)月的第一天的星期數(shù) int getStartDay(int year, int month) /獲取從獲取從1900年年1月月1日日(星期一星期一)到到y(tǒng)ear年年month月月1日的相隔總天數(shù)日的相隔總天數(shù) int getTotalDays(int year, int month) /獲取獲取year年年month月的總天數(shù)月的總天數(shù) int getMonth

28、Days (int year, int month) /判斷判斷year年是否為閏年如果為閏年,那么返回年是否為閏年如果為閏年,那么返回1,否那么返回,否那么返回0 int isLeapYear(int year)#include int readYear() /輸入年份函數(shù)輸入年份函數(shù) int Year; printf(請(qǐng)輸入年份:請(qǐng)輸入年份:); scanf(%d,&Year); return Year; int readMonth() /輸入月份函數(shù)輸入月份函數(shù) int Month; printf(請(qǐng)輸入月份:請(qǐng)輸入月份:); scanf(%d,&Month); retu

29、rn Month; int isLeapYear(int Year) /判斷閏判斷閏年函數(shù)年函數(shù) if (Year%4)=0 &(Year%100!=0) |(Year%400=0) return 1; else return 0; int getMonthDays (int Year, int Month) /獲得所在年月的天數(shù)函數(shù)獲得所在年月的天數(shù)函數(shù) int Days; switch (Month) case 1:case 3:case 5:case 7:case 8: case 10: case 12:Days=31;break; case 4:case 6:case 9:ca

30、se 11: Days=30;break; case 2: if(isLeapYear(Year) Days=29; else Days=28;break; return Days;int getTotalDays(int Year, int Month) /1900年年1月月1日到當(dāng)前年月日到當(dāng)前年月的間隔天數(shù)的間隔天數(shù) int Days=0, i=0; for(i=1900;iYear;i+) if(isLeapYear(i) Days=Days+366; else Days=Days+365; /累計(jì)月份天數(shù)計(jì)算總天數(shù)累計(jì)月份天數(shù)計(jì)算總天數(shù) for(i=1;iMonth;i+) Days

31、=Days+getMonthDays(Year,i); return Days; int getStartDay(int Year, int Month) /獲得第一天的星期數(shù)獲得第一天的星期數(shù) int startDay=(1+getTotalDays(Year,Month)%7; return startDay; void printMonthBody(int Year, int Month) /打印日歷內(nèi)容打印日歷內(nèi)容 int i; /循環(huán)變量循環(huán)變量 int count; /開(kāi)始星期數(shù)開(kāi)始星期數(shù) int Days; /當(dāng)月天數(shù)當(dāng)月天數(shù) count=getStartDay(Year,Mon

32、th); Days=getMonthDays(Year,Month); /打印空格打印空格 for (i=0;icount;i+) printf( ); /打印數(shù)據(jù)打印數(shù)據(jù) for(i=1;i=Days;i+) printf( %3d,i); count+; if(count%7=0) printf(n); puts(n-n); void printMonthTitle(int Year, int Month) /打印日歷標(biāo)題打印日歷標(biāo)題 printf(tt%d年年%d月月n,Year,Month); puts(-n); puts( 日日 一一 二二 三三 四四 五五 六六n);void pr

33、intMonth(int Year,int Month) /打印日歷打印日歷 printMonthTitle(Year,Month); /打印日歷標(biāo)題打印日歷標(biāo)題 printMonthBody(Year,Month); /打印日歷主體打印日歷主體main() /輸入年份輸入年份 int Year=readYear(); /輸入月份輸入月份 int Month=readMonth(); /打印日歷打印日歷 printMonth(Year,Month);【5-14】編程求解】編程求解1010000以內(nèi)的所有超級(jí)素?cái)?shù)。以內(nèi)的所有超級(jí)素?cái)?shù)。所謂超級(jí)素?cái)?shù)指如果一個(gè)素?cái)?shù)組成它的所謂超級(jí)素?cái)?shù)指如果一個(gè)素?cái)?shù)組

34、成它的: 所有數(shù)碼的和:所有數(shù)碼的和:Sum、 所有數(shù)碼的積:所有數(shù)碼的積:Product、 所有數(shù)碼的平方和:所有數(shù)碼的平方和:SumSquare也都是素?cái)?shù)的數(shù)。也都是素?cái)?shù)的數(shù)。算法分析:算法分析:1只有奇數(shù)才可能是素?cái)?shù),因此判斷應(yīng)從只有奇數(shù)才可能是素?cái)?shù),因此判斷應(yīng)從i=11循環(huán)到循環(huán)到10000,按步長(zhǎng)為,按步長(zhǎng)為2進(jìn)行。進(jìn)行。2調(diào)用求素?cái)?shù)函數(shù)調(diào)用求素?cái)?shù)函數(shù)Prime(i)判斷判斷i是否為素?cái)?shù)。如是,是否為素?cái)?shù)。如是,再做判斷它是否為超級(jí)素?cái)?shù)的事情,否那么進(jìn)入下一輪再做判斷它是否為超級(jí)素?cái)?shù)的事情,否那么進(jìn)入下一輪循環(huán),判斷一個(gè)奇數(shù)是否為素?cái)?shù)。循環(huán),判斷一個(gè)奇數(shù)是否為素?cái)?shù)。3 3當(dāng)某奇數(shù)當(dāng)某

35、奇數(shù)i i已被確定為素?cái)?shù)時(shí),下面的工作是:已被確定為素?cái)?shù)時(shí),下面的工作是:A A、將、將m m=i=i分解成組成它的各位數(shù)碼,并對(duì)數(shù)碼進(jìn)行求和、積平方和三種分解成組成它的各位數(shù)碼,并對(duì)數(shù)碼進(jìn)行求和、積平方和三種運(yùn)算。運(yùn)算。 方法:循環(huán)對(duì)方法:循環(huán)對(duì)m m進(jìn)行進(jìn)行m%10m%10、M/=10M/=10運(yùn)算,將所得的數(shù)碼求和、求積、求平方運(yùn)算,將所得的數(shù)碼求和、求積、求平方和的運(yùn)算,直到和的運(yùn)算,直到m m為為0 0時(shí)分解結(jié)束。時(shí)分解結(jié)束。B B、調(diào)用、調(diào)用Prime()Prime()函數(shù),判斷數(shù)碼和是否為素?cái)?shù),是繼續(xù)第函數(shù),判斷數(shù)碼和是否為素?cái)?shù),是繼續(xù)第C C步,否那么跳到步,否那么跳到i i循

36、環(huán)的下一輪,判斷另一個(gè)奇數(shù)是否為素?cái)?shù)。循環(huán)的下一輪,判斷另一個(gè)奇數(shù)是否為素?cái)?shù)。C C、調(diào)用、調(diào)用Prime()Prime()函數(shù),判斷數(shù)碼積是否為素?cái)?shù),是繼續(xù)第函數(shù),判斷數(shù)碼積是否為素?cái)?shù),是繼續(xù)第D D步,否那么跳到步,否那么跳到i i循環(huán)的下一輪,判斷另一個(gè)奇數(shù)是否為素?cái)?shù)。循環(huán)的下一輪,判斷另一個(gè)奇數(shù)是否為素?cái)?shù)。D D、調(diào)用、調(diào)用Prime()Prime()函數(shù),判斷數(shù)碼平方和是否為素?cái)?shù),是繼續(xù)第函數(shù),判斷數(shù)碼平方和是否為素?cái)?shù),是繼續(xù)第5 5步,否那么跳步,否那么跳到到i i循環(huán)的下一輪,判斷另一個(gè)奇數(shù)是否為素?cái)?shù)。循環(huán)的下一輪,判斷另一個(gè)奇數(shù)是否為素?cái)?shù)。E E、經(jīng)過(guò)、經(jīng)過(guò)2 2、3 3、4

37、4步,證明步,證明i i滿足了超級(jí)素?cái)?shù)的條件,輸出,并讓計(jì)數(shù)器滿足了超級(jí)素?cái)?shù)的條件,輸出,并讓計(jì)數(shù)器+1.+1.源程序如下:源程序如下:#include #include int Prime();void main() int i,digit,m,Flag; int Sum,Product,SumSquare; int Count=0; puts(10 到到 10000 之間的全部超級(jí)之間的全部超級(jí)素?cái)?shù):素?cái)?shù):); /循環(huán)求循環(huán)求10,10000之間的所有超級(jí)之間的所有超級(jí)素?cái)?shù)素?cái)?shù)for(i=11;i0);Flag=Prime(Sum);if(!Flag) continue; Flag=Pri

38、me(Product);if(!Flag) continue; Flag=Prime(SumSquare);If(Flag) printf(%d ,i); /條件全部滿足,條件全部滿足,i一定是超級(jí)素?cái)?shù),予以輸出一定是超級(jí)素?cái)?shù),予以輸出 Count+;printf(n總共總共%d個(gè)超級(jí)素?cái)?shù)個(gè)超級(jí)素?cái)?shù)n,Count);int Prime(int m)int n,j;if(m2)return 0; / 0、1不是素?cái)?shù)不是素?cái)?shù)n=sqrt(m);for(j=2;j=n;j+)if(m%j=0) /m不能被不能被j整除,一定不是素?cái)?shù)整除,一定不是素?cái)?shù) return 0;return 1; /循環(huán)正常結(jié)

39、束,循環(huán)正常結(jié)束,m一定是素?cái)?shù)一定是素?cái)?shù)運(yùn)行運(yùn)行【例【例5-155-15】制作一張有】制作一張有1010個(gè)學(xué)生成績(jī)單,成績(jī)由隨機(jī)函個(gè)學(xué)生成績(jī)單,成績(jī)由隨機(jī)函數(shù)生成,運(yùn)行結(jié)果如圖數(shù)生成,運(yùn)行結(jié)果如圖5-65-6所示。所示。算法分析:算法分析:1 1從學(xué)生成績(jī)單輸出結(jié)果可看出,成績(jī)數(shù)組從學(xué)生成績(jī)單輸出結(jié)果可看出,成績(jī)數(shù)組ScoreScore應(yīng)是一個(gè)應(yīng)是一個(gè)M M* *N N的的浮點(diǎn)數(shù)矩陣浮點(diǎn)數(shù)矩陣(M=11,N=5)(M=11,N=5),成績(jī)表的第,成績(jī)表的第1 1列與成績(jī)數(shù)組列與成績(jī)數(shù)組ScoreMNScoreMN本本身無(wú)關(guān),是一個(gè)附加列,目的是輸出學(xué)生的序號(hào)和身無(wú)關(guān),是一個(gè)附加列,目的是輸出學(xué)

40、生的序號(hào)和“總平均;同總平均;同樣,表頭也不是樣,表頭也不是ScoreMNScoreMN的內(nèi)容。的內(nèi)容。2 2表頭和表線可事先定義在一個(gè)字符型二維數(shù)組表頭和表線可事先定義在一個(gè)字符型二維數(shù)組s680s680中。其中。其中所涉及的各中圖形字符,全部取自于漢字中所涉及的各中圖形字符,全部取自于漢字GB2312-80GB2312-80中第中第9 9區(qū)的制區(qū)的制表符。表符。3 3ScoreMNScoreMN前前M-1M-1行、行、N-1N-1列的各元素值,應(yīng)由成績(jī)生成函數(shù)列的各元素值,應(yīng)由成績(jī)生成函數(shù)CreateScore(float ScoreN)CreateScore(float ScoreN)生

41、成。其中第生成。其中第M-1M-1行、行、N-1N-1列前面的列前面的各元素值,通過(guò)隨機(jī)數(shù)函數(shù)生成,并進(jìn)行適當(dāng)?shù)募夹g(shù)處理。第各元素值,通過(guò)隨機(jī)數(shù)函數(shù)生成,并進(jìn)行適當(dāng)?shù)募夹g(shù)處理。第M-1M-1行行、N-1N-1列的個(gè)元素值,是前面各行、各列元素之求平均的結(jié)果。列的個(gè)元素值,是前面各行、各列元素之求平均的結(jié)果。4 4表頭的打印由函數(shù)表頭的打印由函數(shù)PrintString(char str80)PrintString(char str80)完成。它可完成。它可通過(guò)循環(huán)的方式將通過(guò)循環(huán)的方式將s680s680中的中的s0s0、s1s1、s2s2、s3s3打印出來(lái)打印出來(lái),組成表頭。,組成表頭。5 5成績(jī)單由函數(shù)成績(jī)單由函數(shù)PrintRecord(float ScoreN,str80)PrintRecord(float ScoreN,str80)實(shí)實(shí)現(xiàn),要完成如下任務(wù):現(xiàn),要完成如下任務(wù): 外循環(huán)外循環(huán)i=0M-2i=0M-2開(kāi)始,打印開(kāi)始,打印“和學(xué)生的學(xué)號(hào)最后一行應(yīng)和學(xué)生的學(xué)號(hào)最后一行應(yīng)打印打印“總平均;總平均; 內(nèi)循環(huán)開(kāi)始,循環(huán)打印內(nèi)循環(huán)開(kāi)始,循環(huán)打印“和和

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論