当前位置: 首页 > article >正文

探索C语言简易计算器程序的实现与优化

在C语言编程学习中,实现一个简易计算器是一个常见且有趣的练习项目。它不仅能帮助我们巩固基本的语法知识,如函数、循环、分支结构,还能让我们深入理解程序设计的逻辑。接下来,我们将分析三段实现简易计算器功能的C语言代码,探讨它们的特点和优势。

 

一、基础版本:简单直接的功能实现

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

 

void menu()

{

    printf("***1.add 2.sub****\n");

    printf("***3.mul 4.div****\n");

    printf("****** 0.exit ******\n");

    printf("********************\n");

    printf("请选择:");

}

 

int add(int x, int y)

{

    return x + y;

}

 

int sub(int x, int y)

{

    return x - y;

}

 

int mul(int x, int y)

{

    return x * y;

}

 

int div(int x, int y)

{

    return x / y;

}

 

int main()

{

    menu();

    int input = 0;

    scanf("%d", &input);

    int x = 0;

    int y = 0;

    printf("请输入:");

    scanf("%d%d", &x, &y);

    int ret = 0;

    switch (input)

    {

    case 1:

        ret = add(x, y);

        printf("结果为:%d\n", ret);

        break;

    case 2:

        ret = sub(x, y);

        printf("结果为:%d\n", ret);

        break;

    case 3:

        ret = mul(x, y);

        printf("结果为:%d\n", ret);

        break;

    case 4:

        ret = div(x, y);

        printf("结果为:%d\n", ret);

        break;

    case 0:

        printf("退出成功!\n");

        break;

    default:

        printf("输入错误,请重新输入!\n");

    }

    return 0;

}

 这个版本的代码结构清晰,易于理解。 menu 函数负责打印操作选项菜单,让用户选择要进行的运算。 add 、 sub 、 mul 、 div 四个函数分别实现加、减、乘、除四种基本运算。在 main 函数中,通过 switch 语句根据用户的选择调用相应的函数进行计算,并输出结果。如果用户输入0,则退出程序;输入其他无效选项时,提示错误。

 这种实现方式的优点是逻辑简单明了,初学者容易上手。但缺点也很明显,代码的扩展性和复用性较差,如果需要添加新的运算功能,需要在 switch 语句中添加新的分支,修改的地方较多。

 二、进阶版本:使用函数指针数组优化

 #define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

 

void menu()

{

    printf("***1.add 2.sub****\n");

    printf("***3.mul 4.div****\n");

    printf("****** 0.exit ******\n");

    printf("********************\n");

}

 

int add(int x, int y)

{

    return x + y;

}

 

int sub(int x, int y)

{

    return x - y;

}

 

int mul(int x, int y)

{

    return x * y;

}

 

int div(int x, int y)

{

    return x / y;

}

 

int main()

{

    int(*pf[5])(int, int) = { 0, add, sub, mul, div };

    int input = 0;

    int x = 0;

    int y = 0;

    do

    {

        menu();

        printf("请选择:");

        scanf("%d", &input);

        if (input == 0)

        {

            printf("退出成功!\n");

            return 0;

        }

        else if (input >= 1 && input <= 4)

        {

            printf("请输入:");

            scanf("%d%d", &x, &y);

            int ret = pf[input](x, y);

            printf("%d\n", ret);

        }

        else

        {

            printf("输入错误!");

        }

    } while (input);

 

    return 0;

}

 这个版本引入了函数指针数组 pf ,将四个运算函数的指针存储在数组中。通过 do-while 循环,不断显示菜单并获取用户输入。当用户输入有效选项时,直接通过函数指针数组调用相应的函数进行计算,大大简化了 switch 语句的复杂结构。

 这种实现方式的优势在于提高了代码的可维护性和扩展性。如果需要添加新的运算功能,只需要在函数指针数组中添加新的函数指针,而不需要大幅修改 main 函数中的逻辑。

 

三、改进版本:分离输出功能

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

 

void menu()

{

    printf("***1.add 2.sub****\n");

    printf("***3.mul 4.div****\n");

    printf("****** 0.exit ******\n");

    printf("********************\n");

    printf("请选择:");

}

 

int add(int x, int y)

{

    return x + y;

}

 

int sub(int x, int y)

{

    return x - y;

}

 

int mul(int x, int y)

{

    return x * y;

}

 

int div(int x, int y)

{

    return x / y;

}

 

void test(int m)

{

    printf("结果为:%d\n", m);

}

 

int main()

{

    menu();

    int input = 0;

    scanf("%d", &input);

    int x = 0;

    int y = 0;

    printf("请输入:");

    scanf("%d%d", &x, &y);

    int ret = 0;

    switch (input)

    {

    case 1:

        ret = add(x, y);

        test(ret);

        break;

    case 2:

        ret = sub(x, y);

        test(ret);

        break;

    case 3:

        ret = mul(x, y);

        test(ret);

        break;

    case 4:

        ret = div(x, y);

        test(ret);

        break;

    case 0:

        printf("退出成功!\n");

        break;

    default:

        printf("输入错误,请重新输入!\n");

    }

    return 0;

}

 这个版本在基础版本的基础上,将结果输出功能分离到 test 函数中。在 switch 语句的每个分支中,先调用相应的运算函数得到结果,再调用 test 函数输出结果。

 这样做的好处是将计算和输出功能解耦,使代码结构更加清晰,也便于后续对输出格式或方式进行统一修改。

 通过对这三段代码的分析,我们可以看到在C语言编程中,从简单的功能实现到逐步优化代码结构,提升代码的可维护性和扩展性是一个不断学习和进步的过程。每一次改进都体现了对C语言特性的更深入理解和应用,希望这些分析能帮助大家在C语言学习和编程实践中有所收获。

相关文章:

探索C语言简易计算器程序的实现与优化

在C语言编程学习中&#xff0c;实现一个简易计算器是一个常见且有趣的练习项目。它不仅能帮助我们巩固基本的语法知识&#xff0c;如函数、循环、分支结构&#xff0c;还能让我们深入理解程序设计的逻辑。接下来&#xff0c;我们将分析三段实现简易计算器功能的C语言代码&#…...

时间序列分析(一)——基础概念篇

一、时间序列的相关概念 定义&#xff1a;时间序列是按时间顺序排列的一系列观测值&#xff0c;通常以固定间隔&#xff08;如秒、天、年&#xff09;记录。而时间序列分析是一种研究按时间顺序排列的数据点的统计方法&#xff0c;发现趋势、季节性波动、周期性和异常等模式&a…...

Python因为网络原因安装依赖库报错

现象 在终端运行以下指令 pip install pyautogui pillow keyboard 出现报错&#xff0c;终端信息如下&#xff1a; PS D:\code\Python> pip install pyautogui pillow keyboard Collecting pyautoguiUsing cached PyAutoGUI-0.9.54.tar.gz (61 kB)Installing build depe…...

【Redis】主从模式,哨兵,集群

主从复制 单点问题&#xff1a; 在分布式系统中&#xff0c;如果某个服务器程序&#xff0c;只有一个节点&#xff08;也就是一个物理服务器&#xff09;来部署这个服务器程序的话&#xff0c;那么可能会出现以下问题&#xff1a; 1.可用性问题&#xff1a;如果这个机器挂了…...

DockerFile详细学习

目录 1.DockerFile介绍 2.DockerFile常用指令 3.指令详细讲解 4.实例 构建Node-Exporter 构建Alertmanager 构建Mariadb 1.DockerFile介绍 什么是 Dockerfile&#xff1f; Dockerfile 是一个文本文件&#xff0c;包含了构建 Docker 镜像的所有指令。 Dockerfile 是一…...

寒假2.5

题解 web:[网鼎杯 2020 朱雀组]phpweb 打开网址&#xff0c;一直在刷新&#xff0c;并有一段警告 翻译一下 查看源码 每隔五秒钟将会提交一次form1&#xff0c;index.php用post方式提交了两个参数func和p&#xff0c;func的值为date&#xff0c;p的值为Y-m-d h:i:s a 执行fu…...

Temperature、Top-P、Top-K、Frequency Penalty详解

在生成式AI&#xff08;比如ChatGPT&#xff09;中&#xff0c;Temperature、Top-P、Top-K、Frequency Penalty 这些参数用于控制文本生成的多样性、随机性和重复度&#xff0c;它们的作用如下&#xff1a; 1. Temperature&#xff08;温度&#xff09; 作用&#xff1a;控制输…...

【大数据技术】编写Python代码实现词频统计(python+hadoop+mapreduce+yarn)

编写Python代码实现词频统计(python+hadoop+mapreduce+yarn) 搭建完全分布式高可用大数据集群(VMware+CentOS+FinalShell) 搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn) 本机PyCharm连接CentOS虚拟机 在阅读本文前,请确保已经阅读过以上三篇文章,成功搭建了…...

中国销冠,比亚迪1月销量超30万台,出口量飙升83%

近日&#xff0c;比亚迪公布的 1 月销量数据成为了汽车行业热议的焦点&#xff0c;比亚迪凭借 300538 辆的销量成绩&#xff0c;进一步巩固了其在新能源汽车市场的统治力&#xff0c;再次稳坐中国品牌汽车市场销冠宝座。 在 1 月的销售数据中&#xff0c;比亚迪王朝丨海洋系列无…...

App拉新、推广

任推邦 https://www.bilibili.com/video/BV1qD2qY4E7D u客直谈 https://space.bilibili.com/1817283205...

大数据sql查询速度慢有哪些原因

1.索引问题 可能缺少索引&#xff0c;也有可能是索引不生效 2.连接数配置&#xff1a;连接数过少/连接池比较小 连接数过 3.sql本身有问题&#xff0c;响应比较慢&#xff0c;比如多表 4.缓存池大小 可能是缓存问题&#xff08;命中率>99%&#xff09; 5.加了锁 6. redis&a…...

2 fastAPI请求参数

1. 路径参数 (Path Parameters) 路径参数是 URL 路径的一部分&#xff0c;通常用于标识资源的唯一性。路径参数在 FastAPI 中通过在路由装饰器中使用大括号 {} 来定义。 获取路径参数的方式 from fastapi import FastAPIapp FastAPI()app.get("/items/{item_id}"…...

为何实现大语言模型的高效推理以及充分释放 AI 芯片的计算能力对于企业级落地应用来说,被认为具备显著的研究价值与重要意义?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ AI 芯片&#xff1a;为人工智能而生的 “大脑” AI 芯片&#xff0c;又称人工智能加速器或计算卡&#xff0c;是专为加速人工智能应用&#xff0c;特别是深度学习任务设计的专用集成电路&#xff08;A…...

Spring容器初始化扩展点:ApplicationContextInitializer

目录 一、什么是ApplicationContextInitializer&#xff1f;1、核心作用2、适用场景 二、ApplicationContextInitializer的使用方式1、实现ApplicationContextInitializer接口2、注册初始化器 三、ApplicationContextInitializer的执行时机四、实际应用案例1、动态设置环境变量…...

树欲静而凤不止

我不知道为什么要求一定要在抖音上举办婚礼&#xff1f;觉得唯一的一个作用&#xff0c;财力的体现。 做到了&#xff0c;就见了。让我觉得就像买见面一样。 见了不合适&#xff0c;该当如何&#xff1f; 这个对于认真找对象&#xff0c;真的很重要吗&#xff1f; 分钱给平台&…...

C++11详解(二) -- 引用折叠和完美转发

文章目录 2. 右值引用和移动语义2.6 类型分类&#xff08;实践中没什么用&#xff09;2.7 引用折叠2.8 完美转发2.9 引用折叠和完美转发的实例 2. 右值引用和移动语义 2.6 类型分类&#xff08;实践中没什么用&#xff09; C11以后&#xff0c;进一步对类型进行了划分&#x…...

AI 编程工具—Cursor 进阶篇 文章改写生成整理爬取

AI 编程工具—Cursor 进阶篇 文章改写生成整理爬取 其实对做自媒体的人而言,整理素材其实是一件非常耗时的事情,今天我们来看一下如何使用Cursor来帮我们解决这些问题,首先我们要建一个单独的项目,因为这个项目不涉及任何代码操作,只是文字相关的事情,还有就是这个项目需…...

Yageo国巨的RC系列0402封装1%电阻库来了

工作使用Cadence多年&#xff0c;很多时候麻烦的就是整理BOM&#xff0c;因为设计原理图的时候图省事&#xff0c;可能只修改value值和封装。 但是厂家&#xff0c;规格型号&#xff0c;物料描述等属性需要在最后的时候一行一行的修改&#xff0c;繁琐又容易出错&#xff0c;过…...

Linux系统安装Nginx详解(适用于CentOS 7)

目录 1. 更新系统包 2. 安装EPEL仓库 3. 安装Nginx 4. 启动Nginx服务 5. 设置Nginx开机自启 6. 检查Nginx状态 7. 配置防火墙 8. 访问Nginx默认页面 9. 配置Nginx&#xff08;可选&#xff09; 10. 重启Nginx 解决步骤 1. 检查系统版本 2. 移除错误的 Nginx 仓库 …...

Vue3 组件通信汇总

目录 1、常见通信方式汇总&#xff1a;2、常用组件通信方式说明2.1 【props】2.2【自定义事件】2.3 【v-model】2.4 【$attrs 】2.5 【\$refs、\$parent】2.6 【provide、inject】 1、常见通信方式汇总&#xff1a; Vue3组件通信和Vue2的区别&#xff1a; 移出事件总线&#…...

nginx伪静态配置解释和Nginx 常见的配置

文章目录 禁止访问 runtime 和 application 目录rewrite 对 URL 进行重写或重定向301重定向root 静态资源路径处理alias 路径映射try_files 伪静态规则Nginx 配置有许多其他常见的场景和使用方式 1. **基本的反向代理配置**2. **负载均衡配置**3. **限制访问&#xff08;IP 限…...

PromptSource和LangChain哪个更好

目录 1. 设计目标与定位 PromptSource LangChain 2. 功能对比 3. 优缺点分析 PromptSource LangChain 4. 如何选择&#xff1f; 5. 总结 PromptSource 和 LangChain 是两个在自然语言处理&#xff08;NLP&#xff09;领域非常有用的工具&#xff0c;但它们的设计目标和…...

AI安全最佳实践:AI云原生开发安全评估矩阵(下)

上篇小李哥带大家一起了解了什么是AI应用云原生开发安全评估矩阵&#xff0c;并且介绍了利用该矩阵如何确定我们云上AI应用的安全评估范围&#xff0c;接下来我们将继续本系列的下篇&#xff0c;基于该安全评估矩阵设计和实施我们系统应具备的安全控制。 优先考虑的安全控制 …...

Windows DeepSeek API调用基础教程-Python

DeepSeek API 调用&#x1f680; 在最近DeepSeek大火之后&#xff0c;在各个媒体上都能看到对这个大模型的报道&#xff0c;这个使用MoE的架构的大模型&#xff0c;在使用体验上&#xff0c;确实让我眼前一亮&#xff0c;我自己平时也是已经在用着GPT-o1&#xff0c;对比下来发…...

达梦数据库从单主模式转换为主备模式

目录标题 达梦数据库单主转主备配置笔记前期准备服务器环境数据库安装磁盘空间 流程流程图说明 详细步骤1. 检查主库归档模式2. 配置主库配置文件dm.ini 文件dmmal.ini 文件dmarch.ini 文件 3. 备份主库数据库4. 备库配置新建备库数据库配置备库配置文件dm.ini 文件复制主库的 …...

SpringUI Web高端动态交互元件库

Axure Web高端动态交互元件库是一个专为Web设计与开发领域设计的高质量资源集合&#xff0c;旨在加速原型设计和开发流程。以下是关于这个元件库的详细介绍&#xff1a; 一、概述 Axure Web高端动态交互元件库是一个集成了多种预制、高质量交互组件的工具集合。这些组件经过精…...

ES冷热数据分离配置

冷热数据是根据索引创建时间来进行迁移的。一旦迁移到冷数据节点&#xff0c;则无法再恢复成热数据&#xff0c;因为热数据节点中该索引已经没有分片存在了。 基于Docker搭建ES集群,并设置冷热数据节点 配置冷热数据迁移策略 PUT https://192.168.x.xx:19200/_ilm/policy/my…...

七大排序思想

目录 七大排序的时间复杂度和稳定性 排序 插入排序 简单插入排序 希尔排序 选择排序 简单选择排序 堆排序 交换排序 冒泡排序 快速排序 快排的递归实现 hoare版本的快排 挖坑法的快排 双指针法的快排 快排的非递归 归并排序 归并的递归实现 归并的非递归实现…...

制作PE启动盘(内含Win11 iso镜像)

前言 本文用于记录制作PE启动盘过程&#xff0c;学习记录用&#xff0c;如有不对请指出&#xff0c;谢谢&#xff01; 参考视频&#xff1a; 1. 微PE下载&#xff1a;https://www.bilibili.com/video/BV1vT4y1n7JX/?spm_id_from333.788.top_right_bar_window_history.conte…...

css字体样式与文本样式详解

目录 一、CSS字体样式 1. 字体类型&#xff08;font-family&#xff09; 2. 字体大小&#xff08;font-size&#xff09; 3. 字体粗细&#xff08;font-weight&#xff09; 4. 字体风格&#xff08;font-style&#xff09; 5. 字体颜色&#xff08;color&#xff09; 6. …...