求帮遍一个C++程序。 10
1. 问题描述
设计一个程序来模拟一个简单的手持计算器。程序支持算术运算+、-、*、/、=、以及C(清除)、A(全清除)操作。
2. 基本要求
程序运行时,显示一个窗口,等待用户输入,用户可以从键盘输入要计算的表达式,输入的表达式显示在窗口中,用户键入’=’ 符号后,窗口显示出结果。
3. 测试数据
程序输入不少于5种不同的表达式进行测试。
4. 实现提示
可定义一个计算器类,该类包括两个组件对象,一个计算引擎和一个用户接口,用户接口对象处理接受的键盘输入信息,并显示答案,计算引擎对象对给出的数据执行相应操作,并存储操作的结果。
5. 选做内容
如果用户输入的表达式不合法,可以判别出来并给出相应的错误提示。
有错误。 展开
1、实现思路
本设计只要求程序支持算术运算+、-、*、/、=、以及C(清除)、Q(关闭)操作。对此对程序作如下分析:
1、 要实现计算器的+、-、*、/、=,首先进行变量定义,要有scanf函数对数字进行输入,并对输入的符号进行判断,然后执行相应的计算。
2、 对字符的判断我用的是if语句,如果所输入的字符对应于+、-、*、/中的一个然后我就对其进行标记。
3、 然后用多分支选择结构switch语句对进行选择计算,分别进行加减乘除。最后用printf函数输出结果(result)
4、 接着编写清除程序,要清屏,开头要包括windows和stdlib函数。当执行完输出语句后要对接下来的输入的字符进行判断,如果输入为C则执行清屏语句system("CLS"),然后用goto语句进行循环使程序跳到loop1即开始新的计算,如果输入为Q,则程序跳到loop2,使程序关闭。
5、 程序的N—S流程图如下
2、实现过程
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
void main() /* 主函数*/
{int act,x; /*定义整型变量*/
float num1=0,num2=0,result; /*定义浮点型变量*/
char c; /*定义字符型变量*/
loop1:scanf("%f%c%f",&num1,&c,&num2); /*输入*/
if(c=='+') /*判断*/
{act=1;
} /*做计算加法标志值*/
if(c=='-')
{act=2;
} /*做计算减法标志值*/
if(c=='*')
{act=3;
} /*做计算乘法标志值*/
if(c=='/')
{act=4;} /*做计算除法标志值*/
switch(act) /*根据运算符号运算*/
{case 1:result=num1+num2;break; /*做加法*/
case 2:result=num1-num2;break; /*做减法*/
case 3:result=num1*num2;break; /*做乘法*/
case 4:result=num1/num2;break; /*做除法*/
}
printf("%.2f\n",result); /*输出结果*/
x=getchar(); /*输入一个字符*/
if(x=='c') /*判断字符*/
system("CLS"); /*清屏*/
if(x=='q')
goto loop2; /*跳到loop2(结尾)*/
goto loop1; /*跳到loop1(循环)*/
loop2:; /* 标识符*/
}
#include <stdlib.h>
#include<iostream.h>
#include <ctype.h>
# define MAX 1000
class calculator {
private:
struct save1 /* 存储数字 */
{
double n[MAX]; int top; } stack1;
struct save2 /* 存储运算符 */
{
char n[MAX]; int top; } stack2;
public:
calculator()
{
}; /* 空的构造函数 bool stack1empty(save1 s); bool stack2empty(save2 s); */
void push1( save1 & s, double num ); void push2( save2 & s, char op );
void pop1( save1 & s, double & num ); void pop2( save2 & s, char & op ); int in( char op ); int out( char op );
void count( double a, char op, double b ); void cal(); };
bool calculator::stack1empty( save1 s ) /* 判断数字栈是否为空 { */
if ( s.top == -1 )
return 1;
else return 0; }
bool calculator::stack2empty( save2 s ) /* 判断运算符栈是否为空 { */
if ( s.top == -1 )
return 1;
else return 0;
}
void calculator::push1( save1 &s, double num ) /* 将数据压入数字栈 { */
if ( s.top == MAX - 1 )
{
cout << "栈已满 ";
} else {
s.top++;
s.n[s.top] = num;
} }
void calculator::push2( save2 &s, char op ) /* 将运算符压入运算符栈 { */
if ( s.top == MAX - 1 )
{
cout << "栈已满";
} else {
s.top++;
s.n[s.top] = op;
} }
void calculator::pop1( save1 &s, double &num ) /* 将栈顶的数据元素取出,存放在num中 { */
if ( s.top == -1 )
{
cout << "栈为空" << endl;
} else{
num = s.n[s.top]; s.top--;
}
}
void calculator::pop2( save2 &s, char &op ) /* 将栈顶的运算符取出,存放在op中 { */
if ( s.top == -1 )
{
cout << "栈为空" << endl;
} else{
op = s.n[s.top]; s.top--;
}
}
int calculator::in( char op ) /* 在栈内优先级的判断 { */
if ( op == '-' || op == '+' )
return(2);
else if ( op == '*' || op == '/' )
return(4);
else return(-1); }
int calculator::out( char op ) /* 早栈外优先级的判断 { */
if ( op == '-' || op == '+' )
return(1);
else if ( op == '*' || op == '/' )
return(3);
else return(-1); }
void calculator::count( double a, char op, double b ) /* 进行计算并将所得的结果压入栈顶 { */
double sum; switch ( op )
{
case '+': sum = a + b; break; case '-': sum = a - b; break; case '*': sum = a * b; break; case '/': sum = a / b; break; default: break;
}
push1( stack1, sum ); }
void calculator::cal( void )
{
int i = 0, j; double a, b, c;
char expression[MAX], operate, temp[20]; cout << "请输入表达式(输完之后请加=):"; cin >> expression;
stack1.top = -1; /* 清空数字栈 stack2.top=-1;//清空运算符栈 */
while ( expression[i] != '=' ) /* 以=号结尾 { */
if ( isdigit( expression[i] ) ) /*若读入的字符为数字,则继续判断下一个字符,直到下个字符不是数字或者不是小数点,即可保证该操作数是完整的小数,然后将该数入操作数栈*/
{
j = 0;
while ( isdigit( expression[i] ) || expression[i]
== '.' )
{
temp[j++] = expression[i]; i++;
}
temp[j] = '\0';
c= atof( temp ); /* char类型进行转换 push1(stack1,c); } else { */
if ( expression[i] == '-' || expression[i]
== '+' || expression[i] == '*' || expression[i]
== '/' ) /* 若读入的字符为运算符的情况 { */
if ( in( stack2.n[stack2.top] ) < out( expression
[i] ) || stack2empty( stack2 ) ) /* 读入的运算符与运算符栈顶元素相比,并进行相应的操作 { */
push2( stack2, expression[i] );
i++;
} else {
pop1( stack1, a ); pop1( stack1, b );
pop2( stack2, operate );
count( b, operate, a ); /* 先进后出原则 } } } } */
while ( stack2.top != -1 ) /* 读入结束后,继续进行操作,直到运算符栈为空 { */
pop1( stack1, a );
pop1( stack1, b );
pop2( stack2, operate ); count( b, operate, a );
}
cout << stack1.n[stack1.top] << endl;
}
void main()
{
cout << "\t****************************************\n"; cout << "\t 模拟计算器程序 \n"; cout << endl;
cout << " \t**** 制作人:陈露 \n"; cout << " \t**** 指导老师:徐静 \n"; cout << " \t**** 专业班级:08网工(1)班 \n"; cout << " \t**** 制作时间:2009年6月19日 \n";
cout << " \t*****************************************\n"; cout << endl;
part1:
cout << "----------欢迎使用本计算器--------" << endl; calculator mycal; mycal.cal();
cout << "继续计算吗?" << endl;
cout << "y(是) n(否) A(退出)" << endl; char choice;
cout << "请输入你的选择:";
cin >> choice;
while ( choice != 'A' )
{
if ( choice == 'y' )
{
system( "cls" ); /* 进行全清除 */
goto part1;
} /* goto语句跳转到part1再次进行计算 else { */
cout << "谢谢使用!" << endl; break;
}
}
}