版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第五章,函數與儲存類別,函數,函數 函數為完成某一次特定任務或工作的小程式 函數的類型 庫存函數(library functions) 如:scanf()、printf()函數等 此函數為系統所提供可以直接呼叫使用之 自定函數(user-define functions) 此函數是使用者自行定義之函數 函數的其它特點 它與變數一樣都有資料型態 函數傳回值之資料型態必須和函數之資料型態一致,函數的三個要素,/* File name: ex5-1a.c */ #include #include void print_star(); int main( ) print_star(); printf(
2、Bright Tsai); print_star(); void print_star( ) printf(*); ,函數的語法,函數的呼叫,函數的定義,函數的三個要素,函數的語法 好比說英文或法文時,需符合英文文法或法文文法一樣,因此當您在函數呼叫時,若與函數語法不符,編譯程式便在編譯時期會發出錯誤訊息 函數的語法,一般寫在main( )函數的上面,從此便可知此程式用到了幾個函數 函數的呼叫 函數的呼叫是執行函數的定義區段 函數的定義 此區段為函數所要完成的工作,如範例5-1a.c為印出11個*,函數的呼叫,函數的呼叫可以帶有參數 參數的類型 形式參數(formal argument) 實際
3、參數(actual argument) 參數傳遞方式 傳值呼叫(call by value) 傳址呼叫(call by address) 範例ex5-1b.c,傳值呼叫,/* File name: ex5-1b.c */ #include #include void print_star(int); int main() print_star(30); printf(“Mr. Bright Tsai is at the NCTUn”); print_star(30); void print_star(int k) int i; for(i = 1; i = k; i+) printf(“*”)
4、; print(“n”); ,形式參數,實際參數,return 敘述,return 敘述 在函數定義中,return敘述表示將此結果傳回給呼叫此函數的敘述,並將控制權交回 若無return敘述,則遇到右大括號()便結束函數定義且交回控制權給呼叫此一敘述的下一個敘述 C 程式中不可有巢狀函數(nested function),return 程式範例(一),/* File name: ex5-2a.c */ #include #include double average(double, double); int main( ) double score_1, score_2, aver; pri
5、ntf(Enter two double numbers: ); while(scanf(%lf %lf, double average(double f1, double f2) ,return 程式範例(一),float average(float f1, float f2) return (f1 + f2) / 2); 程式解說 當一函數執行完有傳回值傳回呼叫函數的敘述時,必須注意此函數的資料型態必須與傳回值的資料型態一致才可 如傳回值為(f1+f2)/2) 是一浮點數,故average的函數資料型態也必須為浮點數,return 程式範例(二),/* File name: ex5-2b.
6、c */ #include #include void funct(int, int); int main() int a = 1000, b = 2000; funct(a, b); printf(“a = %d b = %dn”, a, b); ,return 程式範例(二),void funct(int a, int b) int c; c = a + b; printf(a + b = %dn, c); return c; 程式解說 若參數使用 void,如 funct(void) 是表示 funct 函數不接受任何參數,遞迴函數,遞迴函數(recursive function) 在函
7、數本身中,若有一敘述又呼叫它本身函數 遞迴函數範例 計算某數的階層,如:6! 費氏數列 設計遞迴函數時必須注意結束點,計算 n 階層,/* File name: ex5-3a.c */ #include #include int fact(long); int main() long number, total; printf(“Enter a number: ”); while(scanf(“%ld”, ,計算 n 階層,long fact(long number) if(number = 0 | number = 1) /* 返迴點 */ return 1; else return (nu
8、mber * fact(number -1); ,計算 n 階層,程式解說 如輸入為6,則其執行的步驟如下: 6 * fact(5) 5 * fact(4) 4 * fact(3) 3 * fact(2) 2 * fact(1) 傳回1,費氏序列,/* File name: ex5-3c.c */ #include #include int fibonacci(int); int main() int n, ans; printf(“Enter a number(n = 0): ”); scanf(“%ld”, ,int fibonacci(int n) if(n = 0) return 0;
9、 else if(n = 1) return 1; else return (fibonacci(n 1) + fibonacci(n -2); ,巨集指令,巨集指令 乃是用#define以某一名稱代替一些處理問題的步驟 巨集指令會比函數產生較多的程式碼,但其執行比較快 如:#define SQUARE(x) x * x,巨集指令範例,/* File name: ex5-4a.c */ #include #define SQUARE(x) x * x void main() printf(“Square of 10 is %d/n”, SQUARE(10); printf(“Square of
10、 8 + 2 is %dn”, SQUARE(8 + 2); ,前置處理程式,#define前置處理程式 除了用來當做巨集指令外,最常用的不外乎以某一符號常數(Symbol constant)代替此一常數 如:將RATE取代33.699 #include #define RATE 33.699 void main( ) float total; . total = RATE * 5000; . ,區域變數與全域變數,區域變數 定義在函數裡面的變數 全域變數 定義在函數外面的變數,區域變數與全域變數,區域變數與全域變數的特性 當一程式區域變數和全域變數同名時,以區域變數優先 使用區域變數前,一定
11、要設定初值,或由使用者輸入該變數的初值後才使用,否則可能產生“garbage value” 全域變數的勢力範圍是其定義位置底下的所有函數,在其以上的函數是不能用的 區域變數的存活期在函數執行完畢之後,區域變數所佔的記憶體將被回收,等再進入函數時,才會再次的為此變數配置記憶體,區域變數與全域變數程式範例,#include #include void a(); void b(); void a() printf(“k = %dn”, k); int k = 200; /* 全域變數 */ void b() printf(“k = %dn”, k); void main() int k = 100;
12、 /* 區域變數 */ printf(“k = %dn”, k); a(); b(); ,K 的勢力範圍,儲存類別,變數利用資料型態以配置記憶體,並利用儲存類別規範其存活期 儲存類別分別有 auto, static, register, extern 儲存類別放在資料型態的前面或後面皆可,但習慣上會以儲存類別在前,資料型態在後,儲存類別-auto,auto儲存類別 先前我們提到的變數皆為auto,此為內定值,亦即不必加以註明也可以,如 auto int i; 與 int i; 具有相同的意義,儲存類別-register,register儲存類別 屬於此類的變數,系統會將它放在CPU中的暫存器(
13、register) 放在暫存器的變數比放在記憶體的變數,處理的速度來得快,不過由於CPU的暫存器有限,且每個皆各有所司,因此系統最多給程式兩個暫存器儲存類別的變數,其餘的皆會主動設定為auto 因此register和auto大致上功能類似 假設在程式中有一多層的迴圈,若最內層的變數設定為register,會使得程式的執行加快,儲存類別-static,靜態儲存類別變數之宣告方式 在變數名稱前加一static關鍵字 靜態儲存類別變數的類型 靜態區域變數:此類變數在程式結束時,此變數才會消失 靜態全域變數:資料隱藏,儲存類別-static,/* File name: ex5-6a.c */ #inc
14、lude #include void stat_ai(); int main() int i; for(i = 1; i = 5; i+) stat_ai(); void stat_ai() int ai = 1; static int si = 1; printf(ai = %dn, ai+); printf(si = %dnn, si+); ,儲存類別-extern,/* file 1 */ void callme() int i = 100; int main() int i = 200; i += 30; callme(); ,/* file 2 */ int callme() ext
15、ern int i; /* 宣告 */ i += 100; printf(“i = %d”, i); ,第十二章,常用的數學函數,常用的數學函數,數字函數 此類函數主要是一些常用的數學函數 定義在標頭檔 C提供之數學函數 pow(), sqrt(), exp() log(), log10() ceil(), floor() fabs(), ldexp() fmod(), modf(),常用的數學函數,pow(x, y) 主要是計算x的y次方 如: pow(4, 3) 表示計算4的3次方 當x = 0且y = 0,或者是x 0且y不是一整數時,則表示定義域錯誤,如pow(0, -2)或pow(-
16、2, 2.5) 範例ex12-1a.c,常用的數學函數,/* File name: ex12-1a.c */ #include #include #include int main() double x, y; printf(Enter xy: ); scanf(%lf%lf, ,常用的數學函數,sqrt(x) 主要是計算x的開根號,其中x為double型態,且x=0 如: sqrt(100) 表示計算100開根號 範例ex12-1b.c,常用的數學函數,/* File name: ex12-1b.c */ #include #include #include int main() doubl
17、e x; printf(Enter a number: ); scanf(%lf, ,常用的數學函數,exp(x) 主要是計算指數ex 如: exp(10) 表示計算e10 範例ex12-1c.c,常用的數學函數,/* File name: ex12-1c.c */ #include #include #include int main() int i; double x; for(i = 0; i = 10; i+) printf(exp(%2d) = %8.2fn, i, exp(i); ,常用的數學函數,log(x) 主要是計算loge(x),其中x 0 如: log(10) 表示計算l
18、n(10) 範例ex12-1d.c,常用的數學函數,/* File name: ex12-1d.c */ #include #include #include int main() int i; double x; for(i = 10; i = 100; i += 10) printf(log(%3d) = %.2fn, i, log(i); ,常用的數學函數,log10(x) 主要是計算log10(x),其中x 0 如: log10(10) 表示計算log(10) 範例ex12-1e.c,常用的數學函數,/* File name: ex12-1e.c */ #include #includ
19、e #include int main() int i; double x; for(i = 10; i = 100; i += 10) printf(log10(%3d) = %.2fn, i, log10(i); ,常用的數學函數,ceil(x) 主要是計算大於等於x的最小整數 如: ceil(2.5) 此函數會傳回3 ceil(-2.5) 此函數會傳回-2 範例ex12-1f.c,常用的數學函數,/* File name: ex12-1f.c */ #include #include #include int main() double x; printf(Enter a number:
20、 ); scanf(%lf, ,常用的數學函數,floor(x) 主要是計算小於等於x的最大整數 如: floor(2.5) 此函數會傳回2 floor(-2.5) 此函數會傳回-3 範例ex12-1g.c,常用的數學函數,/* File name: ex12-1g.c */ #include #include #include int main() double x; printf(Enter a number: ); scanf(%lf, ,常用的數學函數,fabs(x) 主要是計算x的絕對值 如: fabs(-2.5) 此函數會傳回2.5 範例ex12-1h.c,常用的數學函數,/* F
21、ile name: ex12-1h.c */ #include #include #include int main() double x; printf(Enter a number: ); scanf(%lf, ,常用的數學函數,ldexp(x, y) 主要是計算x * 2y 如: ldexp(4, 2) 表示計算4 * 22 = 16 範例ex12-1i.c,常用的數學函數,/* File name: ex12-1i.c */ #include #include #include int main() double x = 10; int y = 3; printf(ldexp(%.2f
22、, %d) = %.2fn, x, y, ldexp(x, y); ,常用的數學函數,fmod(x, y) 主要是計算 x / y 的餘數,所得結果與x同號;若y為0,則結果為0 如: fmod(3, 2) = 1 fmod(-3, 2) = -1 範例ex12-1j.c,常用的數學函數,/* File name: ex12-1j.c */ #include #include #include int main() double x, y; printf(Enter x/y: ); scanf(%lf/%lf, ,常用的數學函數,modf(x, double *ip) 主要是將x劃分為整數部份
23、與小數部份,此兩部份與x同號;modf函數將整數部份存於*ip,並傳回小數部份 如: y = modf(123.456, printf(Enter a double number: ); scanf(%lf, ,亂數相關函數,亂數相關函數 此類函數在於產生亂數之用 定義在標頭檔 常見的亂數函數 rand() srand(),亂數相關函數,rand 函數 此函數相當於一亂數產生器,函數執行後會傳回一個介於032767間的整數 範例ex12-2a.c,亂數相關函數,/* File name: ex12-2a.c */ #include #include int main(void) int i;
24、puts(); for(i = 0; i 10; i+) printf(%dn, rand(); ,亂數相關函數,srand 函數 此函數用以重設rand函數執行時所需之亂數種子 範例ex12-2c.c,srand 函數,/* File name: ex12-2c.c */ #include #include int main(void) int i, seed; printf(Please enter a new seed.); scanf(%d, ,資料型態轉換函數,資料型態轉換函數 此類函數是將某一型態的資料轉變為另一型態,如:字串-整數、字串-浮點數、整數-字串等 定義在標頭檔 常見的資料型態轉換函數 atoi() atof() Itoa(),資料型態轉換函數,atoi 函數 此函數可將字串轉換為整數型態的資料 其語法如下: y = atoi(string); 此函數會將字串string轉換為整數後傳回,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 亳州市专职消防员招聘考试题库及答案
- 专八真题及答案
- 2026年山西省晋城市泽州县中考语文一模试卷(含详细答案解析)
- 卫生间管根防水专项施工方案
- 管道防腐层修补施工方案
- 复合土钉墙支护专项施工方案
- 有组织废气处置方案
- (正式版)DB31∕T 1669.1-2026 《城域物联感知基础设施 第1部分:总体技术框架》
- 2026年职业病诊断医师考试(职业性化学中毒)综合能力测试题及答
- 脾破裂患者呼吸功能监测护理
- 2026中国芳纶纤维行业需求预测及发展前景趋势分析报告
- 2025护理学副高职称考试题库及答案
- (二模)河南五市2026年高三毕业年级第二次质量检测政治试卷(含答案及解析)
- 九师联盟2026届高三下学期4月学业评估数学+答案
- 2026年天津市专业技术人员继续教育公需课答案
- SHS 01043-2019屏蔽泵维护检修规程
- 2025秋沪科版(2024)数学八年级上册教学课件(安徽专用)14.1 全等三角形
- 人教版六年级数学下册期中复习试题课件
- DB21-T+4005-2024超大规模超深井智慧矿山建设规范
- DBJ04∕T 299-2013 发泡水泥保温板外墙外保温工程技术规程
- 完工后做好项目复盘总结
评论
0/150
提交评论