C++ 写一个简单的加减法计算器

news/2025/2/3 6:42:05/

*************

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++的逻辑了。

新年快乐。                


http://www.ppmy.cn/news/1568888.html

相关文章

恢复二叉搜索树(99)

99. 恢复二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 相关算法&#xff1a;二叉树前序遍历&#xff08;144&#xff09;、中序遍历&#xff08;94&#xff09;、后序遍历&#xff08;145&#xff09;-CSDN博客 官方解法&#xff1a; /*** Definition for a binary t…

异常检测概述

异常检测&#xff08;Anomaly Detection&#xff09;概述 异常检测是机器学习与深度学习中的重要研究课题&#xff0c;旨在识别数据中与大多数样本显著偏离的异常样本&#xff08;离群点&#xff09;。其核心挑战在于&#xff1a;异常通常缺乏明确的定义、样本极少且分布复杂。…

电子电气架构 --- 车载电子和软件架构概述

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

从实验室到现实,机器人泛化的秘密:Scaling Law如何重塑机器人学习

—机器人领域Scaling Law&#xff08;规模定律&#xff09;的核心内容与应用 1.Scaling Law的核心表现 • 幂律关系&#xff1a; 机器人策略的泛化能力与训练数据的环境数量、物体数量及组合数量呈幂律关系。例如&#xff0c;模型性能与训练物体数量的幂次方成正比&#xff0…

Electron工具Electron Fiddle

参考链接&#xff1a; https://www.electronjs.org/zh/docs/latest/tutorial/examples https://blog.csdn.net/qq_41887214/article/details/131384850

从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(OLED设备层封装)

目录 OLED设备层驱动开发 如何抽象一个OLED 完成OLED的功能 初始化OLED 清空屏幕 刷新屏幕与光标设置1 刷新屏幕与光标设置2 刷新屏幕与光标设置3 绘制一个点 反色 区域化操作 区域置位 区域反色 区域更新 区域清空 测试我们的抽象 整理一下&#xff0c;我们应…

电信传输基本理论/5G网络层次架构——超三万字详解:适用期末考试/考研/工作

电信传输的基本概念 信息、通信、电信、电信传输的定义 信息 信息指的是消息中的有效信息量 通信 通信指的是利用传输媒质将信息从一段传输到另一端 电信 电信的意思是利用电子技术来将信息从一段传输到另一端 电信传输 电信传输的概念就是将含有信息的电信号进行传输…

TensorFlow 示例摄氏度到华氏度的转换(一)

TensorFlow 实现神经网络模型来进行摄氏度到华氏度的转换&#xff0c;可以将其作为一个回归问题来处理。我们可以通过神经网络来拟合这个简单的转换公式。 1. 数据准备与预处理 2. 构建模型 3. 编译模型 4. 训练模型 5. 评估模型 6. 模型应用与预测 7. 保存与加载模型 …