文章目錄
1、函數概述
- 函數是學習C語言的重點。學習C語言有兩個知識點是必需要學的,一個是函數,另外一個是指針,這兩個知識點是C語言的主體和核心,因而可知其重要性。雖然其它語言中也有函數,可是C語言中的函數更加劇要。由於C語言中的函數與如今全部流行語言中的函數的用法都不太同樣。學完C語言的函數有助於咱們理解什麼是面向過程。等未來學習面嚮對象語言,如 C++、Java 或者C#的時候就會發現,這些語言中函數的用法與C語言中的用法有很大的差異。所以,函數是理解面向過程和麪向對象的切入點。經過 C 語言的函數能夠直觀地辨別出面向過程和麪向對象的區別。C 語言的函數有一個特色,就是它有固定的格式和固定的模型。
- C語言是結構化程序設計語言,採用模塊化的處理方式,每個模塊其實就是一個函數。對於比較複雜的問題,採用自頂向下,逐層分解,直到分解到最基本的模塊,這就是結構化程序設計的基本方法。
2、函數的聲明、定義與調用
(一)函數使用三步曲
- 聲明函數(只有函數頭:函數名、形式參數、返回值)
- 定義函數(包含函數頭和函數體)
- 調用函數(經過函數名加實際參數來調用)
- 其中,形式參數只能是變量(簡單變量或數組變量),實際參數能夠是常數、變量或者表達式。
(二)案例演示 - 編寫函數求三個整數最大值
一、編寫程序 - 編寫函數求三個整數最大值.c
/* 功能:編寫函數求三個整數最大值 做者:華衛 日期:2014年5月8日 */ #include "stdio.h" // 第1步:聲明函數 int max(int a, int b, int c); // a, b, c叫作形式參數,簡稱形參或虛參 void main() { // 聲明部分 int m, n, k; int max_value; // 輸入部分 printf("m,n,k = "); scanf("%d,%d,%d", &m, &n, &k); // 處理部分 max_value = max(m, n, k); // 第3步:調用函數(m,n,k叫作實際參數,簡稱實參) // 輸出部分 printf("max_value = %d\n", max_value); } // 第2步:定義函數 int max(int a, int b, int c) { // 函數頭 int max = a; if (max < b) max = b; if (max < c) max = c; return max; // 返回函數值 }
二、運行程序,查看結果
(三)課堂練習 - 計算階乘之和
- 編寫階乘函數計算0! + 1! + 2! + …… + 10!。
3、參數傳遞
(一)值傳遞
一、概述
當調用函數傳入的實際參數是常量、簡單變量或表達式,此時採用值傳遞的方式,也就是實際參數的值傳給形式參數後,不會受形式參數變化的影響。值傳遞是一種單向的數據傳遞。web
當實際參數是常量或表達式的時候,值傳遞很好理解,只是把數據傳給形式參數就了事,不會接受形式參數變化的影響。所以,咱們只演示實際參數是變量時的值傳遞。算法
二、案例演示
- 編寫程序 - 值傳遞演示.c
/* 功能:值傳遞演示 做者:華衛 日期:2014年5月13日 */ #include "stdio.h" // 一、聲明函數 int change(int x); void main() { // 聲明部分 int n; int m; // 輸入部分 printf("n = "); scanf("%d", &n); // 處理部分 m = change(n); // 3. 調用函數 // 輸出部分 printf("實際參數:%d\n", n); printf("函數返回值:%d\n", m); } // 二、定義函數 int change(int x) { x = 2 * x; printf("形式參數:%d\n", x); return x; }
- 運行程序,查看結果
(二)地址傳遞
一、概述
當調用函數傳入的實際參數是數組時,採用地址傳遞方式,也就是說形式參數(數組)值發生變化,會反過來影響實際參數(數組)。地址傳遞是一種雙向傳遞。數組
二、案例演示
- 編寫程序 - 地址傳遞演示.c
/* 功能:地址傳遞演示 做者:華衛 日期:2014年5月13日 */ #include "stdio.h" // 一、聲明函數 void reverse(int a[], int n); void main() { // 聲明部分 int i; // 循環變量 int b[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 輸出部分 printf("原序:"); for(i = 0; i < 10; i++) { printf("%d ", b[i]); } printf("\n"); // 處理部分 reverse(b, 10); // 三、調用函數:實際參數是一個數組,採用地址傳遞方式 // 輸出部分 printf("反序:"); for(i = 0; i < 10; i++) { printf("%d ", b[i]); } } // 二、定義函數(功能:數組反序) void reverse(int a[], int n) { int i; // 循環變量 int temp; // 臨時變量 for(i = 0; i < n/2; i++) { temp = a[i]; a[i] = a[n - 1 - i]; a[n - 1 - i] = temp; } }
- 運行程序,查看結果
4、遞推算法與遞歸算法
(一)遞推算法
從已知向未知不斷拓展的思想方式。svg
(二)遞歸算法
從未知向已知不斷迴歸的思想方式。模塊化
(三)案例演示 - 計算階乘
- 拿一個簡單的數學問題——階乘——來講明這兩種不一樣的思想方式。
(1)採用遞推方式來計算 n!
起點:1! = 1
2! = 1! * 2
3! =2! * 3
……
終點:n! = (n-1)! * n函數(2)採用遞歸方式來計算 n!
起點:n! = (n-1)! * n
(n-1)! = (n-2)! * (n-1)
(n-2)! = (n-3)! * (n-2)
……
終點: 1! = 1學習
- 編寫程序 - 採用遞推和遞歸方式計算階乘.c
/* 功能:採用遞推和遞歸方式計算階乘 做者:華衛 日期:2014年5月13日 */ #include "stdio.h" // 一、聲明函數 int jc_recurrence(int n); int jc_recursion(int n); void main() { // 採用遞推方式計算階乘 printf("遞推方式計算:5! = %d\n", jc_recurrence(5)); // 採用遞歸方式計算階乘 printf("遞歸方式計算:5! = %d\n", jc_recursion(5)); } // 二、定義函數 // 遞推方式計算階乘函數 int jc_recurrence(int n) { int i; int jc = 1; for (i = 1; i <= n; i++) { jc = jc * i; } return jc; } // 遞歸方式計算階乘函數 int jc_recursion(int n) { int jc = 1; if (n > 1) { jc = n * jc_recursion(n - 1); } else { jc = 1; } return jc; }
- 運行程序,查看結果
本文同步分享在 博客「howard2005」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。url