📄 计算器4.c
字号:
double ctod (char *,int );
int f(char);
int check(char *,int);
void ztob(char *,char *);
double zhu(char *);
#define P printf
#include"stdio.h"
#include"string.h"
void main (void)
{
char c[1000],*c1=c,c2[1000];
int i,biao,length,flag=0,fla;
double jieguo;
P("请选择输入算式的表示法,输入代号\n 1波兰输入法\n 2自然输入法(务必正确输入,且不要输入括号,此算法无法查错)\n");
fla=scanf("%d",&biao);
while( fla==0||( biao!=1&&biao!=2 ) )
{
while(getchar()!='\n') ;
P("请选择输入算式的表示法\n 1波兰输入法\n 2自然输入法(务必正确输入,且不要输入括号,此算法无法查错)\n");
fla=scanf("%d",&biao);
/*while(getchar()!='\n') ;*/
}
while(getchar()!='\n') ;
if(biao==1)
{
printf("输入波兰算式");
gets(c2);
length=strlen(c2); P("length=%d\n",length);
flag=check(c2,length);
while(flag==0)
{
printf("波兰算式错误,重新输入\n");
gets(c2);
length=strlen(c2);
flag=check(c2,length);
}
c2[length]='\n';
jieguo=zhu(c2);
}
if(biao==2)
{
P("输入自然算式:\n");
gets(c1);
ztob(c1,c2);
for(i=0;c2[i]!='\n';i++) putchar(c2[i]);
jieguo=zhu(c2);
}
P("结果是%f\n",jieguo);
}
/*函数1 定义算波兰法的函数*/
double zhu(char *c)
{
char *pc=c;
double a[1000],*pa=a,t;
int i=0,k=0,flag1=1;
while(c[i]!='\n')
{
if(c[i]!=42&&c[i]!=43&&c[i]!=45&&c[i]!=47) /*c[i]不是运算副*/
{
if(c[i]==32) {*pa=ctod(pc-k,k); pa++; k=0;}
else k++;
}
else /*c[i]是运算副*/
{
if((c[i-1]>=48&&c[i-1]<=57)||c[i-1]==46) {*pa=ctod(pc-k,k);k=0;}
else pa--;
switch (c[i])
{
case 43: t=(*(pa-1))+(*pa); break;
case 45: t=(*(pa-1))-(*pa); break;
case 42: t=(*(pa-1))*(*pa); break;
default:
{
if(*pa+1.0==1.0) {flag1=0;printf("除数为零,停止运算");}
else t=(*(pa-1))/(*pa);
}
}
*(--pa)=t;
pa++;
}
i++;
pc++;
}
if(flag1==1) return(t);
}
/*函数2 定义将字符转化成数字的函数*/
double ctod(char *p,int k)
{
double s,z,x;
int numz=0,i=0,flag=0;
while(i<k&&flag==0)
{
if(p[i]!=46) numz++;
else flag=1;
i++;
}
z=0;
for(i=0;i<numz;i++) z=10*z+(double)(p[i]-48); ;
x=0;
for(i=k-1;i>numz;i--) x=x/10+p[i]-48;
s=z+x/10;
return(s);
}
/*函数3 定义初步检查字符合理性的函数*/
int f(char c)
{
int b;
if((c>=48&&c<=57)||c==42||c==43||c==45||c==47||c==32||c==46) b=1;
else b=0;
return(b);
}
/*函数4 定义进一步检查字符合理性的函数*/
int check(char *c,int length)
{
int i=0,nn=0,nk=0,nf=0,bd=0;
if(c[0]<48||c[0]>57) { P("第一个字符非数字");return(0);} /*第一个字符必须为数字*/
while(i<length)
{
if(f(c[i])==0) {P("c[%d]不满足初步要求,c[%d]=%c\n",i,i,c[i]);return(0);}
else /*c[i]初步合理*/
{
if(c[i]==32) /*c[i]为空格*/
{
bd=0; nk++;
if(c[i+1]==32) {P("c[%d]c[%d]都是空格\n",i,i+1);return(0);}
}
else /*c[i]非空格*/
{
if(c[i]==43||c[i]==45||c[i]==42||c[i]==47) /*c[i]为四符*/
{
bd=0; nf++;
if(nf>(nn+1)) /*第n个运算副前至少n+1个数,此条件不成立*/
{P("不满足第n个运算副前至少n+1个数\n"); return(0);}
}
else /*c[i]非四符*/
{
if(c[i]==46) /*c[i]为小数点*/
{
if(bd==0) bd=1;
else { P("c[i]为第二个小数点\n");return(0);} /*两个小数点*/
}
else /*c[i]非小数点,只能是数字*/
{
if(c[i+1]==43||c[i+1]==45||c[i+1]==42||c[i+1]==47||c[i+1]==32) nn++;
}
}
}
}
i++;
}
if( (nf==(nn-1)) && (nk<=nf) ) return(1);
else {P("不满足运算副数比数字数少一\n"); return(0);}
}
/*函数5 定义将自然法转换成波兰法的函数*/
void ztob(char *c,char *c2)
{
int length,nn=0,nf=0,nk=0,i=0,k;
char fu[10]="k",*fp=fu;
length=strlen(c);
while(i<length)
{
if((c[i]>=48&&c[i]<=57)||c[i]==46) /*c[i]是数字或小数点*/
{
*c2=c[i];
c2++;
if((c[i+1]<48||c[i+1]>57)&&c[i+1]!=46)
{
nn++;
*c2=32;
c2++;
}
}
else /*c[i]是运算副*/
{
if( (*fp=='k')|| (( c[i]==42||c[i]==47 )&&( *(fp-1)==43||*(fp-1)==45 )) )
/*fp空或c[i]高于fp顶*/
{
*fp=c[i];
fp++;
}
else
{
k=fp-fu;
if(k==1)
{
fp--;
if(*(c2-1)==32) c2--;
*c2=*fp;
c2++;
nf++;
*fp=c[i];
fp++;
}
if(k==2)
{
fp--;
if(*(c2-1)==32) c2--;
*c2=*fp;
c2++;
nf++;
/*始*/ if(( c[i]==42||c[i]==47 )&&( *(fp-1)==43||*(fp-1)==45 ))
{
*fp=c[i];
fp++;
}
else
{
fp--;
if(*(c2-1)==32) c2--;
*c2=*fp;
c2++;
nf++;
*fp=c[i];
fp++;
} /*终*/
}
}
}
i++;
}
P("符号站里有%c %c\n",fu[0],fu[1]); P("fp-fu==%d\n",fp-fu);
while(fp-fu!=0)
{
P("取一次\n");
fp--;
if(*(c2-1)==32) c2--;
*c2=*fp;
c2++;
}
*c2='\n';
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -