目錄

寫再前面
正文
一、計算器的實現(xiàn)
二、封裝冗余代碼
三、使用函數(shù)指針
四、回調(diào)函數(shù)的再舉例
寫在最后
行文思路:
我們就是實現(xiàn)加、減、乘、除、異或,這幾項基本的功能
#includevoid menu()
{
printf("******************\n");
printf("**0.exit 1.add***\n");
printf("** 2.sub 3.mul**\n");
printf("** 4.div 5.Xor**\n");
printf("******************\n");
}
//計算器功能的封裝函數(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("請選擇:>");
scanf("%d",&input);
switch(input)
{
case 1: printf("請輸入兩個操作數(shù):");
scanf("%d%d",&x,&y);
printf("結(jié)果為:%d\n",add(x,y));
break;
case 2: printf("請輸入兩個操作數(shù):");
scanf("%d%d",&x,&y);
printf("結(jié)果為:%d\n",sub(x,y));
break;
case 3: printf("請輸入兩個操作數(shù):");
scanf("%d%d",&x,&y);
printf("結(jié)果為:%d\n",mul(x,y));
break;
case 4: printf("請輸入兩個操作數(shù):");
scanf("%d%d",&x,&y);
printf("結(jié)果為:%d\n",div(x,y));
break;
case 5: printf("請輸入兩個操作數(shù):");
scanf("%d%d,&x,&y");
printf("結(jié)果為:%d\n",Xor(x,y));
break;
case 0: printf("退出");
break;
default: printf("選擇錯誤,請重新輸入");
break;
}
}while(input);
return 0;
} 你會發(fā)現(xiàn)五個實現(xiàn)計算功能的函數(shù)除了調(diào)用函數(shù)不一樣外,其他的均相同,這就造成了代碼的冗余,我們把這些重復(fù)的代碼封裝成一個函數(shù),就能大大減少代碼量
回調(diào)函數(shù):就是一個通過函數(shù)指針調(diào)用的函數(shù),如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),當(dāng)這個指針被用來調(diào)用其所指向的函數(shù)時,我們就說這是回調(diào)函數(shù)。回調(diào)函數(shù)不是由該函數(shù)的實現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時由另外的以一方調(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("請輸入兩個操作數(shù)>");
scanf("%d%d",&x,&y);
printf("結(jié)果是:%d",pf(x,y));//實現(xiàn)回調(diào)
}
int main()
{
int x=0,y=0,input;
do
{
menu();
printf("請選擇:>");
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("選擇錯誤,請重新輸入");
break;
}
}while(input);
return 0;
} 我們干脆不使用switch語句,采用函數(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("請選擇:>");
scanf("%d",&input);
if(input>=1&&input<=6)
{
printf("請輸入兩個操作數(shù)>");
scanf("%d%d",&x,&y);
int ret=pfArr[input](x,y);//一定要傳兩個參數(shù)
printf("%d",ret);
}
else if(input==0)
{
printf("退出\n");
break;
}
else
printf("輸入錯誤,請重新輸入");
}while(input);
return 0;
} 回調(diào)函數(shù):就是一個通過函數(shù)指針調(diào)用的函數(shù),如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),當(dāng)這個指針被用來調(diào)用其所指向的函數(shù)時,我們就說這是回調(diào)函數(shù)。回調(diào)函數(shù)不是由該函數(shù)的實現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時由另外的以一方調(diào)用
在這段程序中,print函數(shù)就稱為回調(diào)函數(shù),當(dāng)然,這不是回調(diào)函數(shù)的應(yī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👍🏻點贊,你的認(rèn)可是我創(chuàng)作的動力!
?收藏,你的青睞是我努力的方向!
??評論,你的意見是我進(jìn)步的財富!
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
文章題目:【C語言進(jìn)階】函數(shù)指針、回調(diào)函數(shù)——實現(xiàn)計算器-創(chuàng)新互聯(lián)
本文路徑:http://chinadenli.net/article36/cocipg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、網(wǎng)站內(nèi)鏈、企業(yè)網(wǎng)站制作、虛擬主機(jī)、網(wǎng)站維護(hù)、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容