1.转移表的概念和代码实现
概念:在 C 语言中,转移表是一个函数指针数组,数组中的每个元素都是一个函数指针,指向一个特定的函数。通过使用转移表,可以以数组的方式调用其中的函数,从而在某些情况下替代冗长的switch语句。以下是一个使用转移表的示例代码,演示了如何使用转移表来实现简单的计算器功能:
#include <stdio.h>int add(int a, int b) {return a + b; }int del(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; }void menu() {printf("**************************\n");printf("***** 1.Add 2.Del *****\n");printf("***** 3.Mul 4.Div *****\n");printf("***** 0.exit *****\n");printf("**************************\n"); }int main() {int input = 0;int a = 0;int b = 0;int ret = 0;do {menu();printf("请输入:>");scanf("%d", &input);// 使用转移表来调用函数int (*ops_func[])(int, int) = { add, del, mul, div };PFun pFun = ops_func[input - 1];ret = pFun(a, b);printf("两数相加值为%d\n", ret);} while (input); }
在上述代码中,定义了四个函数add、del、mul和div,分别用于执行加法、减法、乘法和除法运算。然后,创建了一个函数指针数组ops_func,其中每个元素都指向一个函数。通过输入的操作符选择对应的函数指针,并调用相应的函数进行运算。
使用转移表的优点是可以使代码更加简洁和灵活,特别是在需要处理多个函数的情况下。它可以避免使用冗长的switch语句,并且在添加或删除函数时也更加方便。
2.一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。编写一个函数找出这两个只出现一次的数字。
例如:有数组的元素是:1,2,3,4,5,1,2,3,4,6 只有5和6只出现1次,要找出5和6.
找出一个只出现过一次的数字的问题处理方法就是找一个数字把里面所有的数字都异或一遍,利用异或两次等于没异或的特点来处理。那么如果有两个数字都只出现了一次,那么如此得到的应该是两个数异或的结果。首先这个结果肯定不是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里}} }
3.获得某年某月有多少天,编程实现。输入年份和月份,计算这一年这个月有多少天。
#include <stdio.h>int main() {int y =0;int m =0; int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};while (scanf("%d %d", &y, &m) != EOF) { // 注意 while 处理多个 case// 64 位输出请用 printf("%lld") to int day=days[m];if((y % 4==0 && y % 100!=0)||(y%400==0)){if(m==2)day+=1;}printf("%d\n",day);}return 0;
}