C++回調(diào)函數(shù)實現(xiàn)計算器和qsort
前言
回調(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),當這個指針被用來調(diào)用其所指向的函數(shù)時,我們就說這是回調(diào)函數(shù)?;卣{(diào)函數(shù)不是由該函數(shù)的實現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時由另外的一方調(diào)用的,用于對該事件或條件進行響應。
今天用一個簡易的計算器和qsort的實現(xiàn),帶大家深入了解回調(diào)函數(shù)
一、計算器
寫一個計算器、加法、減法、乘法、除法
1.switch語句實現(xiàn)
#include<stdio.h>
#include<string.h>
void menu()
{
printf("****************************\n");
printf("***** 1.add 2.sub ******\n");
printf("***** 3.mul 4.div ******\n");
printf("***** 0.exit ******\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 main()
{
int input = 0;
int x = 0;
int y = 0;
int ret = 0;
do
{
menu();
printf("請選擇:>");
scanf("%d", &input);
printf("請輸入兩個操作數(shù):>");
scanf("%d %d", &x, &y);
switch (input)
{
case 1:
ret = add(x, y);
printf("%d\n", ret);
break;
case 2:
ret = sub(x, y);
printf("%d\n", ret);
break;
case 3:
ret = mul(x, y);
printf("%d\n", ret);
break;
case 4:
ret = div(x, y);
printf("%d\n", ret);
break;
case 0:
printf("退出計算器\n");
break;
default:
printf("選擇錯誤\n");
break;
}
} while (input);
return 0;
}2.回調(diào)函數(shù)實現(xiàn)
把加減乘除函數(shù),封裝成一個函數(shù)指針calc,在用戶輸入需要什么功能時,只需要將函數(shù)的地址傳到回調(diào)函數(shù)中,大大的提高了代碼利用率,將功能封裝起來,高內(nèi)聚低耦合。
#include<stdio.h>
#include<string.h>
void menu()
{
printf("****************************\n");
printf("***** 1.add 2.sub ******\n");
printf("***** 3.mul 4.div ******\n");
printf("***** 0.exit ******\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;
}
void calc(int (*pf)(int, int))
{
int x = 0;
int y = 0;
int ret = 0;
printf("請輸入2個操作數(shù):>");
scanf("%d %d", &x, &y);
ret = pf(x, y);
printf("%d\n", ret);
}
int main()
{
int input = 0;
do
{
menu();
printf("請選擇:>");
scanf("%d", &input);
switch (input)
{
case 1:
calc(add);
break;
case 2:
calc(sub);
break;
case 3:
calc(mul);
break;
case 4:
calc(div);
break;
case 0:
printf("退出計算器\n");
break;
default:
printf("選擇錯誤\n");
break;
}
} while (input);
return 0;
}二、qsort
1.冒泡排序
在學習qsort之前先回顧一下冒泡排序
#include<stdio.h>
#include<string.h>
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz - 1; i++)
{
for (int j = 0; j < sz - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int h = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = h;
}
}
}
for (i = 0; i < sz; i++) {
printf("%d ", arr[i]);
}
return 0;
}2.qsort

相信很多小伙伴會有疑問,不是已經(jīng)學習了冒泡排序,為什么還要學習qsort,不是多此一舉嗎?但是,冒泡排序只能排整形數(shù)據(jù),那浮點數(shù),字符型,結(jié)構(gòu)體又該怎么實現(xiàn)呢,這就發(fā)揮出qsort的作用了。帶大家解讀一下qsort

3.qsort排序浮點數(shù)
#include<stdio.h>
#include<stdlib.h>
cmp_float(const void* e1, const void* e2)
{
return *(float*)e1 - *(float*)e2;
}
int main()
{
float f[] = { 5.0,4.0,3.0,2.0,1.0 };
int sz = sizeof(f) / sizeof(f[0]);
qsort(f, sz, sizeof(f[0]), cmp_float);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%f ", f[i]);
}
return 0;
}
4.qsort排序字符型
int cmp_char(const void* e1, const void* e2)
{
return *(char*)e1 - *(char*)e2;
}
int main()
{
char ch[] = { 'f','e','d','c','b','a' };
int sz = sizeof(ch) / sizeof(ch[0]);
qsort(ch, sz, sizeof(ch[0]), cmp_char);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%c ", ch[i]);
}
return 0;
}
5.qsort排序結(jié)構(gòu)體
struct Stu
{
char name[30];
int age;
};
int cmp_Stu_name(const void* e1, const void* e2)
{
return strcmp(((struct Stu*)e1)->name,((struct Stu*)e2)->name);
}
int cmp_Stu_age(const void* e1, const void* e2)
{
return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
int main()
{
struct Stu s[] = { {"zhaoding",20},{"zhangsan",19},{"wangwu",15} };
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]), cmp_Stu_age);
return 0;
}

6.自定義實現(xiàn)my_qsort
void Swap(char* buf1, char* buf2, int width)
{
int i = 0;
for (i = 0; i < width; i++)
{
char* h = *buf1;
*buf1 = *buf2;
*buf2 = h;
buf1++;
buf2++;
}
}
void my_qsort(void* base, int sz, int width, int(*cmp)(const void* e1, const void* e2))
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (cmp((char*)base+j*width, (char*)base + (j + 1) * width) > 0)
{
Swap((char*)base + j * width, (char*)base + (j + 1) * width,width);
}
}
}
}
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1 };
int sz = sizeof(arr) / sizeof(arr[0]);
my_qsort(arr, sz, sizeof(arr[0]), Swap);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}總結(jié)
到此這篇關(guān)于C++回調(diào)函數(shù)實現(xiàn)計算器和qsort的文章就介紹到這了,更多相關(guān)C++回調(diào)函數(shù) 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java?C++?算法題解leetcode652尋找重復子樹
這篇文章主要為大家介紹了Java?C++?算法題解leetcode652尋找重復子樹示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09
C++調(diào)用EasyX庫實現(xiàn)嫦娥奔月小游戲
這篇文章主要為大家詳細介紹了C++如何調(diào)用EasyX庫編寫一個簡單的嫦娥奔月小游戲,文中的示例代碼講解詳細,感興趣的小伙伴可以參考一下2023-09-09
C++利用Socket實現(xiàn)主機間的UDP/TCP通信
這篇文章主要為大家詳細介紹了C++如何利用Socket實現(xiàn)主機間的UDP/TCP通信功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2023-01-01
C++實現(xiàn)將數(shù)組中的值反轉(zhuǎn)
這里給大家分享的事一則C++實現(xiàn)將數(shù)組中的值反轉(zhuǎn)的代碼,取材自《C++程序設(shè)計》(梁勇著第三版367頁),有需要的小伙伴可以參考下2016-05-05
C語言實現(xiàn)ATM自動取款機系統(tǒng)的示例代碼
ATM自動取款機系統(tǒng)是銀行業(yè)務(wù)流程中十分重要且必備的環(huán)節(jié)之一,在銀行業(yè)務(wù)流程中起著承上啟下的作用。本文將用C語言實現(xiàn)一個簡單的ATM自動取款機系統(tǒng),需要的可以參考一下2022-08-08

