重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
极限的四则运算法则是:
为丰泽等地区用户提供了全套网页设计制作服务,及丰泽网站建设行业解决方案。主营业务为网站设计制作、成都网站制作、丰泽网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
极限四则运算法则的前喊埋悔提是两个极限液仿存在,当有一个极限本身是不存在的,则不能用四则运算法则。设limf(x)和limg(x)存在,且令limf(x)=A,limg(x)=B。
四则运算是指加法、减法、乘法和除法四种运算。四则运算是小学数学的重要内容,也是学习其它各有关知识的基础。
在极限都存在的情况下,和差积商的极限,等于极限的和差积商。用数学的话郑正表达就是:
lim(A+B)limA+limB
lim(A-B)=limA-limB
limAB=limA×limB
lim(A/B)limA/limB
前提是以上各个极限都存在。
我曾用c编了个计算器,支持四则运算,支持括扮历号改变优先级,你看看吧:
#include stdio.h
#include string.h
#include stdlib.h
#include conio.h
#define Esc 27
#define Tab 9
void needle(char* s,char* carriage,int start)//needle意为“用针缝”
{
int size_carriage=(int)strlen(carriage);
int i,j;
for(j=0;jsize_carriage;j++)
{
for(i=(int)strlen(s);i=start;i--)
s[i+1]=s[i];
s[i+1]=carriage[j];
start=i+2;
}
}
double factorial(double d)//factorial意为“阶乘”
{
return d==0?1:d*factorial(d-1);
}
void handle(char* carriage)//handle意为“处理”
{
void find_start(char*,int*);
char* save1,*save2,ch;
char op[111];
double d1,d2;
int start,i;
find_start(carriage,start);
ch=carriage;
d1=strtod(carriage,save1);//strtod是厅肢搜库函数,功能是将字符串carriage中出现的第一个浮点数转化为double,并将剩余字符储存饥州在save1中
if(ch=='!')
{
sprintf(op,"%g",factorial(d1));//springf是库函数,功能是将显示在屏幕上的内容储存在op中
strcpy(carriage,op);
return;
}
for(i=0;i(int)strlen(save1);i++)//对于第一个不是'+'或'-'或数字的字符串,strtod无法作用。所以得去掉诸如"*22"字符串中的'*'
save1[i]=save1[i+1];
d2=strtod(save1,save2);
switch(ch)
{
case '*':sprintf(op,"%.32g",d1*d2);break;
case '/':sprintf(op,"%.32g",d1/d2);break;
case '+':sprintf(op,"%.16g",d1+d2);break;
case '-':sprintf(op,"%.16g",d1-d2);
}
strcpy(carriage,op);
}
void del(char* s,int start,int end)//delete意为“删除”
{
int i,j;
int size=(int)strlen(s);
for(i=end;i=start;i--)
for(j=i;jsize;j++)
s[j]=s[j+1];
}
void copy(char* s,char* carriage,int start,int end)//copy意为“复制”
{
int i;
for(i=0;start=end;i++,start++)
carriage[i]=s;
carriage[i]='\0';
}
void scissor(char* s,char* carriage,int* start)//scissor意为“用剪刀剪”
{
int sta,end;
for(sta=*start-1;(s[sta]='0's[sta]='9')||s[sta]=='.';sta--);
if(sta!=0||s[*start]=='!') //处理式子是-2+3或-2!的特殊情况
sta++;
if(s[*start]=='!')//'!'是单目运算符
end=*start;
else
{
for(end=*start+1;(s='0's='9')||s=='.';end++);
if((s[end-1]=='*'||s[end-1]=='/')(s=='+'||s=='-'))//处理式子是2*-2等的特殊情况
for(end++;(s='0's='9')||s=='.';end++);
end--;
}
copy(s,carriage,sta,end);
del(s,sta,end);
*start=sta;//记住等下针线函数needle要开始缝的地方
}
void find_start(char* s,int* start)//find_start意为“找到操作符号开始处”
{
int i;
int size=(int)strlen(s);
//由优先级决定从上而下的顺序
for(i=0;isize;i++)
if(s[i]=='!')
{
*start=i;
return;
}
for(i=0;isize;i++)
if(s[i]=='*'||s[i]=='/')
{
*start=i;
return;
}
if(s[0]=='+'||s[0]=='-')
{
for(*start=1;(s[*start]='0's[*start]='9')||s[*start]=='.';(*start)++);
return;
}
for(i=0;isize;i++)
if(s[i]=='+'||s[i]=='-')
{
*start=i;
return;
}
}
int judge(char* s)//judge意为“判断”
{
int i;
int size=(int)strlen(s);
for(i=1;isize;i++)
if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'||s[i]=='!')
return 1;
return 0;
}
void count(char* s)//count意为“计算”
{
int start,i;
char carriage[555];//carriage意为“运载体”
while(judge(s))//判断式子是否还需要进行运算
{
for(i=0;i(int)strlen(s);i++)//此循环作用是将式子中出现的'--'替换为'+'
{
for(;s[i]!='-' i(int)strlen(s);i++);//循环结束
if(s[i+1]=='-')
{
del(s,i,i+1);
needle(s,"+",i);
}
}
find_start(s,start);//让下标start指向式子应该最先开始处理的运算符
scissor(s,carriage,start);//用剪刀scissor将start指向的运算符及相对应的操作数剪下并储存在运载体carriage上
handle(carriage);//处理该运载体,并将运载体上运载的式子的计算结果储存在运载体上
needle(s,carriage,start);//见函数simplify中的说明
}
}
void simplify(char* s)//simplify意为“简化”,即将括号去除
{
char carriage[555];//carriage意为“运载体”
int start,end,i;
int size=(int)strlen(s);
while(1)
{
for(i=0;s[i] != '(' isize;i++);//注意这里末尾是分号
if(i==size)
break;//说明式子已不含括号,简化完成
for(end=0;s != ')';end++);//使end下标指向式子中第一个出现')'的地方
end--;
for(start=end;s != '(';start--);//寻找与上面一个')'配对的'('
start++;
copy(s,carriage,start,end);//将括号里的内容复制给运载体carriage
del(s,start-1,end+1);//删除整个括号及其里面的内容
count(carriage);//计算运载体运载的表达式,运算结果储存在运载体上
needle(s,carriage,start-1);//将运载体运载过来的结果用针线needle缝在刚才删除式子s括号及其内容的地方
}
}
int main()
{
int i=0;
char s[555],ch;
puts(" 本程序不对用户输入数据进行检测:");
puts(" 即用户应输入规范的计算式,包括分母不能为0:");
puts(" 式子不能含有空格及其他非计算字符;");
puts(" 按任意一个键开始,按回车键显示运算结果;");
while(1)
{
i++;
ch=getch();
if(Esc==ch)
break;
if(Tab==ch)
{
system("cls");//清除当前屏幕
puts("显示运算结果后:按“Esc”键退出,按“Tab”键清除当前屏幕");
}
if(i==1)
{
system("cls");
puts("显示运算结果后:按“Esc”键退出,按“Tab”键清除当前屏幕");
}
puts("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
gets(s);
simplify(s);
count(s);
puts(s);
//实验数据:23.243*(5!-23.123/.133+(2!-13/13.23)*(2!-.235)-((4!-20)!/2!)-32*(3!+2.23/(2*3)!))
//其正确结果是:-5953.9401265774754346182917611489
}
puts("谢谢使用!\n有问题可加q问我:281754179");
getch();
return 0;
}
我记得学了数据结构后我又重新用栈写了个,容错能力会更好,上面的代码可以改进很多,也只是给你一个思路罢了
1.判断四则运算字符串的括号是否匹配,可以用以个栈来计算,开始栈是空,从头遍历所有字符,找到'(',压栈,找到')'弹出一个元素,遍历完成以后如果栈是空表示正常,非空,或则中间出现问题都表示括号不正常。
2.分解四则运算中的所有元素,把所有分解的元素放在队列中,遍历整个字符串,有switch分支,如果是0-9的字符用一个字符串存储并和前面的字符组合起来,如果是'孝链+''-''*''/'就把前面存储数字的字符串当成一个元素放进队列,并把当前运算法符当成一个元素拆迅也放进队列,遍历完成以后所有的数据和运算符都分开了,比如234+456,会分解成234,+,456三个元素。
3.然后分解队列,用两个栈,一个存放所有元素用A表示,一个存放运算符号用B表示(这个是临时变量),从头开始遍历整个队列,如果是数据就把数据压到A栈。如果元素是运算符就分开处理,如果是'(''+''-''*''/'')'处理方法都不一样,详细说明太复杂,整体的思想就是把数据和运算符的顺序排列好(上面的元素排列以后变成234,456,+;可以参考后序排列)。
4.计算:依次弹出A中的元素,如果是数据把数据压在栈C中,如果是运算符,从C中弹出该运算符需要的数据,然后把计算结果再次压进栈C,当A遍历完以后,C顶元素就是计算结果。
整个大题思路:1.检查,2.分巧御孙解,3.中序排列,4.后序排列,5.计算