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

ops/2025/2/3 12:05:25/

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

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/ops/155300.html

相关文章

【力扣每日一题】LeetCode 2412: 完成所有交易的初始最少钱数

LeetCode 2412: 完成所有交易的初始最少钱数 题目解析 问题描述 给定一个二维数组 transactions&#xff0c;每个元素 transactions[i] [costi, cashbacki] 表示一个交易。对于每笔交易&#xff0c;要求你完成该交易时有足够的初始资金 money&#xff0c;并且交易会减少或增…

React 前端框架开发详细操作

一、引言 在当今的 web 开发领域,React 作为一款流行的前端框架,以其高效的组件化开发模式、虚拟 DOM 带来的高性能以及灵活的生态系统,受到了广大开发者的青睐。无论是开发小型的单页应用还是大型的企业级项目,React 都能展现出强大的能力。本文将详细介绍 React 前端框架…

CSS 中调整元素大小的全面指南

CSS 中调整元素大小的全面指南 1. 原始尺寸&#xff08;固有尺寸&#xff09;示例代码&#xff1a;图像的固有尺寸 2. 设置具体的尺寸示例代码&#xff1a;设置固定宽度和高度 3. 使用百分比示例代码&#xff1a;使用百分比设置宽度 4. 使用百分比作为外边距和内边距示例代码&a…

AI技术路线(marked)

人工智能&#xff08;AI&#xff09;是一个非常广泛且充满潜力的领域&#xff0c;它涉及了让计算机能够执行通常需要人类智能的任务&#xff0c;比如感知、推理、学习、决策等。人工智能的应用已经渗透到各行各业&#xff0c;从自动驾驶到医疗诊断&#xff0c;再到推荐系统和自…

第38周:猫狗识别 (Tensorflow实战第八周)

目录 前言 一、前期工作 1.1 设置GPU 1.2 导入数据 输出 二、数据预处理 2.1 加载数据 2.2 再次检查数据 2.3 配置数据集 2.4 可视化数据 三、构建VGG-16网络 3.1 VGG-16网络介绍 3.2 搭建VGG-16模型 四、编译 五、训练模型 六、模型评估 七、预测 总结 前言…

VScode+Latex (Recipe terminated with fatal error: spawn xelatex ENOENT)

使用VSCode编辑出现Recipe terminated with fatal error: spawn xelatex ENOENT问题咋办&#xff1f; 很好解决&#xff0c;大概率的原因是因为latex没有添加到系统环境变量中&#xff0c;所有设置的编译工具没有办法找到才出现的这种情况。 解决方法&#xff1a; winR 然后输…

Qpython+Flask监控添加发送语音中文信息功能

对QpythonFlask实现对小孩学习的监控-CSDN博客中html页面进行改造&#xff0c;利用Ajax&#xff0c;提交一段文字&#xff0c;发送到数据库&#xff0c;再在服务器&#xff0c;发送该段文件给手机端&#xff0c;然手机端TTS朗读出来&#xff0c;增加了父母监控小孩学习&#xf…

搜索引擎友好:设计快速收录的网站架构

本文来自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/14.html 为了设计一个搜索引擎友好的网站架构&#xff0c;以实现快速收录&#xff0c;可以从以下几个方面入手&#xff1a; 一、清晰的目录结构与层级 合理划分内容&#xff1a;目录结构应…