當前位置:編程學習大全網 - 編程語言 - 關於C語言編程

關於C語言編程

輸入算式:

2 + 5

2 + 5=7

#include<math.h>

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define true 1

#define false 0

#define OPSETSIZE 8

typedef int Status;

unsigned char Prior[8][8] = { // 表3.1 算符間的優先關系

// '+' '-' '*' '/' '(' ')' '#' '^'

/*'+'*/'>','>','<','<','<','>','>','<',

/*'-'*/'>','>','<','<','<','>','>','<',

/*'*'*/'>','>','>','>','<','>','>','<',

/*'/'*/'>','>','>','>','<','>','>','<',

/*'('*/'<','<','<','<','<','=',' ','<',

/*')'*/'>','>','>','>',' ','>','>','>',

/*'#'*/'<','<','<','<','<',' ','=','<',

/*'^'*/'>','>','>','>','<','>','>','>'

};

typedef struct StackChar{

char c;

struct StackChar *next;

}SC;

typedef struct StackFloat{

float f;

struct StackFloat *next;

}SF;

SC* Push(SC *s,char c){

SC *p=(SC*)malloc(sizeof(SC));

p->c=c;

p->next=s;

return p;

}

SF* Push(SF *s,float f){

SF *p=(SF*)malloc(sizeof(SF));

p->f=f;

p->next=s;

return p;

}

SC* Pop(SC *s){

SC *q=s;

s=s->next;

free(q);

return s;

}

SF* Pop(SF *s){

SF *q=s;

s=s->next;

free(q);

return s;

}

float Operate(float a,unsigned char theta, float b) {

switch(theta) {

case '+': return a+b;

case '-': return a-b;

case '*': return a*b;

case '/': return a/b;

case '^': return pow(a,b);

default : return 0;

}

}

char OPSET[OPSETSIZE]={'+' , '-' , '*' , '/' ,'(' , ')' , '#','^'};

Status In(char Test,char* TestOp) {

int Find=false;

for (int i=0; i< OPSETSIZE; i++) {

if (Test == TestOp[i]) Find= true;

}

return Find;

}

ReturnOpOrd(char op,char* TestOp) {

for(int i=0; i< OPSETSIZE; i++)

if (op == TestOp[i]) return i;

}

char precede(char Aop, char Bop) {

return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];

}

float EvaluateExpression(char* MyExpression) { // 算法3.4

// 算術表達式求值的算符優先算法。

// 設OPTR和OPND分別為運算符棧和運算數棧,OP為運算符集合。

SC *OPTR=NULL; // 運算符棧,字符元素

SF *OPND=NULL; // 運算數棧,實數元素

char TempData[20];

float Data,a,b;

char theta,*c,x,Dr[]={'#','\0'};

OPTR=Push(OPTR,'#');

c=strcat(MyExpression,Dr);

strcpy(TempData,"\0");//字符串拷貝函數

while (*c!= '#' || OPTR->c!='#') {

if (!In(*c, OPSET)) {

Dr[0]=*c;

strcat(TempData,Dr);//字符串連接函數

c++;

if (In(*c, OPSET)) {

Data=atof(TempData);//字符串轉換函數(double)

OPND=Push(OPND, Data);

strcpy(TempData,"\0");

}

} else { // 不是運算符則進棧

switch (precede(OPTR->c, *c)) {

case '<': // 棧頂元素優先權低

OPTR=Push(OPTR, *c);

c++;

break;

case '=': // 脫括號並接收下壹字符

OPTR=Pop(OPTR);

c++;

break;

case '>': // 退棧並將運算結果入棧

theta=OPTR->c;OPTR=Pop(OPTR);

b=OPND->f;OPND=Pop(OPND);

a=OPND->f;OPND=Pop(OPND);

OPND=Push(OPND, Operate(a, theta, b));

break;

} // switch

}

} // while

return OPND->f;

} // EvaluateExpression

void main(){

char s[128];

puts(" 輸入算式:");

gets(s);

printf("%s\b=%g",s,EvaluateExpression(s));

getchar();

}

  • 上一篇:七年級計算機期末考試復習題
  • 下一篇:網易郵箱為什麽打不開
  • copyright 2024編程學習大全網