C++ 写一个简单的加减法计算器
*************
C++
topic:结构
*************
Structure is a very intersting issue. I really don't like concepts as it is boring. I would like to cases instead. If I want to learn something, donot hesitate to make shits.
Like building a house. When I was at school my dream is to bought a flat in the very top of the building. I stand by the big floor-to-ceiling window watching outside, colourful and busy. The traffic flows and shining neon are the breathes of the city. It has no relation with the structure of the code so forget it. When building the house, structure always comes significant.

Then add some elements and it will superise you.

So I will do some shit first. Here is the beginning of the caculator.
#include <iostream> // 包含输入输出流库int main()
{ // 主函数,程序的起点return 0; // 程序正常结束
}
So think about the work flow, which is the structure of the code.
- 提示用户输入两个整数。
- 读取用户输入,并检查输入是否有效。
- 如果输入无效,给出错误提示。
- 计算加法和减法的结果。
- 输出结果。
And the first thing is input twonumbers:
#include <iostream>int main()
{"请输入第一个整数: ";"请输入第二个整数: ";return 0;
}
Introduce the new friend, namespace. Pay special attention to the line here. Every time the line comes first, a new friend comes second.
namespace 就是 避免命名冲突,举个例子,我叫“ElseWhereR”,在‘学校’这个命名空间,ElseWhereR是校草。在‘公司’这个命名空间中,ElseWhereR是董事长。ElseWhereR是同一个人,但是在不同的命名空间中可以独立,不会互相干扰。
我写的第一个程序,hello world:
#include <iostream>int main() {std::cout << "Hello, World!" << std::endl;return 0;
}
![]() |
But, 我在抄这段代码的时候, std:: 这个我要经常写,非常的繁琐。这个时候就要介绍 namespace这个非常友好的朋友了。这个的作用就是告诉程序,我要自己起名字了。这个的用法如下:
using namespace xjbName;
如果将这项黑科技用在代码中, 在 C++ 中,标准库的所有符号(如 cout、cin 等)都包含在 std 命名空间中。但是值得注意的是,namespace的名字是可以随便取的, using 也是可以省略的。
#include <iostream>
using namespace std;int main() {cout << "Hello, World!" << endl;return 0;
}
经常写代码的都知道,需要告诉计算机数字的类型,这里直接 int,整数的意思:
#include <iostream>int main() {int num1, num2;std::cout << "请输入第一个整数: ";std::cin >> num1;std::cout << "请输入第二个整数: ";std::cin >> num2;int sum = num1 + num2;int difference = num1 - num2;std::cout << "加法结果: " << sum << std::endl;std::cout << "减法结果: " << difference << std::endl;return 0;
}
std::cout <<
std::cin >>
标准用法,完整意思是:
standard:: control output <<
standard:: control intput >>
两个冒号代表,cout属于std里面的一个成员。
注意,开始实战。
将命名空间和主函数分开。这个是一个很好的习惯。
- 命名空间内代码:可以将具体的功能实现和数据定义组织在一起,方便维护和优化相关功能。
- 主函数:保持简洁,只负责程序的启动和核心流程控制,使得代码结构清晰。
进一步保持代码的优雅,可以将命名空间中的代码实现方法分离出来。
命名空间只定义变量的类型:
#include <iostream>// 定义命名空间 JiSuanQi
namespace JiSuanQi
{// 定义两个整数变量int num1, num2;
}
接下来,写一个函数,实现求和、求差的实现方法:
// 定义命名空间 JiSuanQi
namespace JiSuanQi
{// 定义两个整数变量int num1, num2;
}// 在命名空间外实现函数 calculate
void calculate()
{int sum = JiSuanQi::num1 + JiSuanQi::num2;int difference = JiSuanQi::num1 - JiSuanQi::num2;std::cout << "加法结果: " << sum << std::endl;std::cout << "减法结果: " << difference << std::endl;
}
这里,void是固定格式,表示不返回任何东西,只是执行一些操作。
最后,写出主程序。
#include <iostream>// 定义命名空间 JiSuanQi
namespace JiSuanQi
{// 定义两个整数变量int num1, num2;
}// 在命名空间外实现函数 calculate
void calculate()
{int sum = JiSuanQi::num1 + JiSuanQi::num2;int difference = JiSuanQi::num1 - JiSuanQi::num2;std::cout << "加法结果: " << sum << std::endl;std::cout << "减法结果: " << difference << std::endl;
}// 主函数
int main()
{using namespace JiSuanQi;std::cout << "请输入第一个整数: ";std::cin >> num1;std::cout << "请输入第二个整数: ";std::cin >> num2;calculate();return 0;
}
最后输出的结果是:
![]() |
还有一个好玩的,如果另一个程序也想使用加减法,但是他不想再写一遍函数,那么就需要使用 类。既然外部文件想使用这个方法,那么就得定义这个构造函数为 public。
#include <iostream>// 定义命名空间 JiSuanQi
namespace JiSuanQi
{// 定义类 Calculatorclass Calculator{public:int num1; // 第一个整数int num2; // 第二个整数// 构造函数Calculator(int a, int b) : num1(a), num2(b) {}// 计算加法和减法void calculate() const{int sum = num1 + num2;int difference = num1 - num2;std::cout << "加法结果: " << sum << std::endl;std::cout << "减法结果: " << difference << std::endl;}};
}
值得注意的是,构造函数的名字,和类的名字得保持一致。如果不一致,会发生编译错误。
这里的一个语法知识,用来初始化:
Calculator(int a, int b):这是一个 构造函数,其作用是初始化类Calculator的对象。- 参数列表
(int a, int b)表示该构造函数接受两个整数参数a和b。
: num1(a), num2(b):这是 初始化列表,用于在创建对象时初始化类的成员变量。num1(a)表示将成员变量num1的值初始化为参数a。num2(b)表示将成员变量num2的值初始化为参数b。
{}:表示构造函数的函数体。在这个例子中,函数体为空,因为所有的初始化工作都已经在初始化列表中完成。即使为空,花括号也不能省略。
如果你只希望别的程序调用你的计算,你想把num1和num2保护起来,那就加一个 private。
#include <iostream>// 定义命名空间 JiSuanQi
namespace JiSuanQi
{// 定义类 Calculatorclass Calculator{private:int num1; // 第一个整数int num2; // 第二个整数public:// 构造函数Calculator(int a, int b) : num1(a), num2(b) {}// 计算加法和减法void calculate() const{int sum = num1 + num2;int difference = num1 - num2;std::cout << "加法结果: " << sum << std::endl;std::cout << "减法结果: " << difference << std::endl;}};
}
主函数只要进行一点点改变就OK:
#include <iostream>// 定义命名空间 JiSuanQi
namespace JiSuanQi
{// 定义类 Calculatorclass Calculator{private:int num1; // 第一个整数int num2; // 第二个整数public:// 构造函数Calculator(int a, int b) : num1(a), num2(b) {}// 计算加法和减法void calculate() const{int sum = num1 + num2;int difference = num1 - num2;std::cout << "加法结果: " << sum << std::endl;std::cout << "减法结果: " << difference << std::endl;}};
}// 主函数
int main()
{int num1, num2;std::cout << "请输入第一个整数: ";std::cin >> num1;std::cout << "请输入第二个整数: ";std::cin >> num2;// 使用命名空间 JiSuanQi 中的 Calculator 类JiSuanQi::Calculator calc(num1, num2);calc.calculate();return 0;
}
在实际的工作中,类只进行计算,职责单一化。
#include <iostream>// 定义命名空间 JiSuanQi
namespace JiSuanQi
{// 定义类 Calculatorclass Calculator{public:// 构造函数Calculator(int a, int b) : num1(a), num2(b) {}// 计算加法和减法void calculate(){sum = num1 + num2;difference = num1 - num2;}
}
那么,怎么获取计算结果呢?
int getSum() { return sum; }
-
int getSum():-
这是一个成员函数声明。
-
返回类型是
int,表示该函数返回一个整数值。 -
函数名是
getSum,表示该函数用于获取某个值。
-
-
{ return sum; }:-
函数体。
-
表示该函数的实现是直接返回成员变量
sum的值。
-
老鸟程序员会使用 constant,这个是固定搭配,记住只引用不改变:
#include <iostream>// 定义命名空间 JiSuanQi
namespace JiSuanQi
{// 定义类 Calculatorclass Calculator{public:// 构造函数Calculator(int a, int b) : num1(a), num2(b) {}// 计算加法和减法void calculate(){sum = num1 + num2;difference = num1 - num2;}// 获取计算结果int getSum() const { return sum; }int getDifference() const { return difference; }private:int num1; // 第一个整数int num2; // 第二个整数int sum; // 加法结果int difference; // 减法结果};
}
主函数需要 使用命名空间 JiSuanQi 中的 Calculator 类。注意,主函数在使用类中的构造函数的时候,需要对构造函数声明一个对象。具体的在 函数 中有讲到。
C++ 函数-CSDN博客
https://blog.csdn.net/ElseWhereR/article/details/145371006?spm=1001.2014.3001.5501
#include <iostream>// 定义命名空间 JiSuanQi
namespace JiSuanQi
{// 定义类 Calculatorclass Calculator{public:// 构造函数Calculator(int a, int b) : num1(a), num2(b) {}// 计算加法和减法void calculate(){sum = num1 + num2;difference = num1 - num2;}// 获取计算结果int getSum() const { return sum; }int getDifference() const { return difference; }private:int num1; // 第一个整数int num2; // 第二个整数int sum; // 加法结果int difference; // 减法结果};
}// 主函数
int main()
{int num1, num2;std::cout << "请输入第一个整数: ";std::cin >> num1;std::cout << "请输入第二个整数: ";std::cin >> num2;// 使用命名空间 JiSuanQi 中的 Calculator 类JiSuanQi::Calculator calc(num1, num2);calc.calculate();// 在类外部输出结果std::cout << "加法结果: " << calc.getSum() << std::endl;std::cout << "减法结果: " << calc.getDifference() << std::endl;return 0;
}
对象调用构造函数,只需要加个 . 就OK。
calc.calculate();
一般来说,在一个项目中,将 类的定义 和 类的实现 放在同一份文件中,也就是 头文件。
我将类的定义和类的实现保存为 Calculator.h 文件:
#ifndef CALCULATOR_H
#define CALCULATOR_H
#include <iostream>namespace JiSuanQi {class Calculator {public:// 构造函数Calculator(int a, int b) : num1(a), num2(b) {}// 计算加法和减法void calculate() {sum = num1 + num2;difference = num1 - num2;}// 获取计算结果int getSum() const { return sum; }int getDifference() const { return difference; }private:int num1; // 第一个整数int num2; // 第二个整数int sum; // 加法结果int difference; // 减法结果};
}#endif // CALCULATOR_H
那么这个天才的计算逻辑如果斯嘉丽也想使用,那么她在写代码的时候,只需要加上一句话:
#include "Calculator.h"int main() {int num1, num2;std::cout << "请输入第一个整数: ";std::cin >> num1;std::cout << "请输入第二个整数: ";std::cin >> num2;// 创建 Calculator 对象并调用方法JiSuanQi::Calculator calc(num1, num2);calc.calculate();// 输出结果std::cout << "加法结果: " << calc.getSum() << std::endl;std::cout << "减法结果: " << calc.getDifference() << std::endl;return 0;
}
很棒,我大概理解C++的逻辑了。
新年快乐。
相关文章:
C++ 写一个简单的加减法计算器
************* C topic:结构 ************* Structure is a very intersting issue. I really dont like concepts as it is boring. I would like to cases instead. If I want to learn something, donot hesitate to make shits. Like building a house. Wh…...
计算机网络基础 - 链路层(3)
计算机网络基础 链路层和局域网交换局域网链路层寻址地址解析协议 ARP以太网物理拓扑以太网帧结构以太网提供的服务以太网标准 链路层交换机交换机转发和过滤自学习交换机优点交换机和路由器比较 大家好呀!我是小笙,本章我主要分享计算机网络基础 - 链路…...
ray.rllib 入门实践-5: 训练算法
前面的博客介绍了ray.rllib中算法的配置和构建,也包含了算法训练的代码。 但是rllib中实现算法训练的方式不止一种,本博客对此进行介绍。很多教程使用 PPOTrainer 进行训练,但是 PPOTrainer 在最近的 ray 版本中已经取消了。 环境配置&#x…...
FPGA 使用 CLOCK_LOW_FANOUT 约束
使用 CLOCK_LOW_FANOUT 约束 您可以使用 CLOCK_LOW_FANOUT 约束在单个时钟区域中包含时钟缓存负载。在由全局时钟缓存直接驱动的时钟网段 上对 CLOCK_LOW_FANOUT 进行设置,而且全局时钟缓存扇出必须低于 2000 个负载。 注释: 当与其他时钟约束配合…...
选择的阶段性质疑
条条大路通罗马,每个人选择的道路,方向并不一样,但不妨碍都可以到达终点,而往往大家会更推崇自己走过的路径。 自己靠什么走向成功,自己用了什么方法,奉行什么原则或者理念,也会尽可能传播这种&…...
固有频率与模态分析
目录 引言 1. 固有频率:物体的“天生节奏” 1.1 定义 1.2 关键特点 1.3 实际意义 2. 有限元中的模态分析:给结构“体检振动” 2.1 模态分析的意义 2.2 实际案例 2.2.1 桥梁模态分析 2.2.2 飞机机翼模态分析 2.2.3 具体事例 3. 模态分析的工具…...
数科OFD证照生成原理剖析与平替方案实现
一、 引言 近年来,随着电子发票的普及,OFD格式作为我国电子发票的标准格式,其应用范围日益广泛。然而,由于不同软件生成的OFD文件存在差异,以及用户对OFD文件处理需求的多样化,OFD套餐转换工具应运而生。本…...
CAN总线数据采集与分析
CAN总线数据采集与分析 目录 CAN总线数据采集与分析1. 引言2. 数据采集2.1 数据采集简介2.2 数据采集实现3. 数据分析3.1 数据分析简介3.2 数据分析实现4. 数据可视化4.1 数据可视化简介4.2 数据可视化实现5. 案例说明5.1 案例1:数据采集实现5.2 案例2:数据分析实现5.3 案例3…...
SpringSecurity:There is no PasswordEncoder mapped for the id “null“
文章目录 一、情景说明二、分析三、解决 一、情景说明 在整合SpringSecurity功能的时候 我先是去实现认证功能 也就是,去数据库比对用户名和密码 相关的类: UserDetailsServiceImpl implements UserDetailsService 用于SpringSecurity查询数据库 Logi…...
ResNet 残差网络
目录 网络结构 残差块(Residual Block) ResNet网络结构示意图 残差块(Residual Block)细节 基本残差块(ResNet-18/34) Bottleneck残差块(ResNet-50/101/152) 残差连接类型对比 变体网…...
CAPL编程常见问题与解决方案深度解析
CAPL编程常见问题与解决方案深度解析 目录 CAPL编程常见问题与解决方案深度解析引言1. CAPL编程核心难点剖析1.1 典型问题分类2. 六大典型问题场景解析案例1:定时器资源竞争导致逻辑错乱2.1.1 问题现象2.1.2 根因分析2.1.3 解决方案案例2:大数据量报文处理引发性能瓶颈2.2.1 …...
信号处理以及队列
下面是一个使用C和POSIX信号处理以及队列的简单示例。这个示例展示了如何使用信号处理程序将信号放入队列中,并在主循环中处理这些信号。 #include <iostream> #include <csignal> #include <queue> #include <mutex> #include <thread…...
Linux pkill 命令使用详解
简介 pkill 命令用于根据进程名称、用户、组或其他属性终止进程。它是 procps-ng 包的一部分,通常比 kill 更受欢迎,因为它无需查找进程 ID (PID)。 常用选项 -<signal>, --signal <signal>:定义要发送给每个匹配进程的信号&am…...
react注意事项
1.状态的定义以及修改 2.排序用lodash进行排序 import _ from lodassh 3.利用className插件进行动态类名的使用 4.表单使用 5.react中获取dom...
【开源免费】基于SpringBoot+Vue.JS在线考试学习交流网页平台(JAVA毕业设计)
本文项目编号 T 158 ,文末自助获取源码 \color{red}{T158,文末自助获取源码} T158,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
怎样在PPT中启用演讲者视图功能?
怎样在PPT中启用演讲者视图功能? 如果你曾经参加过重要的会议或者演讲,你就会知道,演讲者视图(Presenter View)对PPT展示至关重要。它不仅能帮助演讲者更好地掌控演讲节奏,还能提供额外的提示和支持&#…...
UE AController
定义和功能 AController是一种特定于游戏的控制器,在UE框架中用于定义玩家和AI的控制逻辑。AController负责处理玩家输入,并根据这些输入驱动游戏中的角色或其他实体的行为。设计理念 AController设计用于分离控制逻辑与游戏角色,增强游戏设计…...
H264原始码流格式分析
1.H264码流结构组成 H.264裸码流(Raw Bitstream)数据主要由一系列的NALU(网络抽象层单元)组成。每个NALU包含一个NAL头和一个RBSP(原始字节序列载荷)。 1.1 H.264码流层次 H.264码流的结构可以分为两个层…...
JAVA 接口、抽象类的关系和用处 详细解析
接口 - Java教程 - 廖雪峰的官方网站 一个 抽象类 如果实现了一个接口,可以只选择实现接口中的 部分方法(所有的方法都要有,可以一部分已经写具体,另一部分继续保留抽象),原因在于: 抽象类本身…...
反向代理模块b
1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说,反向代理就相当于…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...


