C语言习题~day20

server/2024/10/19 14:24:09/

  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;
}

http://www.ppmy.cn/server/133068.html

相关文章

第二十六:TCP/IP的知识回顾

1、IP网络层的功能 我们来回顾网络层的功能有哪些&#xff1a; ① 分组与分组交换&#xff1a;把从传输层接收到的数据报文封装成分组&#xff08;Packet&#xff0c;也称为“包”&#xff09;再向下传送到数据链路层。 ② 流量控制&#xff1a;通过流量整形技术来实现流量控…

BJFU|数据结构A(22下)线性表能力提升训练

以下题目来源于力扣&#xff0c;目的在于针对性训练提升线性表类型题目的解题能力。 26 . 删除有序数组中的重复项 61. 旋转链表 86 . 分隔链表 142 . 环形链表 II 25 . K个一组翻转链表 27 . 移除元素 21 . 有序链表合并 83 . 删除排序链表中的重复元素 237 . 删除链表中的节…

浅析Android中View的测量布局流程

前言 掌握Android中View的工作机制有助于日常的UI开发工作&#xff0c;实现具有不同样式和交互的UI界面。如何在屏幕上呈现各种各样的视图元素正是Android中的View工作机制解决的问题&#xff0c;主要包括&#xff1a;View的大小如何确定、View的位置如何确定以及View内容对应…

多进程编程

使用父子进程完成两个文件的拷贝&#xff0c;父进程拷贝前一半&#xff0c;子进程拷贝后一半&#xff0c;两个进程同时进行 #include<myhead.h>//获取拷贝文件的字节数 int get_file_len(const char* file1,const char* file2) {//以只读形式打开需要读取的文件int fd1 …

理解智能合约:区块链在Web3中的运作机制

随着区块链技术的不断发展&#xff0c;“智能合约”这一概念变得越来越重要。智能合约是区块链应用的核心之一&#xff0c;正在推动Web3的发展&#xff0c;为数字世界带来了前所未有的自动化和信任机制。本文将深入探讨智能合约的基本原理、运作机制&#xff0c;以及它在Web3生…

SpringAop学习笔记

SpringAop学习笔记 文章目录 SpringAop学习笔记1. 面向切面编程&#xff08;AOP&#xff09;1.1 代理模式1.2 静态代理1.3 动态代理 2. AOP概念及相关术语2.1 概述2.2 相关术语①横切关注点②通知&#xff08;增强&#xff09;③切面④目标⑤代理⑥连接点⑦切入点 2.3 作用 3. …

贝叶斯公式

内容来源 贝叶斯统计&#xff08;第二版&#xff09;中国统计出版社 贝叶斯公式的密度函数形式 p ( x ∣ θ ) p(x|\theta) p(x∣θ) 表示随机变量 θ \theta θ 给定某个值时&#xff0c;总体指标 X X X 的条件分布 π ( θ ) \pi(\theta) π(θ) 根据参数 θ \theta θ…

【RTT-Studio】详细使用教程十七:FreeModbus通信--LCD

文章目录 一、简介二、Modbus通信三、LCD通信四、配置FreeModbus通信协议四、完整代码五、测试验证 一、简介 Modbus协议是一种用于工业控制的网络通讯协议&#xff0c;可以片面的理解为&#xff0c;Modbus协议一种机器与机器之间进行数据、信息传递的一种格式规范。   Modbu…