使用函數指針實現轉移表
#include <stdio.h>
int add(int a, int b)
{return a + b;
}
int sub(int a, int b)
{return a - b;
}
int mul(int a, int b)
{return a * b;
}
int div(int a, int b)
{return a / b;
}
int main()
{int x, y;int input = 1;int ret = 0;int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //轉移表do{printf("*************************\n");printf(" 1:add 2:sub \n");printf(" 3:mul 4:div \n");printf(" 0:exit \n");printf("*************************\n");printf("請選擇:");scanf("%d", &input);if ((input <= 4 && input >= 1)){printf("輸入操作數:");scanf("%d %d", &x, &y);ret = (*p[input])(x, y);printf("ret = %d\n", ret);}else if (input == 0){printf("退出計算器\n");}else{printf("輸入有誤\n");}} while (input);return 0;
}
2.
解析:A選項,第一個括號里是一個完整定義,第二個括號里是個類型,四不像。BD選項,[]只能在標識符右邊,雙雙排除。只有C是能編過的。
3.
解析:
“調用指針”、“指向函數”是什么鬼……D選項簡直邏輯鬼才!ABC就是基礎概念,可以復習下。
回調函數是一種在編程中常見的概念,它是指將一個函數作為參數傳遞給另一個函數,并在特定的條件或事件發生時被調用執行的函數。
具體來說,回調函數是作為參數傳遞給其他函數的函數指針或函數對象。當滿足特定條件或事件發生時,調用該函數指針或函數對象,以執行預定義的操作或邏輯。
4.
找出一個只出現過一次的數字的問題處理方法就是找一個數字把里面所有的數字都異或一遍,利用異或兩次等于沒異或的特點來處理。那么如果有兩個數字都只出現了一次,那么如此得到的應該是兩個數異或的結果。首先這個結果肯定不是0(要不然就全都配對了),所以里面一定至少一位是一。找出值為1的一位,以這一位的值將結果分為兩組。例如1 2 3 4 1 2,異或完的結果應該是3^4得到的111,那么隨便找一位就行了。例如找最低位,那么這一位是1的有1 3 1,是0的有2 4 2,由于是利用異或結果為1的某一位分的組,所以兩個待查詢數字一定分別在兩組中。所以再找兩個變量,分別異或兩組數,即可找到這兩個數。
void findTwoNum(int arr[], int n, int * pnum1, int * pnum2)
{int i;int sum = 0;
?for (i = 0; i < 9; i++){sum ^= arr[i];} //先找到兩個數互相異或的結果
?int pos;for (i = 0; i < 32; i++){if (sum & 1 << i){pos = i;break;}} //再找到有分歧的一位。在這一位上,兩個數一定是一個1一個0
?*pnum1 = *pnum2 = 0;for (i = 0; i < 10; i++){if (arr[i] & 1 << pos){*pnum1 ^= arr[i]; //這一位是1的,放在數1里}else{*pnum2 ^= arr[i]; //這一位是0的,放在數2里}}
}
5.
#include <stdio.h>
int main()
{int y = 0;int m = 0;int days[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; while(scanf("%d%d", &y, &m) != EOF){int day = days[m-1];if((y%4==0 && y%100!=0) || (y%400==0)){if(m == 2)day += 1;}printf("%d\n", day);}return 0;
}
6.
int Int_sort(const void* p1, const void* p2)
{return *(int*)(p1) - *(int*)(p2);
}print_int(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");
}void int_test()
{int arr[] = { 1,5,8,23,56,44,32,7,6,66 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), Int_sort);print_int(arr, sz);
}struct Stu
{char name[100];int age;
};int Char_sort(const void* p1,const void* p2)
{return (strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name));
}void print_Stu(struct Stu arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%s ", arr[i].name);printf("%d ", arr[i].age);}printf("\n");
}void stu_test()
{struct Stu arr[3] = { {"zhangsan",13},{"lisi",40},{"wangwu",22} };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), Char_sort);print_Stu(arr, sz);
}int main()
{int_test();stu_test();return 0;
}
7.
#include<stdio.h>//仿qsort函數重寫冒泡排序
int cmp(void* e1, void* e2) //所選擇的比較方法
{return *((int*)e1) - *((int*)e2);
}
void swap(char* p1, char* p2, int width) //實現數組元素的交換
{int t = 0;int i = 0;for (i = 0; i < width; i++){t = *p1;*p1 = *p2;*p2 = t;p1++;p2++;}
}
void bubble_sort(void* arr, int sz, int width, int(*cmp)(void* e1, void* e2))
{int i = 0;int j = 0;for (i = 0; i < sz - 1; i++){//冒泡排序趟數for (j = 0; j < sz - 1 - i; j++) //每一趟冒泡排序{if (cmp((char*)arr + (j * width), (char*)arr + (j + 1) * width)>0){//符合條件進行交換swap((char*)arr + (j * width), (char*)arr + (j + 1) * width,width);}}}
}
int main()
{int arr[] = { 10,9,8,7,6,5,4,3,2,1 }; //定義整型數組并初始化int sz = sizeof(arr) / sizeof(arr[0]); //計算數組長度int i = 0;bubble_sort(arr, sz, sizeof(arr[0]), cmp); //模擬qsort函數實現冒泡排序for (i = 0; i < sz; i++) {printf("%d ", arr[i]); //排序完后對數組進行打印,驗證排序是否成功}
}
8.
解析:C,strlen計算\0之前的字符長度