C講課筆記:函數

1、函數概述

  • 函數是學習C語言的重點。學習C語言有兩個知識點是必需要學的,一個是函數,另外一個是指針,這兩個知識點是C語言的主體和核心,因而可知其重要性。雖然其它語言中也有函數,可是C語言中的函數更加劇要。由於C語言中的函數與如今全部流行語言中的函數的用法都不太同樣。學完C語言的函數有助於咱們理解什麼是面向過程。等未來學習面嚮對象語言,如 C++、Java 或者C#的時候就會發現,這些語言中函數的用法與C語言中的用法有很大的差異。所以,函數是理解面向過程和麪向對象的切入點。經過 C 語言的函數能夠直觀地辨別出面向過程和麪向對象的區別。C 語言的函數有一個特色,就是它有固定的格式和固定的模型。
  • C語言是結構化程序設計語言,採用模塊化的處理方式,每個模塊其實就是一個函數。對於比較複雜的問題,採用自頂向下,逐層分解,直到分解到最基本的模塊,這就是結構化程序設計的基本方法。

2、函數的聲明、定義與調用

(一)函數使用三步曲

  1. 聲明函數(只有函數頭:函數名、形式參數、返回值)
  2. 定義函數(包含函數頭和函數體)
  3. 調用函數(經過函數名加實際參數來調用)
  • 其中,形式參數只能是變量(簡單變量或數組變量),實際參數能夠是常數、變量或者表達式。

(二)案例演示 - 編寫函數求三個整數最大值

一、編寫程序 - 編寫函數求三個整數最大值.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

相關文章
相關標籤/搜索