首頁 > 軟體

C語言函數指標陣列實現計算器功能

2022-04-12 13:01:13

一、概念        

陣列:一個存放相同型別資料的儲存空間。

int arr[10];
//陣列arr的每個元素是int

指標陣列:一個存放指標的陣列。

int* arr[10];
//陣列arr的每個元素是int*

函數指標:一個指向函數的指標,一般用函數名錶示。

int Add(int x, int y)
{
    return x + y;
}
 
int main()
{
    int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int (*p)[10] = &arr; 
    //取出陣列的地址,p就是指向陣列arr的指標,陣列中每個元素型別是int,p就是陣列指標
    
    //引出函數指標的問題
    int (*pf)(int, int) = &Add;
    //是一個指向函數的指標 - 存放函數的地址

需要注意的是,函數名是函數的地址,&函數名還是函數的地址,在visual stdio編譯環境下能列印出同一地址。這裡的函數指標pf是指向函數Add,其中(int, int)表示函數需要的兩個形參型別是int,函數返回值型別是int。        

函數指標陣列:一個存放指標的陣列,其中的指標都指向各自的函數。

//函數指標
int (*p)(int, int) = Add;
int (*p)(int, int) = Sub; 
//Add和Sub是函數名,需要傳入的兩個形參和返回值型別都是int
 
//將上面兩個同型別的函數指標放入陣列中,得到函數指標陣列
int (* arr[2]) (int, int) = {Add, Sub};

二、用途

函數指標陣列的用途:轉移表

三、案例:計算器      

(1)基礎程式碼編譯:

#include <stdio.h>
//實現加減乘除
int add(int a, int b)
{
    return a + b;
}
int sub(int a, int b)
{
    return a - b;
}
int sub(int a, int b)
{
    return a * b;
}
int sub(int a, int b)
{
    return a / b;
}
int main()
{
    int x, y;
    int input = 1;
    int ret = 0;
    do
    {
        printf( "***************************n" );
        printf( "    1:add         2:sub    n" );
        printf( "    3:mul         4:div    n" );
        printf( "***************************n" );
        printf("請選擇:");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
                printf("輸入運算元: ");
                scanf("%d %d", &x, &y);
                ret = add(x, y);
                printf("ret = %dn", ret);
                break;
        case 2:
                printf("輸入運算元: ");
                scanf("%d %d", &x, &y);
                ret = sub(x, y);
                printf("ret = %dn", ret);
                break;
        case 3:
                printf("輸入運算元: ");
                scanf("%d %d", &x, &y);
                ret = mul(x, y);
                printf("ret = %dn", ret);
                break;
        case 4:
                printf("輸入運算元: ");
                scanf("%d %d", &x, &y);
                ret = div(x, y);
                printf("ret = %dn", ret);
                break;
        case 0:
                printf("退出程式n");
                break;
        default:
                printf("退出程式n");
                break;
        }
    } while (input);
 
    return 0;
} 

這裡用到的switch迴圈語句,實現了資料的輸入、輸出和函數呼叫,結構與功能簡單易懂,但主函數中程式碼太過冗長,重複的程式碼很多,這樣的結構導致後期拓展函數功能需改動的地方非常多。

(2)使用函數指標陣列的實現:

#include <stdio.h>
//實現加減乘除
int add(int a, int b)
{
    return a + b;
}
int sub(int a, int b)
{
    return a - b;
}
int sub(int a, int b)
{
    return a * b;
}
int sub(int a, int b)
{
    return a / b;
}
int main()
{
    int x, y;
    int input = 1;
    int ret = 0;
    int (*p[5])(int x, int y) = { 0, add, sub, mul, div };//轉移表
    while (input)
    {    
        printf( "***************************n" );
        printf( "    1:add         2:sub    n" );
        printf( "    3:mul         4:div    n" );
        printf( "***************************n" );
        printf("請選擇:");
        scanf("%d", &input);
        if ((input <= 4 && input >= 1))
        {
            printf("輸入運算元: ");
            scanf("%d %d", &x, &y);
            ret = (*p[input])(x, y);
        }
        else
        {
            printf( "輸入有誤n" );
            printf( "ret = %dn", ret );
        }
        return 0;
}
       

敲重點!!!     敲重點!!!  敲重點!!!

這裡我們看到函數指標陣列的用法是:陣列內容(函數指標)解除參照得到函數地址,接著傳入引數,進行函數呼叫,結果返回一個整形(int)資料由ret接收。

ret = (*p[input])(x, y);

在程式碼中若出現許多函數同返回值型別,同引數型別時,使用函數指標陣列是一個能大大簡化程式碼,消除重複程式碼,是結構更加輕易易懂,為後期拓展更多功能函數提供便利。

到此這篇關於C語言函數指標陣列實現計算器功能的文章就介紹到這了,更多相關C語言 計算器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com