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)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)