可视化程序设计~急啊
发布网友
发布时间:2022-04-20 18:12
我来回答
共1个回答
热心网友
时间:2022-04-20 19:42
/* Author cngdzhang */
/* Date 2002.2 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <conio.h>
#include <ctype.h>
#define ISTR 1
#define INUM 2
#define IOPE 3
#define IERR 0
double getfactor();
double getvalue();
char *pss;
char *ps;
char s1[256];
char s2[256];
double t;
double pi=3.1415926;
void ctolower(char *s)
{
while(*s!= '\0 ')
{
*s=tolower(*s);
s++;
}
}
int getitem(char *ss,char *st)
{
char *p=ss;
while(*p== ' ') p++;
if(*p== '( ' || *p== ') ' || *p== '+ ' || *p== '- ' || *p== '* ' || *p== '/ ')
{
*st++=*p;
*st= '\0 ';
p++;
ps=p;
return(IOPE);
}
else if(isdigit(*p))
{
while(isdigit(*p)) *st++=*p++;
*st= '\0 ';
ps=p;
return(INUM);
}
else if(isalnum(*p))
{
while(isalnum(*p)) *st++=*p++;
*st= '\0 ';
ps=p;
return(ISTR);
}
return(IERR);
}
double countit(double num1,char op,double num2)
{
switch(op)
{
case '+ ':
return(num1+num2);
case '- ':
return(num1-num2);
case '* ':
return(num1*num2);
case '/ ':
return(num1/num2);
default:
printf( "error!!! ");
break;
}
return(IERR);
}
double getvalue()
{
int f;
double num1,num2;
char op1,op2;
num1=getfactor();
bb:
f=getitem(ps,s2);
if(f==IERR) return(num1);
if(f==IOPE && *s2== ') ') return(num1);
if(f==IOPE) op1=*s2;
num2=getfactor();
num1=countit(num1,op1,num2);
goto bb;
}
double getfactor()
{
int f;
double num1,num2;
char op1,op2;
f=getitem(ps,s2);
if(f==IOPE && *s2== '( ') return(getvalue());
if(f==ISTR && *s2== 't ' && *(s2+1)== '\0 ') num1=t;
if(f==ISTR && *s2== 'p ' && *(s2+1)== 'i ') num1=pi;
if(f==INUM) num1=atof(s2);
if(f==IOPE && *s2== '- ')
{
f=getitem(ps,s2);
if(f==ISTR && *s2== 't ') num1=-t;
else if(f==ISTR && *s2== 'p ' && *(s2+1)== 'i ') num1=-pi;
else if(f==IOPE && *s2== '( ') return(-getvalue());
if(f==INUM) num1=-atof(s2);
}
if(f==ISTR && *s2== 'c ' && *(s2+1)== 'o ') num1=cos(getfactor());
if(f==ISTR && *s2== 's ' && *(s2+1)== 'i ') num1=sin(getfactor());
if(f==ISTR && *s2== 't ' && *(s2+1)== 'a ') num1=tan(getfactor());
if(f==ISTR && *s2== 's ' && *(s2+1)== 'q ') num1=sqrt(getfactor());
if(f==ISTR && *s2== 'l ' && *(s2+1)== 'n ') num1=log(getfactor());
if(f==ISTR && *s2== 'e ' && *(s2+1)== 'x ') num1=exp(getfactor());
aa:
f=getitem(ps,s2);
if(f==IOPE && (*s2== '+ ' || *s2== '- ' || *s2== ') '))
{
ps--;
return(num1);
}
if(f==IERR) return(num1);
op1=*s2;
f=getitem(ps,s2);
if(f==INUM) num2=atof(s2);
else if(f==IOPE && *s2== '( ') num2=getvalue();
if(f==ISTR && *s2== 't ' && *(s2+1)== '\0 ') num2=t;
if(f==ISTR && *s2== 'p ' && *(s2+1)== 'i ') num2=pi;
if(f==IOPE && *s2== '- ')
{
f=getitem(ps,s2);
if(f==ISTR && *s2== 't ') num2=-t;
else if(f==ISTR && *s2== 'p ' && *(s2+1)== 'i ') num2=-pi;
else if(f==IOPE && *s2== '( ') return(-getvalue());
if(f==INUM) num2=-atof(s2);
}
if(f==ISTR && *s2== 'c ' && *(s2+1)== 'o ') num2=cos(getfactor());
if(f==ISTR && *s2== 's ' && *(s2+1)== 'i ') num2=sin(getfactor());
if(f==ISTR && *s2== 't ' && *(s2+1)== 'a ') num2=tan(getfactor());
if(f==ISTR && *s2== 's ' && *(s2+1)== 'q ') num2=sqrt(getfactor());
if(f==ISTR && *s2== 'l ' && *(s2+1)== 'n ') num2=log(getfactor());
if(f==ISTR && *s2== 'e ' && *(s2+1)== 'x ') num2=exp(getfactor());
num1=countit(num1,op1,num2);
goto aa;
}
void main(){
clrscr();
printf( "Please enter the string: ");
gets(s1);
ps=s1;
printf( "%s = %lf ",s1,getvalue());
}