目錄
成都創(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ù)的再舉例
寫在最后
行文思路:
我們就是實(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;
}
我們干脆不使用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ù):就是一個(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)景,只是拿一段簡(jiǎn)單的代碼來說明問題
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)查看詳情吧