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 反向代理概念 反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说,反向代理就相当于…...
中文文本结构化落地指南:BERT-通用领域模型多行业应用案例
中文文本结构化落地指南:BERT-通用领域模型多行业应用案例 1. 文本分割技术背景 在日常工作和学习中,我们经常会遇到大段的连续文本,比如会议记录、讲座文稿、采访实录等。这些文本通常缺乏段落分隔,读起来费时费力,…...
解锁旧Mac新生命:技术伙伴如何突破苹果限制
解锁旧Mac新生命:技术伙伴如何突破苹果限制 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否曾想过,那些被苹果官方"抛弃"的老旧Ma…...
电容器阻抗与ESR频率特性解析:从理论到高频应用实践
1. 电容器阻抗与ESR的基础原理 当你第一次听说电容器有"阻抗"和"ESR"时,可能会觉得这是两个高深莫测的专业术语。其实理解它们并不难,就像理解水管里的水流一样直观。想象一下,电容器就像是一个储水罐,而阻抗…...
APK Studio安全最佳实践:合规使用逆向工程工具
APK Studio安全最佳实践:合规使用逆向工程工具 【免费下载链接】apkstudio Open-source, cross platform Qt based IDE for reverse-engineering Android application packages. 项目地址: https://gitcode.com/gh_mirrors/ap/apkstudio 在移动应用开发与安全…...
别再只调API了!用Langchain4j的RAG功能,5分钟给你的Java应用加上专属知识库
用Langchain4j的RAG功能为Java应用快速构建智能知识库 在当今信息爆炸的时代,企业内部的文档资料往往分散在各个角落,员工需要花费大量时间查找相关信息。传统的全文检索方式虽然能解决部分问题,但当用户用自然语言提问时,往往难…...
吃透Redis核心数据结构:从原理到实战,避开90%的坑
Redis之所以能成为分布式系统的“性能神器”,核心在于其高效的内存数据结构设计。很多开发者对Redis的认知停留在“SET/GET缓存”,只会用最基础的字符串类型,却忽略了List、Hash、Set、ZSet等核心结构的强大能力,导致代码冗余、性…...
学术探险家的秘密武器:书匠策AI,解锁课程论文新宇宙!
在学术的浩瀚星空中,每一位学子都是勇敢的探险家,怀揣着对知识的渴望,踏上探索未知的征途。而课程论文,则是这场探险中不可或缺的“星际导航图”,指引着我们穿越知识的迷雾,抵达真理的彼岸。但你是否曾遇到…...
Altium Designer新手必看:5分钟搞定PCB封装库创建(附3D模型导入技巧)
Altium Designer新手实战:从零构建PCB封装库与3D模型高效导入 刚接触Altium Designer的工程师常被PCB封装库的创建难住——焊盘尺寸怎么定?丝印如何对齐?3D模型能否可视化验证?这些问题直接关系到后期PCB设计的成功率。本文将用最…...
VibeVoice多音色展示:从儿童到老人的自然过渡效果
VibeVoice多音色展示:从儿童到老人的自然过渡效果 1. 引言 你有没有想过,一段文字可以同时用儿童的天真嗓音、青年的清澈声线、中年的沉稳语调,以及老者的沧桑音色来演绎?这不是科幻电影中的场景,而是VibeVoice带来的…...
SpringBoot+Mybatis多数据源实战:TDengine与MySQL混搭的物联网数据存储方案
SpringBootMybatis多数据源实战:TDengine与MySQL混搭的物联网数据存储方案 在物联网系统开发中,数据存储架构的设计往往面临一个核心矛盾:海量设备时序数据的高效存储与业务数据的复杂关系处理如何平衡?传统单一数据库方案要么在时…...


