asp程序计算,急,在线等…

asp程序计算,急,在线等…,第1张

123+234=357

123+"234"=357

"禅拦123"+"234"=123234

数字与数字型字符相加时它会陆袭旁自动早橡把数字型字符转换为数字

一、点“工具”——“选项”——“重新计算”——勾选“迭代计算”——将“最多迭代次数”改为“1”,如图亏悉:

二、将公式

=$A$1-SUM($B$1:B1)+SUM($C$1:C1)

粘贴到“D1”单元格,并拖下去,如图:

将公式

=D2

粘贴到“A2”单元格,并拖下去,如图:

输入数据,效果如图:

“D1”单元格公式可改漏仔为:

=A1-B1+C1

在E列演返空汪示如图:

“D2”单元格公式可改为:

=D1-B2+C2

并将“D2”单元格公式拖下去,效果如图:

/*以下是一个用于对任意表达式处理的计算器程序代码*/

#include<stdio.h>// c语言输入输出函数处理

//#include<stdlib.h>

#include<math.h>/*数学库函数*/

#include<string.h>/*字符串处理函数*/

//<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

#define MAX_SIZE 256 //处理字符串的最大长度

enum BOOL{FALSE,TRUE}//定义枚举类型变量

typedef struct tagOPERATE{

double Operand//定义 *** 作数

char Operator//定义 *** 作符(+ - * / ^)

}OPERATE,*LPOPERATE

void PostSrc(char *src,LPOPERATE lpOperator)

int IsDigit(char)

int isp(char ch)

int icp(char ch)

int Locate(char ch)

int getOperand(char *s,int *len,double *oprd)

double Calculate(LPOPERATE lpOperator,double x)

void SrcFunProc(char *src)

void _Proc(char*src)

static char Operator[]="#(+-*/^" //定义需要运算的字符

static int InPriority[]={0,1,3,3,5,5,7}//输入优先级

static int OutPriority[]={0,10,2,2,4,4,6}//输出优先级

int Locate(char ch)//对字符串表达式的定位

{

int i=0

for(i=0Operator[i]!='\0'i++)

if(Operator[i]==ch)

return i

return -1

}

int isp(char ch)//输入表达式的优余老吵先级

{

if('A'<=ch&&'Z'>=ch)

return 9

else

return InPriority[Locate(ch)]

}

int icp(char ch)//输出表达式的优先级

{

if('A'<=ch&&'Z'>=ch)

return 8

else

return OutPriority[Locate(ch)]

}

void _Proc(char*src)//将输含蔽入的字符串表达式一一入栈保护

{

char Buffer[MAX_SIZE]

char*p=src,*q=Buffer

*q++=*p++

while('\0'!=*p)

{

if('-'==*p&&'('==*(p-1))

{

*q++='0'

*q++='-'

p++

}

else

*q++=*p++

}

*q='\0'

strcpy(src,Buffer)

}

void SrcFunProc(char*src) //用于处理数学函数(sin cos tan ln log)的运竖侍算

{

char Buffer[MAX_SIZE]

char*p=src,*q=Buffer

while(*p!='\0')

{

switch(*p)

{

case 's':// A代表sin

*q++='A'

p+=3

break

case 'c':// B代表cos

*q++='B'

p+=3

break

case 'e'://C代表exp

*q++='C'

p+=3

break

case 'l':

if('n'==*(p+1))//D代表ln()

*q++='D'

else

*q++='E' //E代表lg()

p+=2

break

case 't'://F代表tan()

*q++='F'

p+=3

break

default:

*q++=*p++

break

}

}

*q='\0'

strcpy(src,Buffer)

}

void PostSrc(char*src,LPOPERATE lpOperator) //后缀遍历处理表达式

{

char *p=src,y

LPOPERATE lpOptr=lpOperator

char stack[MAX_SIZE]

int top=-1

double Operand

int offset=0

stack[++top]='#'

while('\0'!=*p)

{

if(IsDigit(*p))

{

getOperand(p,&offset,&Operand)

p+=offset

lpOptr->Operand=Operand

lpOptr->Operator=0

lpOptr++

}

else

if('x'==*p)

{

(lpOptr++)->Operator='x'

p++

}

else

if('p'==*p)

{

lpOptr->Operand=3.14159266

p+=2

lpOptr->Operator=0

lpOptr++

}

else

if(')'==*p)

{

for(y=stack[top--]y!='('y=stack[top--])

(lpOptr++)->Operator=y

p++

}

else

{

for(y=stack[top--]isp(y)>icp(*p)y=stack[top--])

(lpOptr++)->Operator=y

stack[++top]=y

stack[++top]=*p++

}

}

while(top!=-1)

(lpOptr++)->Operator=stack[top--]

}

int IsDigit(char ch) //判断是否为数字

{

if(('0'<=ch&&'9'>=ch)||'.'==ch)

return TRUE

return FALSE

}

int getOperand(char *s,int *len,double *oprd)//获取 *** 作数即字符串表达式

{

char *p = s,ch = *s++

double z = 0,x = 0

int bits = 0

int point = FALSE

while( IsDigit(ch) == TRUE){

if (ch == '.'){

if (point == TRUE)

return FALSE

point = TRUE

}

else {

if (point == TRUE){

x *= 10

x += ch - '0'

bits++

}

else {

z *= 10

z += ch - '0'

}

}

ch = *s++

}

while(bits-- >0) x /= 10

z += x

*oprd = z

*len = s - p - 1

return TRUE

}

double Calculate(LPOPERATE lpOperator,double x) //对字符串表达式的运算处理

{

double stack[MAX_SIZE],y1,y2

int top=-1

LPOPERATE lpOptr=lpOperator

stack[++top]=0

while(lpOptr->Operator!='#')

{

if(!lpOptr->Operator)

stack[++top]=(lpOptr++)->Operand

else

if('x'==lpOptr->Operator)

{

stack[++top]=x

lpOptr++

}

else

switch ((lpOptr++)->Operator)

{

case '+'://求+

y1=stack[top--]

y2=stack[top--]

stack[++top]=y1+y2

break

case '-'://求-

y1=stack[top--]

y2=stack[top--]

stack[++top]=y2-y1

break

case '*'://求*

y1=stack[top--]

y2=stack[top--]

stack[++top]=y1*y2

break

case '/'://求/

y1=stack[top--]

y2=stack[top--]

stack[++top]=y2/y1

break

case '^'://求^

y1=stack[top--]

y2=stack[top--]

stack[++top]=pow(y2,y1)

break

case 'A': //求sin(y1)

y1=stack[top--]

stack[++top]=sin(y1)

break

case 'B'://求cos(y1)

y1=stack[top--]

stack[++top]=cos(y1)

break

case 'C'://求exp(y1)

y1=stack[top--]

stack[++top]=exp(y1)

break

case 'D'://求log(y1)

y1=stack[top--]

stack[++top]=log(y1)

break

case 'E'://求log10(y1)

y1=stack[top--]

stack[++top]=log10(y1)

break

case 'F'://求tan(y1)

y1=stack[top--]

stack[++top]=tan(y1)

break

default:

break

}

}

return stack[top]

}

void main()

{

char src[MAX_SIZE]

double d

OPERATE postsrc[MAX_SIZE]

memset(src,0,MAX_SIZE)//初始化内存的某一块地址其地址的最大值为256最后返回src

printf("公式计算器--精确到小数点后六位\n输入任意表达式开始计算,输入quit结束程序\n常量pi=3.14159266\n")

scanf("%s",src)

while(strcmp(src,"quit"))//输入字符串与"quit"比较,若相等则退出循环,否则继续处理表达式

{

_Proc(src)

SrcFunProc(src)

PostSrc(src,postsrc)

d=Calculate(postsrc,3.1415926)

printf("计算结果是:%f\n",d)

memset(src,0,MAX_SIZE)

scanf("%s",src)

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12369654.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存