面向对象程序设计大作业计算器类完成时间:2013 年 5月25日计算器类1.编程目的设计实现计算器类,能进行整数及实数的加、减、乘、除、平方、开方等基本运算,及能进行二进制,十进制,八进制,十六进制数值之间的转换,以及能进行三角函数的计算。
2.系统简介本程序利用类完成了十进制下的四则运算(加,减,乘,除),可以把十进制转化为二进制、八进制、十六进制,可以进行一些常用的函数运算(比如sin、cos、tan、sqrt等)。
程序设计语言采用Visual C++6.0,程序运行平台Windows 7,程序通过调试运行实现了设计目标。
刚开始时出现主要的运算界面,然后进行选择1-3.选择1,则进行一般运算;选择2,则进行三角函数运算;选择3,则进行进制的转换。
若选择1,则又分为1-7个选择,利用if...else if...else...语句来实现。
若选择1,进行加法运算;选择2,进行减法运算;选择3,进行乘法运算;选择4,进行除法运算;选择5,进行取余运算;选择6,幂运算;选择7,开方运算。
三角函数和进制转换与此类同。
3.编程思路本程序分为三类:(1)实现了十进制下的四则运算(加、减、乘、除),还可以进行平方、开方的运算及幂的运算;(2)实现十进制转换为二进制、八进制、十六进制。
(3)进行三角函数的基本运算。
建立一个文件,该文件包含三个类程序分别为class Trigonometric、class HexBinDecOct、class Calculate且分别对应三角函数运算、进制转换、一般运算,最后是一个主函数。
4总体设计(附类图)编程实现计算器,用类来完成。
首先,编写的是三角函数(sin、cos、tan)的实现类;其次,一般运算(加、减、乘、除、开方、幂)类;最后是,把十进制转换为二进制、八进制、十六进制。
具体程序实现如下图表示:5.关键技术说明面向对象设计方法的核心概念——类,利用类可以实现对数据的封装及隐蔽。
在面向对象程序设计中,程序模块是由类构成的,类是对逻辑上相关的函数与数据的封装,它是对问题的抽象描述。
类成员的访问控制属性包括三种:公有类型(public)、私有类型(privite)、保护类型(protected)。
公有类型成员定义了类的外部接口,公有成员用public 关键字声明,在类外只能访问类的公有成员。
私有成员在关键字privite后面声明,如果私有成员紧接着类名称,则关键字可以省略。
私有成员只能被本类的成员函数访问,来自类外的任何访问都是非法的。
保护类型成员的性质和私有成员的性质相似,其差别在于继承过程中对产生的新类影响不同。
本程序包含公有成员和私有成员,不含保护类成员。
分别为class Trigononetric、class Calculate、class HexBinDecOct6.源代码#include <iostream>#include <cmath>#include <stdlib.h>using namespace std;#define pi 3.14159265/************************************************************/class Trigonometric{//三角函数实现private: double number;//要操作的数char ch2;//选择控制public: void print1();//界面输出void set1(double num)//传值给操作函数{number=num;}};void Trigonometric::print1(){cout<<"\t\t进入三角函数的运算"<<endl;cout<<"\t\t请输入一个弧度数:"<<endl;cin>>number; set1(number);cout<<"\t\t 1.求sin(a)"<<endl;cout<<"\t\t 2.求cos(a)"<<endl;cout<<"\t\t 3.求tan(a)"<<endl;cout<<"\t\t 4.求全部!"<<endl;cin>>ch2;back3:if(ch2=='1')cout<<"sin("<<number<<")="<<sin(number)<<endl;else if(ch2=='2')cout<<"cos("<<number<<")="<<cos(number)<<endl;else if(ch2=='3')cout<<"tan("<<number<<")="<<tan(number)<<endl;else if(ch2=='4'){cout<<"sin("<<number<<")="<<sin(number)<<endl;cout<<"cos("<<number<<")="<<cos(number)<<endl;cout<<"tan("<<number<<")="<<tan(number)<<endl;}else{cout<<"\t\t输入有误!请重新选择:"<<endl;cin>>ch2;goto back3;}}/************************************************************/class HexBinDecOct{//进制转换private: char str2[100];//存储二进制char str8[100];//存储八进制char str16[100];//存储十六进制char ch2;//选择控制int number;//要转换的十进制数public: void print2();void set2(double num){ number=num;}void conversionAll(int number);//全部转换char sixteen(int number);//转换为十六进制char eight(int number);//转换为八进制 char two(int number);//转换为二进制};void HexBinDecOct::print2(){ cout<<"欢迎使用进制转换:"<<endl;cout<<"\t\t请输入一个数:"<<endl;cin>>number;set2( number);cout<<"\t\t***********************************"<<endl;cout<<"\t\t * 1.十进制转换为二进制*"<<endl;cout<<"\t\t * 2.十进制转换为八进制*"<<endl;cout<<"\t\t * 3.十进制转换为十六进制*"<<endl;cout<<"\t\t * 4.十进制转换为二、八、十六进制 *"<<endl;cout<<"\t\t *请选择:1-4 *"<<endl;cout<<"\t\t***********************************"<<endl;cin>>ch2;back4:if(ch2=='1')//1.十进制转换为二进制cout<<two(number)<<endl;else if(ch2=='2')//十进制转换为八进制cout<<eight(number)<<endl;else if(ch2=='3')//十进制转换为十六进制cout<<sixteen(number)<<endl;else if(ch2=='4')//十进制转换为二、八、十六进制conversionAll(number);else {cout<<"\t\t输入有误!请重新选择:"<<endl;cin>>ch2;//重新选择goto back4;//重新转换}}char HexBinDecOct::two(int number){int N=number;cout<<"转换为二进制数为:"<<endl;int aa[20];int temp;temp = N;int num;int i=0;while(temp !=0){num = temp%2;aa[i] = num;i++;temp = temp/2;}for(num=i-1;num>=0;num--){cout<<aa[num];}cout<<endl;return 0;}char HexBinDecOct::eight(int number){cout << "请输入一个十进制正整数:"; cout << number << "(10) = ";int a[100];int index = 0;while(number >= 1){a[index] = number%8;index++;number /= 8;}for(int i=index-1; i>=0; i--)cout << a[i];cout << "(8)" << endl;return 0;}char HexBinDecOct::sixteen(int number){cout<<"请输入一个十进制数:"<<endl;char *p;p=itoa(number,str16,10);cout<<"str16="<<str16<<endl;cout<<"p="<<p<<endl; //将整型数n按十六进制转换为字符串并输出p=itoa(number,str16,16);cout<<"转换为十六进制为:"<<str16<<endl;return 0;}void HexBinDecOct::conversionAll(int number){cout<<"请输入一个数字:";cin>>number;char str2[10];char str8[10];char str16[10];itoa(number, str2, 2);itoa(number, str8, 8);itoa(number, str16, 16);cout<<"\t\t********************"<<endl;cout<<"\t\t* 1.转换为二进制 *"<<str2<<endl;cout<<"\t\t* 2.转换为八进制 *"<<str8<<endl;cout<<"\t\t* 3.转换为十六进制*"<<str16<<endl;cout<<"\t\t* 请选择:1-3 *"<<endl;cout<<"\t\t********************"<<endl;}/******************************************************* *****/class Calculate{//一般计算private: double sum;//存储运算结果char ch2;//选择控制double num1,num2;//两个操作数public: void set3(double num1,double num2)//赋值{num2=num2;num1=num1;}void print3();double add(double num1,double num2);//加double subtract(double num1,double num2);//减double multiplication(double num1,double num2);//乘double divide(double num1,double num2);//除double mod(double num1,double num2);//取余double mi(double num1,double num2);//幂double kaifang(double num1);//开方};void Calculate::print3(){cout<<"\t\t请输入两个数:"<<endl;cin>>num1>>num2;set3( num1,num2);cout<<"\t\t*******************"<<endl;cout<<"\t\t* 1.加法运算 *"<<endl;cout<<"\t\t* 2.减法运算 *"<<endl;cout<<"\t\t* 3.乘法运算 *"<<endl;cout<<"\t\t* 4.除法运算 *"<<endl;cout<<"\t\t* 5.取余运算 *"<<endl;cout<<"\t\t* 6.幂运算 *"<<endl;cout<<"\t\t* 7.开方运算 *"<<endl;cout<<"\t\t*******************"<<endl;cout<<"\t\t请输入菜单项(1-8):";cin>>ch2;back2:if(ch2=='1'){// 1.加法运算cout<<"\t\t"<<num1<<'+'<<num2<<'='<<add(num1,num2)<<endl ;}else if(ch2=='2'){// 2.减法运算cout<<"\t\t"<<num1<<'-'<<num2<<'='<<subtract(num1,num2)<<endl;}else if(ch2=='3'){// 3.乘法运算cout<<"\t\t"<<num1<<'*'<<num2<<'='<<multiplication(num1, num2)<<endl;}else if(ch2=='4'){// 4.除法运算cout<<"\t\t"<<num1<<'/'<<num2<<'='<<divide(num1,num2)<<e ndl;}else if(ch2=='5'){// 5.取余运算cout<<'\t\t'<<num1<<'%'<<num2<<'='<<mod(num1,num2)<<endl ;}else if(ch2=='6'){//6.幂运算cout<<'\t\t'<<num1<<'^'<<num2<<'='<<mi(num1,num2)<<endl;}else if(ch2=='7'){//7.开方运算cout<<'\t'<<num1<<'='<<kaifang(num1)<<endl;}else{ cout<<"\t\t输入有误!请重新选择:"<<endl;cin>>ch2;goto back2;}}double Calculate::add(double num1,double num2){return sum=num1+num2;}double Calculate::subtract(double num1,double num2){return sum=num1-num2;}double Calculate::multiplication(double num1,double num2)return sum=num1*num2;}double Calculate::divide(double num1,double num2) {if(num2!=0)return sum=num1/num2;elsereturn 0;}double Calculate::mod(double num1,double num2) {if(num2!=0)return sum=(int)num1%(int)num2;elsereturn 0;}double Calculate::mi(double num1,double num2) {if(num2==0)return sum=1;elsereturn sum=pow(num1,num2);}double Calculate::kaifang(double num1){if(num1>=0)return sum=sqrt(num1);elsereturn 0;}/********************************************************** **/int main(){ //int num1=0,num2=0,number=0;Trigonometric tri;//三角函数对象HexBinDecOct hex;//进制转换对象Calculate cal;//一般计算对象char ch1,ch3;back1:{do{cout<<"\t\t*****欢迎使用计算器**********"<<endl;cout<<"\t\t*****主菜单**********"<<endl;cout<<"\t\t* *"<<endl;cout<<"\t\t* 1. 基本运算 *"<<endl;cout<<"\t\t* 2. 三角函数 *"<<endl;cout<<"\t\t* 3. 进制转换 *"<<endl;cout<<"\t\t* *"<<endl;cout<<"\t\t* 请选择:1---3 *"<<endl;cout<<"\t\t*********************"<<endl;cin>>ch1; if(ch1=='1'){// 1.基本运算cal.print3();}else if(ch1=='2'){// 2.三角函数tri.print1();}else if(ch1=='3'){// 3.进制转换hex.print2();}else{cout<<"输入有误!"<<endl;goto back1;}cout<<"again?(y/n)"<<endl;cin>>ch3;}while(ch3=='y'||ch3=='Y');};return 0;}7.测试(主界面及各功能模块的运行图及说明)开始运行的界面:(一)、一般运算的界面:(1)加法的界面:(减法类似)(2)运行乘法的界面(除法类似不在列出):(3)幂运算:(4)开方运算:可以从图中看到,当进行开方运算时需输入两个数,但是第二个数没影响,程序运行第一个数且运行正确。