专栏首页技术碎碎念c++实现简单计算器

c++实现简单计算器

帮一个同学写的,非计算机类专业,应付交差,也没什么功能,两个数的加减乘除运算,以及三角函数的运算。要求用到模板、运算符重载和异常处理。

一直以来都是用的java,没怎么用过c++,就当是复习了一下c++语法。

代码如下:

  1 #include<iostream>
  2 #include<string>
  3 #include<cmath>
  4 #include<cstdlib>
  5 
  6 using namespace std;
  7 
  8 //四则运算
  9 template <class T> class ElementaryArithmetic{
 10 private:
 11     T result;
 12     T operand1, operand2;
 13     char operators;
 14 public:
 15     //四则运算
 16     void Calculate(); 
 17     //加法运算
 18     void add(T, T); 
 19     //减法运算
 20     void subtraction(T, T); 
 21     //乘法运算
 22     void multiplication(T, T);
 23     //除法运算
 24     void divide(T, T); 
 25     //输出运算符重载
 26     template <class E> friend ostream &operator<<(ostream&, ElementaryArithmetic<E> &);
 27 };
 28 
 29 //四则运算
 30 template <class T> void ElementaryArithmetic<T>::Calculate(){
 31     int type;
 32 
 33 loop1:
 34     system("cls");
 35     cout << endl << "*******************" << endl;
 36     cout << "*   1.加法运算    *" << endl; 
 37     cout << "*   2.减法运算    *" << endl;  
 38     cout << "*   3.乘法运算    *" << endl;  
 39     cout << "*   4.除法运算    *" << endl; 
 40     cout << "*******************" << endl << endl;
 41     cout << "请输入菜单项(1-4):";
 42     try{
 43         cin >> type;
 44         if (type != 1 && type != 2 && type != 3 && type != 4)
 45             throw 1;
 46     }
 47     catch (int e){
 48         cout << endl << "输入错误,请重新输入选项...";
 49         system("pause");
 50         goto loop1;
 51     }
 52     
 53     cout << endl << "请输入两个数字:";
 54     cin >> operand1 >> operand2;
 55     if (type == 1){
 56         add(operand1, operand2);
 57         operators = '+';
 58     }
 59     else if (type == 2){
 60         subtraction(operand1, operand2);
 61         operators = '-';
 62     }
 63     else if (type == 3){
 64         multiplication(operand1, operand2);
 65         operators = '*';
 66     }
 67     else if (type == 4){
 68         divide(operand1, operand2);
 69         operators = '/';
 70     }
 71     
 72 }
 73 
 74 //加法运算
 75 template <class T> void ElementaryArithmetic<T>::add(T operand1,T operand2){
 76     result = operand1 + operand2;
 77 }
 78 
 79 //减法运算
 80 template <class T> void ElementaryArithmetic<T>::subtraction(T operand1, T operand2){
 81     result = operand1 - operand2;
 82 }
 83 
 84 //乘法运算
 85 template <class T> void ElementaryArithmetic<T>::multiplication(T operand1, T operand2){
 86     result = operand1 * operand2;
 87 }
 88 
 89 //除法运算
 90 template <class T> void ElementaryArithmetic<T>::divide(T operand1, T operand2){
 91     try{
 92         //除数为0,出现异常
 93         if ((operand2 - 0) < 1e-8 && (operand2 - 0) > -1e-8)
 94             throw 0;
 95     }
 96     catch (int){
 97         throw ;
 98     }
 99     result = operand1 / operand2;
100 }
101 
102 //输出运算符重载
103 template <class E> ostream& operator<<(ostream &os, ElementaryArithmetic<E> &result){
104     os << endl << "计算结果 : " << result.operand1 << result.operators << result.operand2 << '=' << result.result << endl;
105     return os;
106 }
107 
108 //三角函数
109 class Trigonometric{
110 private:
111     double radian;
112     string type;
113     double result;
114 public:
115     //三角函数计算
116     void Calculate();
117     //输出运算符重载
118     friend ostream &operator<<(ostream&, Trigonometric &);
119 };
120 
121 //三角函数计算
122 void Trigonometric::Calculate(){
123     int option;
124 
125 loop2:
126     system("cls");
127     cout << "*******************" << endl;
128     cout << "*    1.求正弦      *"<< endl; 
129     cout << "*    2.求余弦      *"<< endl;
130     cout << "*    3.求正切      *"<< endl;
131     cout << "*******************" << endl << endl;
132     cout << "请输入菜单项(1-3):";
133     try{
134         cin >> option;
135         if (option != 1 && option != 2 && option != 3 && option != 4)
136             throw 2;
137     }
138     catch (int e){
139         cout << endl << "输入错误,请重新输入选项..." ;
140         system("pause");
141         goto loop2;
142     }
143     
144 
145     cout << endl << "请输入弧度:";
146     cin >> radian;
147 
148     if (option == 1){
149         result = sin(radian);
150         type = "sin";
151     }
152     else if (option == 2){
153         result = cos(radian);
154         type = "cos";
155     }
156     else if (option == 3){
157         result = tan(radian);
158         type = "tan";
159     }
160 }
161 
162 //输出运算符重载
163 ostream &operator<<(ostream &os, Trigonometric &result){
164     os << endl << "计算结果 : " << result.type << "(" << result.radian << ") = " << result.result << endl;
165     return os;
166 }
167 
168 int main(){
169     int type;
170 
171 loop:
172     while (true){
173         system("cls");
174         cout << "*******主菜单**********" << endl;
175         cout << "*                     *" << endl;
176         cout << "*   1. 四则运算       *" << endl;
177         cout << "*   2. 三角函数       *" << endl;
178         cout << "*   3. 退出程序       *" << endl;
179         cout << "*                     *" << endl;
180         cout << "***********************" << endl << endl;
181         cout << "请输入菜单项(1-3):";
182 
183         try{
184             cin >> type;
185             if (type != 1 && type != 2 && type != 3)
186                 throw - 1;
187         
188             if (type == 1){
189                 ElementaryArithmetic<double> calc;
190                 calc.Calculate();
191                 cout << calc;
192             }
193             else if (type == 2){
194                 Trigonometric calc;
195                 calc.Calculate();
196                 cout << calc;
197             }
198             else if (type == 3)
199                 break;
200         }
201         catch (int e){
202             if (e == -1){
203                 cout << endl << "输入错误,请重新输入选项...";
204                 system("pause");
205                 goto loop;
206             }
207             else if (e == 0)
208                 cout << "除数不能为 0 " << endl;
209             
210         }
211         cout << endl;
212         system("pause");
213     }
214     return 0;
215 }

好吧,其实我也不知道为什么要求用模板和运算符重载,感觉没什么必要,典型的作业代码,不过也可能是我思想的局限性。总之,就这样吧。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • sql server 触发器

    触发器是一种特殊类型的存储过程。触发器可包含复杂的T-SQL语句。触发器不能通过名称被直接调用,也不允许设置参数。它是建立在触发事件上的。 触发器可以强制执行一...

    欠扁的小篮子
  • sql server 事务处理

    事物处理 事务是SQL Server中的单个逻辑单元,一个事务内的所有SQL语句作为一个整体执行,要么全部执行,要么都不执行。 事务有4个属性,称为ACID(原...

    欠扁的小篮子
  • mysql基础 事务的认识和使用

    事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务是恢复和并发控制的基本单位。 在关系数据库中,一个事务可以是...

    欠扁的小篮子
  • Lucene 高阶查询的六脉神剑 —— QueryParser

    上篇我们介绍了 Lucene 多样的查询模式,每一种都是相互独立的用来解决特定查询目标的 Query 对象。本节我们要将这些查询模式使用 QueryParser...

    老钱
  • 模仿是最好的学习方式

    代码仓库开始的时候还是很简单的,如果随着时间的推移,版本迭代很多次后,再研究就困难很多,所以大佬们经常推荐从第一个commit开始学习,记得以前github是以...

    前端黑板报
  • 实践微服务,第14部分:GraphQL

    在实践微服务系列博客的这一篇中,我们将看看如何使用GraphQL将Account对象提供给我们的客户端。

    ★忆先★
  • 使用Spark SQL的临时表解决一个小问题

    我是攻城师
  • 只有名字,如何查到老赖的身份证号?

    三叔为人爽快,对朋友那是真讲义气,关系铁的借钱不用借条,不铁的写个借条就行,就是这么豪爽的老实人,现在却遇到了老赖,当初承诺还钱的「朋友」却玩起了失踪,电话不接...

    somenzz
  • 理才网入选中国B2B百强:头部效应 驱动未来 | 腾讯SaaS加速器·学员动态

    ? 来源 | 腾讯SaaS加速器首期项目-理才网 ---- ? 12月27日,第三届·中国浙江舟山群岛新区全球海洋经济创业大赛总决赛在朱家尖举行。经过多轮...

    腾讯SaaS加速器
  • Centos7(Firewall)防火墙开启常见端口命令

    砸漏

扫码关注云+社区

领取腾讯云代金券