牛客网刷题 | BC77 简单计算器

2024-05-06 07:52

本文主要是介绍牛客网刷题 | BC77 简单计算器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目前主要分为三个专栏,后续还会添加:

        专栏如下:                 C语言刷题解析       C语言系列文章       我的成长经历

感谢阅读!

初来乍到,如有错误请指出,感谢!


描述

KiKi实现一个简单计算器,实现两个数的“加减乘除”运算,用户从键盘输入算式“操作数1运算符操作数2”,计算并输出表达式的值,如果输入的运算符号不包括在(+、-、*、/)范围内,输出“Invalid operation!”。当运算符为除法运算,即“/”时。如果操作数2等于0.0,则输出“Wrong!Division by zero!”

数据范围:字符串长度满足 3≤𝑛≤50 3≤n≤50  ,保证运算符是一个char类型字符。

输入描述:

输入一行字符串,操作数1+运算符+操作数2 (其中合法的运算符包括:+、-、*、/)。

输出描述:

输出为一行。

如果操作数和运算符号均合法,则输出一个表达式,操作数1运算符操作数2=运算结果,各数小数点后均保留4位,数和符号之间没有空格。

如果输入的运算符号不包括在(+、-、*、/)范围内,输出“Invalid operation!”。当运算符为除法运算,即“/”时。

如果操作数2等于0.0,则输出“Wrong!Division by zero!”。


思路 : 

这道题我想复杂了

想先用数组判断是不是  + - * /  这四个符号

然后再进去计算

搞了半天没有看见成效

看了下评论区

用一个switch 语句就可以了

我想多了,唉......

读取输入:首先,我们需要从用户那里读取一行输入,这行输入包含了两个操作数和一个运算符。

解析输入:将输入的字符串按照运算符分割成两部分,前半部分是操作数1,后半部分是操作数2。同时,识别出运算符。

验证运算符:检查运算符是否为合法的运算符(+、-、*、/)。如果不是合法的运算符,则输出“Invalid operation!”。

处理除法:如果运算符是除法(/),需要检查操作数2是否为0.0。如果是0.0,则输出“Wrong!Division by zero!”。

执行运算:如果通过以上检查,根据运算符对两个操作数进行相应的数学运算。

格式化输出:将运算结果保留四位小数,并按照题目要求的格式输出表达式和结果,即操作数1运算符操作数2=运算结果。


代码 1:

# include <stdio.h>
int main (){double a,b;char c;//char类型字符scanf("%lf%c%lf",&a,&c,&b);switch (c) {case '+'://add = a+bprintf("%.4lf+%.4lf=%.4lf",a,b,a+b);break;case '-'://sub=a-bprintf("%.4lf-%.4lf=%.4lf",a,b,a-b);break;case '*'://mul=a*bprintf("%.4lf*%.4lf=%.4lf",a,b,a*b);break;case '/':if (b==0.0) {printf("Wrong!Division by zero!\n");}else {//div = a/bprintf("%.4lf/%.4lf=%.4lf",a,b,a/b);}break;default:printf("Invalid operation!\n");break;}return 0;
}

代码 2 :

#include<stdio.h>
int main(){
double a, b;
char ch;
while ((scanf("%lf%c%lf", &a, &ch, &b)) != EOF)
{if (ch == '+' || ch == '-' || ch == '*' || ch == '/'){switch (ch){case '+':printf("%.4lf%c%.4lf=%.4lf", a, ch, b, a + b); break;case '-':printf("%.4lf%c%.4lf=%.4lf", a, ch, b, a - b); break;case '*':printf("%.4lf%c%.4lf=%.4lf", a, ch, b, a * b); break;case '/':if (b == 0.0){printf("Wrong!Division by zero!"); break;}else{printf("%.4lf%c%.4lf=%.4lf", a, ch, b, a / b); break;}}}elseprintf("Invalid operation!");
}
return 0;
}

代码 3 :

if...else 来判断的

int main()
{double a,b,z;char c;while(scanf("%lf%c%lf",&a,&c,&b)!=EOF){if(c!='+' && c!='-' && c!='*' && c!='/'){printf("Invalid operation!");continue;}else if(c=='+'){z=a+b;}else if(c=='-'){z=a-b;}else if(c=='*'){z=a*b;}else if(c=='/'){if(b==0){printf("Wrong!Division by zero!");continue;}else{z=a/b;}}printf("%.4lf%c%.4lf=%.4lf",a,c,b,z);}return 0;
}

代码 4 :

使用指针来写的

#include <stdio.h>
//加
double add(double a, double b) {return a + b;
}
//减
double sub(double a, double b) {return a - b;
}
//乘
double mul(double a, double b) {return a * b;
}
//除
double div(double a, double b) {return a / b;
}
int main() {double a, b;  //操作数1和2char opt;    //运算方式//函数指针数组double (*pf[8])(double, double) = {NULL, NULL, mul, add, NULL, sub, NULL, div};scanf("%lf%c%lf", &a, &opt, &b);if (opt == '+' || opt == '-' || opt == '*' || opt == '/') //判断运算符是否合法{if (opt == '/' && b == 0) //判断是否符合分母不为零{printf("Wrong!Division by zero!\n");}else {printf("%.4lf%c%.4lf=%.4lf", a, opt, b, (*pf[opt % 40])(a, b)); //输出}} else {printf("Invalid operation!\n");}}

扩展 :switch语句

switch语句是一种多分支选择结构,允许根据变量的值执行不同的代码块。以下是关于switch语句的一些关键知识点:

基本语法

switch (expression) {case constant_expression:// 代码块1break;case constant_expression:// 代码块2break;// ...default:// 默认代码块,当没有匹配的case时执行
}

要点

  1. switch语句的主体是一个圆括号内的表达式(通常是一个变量或常量),这个表达式的结果将与每个case标签中的常量表达式进行比较。
  2. 如果找到匹配的case,程序将从该case下的代码块开始执行,直到遇到break语句。如果没有break,程序将继续执行下一个case的代码,这称为“穿透”或“瀑布”效应。
  3. case标签中的常量表达式必须是整数或枚举类型。
  4. default标签是可选的,用于处理没有匹配case的情况。如果没有匹配的case且没有default,程序将跳过整个switch语句继续执行。
  5. switch语句通常用于替代多个if-else语句,使代码更加清晰。

示例

#include <stdio.h>int main() {int day = 4;switch (day) {case 1:printf("Monday");break;case 2:printf("Tuesday");break;// ...case 5:printf("Friday");break;default:printf("Not a typical workday");}return 0;
}

在这个例子中,根据变量day的值,程序将打印出对应的星期名称。由于day被初始化为4,程序将执行case 2下的代码块,并打印出"Tuesday"。

注意事项

  • 确保每个希望终止的case后面都有break语句,以防止穿透效应。
  • switch语句的表达式结果和case标签中的常量表达式都不进行类型转换。
  • 在某些情况下,使用if-else可能比switch更灵活,特别是当涉及到非整数类型或更复杂的逻辑时。

switch语句是C语言中处理多条件分支选择的有用工具,正确使用它可以提高代码的可读性和效率。

  

这篇关于牛客网刷题 | BC77 简单计算器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/963817

相关文章

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

使用EasyExcel实现简单的Excel表格解析操作

《使用EasyExcel实现简单的Excel表格解析操作》:本文主要介绍如何使用EasyExcel完成简单的表格解析操作,同时实现了大量数据情况下数据的分次批量入库,并记录每条数据入库的状态,感兴... 目录前言固定模板及表数据格式的解析实现Excel模板内容对应的实体类实现AnalysisEventLis

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav