/* calc.cpp实现了计算机系统。开始时,他显示一个菜单,以选择计算器的类型。如果用户选择了 标准型计算器,则出现标准型计算器的菜单,而如果用户选择了科学性计算器,则出现科学计算器 的菜单,最后一个的选项是退出程序。 在标准计算器中,选项有加、减、乘、除等,而在科学计算器中,选项有求幂、阶乘、开方等。 在本程序中,定义了新旧计算器的宏开关,新计算器接受输入值,而旧计算器的操作数则是前次操 作的结果。 本项目没有考虑异常处理,所以输入输出时不要输入非数字字符串。 数据范围还不够大,将在往后进一步改进。 */ //包含预处理宏和头文件的文件 #include<iostream> using namespace std; #include<conio.h> #include<math.h> #include<stdlib.h> #include<stdio.h> #define new_cal 1 #define old_cal 0 //stand_calc 类定义了标准计算器的函数 class stand_calc { /*标准计算器函数的原型。这些函数都是静态的,所以调用他们时, 只使用类名即可,没有必要创建该类的实例。*/ public: static double addition(double,double); static double substract(double,double); static double multiplication(double,double); static double division(double,double*); static double modulus(double*,double*); }; //science_calc类定义了科学型计算器的函数 class science_calc { public: static double square(double); static double cube(double); static double power(double,double); static double sq_root(double); static long int fact(double); static double sin_func(double); static double cos_func(double); static double tan_func(double); }; double stand_calc::addition(double a, double b) { return (a+b); } double stand_calc::substract(double a, double b) { return (a-b); } double stand_calc::multiplication(double a, double b) { return (a*b); } /*除法函数将执行被除数和除数的相除,该函数有两个参数,其中一个是变量副本, 另一个是指针。之所以如此,是因为如果除数是0,则该函数将显示再次输入除数的 信息。使用指针后,再次输入的除数值也会在主函数中被更新。*/ double stand_calc::division(double a, double*b) { while(*b==0) { cout<<" Cannot divide by zero"<<endl; cout<<" Enter the second number again:"; cin>>*b; } return (a/(*b)); } /*求余函数将执行被除数和除数的相除,并返回除法的余数。和除法操作类似,它的 除数也不能为0。由于不能对双精度数求余,所以得先转换成整数。*/ double stand_calc::modulus(double* a, double*b) { while(*b==0) { cout<<" Cannot divide by zero"<<endl; cout<<" Enter the second number again:"; cin>>*b; } int x=(int)*a; int y=(int)*b; if(*a-x>0||*b-y>0) { cout<<" Converting decimal number into an integer to perform modulus"; } *a=x; *b=y; return ((x)%(y)); } //science_calcl类的函数声明由此开始 double science_calc::square(double x) { return (pow(x,2)); } double science_calc::cube(double x) { return (pow(x,3)); } double science_calc::power(double x,double y) { return (pow(x,y)); } double science_calc::sq_root(double x) { return (sqrt(x)); } long int science_calc::fact(double x) { int n=(int)x; long int f=1; while(n>1) { f*=n; n--; } return f; } double science_calc::sin_func(double x) { return (sin(x)); } double science_calc::cos_func(double x) { return (cos(x)); } double science_calc::tan_func(double x) { return (tan(x)); } int main() { double num1,num2,num3,temp; int choice1=0,choice2,flag; //主菜单的循环,程序从此开始,他将显示选择计算器类型的菜单 do { // clrsrc();//清除屏幕 system("cls"); cout<<"===============Type of Calculators==============="; cout<<" 1 Standard Calculator 2 Scientific Calculator 3 Quit"<<endl; cin>>choice1; flag=new_cal; //根据主菜单中的输入选项,执行相应操作 switch(choice1) { case 1: do { // clrscr(); system("cls"); cout<<"================Standard Calculator================"; cout<<" 1 Addition 2 Substraction 3 Multification 4 Division 5 Modulus 6 Return to Previous Menu 7 Quit"; //只有在旧计算器模式时,选项8才会显示,此时一个操作数已经存储在计算机的内存中 if(flag==old_cal) { cout<<" 8 Clear Memory"; } cout<<" Choose the type of calculator:"<<endl; cin>>choice2; switch(choice2) { case 1: // 如果是新计算机模式,则接受第一个操作数,否则第一个操作数由上一次计算结果提供 if(flag==new_cal) { cout<<"Enter first number:"; cin>>num1; } else { num1=temp; cout<<" First num is"<<num1<<endl; } cout<<"Enter second number:"; cin>>num2; num3=stand_calc::addition(num1,num2); cout<<" Addition of"<<num1<<" and"<<num2<<" is "<<num3; cout<<" Press any key to continue......"<<endl; getch(); temp=num3; flag=old_cal; break; case 2: // 如果是新计算机模式,则接受第一个操作数,否则第一个操作数由上一次计算结果提供 if(flag==new_cal) { cout<<"Enter first number:"; cin>>num1; } else { num1=temp; cout<<" First num is"<<num1<<endl; } cout<<"Enter second number:"; cin>>num2; num3=stand_calc::substract(num1,num2); cout<<" Substraction of"<<num1<<" from"<<num2<<" is "<<num3; cout<<" Press any key to continue......"<<endl; getch(); temp=num3; flag=old_cal; break; case 3: // 如果是新计算机模式,则接受第一个操作数,否则第一个操作数由上一次计算结果提供 if(flag==new_cal) { cout<<"Enter first number:"; cin>>num1; } else { num1=temp; cout<<" First num is"<<num1<<endl; } cout<<"Enter second number:"; cin>>num2; num3=stand_calc::multiplication(num1,num2); cout<<" Multification of"<<num1<<" and"<<num2<<" is "<<num3; cout<<" Press any key to continue......"<<endl; getch(); temp=num3; flag=old_cal; break; case 4: // 如果是新计算机模式,则接受第一个操作数,否则第一个操作数由上一次计算结果提供 if(flag==new_cal) { cout<<"Enter first number:"; cin>>num1; } else { num1=temp; cout<<" First num is"<<num1<<endl; } cout<<"Enter second number:"; cin>>num2; num3=stand_calc::division(num1,&num2); cout<<" Division of"<<num1<<" by"<<num2<<" is "<<num3; cout<<" Press any key to continue......"<<endl; getch(); temp=num3; flag=old_cal; break; case 5: // 如果是新计算机模式,则接受第一个操作数,否则第一个操作数由上一次计算结果提供 if(flag==new_cal) { cout<<"Enter first number:"; cin>>num1; } else { num1=temp; cout<<" First num is"<<num1<<endl; } cout<<"Enter second number:"; cin>>num2; num3=stand_calc::modulus(&num1,&num2); cout<<" Modulus of"<<num1<<" by"<<num2<<" is "<<num3; cout<<" Press any key to continue......"<<endl; getch(); temp=num3; flag=old_cal; break; case 6: cout<<" Returning to previous menu."; cout<<" press any key to continue......"; getch(); break; case 7: cout<<" Quitting......"; cout<<" press any key to continue......"; getch(); exit(0); case 8: //如果是新计算机模式,则8是非法选项,否则8选项用以重启一个新的计算 if(flag==new_cal) { cout<<" Invalid choice."; cout<<" press any key to continue......"; getch(); } else { temp=0; flag=new_cal; } break; default: cout<<" Invalid choice."; cout<<" press any key to continue......"; getch(); break; } }while(choice2!=6); break; case 2: do { // clrscr(); system("cls"); cout<<"================Scientific Calculator================"; cout<<" 1 Square 2 Cube 3 Power 4 Factorial 5 Sin 6 Cos 7 Tan 8 Return to previous menu 9 Quit"; //只有在旧计算器模式时,选项8才会显示,此时一个操作数已经存储在计算机的内存中 if(flag==old_cal) { cout<<" 10 Clear Memory"; } cout<<" Choose the type of calculator:"<<endl; cin>>choice2; switch(choice2) { case 1: if(flag==new_cal) { cout<<"Enter number to find square:"; cin>>num1; } else { num1=temp; cout<<" Number is"<<num1<<endl; } num3=science_calc::square(num1); cout<<" Square of"<<num1<<" is "<<num3; cout<<" Press any key to continue......"<<endl; getch(); temp=num3; flag=old_cal; break; case 2: if(flag==new_cal) { cout<<"Enter number to find cube:"; cin>>num1; } else { num1=temp; cout<<" Number is"<<num1<<endl; } num3=science_calc::cube(num1); cout<<" Cube of"<<num1<<" is "<<num3; cout<<" Press any key to continue......"<<endl; getch(); temp=num3; flag=old_cal; break; case 3: if(flag==new_cal) { cout<<"Enter first number for base to find power:"; cin>>num1; } else { num1=temp; cout<<" First number is"<<num1<<endl; } cout<<"Enter second number for base to fine power:"; cin>>num2; num3=science_calc::power(num1,num2); cout<<" Power of"<<num1<<"to the power "<<num3; cout<<" Press any key to continue......"<<endl; getch(); temp=num3; flag=old_cal; break; case 4: if(flag==new_cal) { cout<<"Enter number to find factorial:"; cin>>num1; } else { num1=temp; cout<<" Number to find factorial is"<<num1<<endl; } num3=science_calc::fact(num1); cout<<" Factorial of"<<num1<<" is "<<num3; cout<<" Press any key to continue......"<<endl; getch(); temp=num3; flag=old_cal; break; case 5: if(flag==new_cal) { cout<<"Enter number to find sin value:"; cin>>num1; } else { num1=temp; cout<<" Number for sin value is"<<num1<<endl; } num3=science_calc::sin_func(num1); cout<<" Sin value of"<<num1<<" is "<<num3; cout<<" Press any key to continue......"<<endl; getch(); temp=num3; flag=old_cal; break; case 6: if(flag==new_cal) { cout<<"Enter number to find cos value:"; cin>>num1; } else { num1=temp; cout<<" Number for cos value is"<<num1<<endl; } num3=science_calc::cos_func(num1); cout<<" Cos value of"<<num1<<" is "<<num3; cout<<" Press any key to continue......"<<endl; getch(); temp=num3; flag=old_cal; break; case 7: if(flag==new_cal) { cout<<"Enter number to find tan value:"; cin>>num1; } else { num1=temp; cout<<" Number for tan value is"<<num1<<endl; } num3=science_calc::tan_func(num1); cout<<" Tan value of"<<num1<<" is "<<num3; cout<<" Press any key to continue......"<<endl; getch(); temp=num3; flag=old_cal; break; case 8: cout<<" Returning to previous menu."; cout<<" press any key to continue......"; getch(); break; case 9: cout<<" Quitting......"; cout<<" press any key to continue......"; getch(); exit(0); case 10: if(flag==new_cal) { cout<<" Invalid choice."; cout<<" press any key to continue......"; getch(); } else { temp=0; flag=new_cal; } break; default: cout<<" Invalid choice."; cout<<" press any key to continue......"; getch(); break; } }while(choice2!=8); break; case 3: cout<<" Quitting......"; cout<<" press any key to continue......"; getch(); break; default: cout<<" Invalid choice."; cout<<" press any key to continue......"; getch(); break; } }while(choice1!=3); return 0; }
执行效果图如下(可以自己尝试):
除了system("cls")清除屏幕的应用,我觉得突出的一点就是新旧计算模式。
该程序主要是函数的书写以及循环与条件的层层嵌入。
版权声明:本文为博主原创文章,未经博主允许不得转载。