新手练习项目 5:简易计算器(C++)

名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼《定风波·莫听穿林打叶声》
Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder)

目录

      • 一、效果图
      • 二、代码(带注释)
      • 三、说明

一、效果图

在这里插入图片描述

二、代码(带注释)

//创作者:Code_流苏(CSDN)
//未经允许,禁止转载发布,可自己学习使用
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;// 计算函数,根据不同的运算符执行相应的计算
double calculate(double num1, double num2, char oper) {switch(oper) {// 基本运算case '+': return num1 + num2;case '-': return num1 - num2;case '*': return num1 * num2;case '/': if(num2 != 0) return num1 / num2;else {cout << "错误:除数不能为0。" << endl;return NAN; // 返回非数值}// 扩展运算case '^': return pow(num1, num2); // 幂运算case 'R': return sqrt(num1);      // 平方根case 'A': return abs(num1);       // 绝对值case 'S': return sin(num1);       // 正弦case 'C': return cos(num1);       // 余弦case 'T': return tan(num1);       // 正切case 'L': return log(num1);       // 自然对数case 'G': return log10(num1);     // 常用对数// 其他功能可以继续添加default:cout << "无效的运算符" << endl;return NAN;}
}int main() {double num1, num2;char oper;char choice;vector<string> history; // 历史记录向量,用于存储所有计算do {// 输入第一个数字,并进行有效性检查cout << "输入第一个数字: ";while(!(cin >> num1)){cout << "无效的输入,请输入一个数字: ";cin.clear();cin.ignore(123, '\n');}// 输入运算符cout << "输入运算符 (+, -, *, /, ^, R, A, S, C, T, L, G): ";cin >> oper;// 对于需要两个操作数的运算符,输入第二个数字if(oper == '+' || oper == '-' || oper == '*' || oper == '/' || oper == '^') {cout << "输入第二个数字: ";while(!(cin >> num2)){cout << "无效的输入,请输入一个数字: ";cin.clear();cin.ignore(123, '\n');}}// 执行计算并输出结果double result = calculate(num1, num2, oper);if (!isnan(result)) {cout << "结果: " << result << endl;// 保存计算记录history.push_back(to_string(num1) + " " + oper + " " + to_string(num2) + " = " + to_string(result));}// 询问用户是否继续cout << "是否继续? (y/n): ";cin >> choice;} while(choice == 'y' || choice == 'Y');// 在程序结束前打印历史记录cout << "\n计算历史:" << endl;for(const auto& record : history) {cout << record << endl;}return 0;
}

三、说明

上述代码实现了一个简易的命令行计算器程序,使用C++编写。它可以执行基本的算术运算以及一些扩展运算。下面是对这个程序的主要功能和结构的概述:

  1. 函数 calculate:

    • 这个函数根据传入的两个数字(num1, num2)和一个运算符(oper),执行相应的计算。
    • 支持的运算包括基本的加、减、乘、除,以及幂运算、平方根、绝对值、三角函数(正弦、余弦、正切)、对数(自然对数和常用对数)。
    • 如果遇到除以零的情况,程序会输出错误信息,并返回一个非数值(NAN)。
    • 如果输入了无效的运算符,程序也会输出错误信息,并返回 NAN
  2. 主函数 main:

    • 程序在一个循环中运行,允许用户进行多次计算。
    • 用户首先输入第一个数字,程序会检查输入的有效性。
    • 然后输入一个运算符。
    • 对于需要两个操作数的运算(如加、减、乘、除、幂运算),程序会要求输入第二个数字,并进行有效性检查。
    • 程序调用 calculate 函数执行计算,并输出结果。
    • 计算结果会被保存在 history 向量中,以便于程序结束前显示所有的计算历史。
    • 用户可以选择是否继续进行更多的计算。
  3. 错误处理:

    • 输入数字时,如果用户输入了非数字的内容,程序会提示重新输入,并清除错误状态和忽略无效输入。
    • 在进行除法时,如果除数为零,程序会输出错误信息。
  4. 计算历史记录:

    • 程序使用一个 vector<string> 来存储所有的计算历史。
    • 在用户结束计算时,程序会打印出所有的计算记录。

Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder)
点赞加关注,收藏不迷路!本篇文章对你有帮助的话,还请多多点赞支持!

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

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

相关文章

HTML--图片

HTML中使用 img标签来显示一张图片 它有三个属性&#xff1a; src alt tiltle src属性&#xff1a; 图片路径建议为相对路径&#xff0c;以免文件移动造成无法正常工作 用法&#xff1a; <img src"图片路径和名字"><!DOCTYPE html> <html> <…

QWebEngineView类方法、属性、信号与槽汇总

文章目录 📖 介绍 📖🏡 环境 🏡📒 使用方法 📒📝 使用示例📝 方法📝 属性📝 信号(Signals)📝 槽(Slots)⚓️ 相关链接 ⚓️📖 介绍 📖 QWebEngineView 是 Qt 提供的一个用于呈现 Web 内容的类,基于 Google 的 Chromium 浏览器引擎。它提供了对现…

Mac M1 Parallels CentOS7.9 Install Jenkins

官网: https://www.jenkins.io/ 一、Install & Check Java Env Oracle官网下载Java: https://www.oracle.com/cn/ # 拷贝到Jenkins服务器 scp Downloads/jdk-8u391-linux-aarch64.tar.gz root10.211.55.34:~# 解压 mkdir -p /opt/java && tar -zxvf jdk-8u391-li…

电脑上不安装Oracle,但是虚拟机装了Oracle,怎么连接到虚拟机里的Oracle数据库呢?

1、准备工作 1.1、确定数据库版本信息 注&#xff1a;如果知道数据库的版本信息&#xff0c;这个步骤可以跳过。 比较简单的方法&#xff0c;直接看数据库的安装位置&#xff0c;也就是数字&#xff08;但是这个方法确定就是&#xff0c;不好确定是多少位的数据库&#xff09;…

使用pandas按照商品和下单人统计下单数据

目录 一&#xff1a;需求描述 二&#xff1a;代码实现 三&#xff1a;注意事项 一&#xff1a;需求描述 最近运营那边给到一个excel表格&#xff0c;是一个小程序用户的下单数据&#xff0c;要以商品为维度&#xff0c;统计用户下单情况&#xff0c;主要是下单的商品总金额&…

CMake+大漠插件的应用开发——处理dm.dll,免注册调用大漠插件

文章目录 CMake大漠插件的应用开发——处理dm.dll&#xff0c;免注册调用大漠插件简介环境项目结构配置编译环境编码-直接调用 dll编码-生成tlh文件&#xff0c;便于提示 CMake大漠插件的应用开发——处理dm.dll&#xff0c;免注册调用大漠插件 简介 网上有一种使用方式是&am…

Navicat连接不上虚拟机中linux的dockers创建的mysql

说明&#xff1a;这个问题可能只是我的个人问题&#xff0c;记录一下吧。当发现这个问题的时候&#xff0c;去网上搜素了一下&#xff0c;搜到的文章基本上都是通过在mysql中设置允许远程访问解决的&#xff0c;然后我也跟着尝试了一下&#xff0c;问题并没有解决。后面就乱七八…

allegro PCB设计心得笔记(二) PCB板框设计心得

Cadence Allegro软件设计PCB板框时&#xff0c;使用Add -> line&#xff0c;在Option选择Board Geometry/Outline&#xff0c;根据PCB需要输入对应坐标&#xff0c;设计好板框。 使用Z-Copy命令设计Route Keepin和Package Keepin时&#xff0c;需要先使用使用Shape -> Co…

【Python】Python语言 3小时速通(有C语言基础版)

python从入门到实践 变量 message"hello world"并不需要指出变量类型 方法 tittle()#以首字母大写的形式输出单词upper()#全部大写输出lower()#全部小写输出存储数据时经常使用lower&#xff0c;因为无法确保数据是大写还是小写 rstrip()#输出删除字符串尾部多余…

YOLOv5涨点改进:多层次特征融合(SDI),小目标涨点明显,| UNet v2,比UNet显存占用更少、参数更少

💡💡💡本文全网独家改进:多层次特征融合(SDI),能够显著提升不同尺度和小目标的识别率 💡💡💡在YOLOv5中如何使用 1)iAFF加入Neck替代Concat; 💡💡💡Yolov5/Yolov7魔术师,独家首发创新(原创),适用于Yolov5、Yolov7、Yolov8等各个Yolo系列,专栏文…

RabbitMQ 的基本概念

一 MQ 的基本概念 1 MQ概述 MQ全称 Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。消息队列就是所谓的存放消息的队列。 消息队列解决的不是存放消息的队列的⽬的&#xff0c;解决的是通信问…

三、GCC编译:链接

代码准备 main.c extern int shared; extern void func(int *a, int *b); int main(){int a 100;func(&a, &shared);return 0; }func.c int shared 1; int tmp 0; void func(int *a, int *b){tmp *a;*a *b;*b tmp; }静态链接 编译 gcc -static -fno-stack-p…

TypeScript学习笔记、鸿蒙开发学习笔记

变量定义方式 # 变量声明 let msg: string douzi console.log(msg) let num: number 20 console.log(num) let end: boolean true console.log("end" end) let a: any 10 a douzi console.log(a) let p {name:"douzi",age:20} console.log(p.name)…

cmake-将源文件编译为可执行文件

文章目录 准备工作创建cmake文件编译源代码需要的文件不在同一个文件夹的情况 准备工作 首先我们准备三个文件 add.h int add(int a,int b);add.cpp int add(int a,int b) {return ab; }main.cpp #include "add.h" #include <iostream> int main() {in…

Multi-Concept Customization of Text-to-Image Diffusion——【代码复现】

本文是发表于CVPR 2023上的一篇论文&#xff1a;[2212.04488] Multi-Concept Customization of Text-to-Image Diffusion (arxiv.org) 一、引言 本文主要做的工作是对stable-diffusion的预训练模型进行微调&#xff0c;需要的显存相对较多&#xff0c;论文中测试时是在两块GP…

ssh远程登录协议

目录 一、ssh协议定义及特点 &#xff08;一&#xff09;ssh协议简介 &#xff08;二&#xff09;ssh协议的主要特点 二、ssh传输原理 三、sshd服务 &#xff08;一&#xff09;配置文件 &#xff08;二&#xff09;基本用法 1.直接连接 2.连接指定用户 3.指定端口号…

设计模式之策略模式【行为型模式】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某…

十分钟教你在 k8s 中部署一个前后端应用

好多开发人员&#xff0c;尤其是没接触过 k8s 的人员对如何在k8s中部署一个 前后端应用很模糊&#xff0c;不知如何下手&#xff0c;所以本篇讲一下如何快速在 k8s 部署一个前后端应用&#xff0c;让大家对k8s有个快速认识 前置依赖 k8s集群&#xff0c;如果没有安装&#xff0…

什么是RoPE-旋转位置编码?

RoPE位置编码是大模型中最常见的位置编码之一。像是谷歌的PaLM和meta的LLaMA等开源大模型都是RoPE位置编码&#xff0c;那么RoPE有什么特点呢&#xff1f; 本文将介绍如下内容&#xff1a; RoPE旋转位置编码概要什么是位置编码&#xff1f;RoPE及其特点总结 一、RoPE旋转位置…

stm32学习笔记:DMA

每个DMA通道硬件触发源是不一样的&#xff0c;要使用某个外设的硬件触发源&#xff0c;就必须使用它连接的那个通道 12个独立可配置的通道&#xff1a;DMA1(7个通道)&#xff0c;DMA2(5个通道) 每个通道都支持软件触发和特定的硬件触发 C8T6 DMA资源&#xff1a;DMA1 &#xff…