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

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.

  1. 提示用户输入两个整数。
  2. 读取用户输入,并检查输入是否有效。
  3. 如果输入无效,给出错误提示。
  4. 计算加法和减法的结果。
  5. 输出结果。

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++ 中,标准库的所有符号(如 coutcin 等)都包含在 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) 表示该构造函数接受两个整数参数 ab

  • : 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; }
  1. int getSum()

    • 这是一个成员函数声明。

    • 返回类型是 int,表示该函数返回一个整数值。

    • 函数名是 getSum,表示该函数用于获取某个值。

  2. { 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&#xff1a;结构 ************* 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以太网物理拓扑以太网帧结构以太网提供的服务以太网标准 链路层交换机交换机转发和过滤自学习交换机优点交换机和路由器比较 大家好呀&#xff01;我是小笙&#xff0c;本章我主要分享计算机网络基础 - 链路…...

ray.rllib 入门实践-5: 训练算法

前面的博客介绍了ray.rllib中算法的配置和构建&#xff0c;也包含了算法训练的代码。 但是rllib中实现算法训练的方式不止一种&#xff0c;本博客对此进行介绍。很多教程使用 PPOTrainer 进行训练&#xff0c;但是 PPOTrainer 在最近的 ray 版本中已经取消了。 环境配置&#x…...

FPGA 使用 CLOCK_LOW_FANOUT 约束

使用 CLOCK_LOW_FANOUT 约束 您可以使用 CLOCK_LOW_FANOUT 约束在单个时钟区域中包含时钟缓存负载。在由全局时钟缓存直接驱动的时钟网段 上对 CLOCK_LOW_FANOUT 进行设置&#xff0c;而且全局时钟缓存扇出必须低于 2000 个负载。 注释&#xff1a; 当与其他时钟约束配合…...

选择的阶段性质疑

条条大路通罗马&#xff0c;每个人选择的道路&#xff0c;方向并不一样&#xff0c;但不妨碍都可以到达终点&#xff0c;而往往大家会更推崇自己走过的路径。 自己靠什么走向成功&#xff0c;自己用了什么方法&#xff0c;奉行什么原则或者理念&#xff0c;也会尽可能传播这种&…...

固有频率与模态分析

目录 引言 1. 固有频率&#xff1a;物体的“天生节奏” 1.1 定义 1.2 关键特点 1.3 实际意义 2. 有限元中的模态分析&#xff1a;给结构“体检振动” 2.1 模态分析的意义 2.2 实际案例 2.2.1 桥梁模态分析 2.2.2 飞机机翼模态分析 2.2.3 具体事例 3. 模态分析的工具…...

数科OFD证照生成原理剖析与平替方案实现

一、 引言 近年来&#xff0c;随着电子发票的普及&#xff0c;OFD格式作为我国电子发票的标准格式&#xff0c;其应用范围日益广泛。然而&#xff0c;由于不同软件生成的OFD文件存在差异&#xff0c;以及用户对OFD文件处理需求的多样化&#xff0c;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功能的时候 我先是去实现认证功能 也就是&#xff0c;去数据库比对用户名和密码 相关的类&#xff1a; UserDetailsServiceImpl implements UserDetailsService 用于SpringSecurity查询数据库 Logi…...

ResNet 残差网络

目录 网络结构 残差块&#xff08;Residual Block&#xff09; ResNet网络结构示意图 残差块&#xff08;Residual Block&#xff09;细节 基本残差块&#xff08;ResNet-18/34&#xff09; Bottleneck残差块&#xff08;ResNet-50/101/152&#xff09; 残差连接类型对比 变体网…...

CAPL编程常见问题与解决方案深度解析

CAPL编程常见问题与解决方案深度解析 目录 CAPL编程常见问题与解决方案深度解析引言1. CAPL编程核心难点剖析1.1 典型问题分类2. 六大典型问题场景解析案例1:定时器资源竞争导致逻辑错乱2.1.1 问题现象2.1.2 根因分析2.1.3 解决方案案例2:大数据量报文处理引发性能瓶颈2.2.1 …...

信号处理以及队列

下面是一个使用C和POSIX信号处理以及队列的简单示例。这个示例展示了如何使用信号处理程序将信号放入队列中&#xff0c;并在主循环中处理这些信号。 #include <iostream> #include <csignal> #include <queue> #include <mutex> #include <thread…...

Linux pkill 命令使用详解

简介 pkill 命令用于根据进程名称、用户、组或其他属性终止进程。它是 procps-ng 包的一部分&#xff0c;通常比 kill 更受欢迎&#xff0c;因为它无需查找进程 ID (PID)。 常用选项 -<signal>, --signal <signal>&#xff1a;定义要发送给每个匹配进程的信号&am…...

react注意事项

1.状态的定义以及修改 2.排序用lodash进行排序 import _ from lodassh 3.利用className插件进行动态类名的使用 4.表单使用 5.react中获取dom...

【开源免费】基于SpringBoot+Vue.JS在线考试学习交流网页平台(JAVA毕业设计)

本文项目编号 T 158 &#xff0c;文末自助获取源码 \color{red}{T158&#xff0c;文末自助获取源码} T158&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

怎样在PPT中启用演讲者视图功能?

怎样在PPT中启用演讲者视图功能&#xff1f; 如果你曾经参加过重要的会议或者演讲&#xff0c;你就会知道&#xff0c;演讲者视图&#xff08;Presenter View&#xff09;对PPT展示至关重要。它不仅能帮助演讲者更好地掌控演讲节奏&#xff0c;还能提供额外的提示和支持&#…...

UE AController

定义和功能 AController是一种特定于游戏的控制器&#xff0c;在UE框架中用于定义玩家和AI的控制逻辑。AController负责处理玩家输入&#xff0c;并根据这些输入驱动游戏中的角色或其他实体的行为。设计理念 AController设计用于分离控制逻辑与游戏角色&#xff0c;增强游戏设计…...

H264原始码流格式分析

1.H264码流结构组成 H.264裸码流&#xff08;Raw Bitstream&#xff09;数据主要由一系列的NALU&#xff08;网络抽象层单元&#xff09;组成。每个NALU包含一个NAL头和一个RBSP&#xff08;原始字节序列载荷&#xff09;。 1.1 H.264码流层次 H.264码流的结构可以分为两个层…...

JAVA 接口、抽象类的关系和用处 详细解析

接口 - Java教程 - 廖雪峰的官方网站 一个 抽象类 如果实现了一个接口&#xff0c;可以只选择实现接口中的 部分方法&#xff08;所有的方法都要有&#xff0c;可以一部分已经写具体&#xff0c;另一部分继续保留抽象&#xff09;&#xff0c;原因在于&#xff1a; 抽象类本身…...

反向代理模块b

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...

软件工程 期末复习

瀑布模型&#xff1a;计划 螺旋模型&#xff1a;风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合&#xff1a;模块内部功能紧密 模块之间依赖程度小 高内聚&#xff1a;指的是一个模块内部的功能应该紧密相关。换句话说&#xff0c;一个模块应当只实现单一的功能…...