⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 计算器4.c

📁 一个能算波兰法和自然法的计算器
💻 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 + -