用到了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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

強強联手!M88明陞宣布与G2 电子竞技俱乐部成为官方合作伙伴!

M88明陞作为亚洲领先的在线游戏平台&#xff0c;正式宣布与G2电子竞技俱乐部建立具有突破性意义的官方合作伙伴关系&#xff0c;G2电子竞技俱乐部是全球领先的电子竞技品牌之一。作为官方合作伙伴关系&#xff0c;双方将合作开展一系列活动。 M88明陞将在G2 电子竞技俱乐部追求…

工单质检上线提升企业IT服务质量管理,智能服务能力再添新翼!甄知燕千云全新版本V1.26.0发布!

燕千云数智化业务服务平台在11月24日发布了V1.26.0版本&#xff0c;本次主要新增了工单质检、SLA绩效管理和上下游管理能力升级、以及自动预测工单流转趋势的功能&#xff0c;以支持更多的IT服务场景。同时&#xff0c;呼叫中心新增了智能分配客服、工单关联会话记录、客服消息…

RT-Thread学习笔记(六):RT_Thread系统死机日志定位

RT_Thread系统死机日志定位 一、RT_Thread系统死机日志定位二、Cortex-M3 / M4架构知识2.1 Cortex-M3 / M4架构概述2.2 寄存器用途 三、排查步骤 一、RT_Thread系统死机日志定位 RT-Thread 系统发生hardfault死机时&#xff0c;系统默认会打印出一系列寄存器状态帮助用户定位死…

NOIP2016提高组第二轮day2 - T3:愤怒的小鸟

题目链接 [NOIP2016 提高组] 愤怒的小鸟 题目描述 Kiana 最近沉迷于一款神奇的游戏无法自拔。简单来说&#xff0c;这款游戏是在一个平面上进行的。 有一架弹弓位于 ( 0 , 0 ) (0,0) (0,0) 处&#xff0c;每次 Kiana 可以用它向第一象限发射一只红色的小鸟&#xff0c;小鸟…

【T3】安装畅捷通T3软件,错误代码0x800A0146,描述:未找到标识符为‘138’的资源。

【问题描述】 安装畅捷通T3软件过程中&#xff0c;提示&#xff1a; 错误代码0x800A0146 描述&#xff1a;未找到标识符为‘138’的资源&#xff0c; 安装程序将立即终止。 【解决方法】 该错误是因为安装过程中检测到数据库版本过高。 首先T3普及版/标准版11.2版本支持数据库…

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…

深度解析HarmonyOS开发-活动召集令元服务【鸿蒙北向应用开发实战】

目录 一&#xff0e;元服务和ArkTS语言简介1.1 学习元服务1.2 元服务带来的变革1.3 元服务全场景流量入口1.4 ArkTS学习1.5 ArkTS特点 二&#xff0e;DevEco Studio开发工具2.1 DevEco Studio学习2.2 DevEco Studio的主要特性2.3 端云一体化开发2.3.1端云一体化开发特点 2.4 低…

Zidebactam sodium salt β-内酰胺酶抑制剂 1706777-46-9科研

Zidebactam sodium salt β-内酰胺酶抑制剂 1706777-46-9 &#xff08;源自星戈瑞&#xff09; ATH686 FLT3 抑制剂 853299-52-2 Pelitrexol 抑制剂 446022-33-9 TBT1 转运蛋白抑制剂 52535-76-9 HFY-4A HDAC 抑制剂 2094810-82-7 SDR-04 BET 抑制剂 879593-54-1 Phthala…

年会抽奖【编程题】

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 目录 ☁️题目解析 ☁️解题思路…

JAVA 阻塞队列原理

JAVA 阻塞队列原理 阻塞队列&#xff0c;关键字是阻塞&#xff0c;先理解阻塞的含义&#xff0c;在阻塞队列中&#xff0c;线程阻塞有这样的两种情况&#xff1a; 当队列中没有数据的情况下&#xff0c;消费者端的所有线程都会被自动阻塞&#xff08;挂起&#xff09;&#x…

浅析不同NAND架构的差异与影响

SSD的存储介质是什么&#xff0c;它就是NAND闪存。那你知道NAND闪存是怎么工作的吗&#xff1f;其实&#xff0c;它就是由很多个晶体管组成的。这些晶体管里面存储着电荷&#xff0c;代表着我们的二进制数据&#xff0c;要么是“0”&#xff0c;要么是“1”。NAND闪存原理上是一…

新瓶装旧酒之底座概念

一、前言 互联网技术总是喜欢创造一下新的词汇以显示技术先进或者高大上&#xff0c;比如&#xff1a;云计算&#xff0c;中台&#xff0c;引擎&#xff0c;敏捷&#xff0c;领域模型等等。刚出来的时候总是让人看的云里雾里&#xff0c;但是了解后发现也就那么回事。比如今年…

【运维】将Linux的硬盘当内存用,Linux内存不够用的时候如何用硬盘提升内存

文章目录 内存不够用&#xff0c;可以用硬盘当内存吗如何取消这种交换空间交换空间是优先使用的还是说原始内存是会被优先使用的 内存不够用&#xff0c;可以用硬盘当内存吗 是的&#xff0c;可以使用硬盘作为虚拟内存来扩展容器中的内存。这个过程被称为“交换”或“交换空间…

管理空闲存储空间

位示图是操作系统中一种管理空闲存储空间的方法。管理空闲除使用位示图法还可用&#xff1a;空闲区表法&#xff0c;空闲链表法&#xff0c;成组链接法 1.空闲区表法 空闲表法属于连续分配方法。它与内存管理中的动态分区分配方法雷同。 将外存空间上一个连续未分配区域称为“…

【兔子王赠书第11期】成为一名优秀的程序员,从读一本好书开始

文章目录 写在前面《代码大全2》前 言哪些人适合阅读本书还可以从哪些地方找到更多相关信息本书的关键收益为什么要写这本书 推荐理由粉丝福利写在后面 写在前面 如果你曾经想要学习软件开发&#xff0c;却因为零基础而感到困惑&#xff0c;那么《代码大全2纪念版》是你的完美…

第三十二课 电商系统增删改查统一接口的编写

商品增删改查 统一接口 接口方法&#xff0c;只有五个 Add增 Delete 删 Update 更新 findAll查询所有 findOne查询某一个 add增加一个数据 不管增加哪一个表的数据 表名&#xff08;小写&#xff09;与类名一致表中的字段在类中私有化封装 采用&#xff1a;java技术…

ArcGIS无法绘制一个或多个图层

背景&#xff1a;在导入一份数据时候&#xff0c;arcmap出现无法绘制一个或多个图层的错误&#xff0c;...点数少于要素所要求的的数量&#xff0c;查阅了半天资料发现是制作数据时候拓扑关系错误造成&#xff0c;现将处理方法详细记录如下&#xff1a; 1.原数据&#xff1a; …

logstash之grok插件自定义规则学习

文章目录 1、前言2、Grok提供的常用Patterns说明及举例2.1 常用的表达式说明 3、使用grok插件进行日志字段处理4、案例1&#xff1a;处理nginx的日志4.1、查看nginx日志格式4.2、对nginx的日志进行过滤处理 5、案例2&#xff1a;处理tomcat的日志5.1、[安装logstash-filter-mul…

JAVA安全之Spring参数绑定漏洞CVE-2022-22965

前言 在介绍这个漏洞前&#xff0c;介绍下在spring下的参数绑定 在Spring框架中&#xff0c;参数绑定是一种常见的操作&#xff0c;用于将HTTP请求的参数值绑定到Controller方法的参数上。下面是一些示例&#xff0c;展示了如何在Spring中进行参数绑定&#xff1a; 示例1&am…

7.25 SpringBoot项目实战【我的借阅记录】

文章目录 前言一、编写控制器二、编写服务层三、Git提交前言 至此,我们已经实现 图书借阅、收藏、评论等场景,最后来到【还书】场景,首先 还书的 入口 一般 是【我的借阅记录】,在这里可以根据产品设计,对于需要归还的书 操作【还书】,所以本文来实现【我的借阅记录】。…