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
{
    // 定义类 Calculator
    class 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
{
    // 定义类 Calculator
    class 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
{
    // 定义类 Calculator
    class 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
{
    // 定义类 Calculator
    class 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
{
    // 定义类 Calculator
    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; // 减法结果
    };
}

主函数需要 使用命名空间 JiSuanQi 中的 Calculator 类。注意,主函数在使用类中的构造函数的时候,需要对构造函数声明一个对象。具体的在 函数 中有讲到。

C++ 函数-CSDN博客https://blog.csdn.net/ElseWhereR/article/details/145371006?spm=1001.2014.3001.5501

#include <iostream>

// 定义命名空间 JiSuanQi
namespace JiSuanQi
{
    // 定义类 Calculator
    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; // 减法结果
    };
}

// 主函数
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++的逻辑了。

新年快乐。                

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

我的2024年博客总结(在工作、博客和生活中找到自己的生活节奏)

文章目录 ⭐前言⭐工作和博客的关联⭐找到自己的生活节奏⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文主要写2024年博客总结&#xff0c;关于在工作、博客和生活中找到自己的生活节奏。 node系列往期文章 node_windows环境变量配置 node_npm发布包 linux_配置…

【视频+图文详解】HTML基础1-html和css介绍、上网原理

图文详解 html介绍 概念&#xff1a;html是超文本标记语言的缩写&#xff0c;其英文全称为HyperText Markup Language&#xff0c;是用来搭建网站结构的语言&#xff0c;比如网页上的文字&#xff0c;按钮&#xff0c;图片&#xff0c;视频等。html的版本分为1.0、2.0、3.0、…

VT:优化LLM推理过程的记忆与探索

&#x1f4d6;标题&#xff1a;LLMs Can Plan Only If We Tell Them &#x1f310;来源&#xff1a;arXiv, 2501.13545 &#x1f31f;摘要 &#x1f538;大型语言模型&#xff08;LLM&#xff09;在自然语言处理和推理方面表现出了显著的能力&#xff0c;但它们在自主规划方面…

C++并发编程指南07

文章目录 [TOC]5.1 内存模型5.1.1 对象和内存位置图5.1 分解一个 struct&#xff0c;展示不同对象的内存位置 5.1.2 对象、内存位置和并发5.1.3 修改顺序示例代码 5.2 原子操作和原子类型5.2.1 标准原子类型标准库中的原子类型特殊的原子类型备选名称内存顺序参数 5.2.2 std::a…

日志收集Day007

1.配置ES集群TLS认证: (1)elk101节点生成证书文件 cd /usr/share/elasticsearch ./bin/elasticsearch-certutil cert -out config/elastic-certificates.p12 -pass "" --days 3650 (2)elk101节点为证书文件修改属主和属组 chown elasticsearch:elasticsearch con…

AJAX综合案例——图书管理

黑马程序员视频地址&#xff1a; AJAX-Day02-10.案例_图书管理AJAX-Day02-10.案例_图书管理_总结_V1.0是黑马程序员前端AJAX入门到实战全套教程&#xff0c;包含学前端框架必会的&#xff08;ajaxnode.jswebpackgit&#xff09;&#xff0c;一套全覆盖的第25集视频&#xff0c…

Linux_线程同步生产者消费者模型

同步的相关概念 同步&#xff1a;在保证数据安全的前提下&#xff0c;让线程能够按照某种特定的顺序访问临界资源&#xff0c;从而有效避免饥饿问题&#xff0c;叫做同步竞态条件&#xff1a;因为时序问题&#xff0c;而导致程序异常&#xff0c;我们称之为竞态条件。 同步的…

Qt u盘自动升级软件

Qt u盘自动升级软件 Chapter1 Qt u盘自动升级软件u盘自动升级软件思路&#xff1a;step1. 获取U盘 判断U盘名字是否正确&#xff0c; 升级文件是否存在。step2. 升级step3. 升级界面 Chapter2 Qt 嵌入式设备应用程序&#xff0c;通过U盘升级的一种思路Chapter3 在开发板上运行的…

拦截器快速入门及详解

拦截器Interceptor 快速入门 什么是拦截器&#xff1f; 是一种动态拦截方法调用的机制&#xff0c;类似于过滤器。 拦截器是Spring框架中提供的&#xff0c;用来动态拦截控制器方法的执行。 拦截器的作用&#xff1a;拦截请求&#xff0c;在指定方法调用前后&#xff0c;根…

信息安全专业优秀毕业设计选题汇总:热点选题

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光&#xff0c;一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理…

Linux中使用unzip

安装命令 yum install unzip unzip常用选项和参数 选项 说明 -q 隐藏解压过程中的消息输出 -d /path/to/directory 指定解压文件的目标目录 -P password 如果.zip文件被密码保护&#xff0c;使用此选项可以指定打开文件所需的密码 解压命令 unzip 要解压的压缩包unz…

ThreadLocal源码解析

文章目录 一、概述二、get()方法三、set()方法四、可能导致的内存泄漏问题五、remove六、思考&#xff1a;为什么要将ThreadLocalMap的value设置为强引用&#xff1f; 一、概述 ThreadLocal是线程私有的&#xff0c;独立初始化的变量副本。存放在和线程进行绑定的ThreadLocalMa…

批量解密,再也没有任何限制了

有的时候我们在网上下载了PDF文档。发现没有办法进行任何的操作&#xff0c;就连打印权限都没有。今天给大家介绍的这个软件可以一键帮你进行PDF解密&#xff0c;非常方便&#xff0c;完全免费。 PDF智能助手 批量解密PDF文件 这个软件不是很大&#xff0c;只有10MB&#xff…

《LLM大语言模型+RAG实战+Langchain+ChatGLM-4+Transformer》

文章目录 Langchain的定义Langchain的组成三个核心组件实现整个核心组成部分 为什么要使用LangchainLangchain的底层原理Langchain实战操作LangSmithLangChain调用LLM安装openAI库-国内镜像源代码运行结果小结 使用Langchain的提示模板部署Langchain程序安装langserve代码请求格…

车载软件 --- 大一新生入门汽车零部件嵌入式开发

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…

有效运作神经网络

内容来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习所用。 文章目录 训练集、验证集、测试集偏差、方差正则化正则化参数为什么正则化可以减少过拟合Dropout正则化Inverted Dropout其他的正则化方法数据增广Early stopping 归一化梯度消失与梯度爆…

【深度优先搜索篇】走迷宫的魔法:算法如何破解迷宫的神秘密码

当你在夜晚孤军奋战时&#xff0c;满天星光以为你而闪烁。 欢迎拜访&#xff1a;羑悻的小杀马特.-CSDN博客 本篇主题&#xff1a;轻轻松松拿捏洛谷走迷宫问题 制作日期&#xff1a;2024.12.31 隶属专栏&#xff1a;C/C题海汇总 首先我…

SQL进阶实战技巧:如何分析浏览到下单各步骤转化率及流失用户数?

目录 0 问题描述 1 数据准备 2 问题分析 3 问题拓展 3.1 跳出率计算 3.2 计算从浏览商品到支付订单的不同路径的用户数&#xff0c;并按照用户数降序排列。 往期精彩 0 问题描述 统计从浏览商品到最终下单的各个步骤的用户数和流失用户数,并计算转化率 用户表结构和…

Autosar-Os是怎么运行的?(内存保护)

写在前面&#xff1a; 入行一段时间了&#xff0c;基于个人理解整理一些东西&#xff0c;如有错误&#xff0c;欢迎各位大佬评论区指正&#xff01;&#xff01;&#xff01; 1.功能概述 以TC397芯片为例&#xff0c;英飞凌芯片集成了MPU模块&#xff0c; MPU模块采用了硬件机…

什么是Maxscript?为什么要学习Maxscript?

MAXScript是Autodesk 3ds Max的内置脚本语言,它是一种与3dsMax对话并使3dsMax执行某些操作的编程语言。它是一种脚本语言,这意味着您不需要编译代码即可运行。通过使用一系列基于文本的命令而不是使用UI操作,您可以完成许多使用UI操作无法完成的任务。 Maxscript是一种专有…