用到了C语言的函数指针功能。


请选择一个功能:
1. 加法
2. 减法
3. 乘法
4. 除法
5. 取模
6. 阶乘
7. 判断素数
8. 球体体积
9. 斐波那契数列
10. 幂运算
11. 最大公约数
12. 最小公倍数
13. 交换数字
14. 排序
15. 退出
请选择一个选项:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>#define M_PI 3.1415926// 函数声明
void add(double x, double y);
void subtract(double x, double y);
void multiply(double x, double y);
void divide(double x, double y);
void modulo(double x, double y);
void factorial(int n);
void is_prime(int n);
void sphere_volume(double r);
void fibonacci(int n);
void power(double x, int n);
void gcd(int a, int b);
void lcm(int a, int b);
void swap(int* a, int* b);
void sort(int arr[], int n);// 结构体定义
typedef struct {char name[20];void (*func)(void);
} Function;// 函数指针数组
Function funcs[] = {{"加法", add},{"减法", subtract},{"乘法", multiply},{"除法", divide},{"取模", modulo},{"阶乘", factorial},{"判断素数", is_prime},{"球体体积", sphere_volume},{"斐波那契数列", fibonacci},{"幂运算", power},{"最大公约数", gcd},{"最小公倍数", lcm},{"交换数字", swap},{"排序", sort}
};// 函数实现
void add(double x, double y) {printf("%g + %g = %g\n", x, y, x + y);
}void subtract(double x, double y) {printf("%g - %g = %g\n", x, y, x - y);
}void multiply(double x, double y) {printf("%g * %g = %g\n", x, y, x * y);
}void divide(double x, double y) {if (y == 0) {printf("错误:除以零!\n");}else {printf("%g / %g = %g\n", x, y, x / y);}
}void modulo(double x, double y) {if (y == 0) {printf("错误:除以零!\n");}else {printf("%g %% %g = %g\n", x, y, fmod(x, y));}
}void factorial(int n) {if (n < 0) {printf("错误:无效的输入!\n");}else {unsigned long long fact = 1;for (int i = 1; i <= n; i++) {fact *= i;}printf("%d 的阶乘是 %llu\n", n, fact);}
}void is_prime(int n) {if (n < 2) {printf("错误:无效的输入!\n");}else {int is_prime = 1;for (int i = 2; i <= sqrt(n); i++) {if (n % i == 0) {is_prime = 0;break;}}if (is_prime) {printf("%d 是素数。\n", n);}else {printf("%d 不是素数。\n", n);}}
}void sphere_volume(double r) {if (r < 0) {printf("错误:无效的输入!\n");}else {double volume = 4.0 / 3.0 * M_PI * pow(r, 3);printf("球体的体积为 %.2f\n", volume);}
}void fibonacci(int n) {if (n < 0) {printf("错误:无效的输入!\n");}else {int a = 0, b = 1;for (int i = 1; i <= n; i++) {int tmp = a + b;a = b;b = tmp;}printf("斐波那契数列的第 %d 个数是 %d\n", n, a);}
}void power(double x, int n) {double result = 1;for(int i=0;i<n;i++)    result *= x;        printf("%g 的 %d 次幂是 %g\n", x, n, result);
}void gcd(int a, int b) {int aa, bb;aa = a, bb = b;if (a == 0 && b == 0) {printf("错误:无效的输入!\n");}else {while (b != 0) {int tmp = b;b = a % b;a = tmp;}printf("%d 和 %d 的最大公约数是 %d\n", aa, bb, a);}
}void lcm(int a, int b) {int aa, bb;aa = a, bb = b;if (a == 0 || b == 0) {printf("错误:无效的输入!\n");}else {int gcd_val = a * b;while (b != 0) {int tmp = b;b = a % b;a = tmp;}printf("%d 和 %d 的最小公倍数是 %d\n", aa, bb, gcd_val / a);}
}void swap(int* a, int* b) {int tmp = *a;*a = *b;*b = tmp;printf("交换后:a = %d,b = %d\n", *a, *b);
}void sort(int arr[], int n) {for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}printf("从小到大排序后:");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");
}int main() {int option;double x, y;int n;int a, b;double r;int* arr = NULL;int len = 0;while (1) {// 显示菜单printf("\n");printf("请选择一个功能:\n");for (int i = 0; i < 14; i++) {printf("%d. %s\n", i + 1, funcs[i].name);}printf("%d. 退出\n", 14 + 1);printf("请选择一个选项:");// 读取用户输入scanf("%d", &option);// 执行相应的函数if (option >= 1 && option <= 14) {printf("请输入参数:");switch (option) {case 1:scanf("%lf%lf", &x, &y);funcs[option - 1].func(x, y);break;case 2:scanf("%lf%lf", &x, &y);funcs[option - 1].func(x, y);break;case 3:scanf("%lf%lf", &x, &y);funcs[option - 1].func(x, y);break;case 4:scanf("%lf%lf", &x, &y);funcs[option - 1].func(x, y);break;case 5:scanf("%lf%lf", &x, &y);funcs[option - 1].func(x, y);break;case 6:scanf("%d", &n);funcs[option - 1].func(n);break;case 7:scanf("%d", &n);funcs[option - 1].func(n);break;case 8:scanf("%lf", &r);funcs[option - 1].func(r);break;case 9:scanf("%d", &n);funcs[option - 1].func(n);break;case 10:scanf("%lf%d", &x, &n);funcs[option - 1].func(x, n);break;case 11:scanf("%d%d", &a, &b);funcs[option - 1].func(a, b);break;case 12:scanf("%d%d", &a, &b);funcs[option - 1].func(a, b);break;case 13:scanf("%d%d", &a, &b);funcs[option - 1].func(&a, &b);break;case 14:printf("\n请输入数组长度:");scanf("%d", &len);if (len <= 0) {printf("错误:无效的输入!\n");}else {arr = (int*)malloc(len * sizeof(int));printf("请输入 %d 个数字:", len);for (int i = 0; i < len; i++) {scanf("%d", arr+i);}funcs[option - 1].func(arr, len);free(arr);}break;}               }else if (option == 14 + 1) {break;}else {printf("错误:无效的选项!\n");}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/218401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

48.0/图片和多媒体文件的使用(详细版)

目录 48.1 网页中插入图片 48.1.1 基本语法 48.1.2 常见属性 48.2 图片超链接 48.3 设置图片热区链接 48.4 将图片作为网页背景 48.5 滚动字幕 48.6 插入多媒体文件 48.1 网页中插入图片 48.1.1 基本语法 <img src=“图片地址”> img 标记用于将图像插入到 HTML…

【Java 基础】32 定时调度

文章目录 Timer 类创建 Timer注意事项 ScheduledExecutorService 接口创建 ScheduledExecutorService注意事项 选择合适的定时调度方式Timer 的适用场景ScheduledExecutorService 的适用场景 总结 在软件开发中&#xff0c;定时任务是一种常见的需求&#xff0c;用于周期性地执…

Linux 中的 container_of 原理

源码基于&#xff1a;Linux 5.10 0.前言 container_of() 这个宏函数在Linux 内核中使用的频率还是很多的。网上关于 container_of 使用的优秀文章也很多&#xff0c;之所以笔者也写一篇&#xff0c;一是想更新下最新代码中的使用&#xff0c;二是融入些自己的拙见&#xff0c;…

CESM笔记——component活动状态+compset前缀解析+B1850,BHIST区别

时隔一年没写CSDN笔记了&#xff0c;一些CESM的知识点我都快忘了。诶&#xff0c;主要是在国外办公室的网屏蔽了好多国内的网络&#xff0c;CSDN登不上&#xff0c;回家又不想干活。。。好吧&#xff0c;好多借口。。。 昨天师弟问我一些问题&#xff0c;想想要不可以水一篇小…

python安装步骤

1.1 python下载地址 python官网 1.2 详细安装步骤 1.2.1 双击安装包打开&#xff0c;勾选最下边两个方框&#xff0c;然后选择自定义安装&#xff0c;如下图。 1.2.2 这一页默认是全部勾选上的&#xff0c;点击下一步。 1.2.3 修改安装路径&#xff0c;默认是C盘&#xff0c…

【Git 小妙招】走进 Git 的分支管理(万字图文讲解)

文章目录 前言1. 理解分支2. 创建分支3. 切换分支4. 合并分支5. 删除分支6. 合并冲突7. 分支管理策略7.1 一个简单的分支策略(仅参考) 8. bug 分支9. 删除临时分支总结 前言 本文开始介绍 Git 的杀手级功能之⼀&#xff1a;分⽀。本文涉及分⽀创建&#xff0c;切换&#xff0c…

16:00的面试,16:07就出来了,问的问题过于变态了。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到六月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40…

园区网络虚拟化应该这样建

下午好&#xff0c;我的网工朋友。 今天和你聊聊怎么建立园区网络虚拟化。 区别于传统园区关注独立的单台设备&#xff0c;虚拟化网络关注全网的整体业务体验&#xff0c;通过iMaster NCE-Campus和VXLAN技术&#xff0c;实现网络资源能够任意灵活调度。 通过虚拟化技术&…

【Redis】深入理解 Redis 常用数据类型源码及底层实现(1.结构与源码概述)

在文章【Redis】不卡壳的 Redis 学习之路&#xff1a;从十大数据类型开始入手中我们介绍了Redis常用的10大数据类型&#xff0c;这10大数据类型可并不是直接在底层通过代码实现的&#xff0c;而是通过不同的底层数据结构组合起来的&#xff0c;这篇我们介绍下Redis常用数据类型…

CSAPP——linux下的 status 函数及进程退出/进程回收详解

status函数是一个系统调用&#xff0c;用于获取子进程的退出状态。它通常在父进程中使用&#xff0c;以便检查子进程是否正常退出或出现错误。 status函数的原型如下&#xff1a; int waitpid(pid_t pid, int *status, int options); pid参数指定要等待的子进程的进程ID stat…

网络安全这条路,如何打怪升级干掉大Boss?

企业对网络安全的重视是挂在嘴上还是落实在行动中&#xff1f;网络安全人员岗位设置是否合理而有效&#xff1f;网络安全从业者最需要什么样的技能培训&#xff1f;网络安全从业者的职业发展路径应该如何规划&#xff1f;一份“网络安全从业人员现状调查”报告&#xff0c;解你…

与OA完美契合的开放式低代码平台

随着企业数字化转型的加速&#xff0c;越来越多的企业开始寻求能够快速适应业务需求变化、降低IT成本、提高运营效率的信息系统解决方案。OA作为面向企业日常办公需求的信息系统&#xff0c;在提高企业内部协作效率、优化业务流程、降低运营成本方面具有重要的作用。 它涵盖了…

山西电力市场日前价格预测【2023-12-13】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-12-13&#xff09;山西电力市场全天平均日前电价为331.79元/MWh。其中&#xff0c;最高日前电价为371.77元/MWh&#xff0c;预计出现在11:15。最低日前电价为280.66元/MWh&#xff0c;预计…

OpenHarmony 如何去除系统锁屏应用

前言 OpenHarmony源码版本&#xff1a;4.0release / 3.2 release 开发板&#xff1a;DAYU / rk3568 一、3.2版本去除锁屏应用 在源码根目录下&#xff1a;productdefine/common/inherit/rich.json 中删除screenlock_mgr组件的编译配置&#xff0c;在rich.json文件中搜索th…

Vue中使用echarts@4.x中国地图及AMap相关API的使用

一、此 demo 实现的基本功能 1.中国地图的显示 2.地图点击下钻的功能 3.地图相关组件的使用&#xff0c;例 tooltip… 二、实现思路 初始使用下载本地的中国 geo 格式的 json 数据来绘制地图&#xff0c;点击某一区划&#xff08;例&#xff1a;山东省&#xff09;时&#xff0…

【计算机设计大赛】冬残奥会可视化系统_附源码—信息可视化赛道获奖项目深入剖析【可视化项目案例-19】

🎉🎊🎉 你的技术旅程将在这里启航! 记得看本专栏里顶置的可视化宝典导航贴哦! 🚀🚀 本专栏为可视化专栏,包含现有的所有可视化技术。订阅专栏用户在文章底部可下载对应案例完整源码以供大家深入的学习研究。 🎓 每一个案例都会提供完整代码和详细的讲解,不论你…

linux(6):linux用户和权限

在linux基础命令第五弹中http://t.csdnimg.cn/Fu5cJ我们学到了关于如何查看命令选项的帮助手册&#xff0c;到此&#xff0c;基础命令的学习先告一段落&#xff0c;我们来学习linux有关用户和权限的问题&#xff0c;这是很有必要的&#xff0c;如果任何人都可以修改我们的文件内…

数据结构 | 查漏补缺之顺式存储和链式存储、如何评价哈希函数的好坏、链地址法、树的遍历、关键路径、完全图、连通图、迪杰斯特拉、b树

目录 顺式存储和链式存储 优缺点比较 顺序存储 ​编辑 链式存储 如何评价哈希函数的好坏 简述哈希查找中链地址法解决冲突的方法 树的遍历 关键路径 完全图 连通图 迪杰斯特拉 b树 特点&#xff1a; 插入&#xff08;索引不能大于&#xff1a;最大为 M-1 个&#…

拼接不同文件夹中同名图片的方法

有时候为了方便对比不同文件夹中同名图片&#xff0c;需要拼接在一起&#xff0c;这里提供一个拼接方法&#xff0c;当然不同命文件也可以实现拼接&#xff0c;稍微改改就能实现 如下图&#xff0c;在文件夹中有五个文件夹中的图片需要拼接&#xff0c;拼接后的图片存放在img_…

Spark RDD的转换

按颜色区分转换&#xff1a; 绿色是单 RDD 窄依赖转换黑色是多 RDD 窄依赖转换紫色是 KV 洗牌型转换黄色是重分区转换蓝色是特例的转换 单 RDD 窄依赖转换 MapPartitionRDD 这个 RDD 在第一次分析中已经分析过。简单复述一下&#xff1a; 依赖列表&#xff1a;一个窄依赖&…