这是在网上找到的一个源程序,在TC下能运行,但是在VC++下就有一个错误,偶笨找不出来,现急用!
希望哪位大虾指点下,感激!
源程序如下:
#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 me",
" 4.Quit",
"",
"",
" **********************************",
" By zuozhe",
" 2006-12-30",};
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("院校:安徽 \n\n\t\t\t");
printf("系别:计算机 \n\n\t\t\t");
printf("日期:2006-12-30");
}
下面的是在VC++里面的出错情况:
--------------------Configuration: 课程设计 - Win32 Debug--------------------
Compiling...
课程设计.cpp
E:\Visual C++\MSDev98\MyProjects\课程设计\课程设计.cpp(10) : fatal error C1083: Cannot open include file: 'mem.h': No such file or directory
Error executing cl.exe.
课程设计.obj - 1 error(s), 0 warning(s)
找了不知道哪的错误,还望有高人指点…………