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

探索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语言代码&#…...

深入了解 MySQL:从基础到高级特性

引言 在当今数字化时代&#xff0c;数据的存储和管理至关重要。MySQL 作为一款广泛使用的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;凭借其高性能、可靠性和易用性&#xff0c;成为众多开发者和企业的首选。本文将详细介绍 MySQL 的基础概念、安装启…...

OSPF基础(1):工作过程、状态机、更新

OSPF基础 1、技术背景&#xff08;与RIP密不可分&#xff0c;因为RIP中存在的问题&#xff09; RIP中存在最大跳数为15的限制&#xff0c;不能适应大规模组网周期性发送全部路由信息&#xff0c;占用大量的带宽资源以路由收敛速度慢以跳数作为度量值存在路由环路可能性每隔30秒…...

工业相机如何获得更好的图像色彩

如何获得更好的图像色彩 大部分的工业自动化检测中对物体的色彩信息并不敏感&#xff0c;因此会使用黑白的相机&#xff0c;但是在显微镜成像、颜色分类识别等领域&#xff0c;相机的色彩还原就显得格外重要&#xff0c;在调节相机色彩方面的参数时&#xff0c;有以下几个方面需…...

使用requestAnimationFrame减少浏览器重绘

文章目录 介绍使用使用rAF前使用rAF后 介绍 在屏幕中&#xff0c;浏览器通常都以60FPS&#xff08;1/60 s&#xff09;每帧更新屏幕&#xff0c;但是当前端绑定了一些高频事件&#xff0c;如鼠标移动&#xff0c;屏幕滚动、触摸滑动等时&#xff0c;在一帧的周期内&#xff0c;…...

Mac 终端命令大全

—目录操作— ꔷ mkdir 创建一个目录 mkdir dirname ꔷ rmdir 删除一个目录 rmdir dirname ꔷ mvdir 移动或重命名一个目录 mvdir dir1 dir2 ꔷ cd 改变当前目录 cd dirname ꔷ pwd 显示当前目录的路径名 pwd ꔷ ls 显示当前目录的内容 ls -la ꔷ dircmp 比较两个目录的内容 di…...

如何使用deepseek开发一个翻译API

什么是deepseek Deepseek 是一个基于人工智能技术的自然语言处理平台&#xff0c;提供了多种语言处理能力&#xff0c;包括文本翻译、语义分析、情感分析等。它通过深度学习模型和大规模语料库训练&#xff0c;能够实现高质量的文本翻译和多语言理解。Deepseek 的核心优势在于…...

vue如何解决跨域

文章目录 vue如何解决跨域1. 什么是跨域2. 如何解决2.1 CROS&#xff08;Cross-Origin Resource Sharing&#xff0c;跨域资源共享&#xff09;2.2 Proxy2.2.1 使用webpack proxy2.2.2 服务端代理转发2.2.3 通过nginx实现代理 vue如何解决跨域 1. 什么是跨域 跨域本质是浏览器…...

红包雨项目前端部分

创建项目 pnpm i -g vue/cli vue create red_pakage pnpm i sass sass-locader -D pnpm i --save normalize.css pnpm i --save-dev postcss-px-to-viewportpnpm i vantlatest-v2 -S pnpm i babel-plugin-import -Dhttps://vant.pro/vant/v2/#/zh-CN/<van-button click&…...

新版AndroidStudio 修改 jdk版本

一、问题 之前&#xff0c;在安卓项目中配置JDK和Gradle的过程非常直观&#xff0c;只需要进入Android Studio的File菜单中的Project Structure即可进行设置&#xff0c;十分方便。 如下图可以在这修改JDK: 但是升级AndroidStudio之后&#xff0c;比如我升级到了Android Stu…...

【golang学习之旅】使用VScode安装配置Go开发环境

1. 下载并安装Go 1.1 下载地址1.2 选择版本并下载1.3 安装目录1.4 验证是否安装成功 2. 配置环境变量 2.1 配置步骤2.2 GO部分环境变量说明 3. 下载或更新 Vscode 3.1 下载地址3.2 安装步骤 4. 为Go开发配置VScode 1. 下载并安装Go 1.1 下载地址 https://studygolang.com/dl…...

langchain教程-2.prompt

前言 该系列教程的代码: https://github.com/shar-pen/Langchain-MiniTutorial 我主要参考 langchain 官方教程, 有选择性的记录了一下学习内容 这是教程清单 1.初试langchain2.prompt3.OutputParser/输出解析4.model/vllm模型部署和langchain调用5.DocumentLoader/多种文档…...

GGML、GGUF、GPTQ 都是啥?

GGML、GGUF和GPTQ是三种与大型语言模型(LLM)量化和优化相关的技术和格式。它们各自有不同的特点和应用场景,下面将详细解释: 1. GGML(GPT-Generated Model Language) 定义:GGML是一种专为机器学习设计的张量库,由Georgi Gerganov创建。它最初的目标是通过单一文件格式…...

C++ 原码、反码、补码和位操作符

目录 一、原码、反码、补码 二、位操作符 1、左移操作符是双⽬操作符 移位规则&#xff1a;左边抛弃、右边补 0 2、右移操作符是双⽬操作符 逻辑右移&#xff1a;左边⽤ 0 填充&#xff0c;右边丢弃算术右移&#xff1a;左边⽤原该值的符号位填充&#xff0c;右边丢弃 3、…...

idea中git版本回退

idea中git版本回退 将dev分支代码合并到master分支执行回退步骤 将dev分支代码合并到master分支 #合并成功之后 执行回退步骤 #在指定的版本上 右键 #这里选择【Hard】彻底回退 #本地的master分支回退成功 #将本地的master强制推送到远程&#xff0c;需要执行命令 git p…...

【PostgreSQL内核学习 —— (WindowAgg(三))】

WindowAgg set_subquery_pathlist 部分函数解读check_and_push_window_quals 函数find_window_run_conditions 函数执行案例总结 计划器模块&#xff08;set_plan_refs函数&#xff09;set_windowagg_runcondition_references 函数执行案例 fix_windowagg_condition_expr 函数f…...

redis教程

Redis 教程 Redis 是一个开源的内存数据结构存储系统&#xff0c;用作数据库、缓存和消息代理。以下是一些基础知识和常用操作。 一、简介 Redis 支持多种数据结构&#xff0c;如字符串、哈希、列表、集合、有序集合等。它具有高性能、高可用性和数据持久化的特性。 二、安…...

Python aiortc API

本研究的主要目的是基于Python aiortc api实现抓取本地设备媒体流&#xff08;摄像机、麦克风&#xff09;并与Web端实现P2P通话。本文章仅仅描述实现思路&#xff0c;索要源码请私信我。 1 demo-server解耦 1.1 原始代码解析 1.1.1 http服务器端 import argparse import …...

Transaction rolled back because it has been marked as rollback-only问题解决

1、背景 在我们的日常开发中&#xff0c;经常会存在在一个Service层中调用另外一个Service层的方法。比如&#xff1a;我们有一个TaskService&#xff0c;里面有一个execTask方法&#xff0c;且这个方法存在事物&#xff0c;这个方法在执行完之后&#xff0c;需要调用LogServi…...

深入浅出 DeepSeek V2 高效的MoE语言模型

今天&#xff0c;我们来聊聊 DeepSeek V2 高效的 MoE 语言模型&#xff0c;带大家一起深入理解这篇论文的精髓&#xff0c;同时&#xff0c;告诉大家如何将这些概念应用到实际中。 &#x1f31f; 什么是 MoE&#xff1f;——Mixture of Experts&#xff08;专家混合模型&#x…...

基于RAG的智能知识库问答系统:从原理到部署实战

1. 项目概述&#xff1a;当AI大模型遇见知识库&#xff0c;一个开源的智能问答解决方案 最近在折腾一个很有意思的开源项目&#xff0c;叫 zhimaAi/chatwiki 。光看名字&#xff0c;你大概能猜到它的核心&#xff1a; chat 代表对话&#xff0c; wiki 代表知识库。没错&a…...

【仅剩217份】《Midjourney后印象派风格白皮书》V2.3——含17位艺术家专属LoRA适配建议、32组跨文化色彩映射表及实时风格强度校准工具(2024.06内部封测版)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;后印象派风格的视觉基因与Midjourney语义解码 后印象派并非对自然的模仿&#xff0c;而是对色彩、结构与主观情绪的系统性重构——梵高旋转的星云、塞尚凝固的苹果、高更平面化的塔希提图腾&#xff0c…...

数据中心碳减排:工作负载迁移与服务器调度优化

1. 数据中心碳减排技术概述 在数字经济时代&#xff0c;数据中心作为信息基础设施的核心载体&#xff0c;其能源消耗和碳排放问题日益凸显。据统计&#xff0c;全球数据中心电力消耗已占全球总用电量的1-2%&#xff0c;且随着AI、云计算等技术的快速发展&#xff0c;这一比例仍…...

基于Circuit Playground Express与NeoPixel的四季交互灯光装置设计与实现

1. 项目概述与核心思路几年前&#xff0c;我在一个艺术展上看到一组悬挂在枯树枝上的玻璃瓶&#xff0c;里面装着会呼吸般变幻光线的LED灯&#xff0c;那种静谧又灵动的美感让我念念不忘。作为一个喜欢把代码和电路“藏”进生活场景里的硬件爱好者&#xff0c;我一直在琢磨如何…...

ITK-SNAP医学图像分割:破解三维解剖结构提取的工程难题

ITK-SNAP医学图像分割&#xff1a;破解三维解剖结构提取的工程难题 【免费下载链接】itksnap ITK-SNAP medical image segmentation tool 项目地址: https://gitcode.com/gh_mirrors/it/itksnap 当我们面对复杂的脑部MRI数据、肿瘤CT扫描或心血管影像时&#xff0c;最大…...

μSR技术中的双量子Rabi振荡优化与应用

1. 实验背景与核心原理 在量子物理和凝聚态物理研究中&#xff0c;μ子自旋共振&#xff08;μSR&#xff09;技术是一种独特的探测手段。这项技术利用正μ子&#xff08;μ&#xff09;作为微观探针&#xff0c;通过观测其自旋极化行为来研究材料的局部磁环境。当μ子注入样品…...

安得医疗冲刺港股:年营收9亿,利润1.5亿 上海亿瑞控制41%股权

雷递网 雷建平 5月16日山东安得医疗用品股份有限公司&#xff08;简称&#xff1a;“安得医疗”&#xff09;日前递交招股书&#xff0c;准备在港交所上市。截至2023年、2024年及2025年12月31日止年度&#xff0c;安得医疗分别宣派及派付股息6670万元、4670万元及4000万元。年营…...

基于vLLM与OpenAI API的LLM生产部署框架实战指南

1. 项目概述&#xff1a;一个面向生产环境的LLM部署框架最近在折腾大语言模型&#xff08;LLM&#xff09;的部署&#xff0c;发现了一个挺有意思的项目&#xff1a;run-llama/llama_deploy。这名字乍一看&#xff0c;可能会让人以为它只是用来部署Meta的Llama系列模型的&#…...

【限时解密】Midjourney未公开的Tea印相冷启动协议:如何绕过默认sampler干扰,直触胶片模拟内核(仅剩37位开发者掌握)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney Tea印相冷启动协议的起源与本质 Midjourney Tea印相冷启动协议&#xff08;Tea-Init Protocol&#xff09;并非官方标准&#xff0c;而是由东亚AI艺术协作社区在2023年自发演化出的一套轻量…...

LC-SLM高精度波面生成:从原理、标定到闭环校正的完整指南

1. 项目概述与核心价值最近在实验室里折腾一个光学精密测量项目&#xff0c;核心需求是生成一个特定形状、高精度的光波面。这玩意儿在光学检测、自适应光学、全息成像甚至一些前沿的微纳加工领域都是刚需。比如&#xff0c;你想检测一个非球面镜的面形误差&#xff0c;最直接的…...