使用函数指针实现转移表
#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之前的字符长度