C++课程设计简单计算器的设计 2Word下载.docx
《C++课程设计简单计算器的设计 2Word下载.docx》由会员分享,可在线阅读,更多相关《C++课程设计简单计算器的设计 2Word下载.docx(30页珍藏版)》请在冰豆网上搜索。
VC++6.0系统可以在一张CD盘上,也可以在“VisualStudio(VisualC++、VisualFoxpro)”等产品的第一张CD盘上。
一般都有一个VC的自动安装程序,也可以执行VC6目录下的setup.exe,在安装包的提示下进行,对初学者可采用“典型安装”方式。
在安装好VC6.0系统后,有时根据需要添加或删除某些部件,可插入CD盘重新执行setup.exe安装程序,安装程序会检测当前系统安装VC6的足件,用户单击“添加/删除”按钮后,在“安装维护”对话框中选定要添加的部件或撤消选定要删除的部件。
与一般的应用软件一样,有以下两种启动方式:
(1)通过“开始”按钮,选择“程序”菜单,然后打开“MicrosoftVisualstudio6.0中文版”子菜单中的“MicrosoftVisualC++6.0中文版”程序。
(2)用户也可以使用命令行启动VC。
单击“开始”按钮后选择“运行”命令,在“运行”对话框中输入c:
\ProgramFiles\MicrosoftVisualStudio\VC98\VC6.exe(按默认盘符和路径安装)即可。
1.4可行性及需求分析
本设计是简单计算器。
日常计算机使用中,常常涉及到一些有关计算的问题,一个小型的计算器软件变得非常有用,该校型计算器需要空间资源较少,对电脑其他程序的应用影响较小。
它的设计按软件工程的方法进行,系统具有良好的界面、必要的交互信息和较好的健壮性;
醒目美观的软件封面。
使用人员能快捷简单地进行操作。
即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。
本软件主要用于计算机windows2000/XP以上版本的用户的使用,这次课程设计一般是实现简单计算器的功能。
要程序能实现:
加,减,乘,除,开方,倒数等运算功能;
还要实现数据的输入,输出,计算,显示及程序退出等功能。
另外还可以实现多种科学计算的功能,如:
三角函数的计算,弧度与角度间的转换,对数指数的计算等等。
二、程序设计与实现
2.1程序结构
本计算器首先是通过在计算器的界面上按下相应的按钮,来进行基本的加,减,乘,除等基本运算,计算器还能够进行平方运算,求平方根运算,乘方运算,三角函数运算(包括正弦函数(sin)、余弦函数(cos)、正切函数(tan)、余切函数(cot)),对数函数(ln、log),指数函数(exp),幂函数(x~)等运算。
2.2详细步骤
2.2.1程序的流程图
2.2.2程序设计具体步骤
1)总体功能:
整个计算器除了基本的加、减、乘、除运算外,另外还有7个功能可以实现七大运算:
三角函数运算功能、对数函数运算功能、指数函数运算功能、乘方运算功能、平方运算功能、根式运算功能、归零功能。
各个运算功能的详细设计说明分别如下:
a、基本运算功能
主要实现数据的加、减、乘、除运算,提供简单的科学计算!
b、三角函数运算功能
用来执行三角函数的运算,包括正弦函数(sin)、余弦函数(cos)和正切函数(tan)
c、对数函数运算功能
用来执行对数函数的运算,包括以e为底ln函数和以10为底的lg函数。
d、指数函数运算功能
用来执行指数函数的运算。
e、乘方运算功能
用来执行乘方的运算,进行数值的成倍计算。
f、平方运算功能
用来执行平方运算,说到底它也属于乘方运算的范畴。
g、根式运算功能用来执行根式的运算。
h.归零、删除功能主要实现数据的清零,当用户输入数据出错时,使用此功能可以清除已输入的内容并重新输入新的运算内容。
具体程序如下:
doubleoperate(doubley,charc,doublex)//对两个数计算(含是双目运算符:
如*,/等等)
{
doubler;
if(c=='
-'
)
r=x-y;
elseif(c=='
+'
r=x+y;
/'
&
&
y!
=0)
r=x/y;
*'
r=x*y;
^'
{
r=1;
for(inti=1;
i<
=y;
i++)
r*=x;
}
%'
intr0=(int)x%(int)y;
r=double(r0);
returnr;
}
doubleoperate_one(doubleone,charcc)//对一个数运算(含单目运算符:
如log(L),sin(S)等等)
if(cc=='
Q'
r=sqrt(one);
elseif(cc=='
C'
r=cos(one);
S'
r=sin(one);
T'
r=tan(one);
c'
r=acos(one);
s'
r=asin(one);
t'
r=atan(one);
doubleoperate_L(doublea,doubleb,chardian)//求对数的值
doubler=log(b)/log(a);
2)运算符的比较等级
typedefstructnode//为了处理符号而建立的链表(如:
1+(-2))
chardata;
node*next;
}node;
typedefstructstack_num//存储数的栈
double*top;
double*base;
}stack_num;
typedefstructstack_char//存储运算符号的栈
char*top;
char*base;
}stack_char;
stack_numS_num;
//定义
stack_charS_char;
charfu[18]={'
\n'
'
)'
L'
('
};
intcompare[1000];
//表现出各运算符号的优先级
doubleshu[1000];
//存储"
数"
的数组
doubledai_result;
//运算的结果,是为了处理M运算(简介函数里有M的定义)
intbiao=0;
//和dia_result一样,为了处理M运算
charline[SIZE];
//输入的所要计算的表达式
voidinit()//初始化
compare[fu[0]]=-2;
//用数字的大小表现出符号的优先级
compare[fu[1]]=-1;
compare[fu[2]]=2;
compare[fu[3]]=2;
compare[fu[4]]=4;
compare[fu[5]]=4;
compare[fu[6]]=4;
compare[fu[7]]=5;
for(inti=8;
=15;
compare[fu[i]]=6;
compare[fu[16]]=7;
S_num.base=(double*)malloc(sizeof(double)*SIZE);
//为栈开辟空间
S_char.base=(char*)malloc(sizeof(char)*SIZE);
//同上
S_num.top=S_num.base;
S_char.top=S_char.base;
voidpush_num(doublen)//数字进栈
*++S_num.top=n;
voidpush_char(charc)//运算符号进栈
*++S_char.top=c;
doublepop_num()//数字出栈
doublem=*S_num.top;
S_num.top--;
returnm;
charpop_char()//运算符号出栈
charcc=*S_char.top;
S_char.top--;
returncc;
charget_top_char()//得到运算符号的栈中最顶端的运算符号
return*S_char.top;
3)整个表达式具体运算程序:
doublecompute()//对整个表达式的计算
charc;
//表示运算符号
intp=0;
//用于shu[++p],先初始化
inti,j;
init();
//进行初始化
push_char('
);
line[strlen(line)]='
;
line[strlen(line)+1]='
\0'
if(biao)
push_num(dai_result);
//把运算的结果先进栈,在这个结果的基础上继续进行运算
biao=0;
for(i=0;
line[i]!
='
)//把表达式中的数字字符串转化成可计算的数字
intflag=0;
intflag1=1;
//标记是否是运算符号
//intflag2=1;
//标记是否出现'
_'
doubleh=0;
intge;
//位数
intbiao_dian=0;
//是否是小数的类型
while
(1)
{
flag1=1;
for(j=0;
j<
=16;
j++)
{
if(line[i]==fu[j])
{
flag1=0;
break;
}
}
if(line[i]=='
break;
.'
i++;
ge=0;
biao_dian=1;
P'
shu[++p]=pi;
E'
shu[++p]=e;
if(flag1)
h=h*10+(line[i]-'
0'
flag=1;
if(biao_dian)
ge++;
else
}
if(flag)
if(biao_dian)
intr=1;
for(intk=1;
k<
=ge;
k++)
r*=10;
h/=r;
shu[++p]=h;
//把转化而来的数字存于数组
if(line[i]=='
shu[++p]=-1;
elseif(line[i]=='
shu[++p]=-2;
shu[++p]=-3;
shu[++p]=-4;
shu[++p]=-5;
shu[++p]=-6;
shu[++p]=-7;
shu[++p]=-8;
shu[++p]=-9;
shu[++p]=-10;
shu[++p]=-11;
shu[++p]=-12;
shu[++p]=-13;
shu[++p]=-14;
shu[++p]=-15;
shu[++p]=-16;
shu[++p]=-17;
i++;
i=1;
while(shu[i]!
=-17||get_top_char()!
doublem=shu[i];
if(m>
push_num(m);
i++;
else
if(m==-1)
c='
elseif(m==-2)
elseif(m==-3)
elseif(m==-4)
elseif(m==-5)
elseif(m==-6)
elseif(m==-7)
elseif(m==-8)
elseif(m==-9)
elseif(m==-10)
elseif(m==-11)
elseif(m==-12)
elseif(m==-13)
elseif(m==-14)
elseif(m==-15)
elseif(m==-16)
elseif(m==-17)
charch=get_top_char();
//得到最顶端运算符号
if(compare[ch]<
compare[c])//运算符号级别的比较
push_char(c);
elseif(ch=='
c=='
pop_char();
elseif(compare[ch]>
=compare[c]&
ch!
if(ch=='
||ch=='
||ch=='
||ch=='
doubleone=pop_num();
chardian=pop_char();
push_num(operate_one(one,dian));
elseif(ch=='
doubleone_L=pop_num();
doubletwo_L=pop_num();
push_num(operate_L(two_L,one_L,dian));
else
doublex=pop_num();
doubley=pop_num();
if(dian=='
x==0)//判断是否除了"
零"
{
cout<
<
"
由于您除了零,结果将是错误的"
endl;
}
push_num(operate(x,dian,y));
//把进行一次计算的结果入栈
doubleresult=pop_num();
//得到结果
returnresult;
4)检查表达式的书写错误:
intcheck_kuohao()//检查表达式括号是否匹配
inti,f=0;
intkuo[SIZE],key=1;
memset(kuo,0,sizeof(kuo));
kuo[++f]=1;
if(kuo[f]==1)
kuo[f]=0;
f--;
key=0;
if(key&
f==0)
return1;
else
return0;
intcheck_char()//检查运算符号是否合法(如:
1+*4)
inti,ge;
)
ge=0;
while(line[i]=='
||line[i]=='
||line[i]=='
ge++;
if(ge>
=3)
else
voidoutput(doubleresult)//打出结果
printf("
所得结果是:
"
cout<
result<
voidcheck()//检查表达式是否合法
voidintroduce();
charcc;
//决定计算器按哪种功能进行计算
doubleresult;
//结果
voidinput();
if(check_kuohao()&
check_char())//看是否合法,合法则计算
result=compute();
output(result);
cout<
输入一个字符'
M'
或'
D'
F'
决定是否继续:
while(cin>
>
cc)
if(cc=='
{
system("
cls"
introduce();