【C語言進(jìn)階】函數(shù)指針、回調(diào)函數(shù)——實(shí)現(xiàn)計(jì)算器-創(chuàng)新互聯(lián)

目錄

成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比武山網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式武山網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋武山地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴。

寫再前面

正文

一、計(jì)算器的實(shí)現(xiàn)

二、封裝冗余代碼

三、使用函數(shù)指針

四、回調(diào)函數(shù)的再舉例

寫在最后


寫再前面

行文思路:

  1. 先用最簡單的do-while語句和switch語句來實(shí)現(xiàn)計(jì)算器的最基本的功能
  2. 再用使用回調(diào)函數(shù)封裝冗余的語句
  3. 最后使用函數(shù)指針改造程序

正文 一、計(jì)算器的實(shí)現(xiàn)

我們就是實(shí)現(xiàn)加、減、乘、除、異或,這幾項(xiàng)基本的功能

#includevoid menu()
{
   printf("******************\n");
   printf("**0.exit  1.add***\n"); 
   printf("** 2.sub  3.mul**\n");
   printf("** 4.div  5.Xor**\n");
   printf("******************\n");
}
//計(jì)算器功能的封裝函數(shù)
int add(int x,int y)
{
   return x+y;
}

int sub(int x, int y)
{
   return x-y;
}

int mul(int x,int y)
{
   return x*y;
}

int div(int x,int y)
{
   return x/y;
}

int Xor(int x,int y)
{
	return x^y;
}
 
int main()
{
   int x=0,y=0,input;
   do
   {
       menu();
       printf("請(qǐng)選擇:>");
       scanf("%d",&input);
       
       switch(input)
       {
            case 1:  printf("請(qǐng)輸入兩個(gè)操作數(shù):");
			            scanf("%d%d",&x,&y);
                        printf("結(jié)果為:%d\n",add(x,y));
                        break;
            case 2:  printf("請(qǐng)輸入兩個(gè)操作數(shù):");
			            scanf("%d%d",&x,&y);
                        printf("結(jié)果為:%d\n",sub(x,y));
                        break;
            case 3:  printf("請(qǐng)輸入兩個(gè)操作數(shù):");
			            scanf("%d%d",&x,&y);
                        printf("結(jié)果為:%d\n",mul(x,y));
                        break;
            case 4:  printf("請(qǐng)輸入兩個(gè)操作數(shù):");
			            scanf("%d%d",&x,&y);
                        printf("結(jié)果為:%d\n",div(x,y));
                        break;
            case 5:  printf("請(qǐng)輸入兩個(gè)操作數(shù):");
			            scanf("%d%d,&x,&y");
                        printf("結(jié)果為:%d\n",Xor(x,y));
                        break;
            case 0:  printf("退出");
                        break;
            default: printf("選擇錯(cuò)誤,請(qǐng)重新輸入");
                         break; 
       }
   }while(input);
   return 0;
}

二、封裝冗余代碼

你會(huì)發(fā)現(xiàn)五個(gè)實(shí)現(xiàn)計(jì)算功能的函數(shù)除了調(diào)用函數(shù)不一樣外,其他的均相同,這就造成了代碼的冗余,我們把這些重復(fù)的代碼封裝成一個(gè)函數(shù),就能大大減少代碼量

回調(diào)函數(shù):就是一個(gè)通過函數(shù)指針調(diào)用的函數(shù),如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用來調(diào)用其所指向的函數(shù)時(shí),我們就說這是回調(diào)函數(shù)?;卣{(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的以一方調(diào)用

#includevoid menu()
{
   printf("\n******************\n");
   printf("**0.exit  1.add***\n"); 
   printf("** 2.sub  3.mul**\n");
   printf("** 4.div  5.Xor**\n");
   printf("******************\n");
}

int add(int x,int y)
{
   return x+y;
}

int sub(int x, int y)
{
   return x-y;
}

int mul(int x,int y)
{
   return x*y;
}

int div(int x,int y)
{
   return x/y;
}

int Xor(int x,int y)
{
	return x^y;
 } 
void fun(int (*pf)(int,int))
{
	int x=0,y=0;
	printf("請(qǐng)輸入兩個(gè)操作數(shù)>");
	scanf("%d%d",&x,&y);
	printf("結(jié)果是:%d",pf(x,y));//實(shí)現(xiàn)回調(diào)
}
int main()
{
   int x=0,y=0,input;
   do
   {
       menu();
       printf("請(qǐng)選擇:>");
       scanf("%d",&input);
       
       switch(input)
       {
            case 1: fun(add);
                    break;
            case 2: fun(sub);
                    break;
            case 3: fun(mul);
			        break;
            case 4: fun(div);
                    break;
            case 5: fun(Xor);
                    break;
            case 0: printf("退出");
                    break;
            default: printf("選擇錯(cuò)誤,請(qǐng)重新輸入");
                         break; 
       }
   }while(input);
   return 0;
}

三、使用函數(shù)指針

我們干脆不使用switch語句,采用函數(shù)指針來實(shí)現(xiàn)同樣的效果,也算是一題多解吧

#includevoid menu()
{
   printf("\n******************\n");
   printf("**0.exit  1.add***\n"); 
   printf("** 2.sub  3.mul**\n");
   printf("** 4.div  5.Xor**\n");
   printf("******************\n");
}

int add(int x,int y)
{
   return x+y;
}

int sub(int x, int y)
{
   return x-y;
}

int mul(int x,int y)
{
   return x*y;
}

int div(int x,int y)
{
   return x/y;
}

int Xor(int x,int y)
{
	return x^y;
 } 
//下面是改造部分
int main()
{
   int x=0,y=0,input;
   int (*pfArr[6])( int,int )={0,add,sub,mul,div,Xor}; 
   do
   {
       menu();
       printf("請(qǐng)選擇:>");
       scanf("%d",&input);
       if(input>=1&&input<=6)
       {
       	   printf("請(qǐng)輸入兩個(gè)操作數(shù)>");
       	   scanf("%d%d",&x,&y);
           int ret=pfArr[input](x,y);//一定要傳兩個(gè)參數(shù)
           printf("%d",ret);
	   }
	   else if(input==0)
	   {
	   	   printf("退出\n");
	   	   break;
	   }
	   else
	       printf("輸入錯(cuò)誤,請(qǐng)重新輸入"); 
   }while(input);
   return 0;
}

四、回調(diào)函數(shù)的再舉例

回調(diào)函數(shù):就是一個(gè)通過函數(shù)指針調(diào)用的函數(shù),如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用來調(diào)用其所指向的函數(shù)時(shí),我們就說這是回調(diào)函數(shù)?;卣{(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的以一方調(diào)用

在這段程序中,print函數(shù)就稱為回調(diào)函數(shù),當(dāng)然,這不是回調(diào)函數(shù)的應(yīng)用場(chǎng)景,只是拿一段簡單的代碼來說明問題

void print(char *str)
{
	printf("Hello,World!+%s",str); 
}
void fun(void (*p)(char*))
{
	printf("fun\n");
	p("666");
}
int main()
{
	fun(print);
	return 0;
 } 

//輸出結(jié)果為:
//fun
//Hello,World!+666

寫在最后

👍🏻點(diǎn)贊,你的認(rèn)可是我創(chuàng)作的動(dòng)力!

?收藏,你的青睞是我努力的方向!

??評(píng)論,你的意見是我進(jìn)步的財(cái)富!

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

文章題目:【C語言進(jìn)階】函數(shù)指針、回調(diào)函數(shù)——實(shí)現(xiàn)計(jì)算器-創(chuàng)新互聯(lián)
本文路徑:http://muchs.cn/article36/cocipg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、網(wǎng)站內(nèi)鏈企業(yè)網(wǎng)站制作、虛擬主機(jī)網(wǎng)站維護(hù)、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作