A. 用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;
}
B. C語言關於表達式求值
c語言有豐富的表達式,這是它的特點之一,表達式主要有4類,算術表達式,賦值表達式,逗號表達式,關系表達式
1.算術表達式就是包含算術運算符(如+
-
/
*
%等)的表達式(不是語句,後面沒有分號),如:a+b
,a%b,a+b-c*d,3+5等,算術表達式的值就是最後算出的結果,如3+5這個表達式的值就是8
2.賦值表達式,就是含有賦值運算符=的表達式,如a=5,b=3,c='a'等,=左邊的a,b,c稱為左值,必須為變數,=右邊的5,3,'a'稱為右值,必須為常量,賦值表達式的值為右值,如a=3的值為3,c='a'的值為字母a的ascii碼65(當然也可以認為它的值就是字母a)
3.逗號表達式就是含有逗號的表達式,形式:表達式1,表達式2,表達式3.......如a,b,c
3,5,7
a=3,b=4,c=6
3,a=5,b=6等
逗號表達式的值為,最右邊的表達式的值,如3,4,5的值就是5,表達式a=3,b=4,c=6的值就是表達式b=6的值,由上述分析知,表達式b=6的值就是6,所以表達式a=3,b=4,c=6的值就是6
4.關系表達式,指含有關系運算符(如>
<
>=
==
=<等)的表達式(其實也是算術表達式的一種)如a>b,a>6,6>5,3<2,4==6等,如果表達式的關系是正確的,那麼表達式的值為1,否則為0
如6>5正確,表達式的值為1,3<2,和4==6錯誤,表達式的值為0
當然可以細分為很多種表達式,不過主要也就是這幾種的變型,希望對你有所幫助
C. c語言表達式求值代碼
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
static int gv_a;
typedef struct list //創建隊列元素型
{
char str[10];
struct list*pNext;
}LIST;
typedef struct queue //創建隊列表型
{
LIST *front;
LIST *rear;
}QUEUE;
typedef struct oprstack //創建運算符棧型
{
char opr[100];
int a;
}OPRSTACK;
typedef struct valstack //創建運算棧型
{
float val[30];
int a;
}VALSTACK;
typedef struct element //創建表達式棧元素型
{
char c;
struct element *pNext;
}ENT;
typedef struct stack //創建表達式棧 型
{
ENT *pTop;
ENT *bottom;
}STACK;
bool calc(char *str,float *result);
float evaluationofexpression(char *str);
int main(void)
{
char str[50];
float result;
printf("請輸入要計算的表達式:");
scanf("%s",str);
result = evaluationofexpression(str);
if (gv_a)
return 0;
printf("結果:%f",result);
printf("\n");
return 0;
}
D. 如何用C語言數據結構的格式實現簡單的算術表達式求值程序
用棧把中綴表達式(輸入的式子)按優先順序轉為後綴表達式(逆波蘭式,即運算符在前,操作數在後),再利用棧變計算邊保存結果用於下一步計算,最後算出式子的答案
以下代碼輸入一個式子(以
=
作為輸入結束標志),輸出結果,負數如-3用0-3表示,支持高位運算
#include
<stdio.h>
#include
<stdlib.h>
#include
<math.h>
#include
<malloc.h>
#define
OK
1
#define
ERROR
-1
typedef
char
SElemType;
typedef
char
Status;
#define
STACK_INIT_SIZE
100000
#define
STACKINCREMENT
2
struct
SqStack
{
SElemType
*base;
SElemType
*top;
int
stacksize;
};
struct
SqStack1
{
int
*base;
int
*top;
int
stacksize;
};
SqStack
OPTR;
SqStack1
OPND;
char
Precede(char
c1,char
c2)
{
if(c1=='+'
||
c1=='-')
{
if(c2=='+'
||
c2=='-'
||
c2==')'
||
c2=='=')
return
'>';
else
return
'<';
}
else
if(c1=='*'
||
c1=='/')
{
if(c2=='(')
return
'<';
else
return
'>';
}
else
if(c1=='(')
{
if(c2==')')
return
'=';
else
return
'<';
}
else
if(c1==')')
return
'>';
else
if(c1=='=')
{
if(c2=='=')
return
'=';
else
return
'<';
}
else
return
'\0';
}
int
In(char
c)
{
if(c=='+'
||
c=='-'
||
c=='*'
||
c=='/'
||
c=='('
||
c==')'
||
c=='=')
return
1;
else
return
0;
}
int
Operrate(int
m,char
b,int
n)
{
switch(b)
{
case
'+':return
m+n;
case
'-':return
m-n;
case
'*':return
m*n;
case
'/':return
m/n;
}
return
0;
}
//操作數
int
InitStack1(SqStack1
&S)
{
S.base=(int
*)malloc(STACK_INIT_SIZE*sizeof(int));
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return
OK;
}
int
Push1(SqStack1
&S,int
e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(int
*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));
S.top=S.base+S.stacksize;
S.stacksize=S.stacksize+STACKINCREMENT;
}
*S.top++=e;
return
OK;
}
int
Pop1(SqStack1
&S,int
&e)
{
if(S.top==S.base)
return
ERROR;
e=*
--S.top;
return
OK;
}
int
GetTop1(SqStack1
S)
{
if(S.top==S.base)
return
ERROR;
return
*(S.top-1);
}
//算符
int
InitStack(SqStack
&S)
{
S.base=(SElemType
*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return
OK;
}
int
Push(SqStack
&S,SElemType
e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(SElemType
*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
S.top=S.base+S.stacksize;
S.stacksize=S.stacksize+STACKINCREMENT;
}
*S.top++=e;
return
OK;
}
int
Pop(SqStack
&S,SElemType
&e)
{
if(S.top==S.base)
return
ERROR;
e=*
--S.top;
return
OK;
}
Status
GetTop(SqStack
S)
{
if(S.top==S.base)
return
ERROR;
return
*(S.top-1);
}
int
Calculate()
{
char
c,theta,p;
int
a,b,i=0,ans,x;
InitStack(OPTR);
Push(OPTR,'=');
InitStack1(OPND);
c=getchar();
while(c!='='
||
GetTop(OPTR)!='=')
{
if(!In(c)
&&
c>='0'
&&
c<='9')
{
Push1(OPND,c-'0');
c=getchar();
while(c>='0'
&&
c<='9')
{
Pop1(OPND,x);
Push1(OPND,x*10+c-'0');
c=getchar();
}
}
else
if(In(c))
{
switch(Precede(GetTop(OPTR),c))
{
case
'<':
Push(OPTR,c);
c=getchar();
break;
case
'=':
Pop(OPTR,p);
c=getchar();
break;
case
'>':
Pop(OPTR,theta);
Pop1(OPND,b);
Pop1(OPND,a);
ans=Operrate(a,theta,b);
Push1(OPND,ans);
break;
}
}
else
{
c=getchar();
}
}
return
GetTop1(OPND);
}
int
main()
{
int
ans;
ans=Calculate();
printf("%d\n",ans);
return
0;
}
E. C語言中一維多項式求值
計算多項式 p(x)=a(n-1)x(n-1)+a(n-2)x(n-2)+.....a1x+a0;
在指定點x處的函數值。
演算法:
首先將多項式表述成如下嵌套的方式:
p(x)=(...((a(n-1)+a(n-2))x+a(n-3))x+....a1)x+a0;
然後依次從里向外算(因為x是已知的么),得到遞推公式:
U(n-1)=a(n-1)
U(k)=U(k+1)x+a(k); K=n-2,n-3......1,0;
那當算到k=0時,得到的U(0)就是要求的值。
下面是用C語言實現的:
double plyv( double a[],double x,int n) //a[]是多項式的系數,n是數組長度。
{
double u;//一直存放遞歸結果;
Int i;
for(i=n-2;i>=0;i--)
{
u=u*x+a[i];
}
return u;
}
#include
int main()
{
double a[3]={2,3,4};//根據多項式的形式定義數組長度以及個數,如果有的x項沒有,則視系數為0;
double s;
double x;
s=plyv(a,x,3);//此為最後結果;
printf("%f",s);
return 0;
}
此題的解題重點在於:找到求解的遞歸關系,然後依據遞歸關系求解。