导航:首页 > 软件知识 > 如何用程序计算表达式的值

如何用程序计算表达式的值

发布时间:2022-07-12 14:58:18

㈠ 1. 编写程序,求出下面算术表达式的值。

第一题:

#include <stdio.h>
int main(int argc, char *argv[])
{
float x=2.5;
int a = 7;
float y = 4.7;
float sum = x+a%3*(int)(x+y)%2/4;
printf("%.4lf",sum);
return 0;
}

㈡ 用C语言编写程序“算术表达式求值”

#include <stdio.h>
#include <math.h>
enum state
;
int ctoi( char c)
bool isNum( char a)
bool isOp(char op)
{
switch(op)
{
case '+':
return true;
break;
case '-':
return true;
break;
case '*':
return true;
break;
case '/':
return true;
break;
default:
return false;
break;
}
}
bool isDot(char dot)
int checkString( char str[], double *a, double * b, char* op, int num)
{
enum state s = BEGIN;
int a_i = 0;
int b_i = 0;

double num1 = 0;
double num2 = 0;
int pointNum = 0;
for( int i = 0; i < num; ++i)
{
if(str[i] == ' ')continue;
switch(s)
{
case BEGIN:
if(isNum(str[i]))

elses = ERROR;
break;
case P2:
if(isNum(str[i]))

else if(isDot(str[i]))
{
s = P3;
}
else if(isOp(str[i]))
{
*op = str[i];
s = P5;
}
else
s = ERROR;
break;
case P3:
if(isNum(str[i]))
{
num1 = num1 + ctoi(str[i]) * pow(0.1, ++pointNum) ;
s = P4;
}
else
s = ERROR;
break;
case P4:
if(isNum(str[i]))
{
num1 = num1 + ctoi(str[i]) * pow(0.1, ++pointNum);
s = P4;
}
else if(isOp(str[i]))
{
*op = str[i];
s = P5;
}
else
s = ERROR;
break;
case P5:
if(isNum(str[i]))
{
num2 = num2 * 10 + ctoi(str[i]);
s = P6;
}
else
s = ERROR;
break;
case P6:
pointNum = 0;
if(isNum(str[i]))
{
num2 = num2 * 10 + ctoi(str[i]);
s = P6;
}
else if(isDot(str[i]))
{
s = P7;
}
else
s = END;
break;
case P7:
if(isNum(str[i]))
{
num2 = num2 + ctoi(str[i]) * pow(0.1, ++pointNum);
s = P8;
}
else
s = END;
break;
case 8:
if(isNum(str[i]))
{
num2 = num2 + ctoi(str[i]) * pow(0.1, ++pointNum);
s = P8;
}
else if(isOp(str[i]))
{
s = END;
}
else
s = END;
break;
case ERROR:
printf("express error. \n");
break;
}
if (s == END || s == ERROR)
break;
}
if(s==END)
else
}
int main()
{
char op;
double a;
double b;

char string[128] = ;
scanf("%s", &string);
printf("the expression you input is : %s. \n", string);
getchar();

if (-1 == checkString(string, &a, &b, &op, 128))
{
printf("error occur while checking expression. Be sure no space in your expression when input\n");
getchar();
return 0;
}

double result;
switch(op)
{
case '+':
result = a + b;
break;
case '-':
result = a - b;
break;
case '*':
result = a * b;
break;
case '/':
if(b != 0)
result = a / b;
else
{
printf(" error! %d/%d", a, b);
return -1;
}
break;
default:
printf("undefined expression.\n");
break;
}

printf("%f %c %f = %f\n", a, op, b, result);
return 0;
}

㈢ 编一个程序计算表达式5>3&&2||8<4的值,并用输出语句把值输出

#include <stdio.h>

int main()

{

printf("5>3&&2||8<4运算结果为:%d",5>3&&2||8<4);

return 0;

}

大于小于的优先级>与&&>或||,因此先计算5>3为真,结果为1;再计算1&&2,结果为真,再计算1||8<4,结果为1。

(3)如何用程序计算表达式的值扩展阅读:

1、优先级与求值顺序无关。如a+b && b*c,虽然*优先级最高,但这个表达式求值顺序是从左到右。

2、优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。

3、相同优先级中,按结合性进行结合。大多数运算符结合性是从左到右,只有三个优先级是从右至左结合的,它们是单目运算符、条件运算符、赋值运算符。

4、基本的优先级需要记住:

指针最优,单目运算优于双目运算。如正负号。先算术运算,后移位运算,最后位运算。请特别注意:1 << 3 + 2 & 7等价于 (1 << (3 + 2))&7。逻辑运算最后结合。

网络-运算符优先级

㈣ 编程-计算表达式的值

const max=100;

var symbol:array[1..max]of char;
number:array[0..max]of integer;
s,t:string;
i,p,j,code:integer;

procere push;
begin
inc(p);
symbol[p]:=s[i];
end;

procere pop;
var r:real;
begin
dec(p);
case symbol[p+1] of
'+':inc(number[p],number[p+1]);
'-':dec(number[p],number[p+1]);
'*':number[p]:=number[p]*number[p+1];
'/':number[p]:=number[p] div number[p+1];
'^':number[p]:=trunc(exp(number[p+1]*ln(number[p])));
end;
end;

function can:boolean;
begin
can:=true;
if (s[i] in ['+','-'])and(symbol[p]<>'(') then exit;
if (s[i] in ['*','/'])and(symbol[p] in ['*','/']) then exit;
if (s[i]='^')and(symbol[p]='^') then exit;
can:=false;
end;

begin
readln(s);
s:='('+s+')';
while i<length(s) do begin
inc(i);
if s[i]=' ' then delete(s,i,1);
end;
i:=1;
while i<=length(s) do begin
while s[i]='(' do begin
push;
inc(i);
end;
j:=i;
repeat
inc(i);
until (s[i]<'0')or(s[i]>'9');
t:=(s,j,i-j);
val(t,number[p],code);
repeat
if s[i]=')' then begin
while symbol[p]<>'(' do pop;
dec(p);
number[p]:=number[p+1];
end
else begin
while can do pop;
push;
end;
inc(i);
until (i>length(s))or(s[i-1]<>')');
end;
writeln('ANS=',number[0]);
readln;
end.
这是Pascal的,VB的下次再说。

㈤ 数据结构写程序实现表达式求值算法

这是c++的代码

0stdafx.h

//stdafx.h:标准系统包含文件的包含文件,
//或是经常使用但不常更改的
//特定于项目的包含文件
//

//#pragmaonce是一个比较常用的C/C++杂注,只要在头文件的最开始加入这条杂注,就能够保证头文件只被编译一次。
#pragmaonce
#include"targetver.h"
#include<stdio.h>
#include<tchar.h>
#include<iostream>
#include<stdlib.h>
#include<string>
#include<string.h>
#include<math.h>
#include<time.h>
usingnamespacestd;

//TODO:在此处引用程序需要的其他头文件


1 stack栈的结构

#pragmaonce
#include"stdafx.h"
#include"StackNode.h"

//LinkStack,链式栈的类定义
template<typenameT>
classStack{
private:
StackNode<T>*top;//curptr
//7个方法
public:
//ConstructFunction()
Stack():top(NULL){}
//DeConstructFunction()
~Stack(){
StackNode<T>*p;//temprefdomain
while(top!=NULL){//free()
p=top;
top=top->next;
deletep;
}
}
//Push()从栈顶压入一个元素
voidPush(constT&item){
StackNode<T>*p=newStackNode<T>;
p->data=item;//赋值
p->next=top;//connectcurptr
top=p;//curptrmove++
}
//Pop()从栈顶弹出一个元素
TPop(){
if(IsEmpty()){//emptystack
cerr<<"Attempttopopanemptystack!"<<endl;
exit(1);
}
StackNode<T>*p=top;//temprefdomain
TRetValue=p->data;//tempdatadomain
top=top->next;//top--move
deletep;//free()p,elsewillcrashmemory
returnRetValue;
}
//Peek(),GetTop()
TPeek()const{
if(IsEmpty()){//emptystack
cerr<<"Attempttopopanemptystack!"<<endl;
exit(1);
}
returntop->data;
}//!_Peek
//Clear()
voidClear(void){
//不free()会内存泄漏
StackNode<T>*p;//temprefdomain
while(top!=NULL){//free()
p=top;
top=top->next;
deletep;
}
this.top=NULL;
}//!_Clear()
//IsEmpty()
intIsEmpty(void)const{
returntop==NULL;
}//!_IsEmpty()
};//!_classStack


2表达式求值算法

#pragmaonce
#include"stdafx.h"
#include"Stack.h"
//方法的声明实现的分离写法容易报错,IDE还找不到错误的地方

//表达式求值
classCalculator{
private:
//Calculator'sstack,运算存储区
Stack<double>s;
//7个方法
public:
//建立一个空计算器栈
Calculator(void){}
//De建立一个空计算器栈
virtual~Calculator(){}
//将一个double型操作数压入堆栈
voidEnter(doubleoperand){
s.Push(operand);
}
//弹出2个操作数
voidGetTwoOperands(double&operand1,double&operand2){
if(s.IsEmpty()){
cerr<<"Nooperandtobepop!"<<endl;
s.Clear();
exit(1);
}
operand1=s.Pop();
if(s.IsEmpty){
cerr<<"Nooperandtobepop!"<<endl;
s.Clear();
exit(1);
}
operand2=s.Pop();
}
//操作符运算
voidCompute(charop){
doubleoperand1,operand2,result;
GetTwoOperands(operand1,operand2);
switch(op){
case'+':result=operand1+operand2;break;
case'-':result=operand1-operand2;break;
case'*':result=operand1*operand2;break;
case'/':if(operand2==0){
cerr<<"Dividedby0!"<<endl;
s.Clear();
exit(1);
}else
result=operand1/operand2;break;
default:
break;
}
s.Push(result);
}
//清空栈
voidClear(){
s.Clear();
}
//计算表达式的值
voidRun(){
charop;//操作符
doubleoperand;//操作数
cin>>op;//输入操作符
while(op!='='){
switch(op){
case'+':case'-':case'*':case'/':
Compute(op);break; //运算
default:cin.putback(op);//非操作符,回流
cin>>operand;//入操作数
Enter(operand);break;//入栈操作数
}
cin>>op;//输入操作符
}
cout<<s.Pop()<<endl;//最后出栈
Clear();//清空栈
}
};//!_classCalculator

㈥ 编写程序对表达式求值:

#include "stdio.h"
#include "malloc.h"

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

typedef int Status;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

typedef struct{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
//构造一个空栈
Status InitStack(SqStack *S){
S->base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));

if(!S->base)
exit(OVERFLOW);
S->top=S->base;
S->stacksize=STACK_INIT_SIZE;
return OK;
}
//判断是否为空栈
Status StackEmpty(SqStack S){
if(S.top == S.base)
return TRUE;
else
return FALSE;
}
//用e返回S的顶元素
Status GetTop(SqStack S, SElemType *e){
if(S.top == S.base)
return ERROR;
*e = *(S.top-1);
return OK;
}
//插入e为新的顶元素
Status Push(SqStack *S, SElemType e){
if((S->top - S->base) >= S->stacksize){
S->base = (
SElemType*)realloc(S->base,
(S->stacksize+STACKINCREMENT)*sizeof(SElemType)
);
if(!S->base)
exit(OVERFLOW);
S->top = S->base +S->stacksize;
S->stacksize += STACKINCREMENT;
}
*(S->top)=e;
S->top++;
return OK;
}
//删除S的顶元素,并用e返回其值
Status Pop(SqStack *S, SElemType *e){
if(S->top == S->base)
return ERROR;
S->top--;
*e = *(S->top);
return OK;
}
//从栈底到栈顶依次对S的每个元素调用函数Visit(),一旦失败操作无效
Status ListTraverse(SqStack S,Status (*visit)(SElemType)){
SElemType *p;
p=S.base;
for(p=S.base;p<S.top;p++)
(*visit)(*p);

return OK;
}
//输出元素e
Status output(SElemType e){
printf("%d ",e);

return OK;
}

实现表达式求值的代码:
/*计算整数表达式的值
*表达式必须以#结束
*表达式中可以出现多位数字,
*表达式中可以出现空格
*运算符包括+,-,*,/,(,)
*运算结果可以是多位整数,并以整数的形式返回
*/
typedef int SElemType; /*放入堆栈的元素的类型*/
#include <ctype.h>
#include "stack_s.c"
/*判断输入的某个字符是否是运算符
*c表示输入的字符
*op数组中存放系统能识别的运算符
*/
Status in(char c,char op[]){
char *p;
p=op;
while(*p != '\0'){
if(c == *p)
return TRUE;
p++;
}
return FALSE;
}
/*比较两个运算符的优先级
*a,b中存放待比较的运算符
*'>'表示a>b
*'0'表示不可能出现的比较
*/
char Precede(char a, char b){
int i,j;
char pre[][7]={
/*运算符之间的优先级制作成一张表格*/
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','0'},
{'>','>','>','>','0','>','>'},
{'<','<','<','<','<','0','='}};
switch(a){
case '+': i=0; break;
case '-': i=1; break;
case '*': i=2; break;
case '/': i=3; break;
case '(': i=4; break;
case ')': i=5; break;
case '#': i=6; break;
}
switch(b){
case '+': j=0; break;
case '-': j=1; break;
case '*': j=2; break;
case '/': j=3; break;
case '(': j=4; break;
case ')': j=5; break;
case '#': j=6; break;
}
return pre[i][j];
}
/*进行实际的运算
*a,b中分别以整数的形式存放两个待运算的操作数
*theta中存放代表操作符的字符
*结果以整数的形式返回
*/
int Operate(int a, char theta, int b){
int i,j,result;
i=a;
j=b;

switch(theta) {
case '+': result = i + j; break;
case '-': result = i - j; break;
case '*': result = i * j; break;
case '/': result = i / j; break;
}
return result;
}
/*从输入缓冲区中获得下一个整数或运算符,并通过n带回到主调函数
*返回值为1表示获得的是运算符
*返回值为0表示获得的是整形操作数
*/
int getNext(int *n){
char c;
*n=0;
while((c=getchar())==' '); /*跳过一个或多个空格*/
if(!isdigit(c)){ /*通过函数判断如果字符不是数字,那么只能是运算符*/
*n=c;
return 1;
}
do { /*能执行到该条语句,说明字符是数字,此处用循环获得连续的数字*/
*n=*n*10+(c-'0'); /*把连续的数字字符转换成相对应的整数*/
c=getchar();
} while(isdigit(c)); /*如果下一个字符是数字,进入下一轮循环*/
ungetc(c,stdin); /*新读入的字符不是数字,可能是运算符,为了不影响下次读入,把该字符放回到输入缓冲区*/
return 0;
}

int EvaluateExpression(){

int n;
int flag;
int c;
char x,theta;
int a,b;

char OP[]="+-*/()#";
SqStack OPTR;
SqStack OPND;

InitStack(&OPTR);
Push(&OPTR,'#');
InitStack(&OPND);
flag=getNext(&c);

GetTop(OPTR, &x);
while(c!='#' || x != '#')
{
if(flag == 0)
{
Push(&OPND,c);
flag = getNext(&c);
} else
{
GetTop(OPTR, &x);
switch(Precede(x, c))
{
case '<'://栈顶元素优先级低
Push(&OPTR,c);
flag = getNext(&c);
break;
case '='://脱括号并接受下一字符
Pop(&OPTR,&x);
flag = getNext(&c);
break;
case '>':// 退栈并将运算结果入栈
Pop(&OPTR, &theta);
Pop(&OPND,&b);
Pop(&OPND,&a);
Push(&OPND, Operate(a, theta, b));
break;
}
}
GetTop(OPTR, &x);
}
GetTop(OPND, &c);
return c;
}

void main(){
int c;
printf("Please input one expression:");
c=EvaluateExpression();
printf("Result=%d\n",c);
getch();
}

㈦ 编写程序对表达式求值

#include<stdio.h>
intmain()
{

charch1,ch2;
doublep1,p2,p3;

scanf("%lf%c%lf%c%lf",&p1,&ch1,&p2,&ch2,&p3);

printf("%.1lf ",(p1+p2)*p3);
return0;
}

阅读全文

与如何用程序计算表达式的值相关的资料

热点内容
ipfs交易所推荐码有哪些 浏览:280
极光新闻在哪里填写人员信息 浏览:227
代理手机卡是什么意思 浏览:159
生日宴程序怎么安排亲戚朋友 浏览:31
市场上说的真钻是什么钻 浏览:78
plc不亮了如何复制程序 浏览:353
德州文玩市场在哪里 浏览:258
什么数据适合关联规则分类 浏览:224
ems邮寄信息平台保存多久 浏览:3
股票市场行情哪个好 浏览:395
重庆皇田花卉市场在什么地方 浏览:50
中木集团墙饰怎么代理武汉 浏览:986
电路板的程序是怎么做的 浏览:135
考试信息管理平台id一般是什么 浏览:95
表与表之间的数据如何合计 浏览:614
遵义女装折扣代理哪个好 浏览:749
代理返款图片怎么做 浏览:201
代理国家的公司有哪些 浏览:997
有一个摄影技术跟vr挂钩叫什么 浏览:245
宜春乌龙茶代理需要什么条件 浏览:995