C++回調(diào)函數(shù)實(shí)現(xiàn)計(jì)算器和qsort
前言
回調(diào)函數(shù)就是一個(gè)通過(guò)函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用來(lái)調(diào)用其所指向的函數(shù)時(shí),我們就說(shuō)這是回調(diào)函數(shù)?;卣{(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的一方調(diào)用的,用于對(duì)該事件或條件進(jìn)行響應(yīng)。
今天用一個(gè)簡(jiǎn)易的計(jì)算器和qsort的實(shí)現(xiàn),帶大家深入了解回調(diào)函數(shù)
一、計(jì)算器
寫(xiě)一個(gè)計(jì)算器、加法、減法、乘法、除法
1.switch語(yǔ)句實(shí)現(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("請(qǐng)選擇:>"); scanf("%d", &input); printf("請(qǐng)輸入兩個(gè)操作數(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("退出計(jì)算器\n"); break; default: printf("選擇錯(cuò)誤\n"); break; } } while (input); return 0; }
2.回調(diào)函數(shù)實(shí)現(xiàn)
把加減乘除函數(shù),封裝成一個(gè)函數(shù)指針calc,在用戶輸入需要什么功能時(shí),只需要將函數(shù)的地址傳到回調(diào)函數(shù)中,大大的提高了代碼利用率,將功能封裝起來(lái),高內(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("請(qǐng)輸入2個(gè)操作數(shù):>"); scanf("%d %d", &x, &y); ret = pf(x, y); printf("%d\n", ret); } int main() { int input = 0; do { menu(); printf("請(qǐng)選擇:>"); 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("退出計(jì)算器\n"); break; default: printf("選擇錯(cuò)誤\n"); break; } } while (input); return 0; }
二、qsort
1.冒泡排序
在學(xué)習(xí)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
相信很多小伙伴會(huì)有疑問(wèn),不是已經(jīng)學(xué)習(xí)了冒泡排序,為什么還要學(xué)習(xí)qsort,不是多此一舉嗎?但是,冒泡排序只能排整形數(shù)據(jù),那浮點(diǎn)數(shù),字符型,結(jié)構(gòu)體又該怎么實(shí)現(xiàn)呢,這就發(fā)揮出qsort的作用了。帶大家解讀一下qsort
3.qsort排序浮點(diǎn)數(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.自定義實(shí)現(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ù)實(shí)現(xiàn)計(jì)算器和qsort的文章就介紹到這了,更多相關(guān)C++回調(diào)函數(shù) 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java?C++?算法題解leetcode652尋找重復(fù)子樹(shù)
這篇文章主要為大家介紹了Java?C++?算法題解leetcode652尋找重復(fù)子樹(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09C++調(diào)用EasyX庫(kù)實(shí)現(xiàn)嫦娥奔月小游戲
這篇文章主要為大家詳細(xì)介紹了C++如何調(diào)用EasyX庫(kù)編寫(xiě)一個(gè)簡(jiǎn)單的嫦娥奔月小游戲,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下2023-09-09C++利用Socket實(shí)現(xiàn)主機(jī)間的UDP/TCP通信
這篇文章主要為大家詳細(xì)介紹了C++如何利用Socket實(shí)現(xiàn)主機(jī)間的UDP/TCP通信功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-01-01C++實(shí)現(xiàn)將數(shù)組中的值反轉(zhuǎn)
這里給大家分享的事一則C++實(shí)現(xiàn)將數(shù)組中的值反轉(zhuǎn)的代碼,取材自《C++程序設(shè)計(jì)》(梁勇著第三版367頁(yè)),有需要的小伙伴可以參考下2016-05-05C語(yǔ)言實(shí)現(xiàn)ATM自動(dòng)取款機(jī)系統(tǒng)的示例代碼
ATM自動(dòng)取款機(jī)系統(tǒng)是銀行業(yè)務(wù)流程中十分重要且必備的環(huán)節(jié)之一,在銀行業(yè)務(wù)流程中起著承上啟下的作用。本文將用C語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的ATM自動(dòng)取款機(jī)系統(tǒng),需要的可以參考一下2022-08-08