| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2849 人关注过本帖
标题:算术表达式求值演示(支持浮点数,纯C编写)
只看楼主 加入收藏
Zacard
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2006-7-7
收藏
 问题点数:0 回复次数:4 
算术表达式求值演示(支持浮点数,纯C编写)

#include "stdio.h" /*I/O函数*/
#include "stdlib.h" /*其它说明*/
#include "string.h" /*字符串函数*/
#include "conio.h" /*屏幕操作函数*/
#include "mem.h" /*内存操作函数*/
#include "ctype.h" /*字符操作函数*/
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

typedef struct{
float *base;
float *top;
float *move;
int stacksize;
}SqStack1; /*结构类型1,用于定义存储操作数的栈*/

typedef struct{
char *base;
char *top;
char *move;
int stacksize;
}SqStack2; /*结构类型2,用于定义存储操作符号的栈*/

int menu_select();
void About(); /*设计者个人信息输出*/
int InitStack1(SqStack1 *S); /* 初始化类型1的栈 */
int InitStack2(SqStack2 *S); /* 初始化类型2的栈 */
float GetTop1(SqStack1 *S); /* 取类型1的栈的栈顶元素 */
char GetTop2(SqStack2 *S); /* 取类型2的栈的栈顶元素 */
int Push1(SqStack1 *S,float e); /* 入栈 */
int Push2(SqStack2 *S,char e);
float Pop1(SqStack1 *S); /* 出栈 */
int Pop2(SqStack2 *S);
void Show1(SqStack1 *S1,SqStack2 *S2,int count); /* 演示函数1,输出S1,S2内容,配合Mainwork1完成演示功能 */
void DestroyStack(SqStack1 *S1,SqStack2 *S2);
void Inputs(char *prompt, char *s, int count); /* 完成录入字符串的存储 */
int In(char c); /* 判断字符与数字的功能函数 */
float Operate(float a,char b,float c); /* 操作函数,执行具体运算 */
char Precede(char a,char b); /* 判断符号优先级函数 */
float ReadNum(char *s,int *j); /* 数字读入函数,可将字符串表示的实数转化为实数返回 */
int Mainwork1(char *a,SqStack2 *OPTR,SqStack1 *OPND); /* 主要工作函数1,根据符号优先级完成相应栈操作,调节屏幕配合Show1显示演示结果 */


main()
{
char a[100];
SqStack1 S1,*OPND;
SqStack2 S2,*OPTR;
OPTR=&S2;OPND=&S1;
clrscr();
About();
for(;;)
{
switch(menu_select()) /*调用主菜单函数,返回值做为开关语句的条件*/
{
case 1:
printf("Input a expression accurately and end it with the char '#'\n");
Inputs("Expression:\n",a,80);break;
case 2:Mainwork1(a,OPTR,OPND) ;break;
case 3:About();break;
case 4:DestroyStack(OPND,OPTR);
exit(0);
}
}
}


int menu_select()
{
char *menu[]={
"",
"",
"",
"",
"",
" ***************MENU***************", /*定义菜单字符串数组*/
" ",
" 1.Input Expression",
" 2.Show Process",
" 3.About..",
" 4.Quit",
"",
"",
" **********************************",
" By Zacard",
" 06 07 07",};
char s[3]; /*以字符形式保存选择号*/
int c,i; /*定义整形变量*/
gotoxy(1,25);
printf("Any key to enter menu......\n");
getch();
clrscr();
for(i=0;i<16;i++) /*输出主菜单数组*/
{ gotoxy(10,i+1);
cprintf("%s",menu[i]);
}
window(1,1,80,25); /*恢复原窗口大小*/
gotoxy(10,21);
do{printf("\n Enter your choice(1~4):");
scanf("%s",s);
c=atoi(s); /*将输入的字符串转化为整形数*/
}while(c<1||c>4);
return c; /*返回选择项,主程序根据该数调用相应的函数*/
}

int InitStack1(SqStack1 *S)
{
(*S).base=(float*)malloc(STACK_INIT_SIZE*sizeof(float));
if(!(*S).base) exit(0);
(*S).top=(*S).base;
(*S).move=(*S).base;
(*S).stacksize=STACK_INIT_SIZE;
return 1;
}/*InitStack1*/

int InitStack2(SqStack2 *S)
{
(*S).base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
if(!(*S).base) exit(0);
(*S).top=(*S).base;
(*S).move=(*S).base;
(*S).stacksize=STACK_INIT_SIZE;
return 1;
}/*InitStack2*/

float GetTop1(SqStack1 *S)
{ float e;
if((*S).top==(*S).base) return 0;
e=*((*S).top-1);
return e;
}/*GetTop1*/

char GetTop2(SqStack2 *S)
{ char e;
if((*S).top==(*S).base) return 0;
e=*((*S).top-1);
return e;
}/*GetTop2*/

int Push1(SqStack1 *S,float e)
{

*(*S).top++=e;
return 1;
}/*Push1*/

int Push2(SqStack2 *S,char e)
{

*(*S).top++=e;
return 1;
}/*Push2*/

float Pop1(SqStack1 *S)
{
float e;
if((*S).top==(*S).base) return 0;
e=*--(*S).top;
return e;
}/*Pop1*/

int Pop2(SqStack2 *S)
{
char e;
if((*S).top==(*S).base) return 0;
e=*--(*S).top;
return e;
}/*Pop2*/


void Show1(SqStack1 *S1,SqStack2 *S2,int count)
{ printf("%d",count ); /*当前步序输出*/
gotoxy(5,count+3);
while((*S2).move!=(*S2).top) {printf("%c",*((*S2).move++));} /*输出符号栈内容*/
gotoxy(15,count+3);
while((*S1).move!=(*S1).top) {printf("%g ",*((*S1).move++));} /*输出操作数栈内容*/
(*S1).move=(*S1).base;
(*S2).move=(*S2).base; /*回朔结构指针*/
}

void DestroyStack(SqStack1 *S1,SqStack2 *S2)
{
(*S1).top=(*S1).base+(*S1).stacksize-1;
for((*S1).move=(*S1).base+1;(*S1).move!=(*S1).top;(*S1).move++)
{free((*S1).base);(*S1).base=(*S1).move;}
free((*S1).base);free((*S1).top);
(*S2).top=(*S2).base+(*S2).stacksize-1;
for((*S2).move=(*S2).base+1;(*S2).move!=(*S2).top;(*S2).move++)
{free((*S2).base);(*S2).base=(*S2).move;}
free((*S2).base);free((*S2).top);
}

void Inputs(char *prompt, char *s, int count) /*prompt 输出提示信息,*s为字符串指针*/
{
char p[255];
do{printf(prompt); /*显示提示信息*/
scanf("%s",p); /*输入字符串*/
if(strlen(p)>count)printf("\n Too long! \n"); /*进行长度校验,超过count值重输入*/
}while(strlen(p)>count);
strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/
}

int In(char c)
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#'||c=='.'||c=='^') return 1;
else return 0;
}/*In*/

float Operate(float a,char b,float c)
{
float d=a;
int i,j;
if(b=='+') d=a+c;
else if(b=='-') d=a-c;
else if(b=='*') d=a*c;
else if(b=='^') /*乘方功能扩展*/
{for(i=1,j=(int)c;i<j;i++) a*=d;
d=a;
}
else d=a/c;
return d;
}/*Opreate*/

char Precede(char a,char b)
{
int i,j;
char Table[9][9]={' ','+','-','*','/','(',')','#','^',
'+','>','>','<','<','<','>','>','<',
'-','>','>','<','<','<','>','>','<',
'*','>','>','>','>','<','>','>','<',
'/','>','>','>','>','<','>','>','<',
'(','<','<','<','<','<','=',' ','<',
')','>','>','>','>',' ','>','>','>',
'#','<','<','<','<','<',' ','=','<',
'^','>','>','>','>','<','>','>','>',
};
for(i=0;i<9;i++)
if(Table[0][i]==b) /*锁定纵坐标*/
break;
for(j=0;j<9;j++) /*锁定横坐标*/
if(Table[j][0]==a)
break;
return Table[j][i];
}/*Precede*/


float ReadNum(char *s,int *j)
{
int i;
float num,weight=0.1; /*weight为小数位权*/
i=*j;
num=s[i]-'0';
for(;!In(s[i+1]);i++) num=10*num+s[i+1]-'0'; /*将整数部分字符串转化为实数*/
if(s[i+1]=='.') /*读到小数点*/
{ i++;
for(;!In(s[i+1]);i++) /*将表示小数部分的字符也转化过来,加到num中*/
{num=num+(s[i+1]-'0')*weight;
weight*=0.1;
}
}
*j=i; /*修改参与读取字符串的下标变量的内容*/
return num;
}


int Mainwork1(char *a,SqStack2 *OPTR,SqStack1 *OPND)
{
int i,*j,count=1;
float num,n,m;
char k;
j=&i;
clrscr();
if(a[0]=='\0')
{printf("\n\n\n\nInput a expression first!");
return 0;
}
InitStack2(OPTR);
Push2(OPTR,'#');
InitStack1(OPND);
printf("\n");
printf("Expression:");
for(i=0;a[i]!='#';i++)
{
if(In(a[i])||(a[i]>47&&a[i]<58)) printf("%c",a[i]);
else {
printf("\nERROR INPUTS!");
return 0;
}
}
i=0;
printf("\nSP");
gotoxy(5,count+2);
printf("OPTR");
gotoxy(15,count+2);
printf("OPND");
gotoxy(40,count+2);
printf("CGI");
gotoxy(50,count+2);
printf("Mainly operate\n");
Show1(OPND,OPTR,count);
while(a[i]!='#'||GetTop2(OPTR)!='#')
{

if(!In(a[i])) /* 是数字字符,调用转化函数转化后进操作字栈 */
{
num=ReadNum(a,j);
Push1(OPND,num);
gotoxy(40,count+3);
printf("%g",num);
gotoxy(50,count+3);
printf("PUSH(OPND,'%g')\n",num);
if(a[i]!='#') i++;
}
else
switch(Precede(GetTop2(OPTR),a[i]))
{
case'<': /* 栈顶元素优先级低,字符入栈 */
Push2(OPTR,a[i]);
gotoxy(40,count+3);
printf("%c",a[i]);
gotoxy(50,count+3);
printf("PUSH(OPTR,'%c')\n",a[i]);
if(a[i]!='#')i++;
break;
case'=': /* 栈顶元素优先级与读入字符相等 */
Pop2(OPTR); /* 出栈 */
gotoxy(40,count+2);
printf("%c",a[i]);
gotoxy(50,count+3);
printf("POP(OPTR)\n");
if(a[i]!='#')i++;
break; /* 栈顶元素优先级数高,出栈处理 */
case'>':
k=Pop2(OPTR);
m=Pop1(OPND);
n=Pop1(OPND);
if(k=='/'&&m==0)
{
printf("\n\nDenominator can't be zero,epression error!");
return 0;
}
Push1(OPND,Operate(n,k,m));
gotoxy(50,count+3);
printf("Operate('%g',%c,'%g')\n",n,k,m);
break;
}
count++;
Show1(OPND,OPTR,count);
}
gotoxy(50,count+3);
printf("Return GETTOP(OPND)");
m=Pop1(OPND);
printf("\nSo,the result is %g",m);
return m;
}


void About()
{
clrscr();
gotoxy(25,8);
printf("Made by Zacard\n\n\t\t\t");
printf("QQ:569912111\n\n\t\t\t");
printf("E-mail: free_pointer@126.com\n\n\t\t\t");
printf("06 07 07");
}

搜索更多相关主题的帖子: 算术 求值 点数 演示 编写 
2006-07-13 20:54
Zacard
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2006-7-7
收藏
得分:0 
用于交流,不用于抄袭

希望高手指点,希望低低手学习

吴伟民老师座下弟子切勿copy上交,以免类同

自由指针是一种生活态度
2006-07-13 20:58
luorizhuifen
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2007-4-16
收藏
得分:0 

神人啊!!!

2007-04-16 20:08
I喜欢c
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:64
帖 子:1749
专家分:0
注 册:2007-3-2
收藏
得分:0 
长.....

 我是指针,却丢失了目标地址!          我是循环,却缺少了结束条件!      我是函数,却没有人来调用!   
2007-04-16 21:11
jackeyhlj
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:51
专家分:0
注 册:2007-3-27
收藏
得分:0 
太长了吧,但还是要学习一下

2007-04-16 21:24
快速回复:算术表达式求值演示(支持浮点数,纯C编写)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018598 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved