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

news2025/1/24 5:43:48


请选择一个功能:
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.coloradmin.cn/o/1301676.html

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

相关文章

区块链实验室(31) - 交叉编译Ethereum的客户端Geth

编译Geth到X86架构平台 下载Geth源码&#xff0c;直接编译Geth源码&#xff0c;见下图。用file命令观察编译后的文件&#xff0c;架构是x86-64。 编译Geth到Arm64架构平台 直接用命令行编译&#xff0c;同时指定期望的架构为Arm64。编译脚本如下所示。 CGO_ENABLED0 GOOSlin…

LeetCode力扣每日一题(Java):35、搜索插入位置

一、题目 二、解题思路 1、我的思路&#xff08;又称&#xff1a;论API的重要性&#xff09; 读完题目之后&#xff0c;我心想这题目怎么看着这么眼熟&#xff1f;好像我之前学过的一个API呀&#xff01; 于是我回去翻了翻我之前写的博客&#xff1a;小白备战蓝桥杯&#xf…

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

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

前端知识(十)———JavaScript 使用URL跳转传递数组对象数据类型的方法

目录 首先了解一下正常传递基本数据类型 JavaScript跳转页面方法 JavaScript路由传递参数 JavaScript路由接收参数传递对象、数组 在前端有的时候会需要用链接进行传递参数&#xff0c;基本数据类型的传递还是比较简单的&#xff0c;但是如果要传递引用数据类型就比较麻烦了…

抖音直播匿名采集——协议分析

本文内容仅作学习参考&#xff0c;如侵权&#xff0c;请联系删除。 这次是关于匿名采集的分析&#xff0c;其中会涉及到以下几个只是点&#xff0c;websocket&#xff0c;protobuf&#xff0c;protobuf反序列化。 这里以web端的websocket做分析。 首先你需要将非匿名的代码给…

测试剪切板贴图,兼测试2023年12月7日更新的Bard

当前的情况好比&#xff0c;&#xff08;居然真的可以通过剪切板把图片放进来&#xff01;&#xff09; 听说2023年12月7日Bard有更新&#xff0c;所以&#xff0c;再测试了一次。这下&#xff0c;对大语言模型应该死心了&#xff1b;AI替代人的传闻应该是过早危言耸听了。

基于SpringBoot+Vue前后端分离的景点数据分析平台(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

临时或永久修改linux-kali虚拟机的主机名和遇见的错误解决方法(保姆级图文)【网络工程】

目录 临时修改主机名1. 查看当前主机名2. 修改主机名3. 打开新窗口&#xff0c;临时主机名生效 永久修改主机名1. 查看当前主机名2. 修改主机名3. 执行重启虚拟机生效配置 配置好hosts文件报错效果解决方法 总结 欢迎关注 『网络工程专业』 系列&#xff0c;持续更新中 欢迎关注…

ArcGIS界面显示分辨率调整

因为电脑显示分辨率的问题呢&#xff0c;ArcGIS的界面显示会字体显示不合适&#xff0c;出现模糊情况&#xff0c;这时候只需要做个简单的操作设置一下便可以解决&#xff01; 1、右键ArcMap的快捷启动方式。 2、对应选择兼容性——>更高DPI设置——>勾选替代DPI缩放行为…

【成功】Linux安装Mysql8并设置远程连接

今天在新搞来的阿里云的服务器里安装MySQL8&#xff0c;记录一下过程&#xff1a; 这是MySQL的官网和下载地址&#xff1a;MySQL :: Download MySQL Community Server (Archived Versions) 1. 先进入安装目录 cd /usr/local 2. 安装 wget https://downloads.mysql.com/arch…

stateflow——如何查看状态机中参数变化及状态机断点调试

法一&#xff1a;使用Data Inspector 点击“符号图窗”和“属性”&#xff0c;如图&#xff1b;在选择变量n并右键点击inspector&#xff0c;最后在logging&#xff0c;如图 法二&#xff1a;log active state 和法一类似使用data inspector查看&#xff0c;类似的查看方法和…

public static final

常量对象中声明并赋值的正确写法一&#xff1a; public class RoleConstant {public static final List<String> PROBLEM_VIEW_ALL_DATA new ArrayList<String>() {{add("角色1");add("角色2");add("角色3");}};}常量对象中声明并…

三. LiDAR和Camera融合的BEV感知算法-融合算法的基本介绍

目录 前言0. 简述1. 融合背景2. 融合思路3. 融合性能优劣总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第三章——LiDAR和Camera融合的BEV感知算法&am…

Stable Diffusion 源码解析(1)

参考1&#xff1a;https://blog.csdn.net/Eric_1993/article/details/129393890 参考2&#xff1a;https://zhuanlan.zhihu.com/p/613337342 1.StableDiffusion基本原理1.1 UNetModel、FrozenCLIP 模型1.2 DDPM、DDIM、PLMS算法 2. Runwayml SD 源码2.1 Img2Img Pipeline2.2 DD…

操作系统笔记——储存系统、文件系统(王道408)

文章目录 前言储存系统地址转换内存扩展覆盖交换 储存器分配——连续分配固定大小分区动态分区分配动态分区分配算法 储存器分配——非连续分配页式管理基本思想地址变换硬件快表&#xff08;TLB&#xff09;多级页表 段式管理段页式管理 虚拟储存器——基于交换的内存扩充技术…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《面向微电网群的云储能经济-低碳-可靠多目标优化配置方法》

这篇文章的标题涵盖了以下关键信息&#xff1a; 面向微电网群&#xff1a;研究的重点是微电网群&#xff0c;这可能指的是多个微电网系统的集合&#xff0c;而不仅仅是一个单独的微电网。微电网是指由分布式能源资源、储能系统和智能控制组成的小型电力系统&#xff0c;通常能够…

PPP协议概述与实验示例

PPP协议概述与实验示例 概述 PPP&#xff08;Point-to-Point Protocol&#xff09;是一种用于在点对点连接上传输多协议数据包的标准方法。它已经成为最广泛使用的互联网接入数据链路层协议&#xff0c;可以与各种技术结合&#xff0c;如ADSL、LAN等&#xff0c;实现宽带接入…

使用React 18、Echarts和MUI实现温度计

关键词 React 18 Echarts和MUI 前言 在本文中&#xff0c;我们将结合使用React 18、Echarts和MUI&#xff08;Material-UI&#xff09;库&#xff0c;展示如何实现一个交互性的温度计。我们将使用Echarts绘制温度计的外观&#xff0c;并使用MUI创建一个漂亮的用户界面。 本文…

视觉盛宴:TikTok独特的短视频美学探究

TikTok作为一款风靡全球的短视频应用&#xff0c;不仅改变了用户获取信息和娱乐的方式&#xff0c;更塑造了一种独特的短视频美学。从舞蹈、音乐、剧情到创意拍摄手法&#xff0c;TikTok的短视频内容呈现出丰富多彩的画面&#xff0c;构建了一场视觉盛宴。本文将深入探讨TikTok…

web 前端之标签练习+知识点

目录 实现过程&#xff1a; 结果显示 1、HTML语法 2、注释标签 3、常用标签 4、新标签 5、特殊标签 6、在网页中使用视频和音频、图片 7、表格标签 8、超链接标签 使用HTML语言来实现该页面 实现过程&#xff1a; <!DOCTYPE html> <html><head>…