软件作业.docx
《软件作业.docx》由会员分享,可在线阅读,更多相关《软件作业.docx(12页珍藏版)》请在冰点文库上搜索。
软件作业
一、上机作业
寻找马鞍点:
若矩形Am*n中的某个元素Aij是第i行的最小值,同时又是第j列的最大值,则称此元素是该矩阵的一个马鞍点。
试编写程序求出矩阵的所有马鞍点。
解题思路:
充分利用数组和循环结构,录入一个3*3的矩阵,得到矩阵后依次找出每一行中的最小值,再验证该值是否是所在列的最大值,若是则作为马鞍点输出,若都不是则该矩阵没有马鞍点。
程序:
#include
#defineM3
#defineN3
voidmain()
{
introw[100]={0};
intcol[100]={0};
intmin_col[100]={0};
inta[M][N];
inti,j;
printf("请输入矩阵元素\n");
for(i=0;ifor(j=0;jscanf("%d",&a[i][j]);printf("矩阵元素如下:\n");for(i=0;i{for(j=0;jprintf("%d",a[i][j]);printf("\n");}for(i=0;i{row[i]=a[i][0];for(j=1;jif(a[i][j]{row[i]=a[i][j];min_col[i]=j;}}for(j=0;j{col[j]=a[0][j];for(i=1;iif(a[i][j]>col[j]){col[j]=a[i][j];}}for(i=0;i{if(row[i]==col[min_col[i]])printf("a[%d][%d]=%d\n",i,min_col[i],row[i]);elseprintf("没有马鞍点!\n");}}运行结果如图:二、大作业简易计算器:设计编写一个计算器,要求根据算符优先算法原则可以计算由“+-,*,/,(,)”组成的任意算术表达式的值。解题思路:使用两个工作栈,一个是OPTR,用以寄存运算符;另一个是OPND,用以寄存数据。首先置数栈为空栈,表达式的起始符号为‘#’算符栈的栈底元素;然后依次读入表达式中的每一个字符,若为数则进OPND数栈,若为运算符则和OPTR算符栈的栈顶运算符比较优先级后,如果栈顶算符优先级低,则此算符进栈并返回新的栈顶算符;如果栈顶算符优先级高,则取算符栈栈顶算符theta并删除此算符,同时去数栈的最上面的两个数a和b并删除这两个数,作athetab运算并将结果进数栈;如果两个算符优先级相同,则删除算符栈顶算符并返回新的栈顶算符。直到整个表达式求值完、程序:#include#include#include//算符优先级表charFirst[7][7]={//'+','-','*','/','(',')','#'/*'+'*/'>','>','<','<','<','>','>',/*'-'*/'>','>','<','<','<','>','>',/*'*'*/'>','>','>','>','<','>','>',/*'/'*/'>','>','>','>','<','>','>',/*'('*/'<','<','<','<','<','=','',/*')'*/'>','>','>','>','','>','>',/*'#'*/'<','<','<','<','<','','='};//运算符数组charOP[7]={'+','-','*','/','(',')','#'};//数据结构体typedefstruct{doubledata[50];inttop;}OPND_Stack;//运算符结构体typedefstruct{chardata[50];inttop;}OPTR_Stack;//初始化运算符栈函数voidInitStack_R(OPTR_Stack*a){a->top=-1;}//初始化数据站函数voidInitStack_D(OPND_Stack*a){a->top=-1;}//运算符进栈函数voidPush_R(OPTR_Stack*a,charb){a->top++;a->data[a->top]=b;}//数据进栈函数voidPush_D(OPND_Stack*a,doubleb){a->top++;a->data[a->top]=b;}//取运算符栈顶符函数voidGetTop_R(OPTR_Stack*a,char*b){*b=a->data[a->top];}//取数据栈顶数函数voidGetTop_D(OPND_Stack*a,double*b){*b=a->data[a->top];}//判断数据是否为运算符函数intIn(chara,char*s){for(inti=0;i<7;i++)if(a==s[i])return1;return0;}//算符优先级判断函数charPrecede(chara,charb){intm,n;for(inti=0;i<7;i++){if(a==OP[i])m=i;if(b==OP[i])n=i;}returnFirst[m][n];}//删除运算符栈顶元素,并取新栈的栈顶元素voidPop_R(OPTR_Stack*a,char*b){a->top--;*b=a->data[a->top];}//取数据站的栈顶元素,并从栈中删除此元素voidPop_D(OPND_Stack*a,double*b){*b=a->data[a->top];a->top--;}//二元运算函数doubleOperate(doublea,chartheta,doubleb){switch(theta){case'+':returna+b;case'-':returna-b;case'*':returna*b;case'/':returna/b;default:return0;}}//将字符串转换成浮点型数据doubleGetdouble(char*a,int*b){doublex;chars[50];intm=0,n;n=strlen(a);for(inti=*b;iif(In(a[i],OP)==1){m=i;break;}for(i=*b;is[i-*b]=a[i];strcat(s,"\0");x=atof(s);*b=m;returnx;}//算符优先算法求值核心函数doubleEvaluateExpression(char*s){OPND_StackOPND;OPTR_StackOPTR;charch,theta;doublex,a,b;intk=0;strcat(s,"#");InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);GetTop_R(&OPTR,&ch);while(s[k]!='#'||ch!='#'){if(In(s[k],OP)==0){x=Getdouble(s,&k);Push_D(&OPND,x);}else{switch(Precede(ch,s[k])){case'<':Push_R(&OPTR,s[k]);k++;break;case'=':Pop_R(&OPTR,&ch);k++;break;case'>':GetTop_R(&OPTR,&theta);Pop_R(&OPTR,&ch);Pop_D(&OPND,&b);Pop_D(&OPND,&a);Push_D(&OPND,Operate(a,theta,b));break;}}GetTop_R(&OPTR,&ch);}GetTop_D(&OPND,&x);returnx;InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);}//判断表达式是否输入正确.intCan(chara[],intn){intp=0,s=0,t=0;for(inti=0;i{if(a[i]=='('||a[i]==')')p++;if((a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/')&&((a[i+1]<'0'&&a[i+1]!='(')||a[i+1]>'9'))s++;if(a[i]=='/'&&a[i+1]=='0')s++;if((a[i]=='('&&(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'))||(a[i]==')'&&a[i+1]=='('))s++;if(a[i]==')'&&a[i+1]!='\0'&&(a[i+1]!='+'&&a[i+1]!='-'&&a[i+1]!='*'&&a[i+1]!='/'))s++;if(a[i]=='.'&&a[i+1]=='.')s++;}if(p%2==0&&s==0)return0;return1;}//负数转换函数voidTranslate(char*s){charb[80];intk,t;if(s[0]=='-'){b[0]='0';b[1]='\0';strcat(b,s);strcpy(s,b);}t=strlen(s);k=t;for(inti=0;i{if(s[i]=='('&&s[i+1]=='-'){k=i+1;for(intj=t;j>=k;j--)s[j]=s[j-1];s[k]='0';s[t+1]='\0';}t=strlen(s);k=t;}}//主函数voidmain(){chara[80];intm;charb[80];printf("============简易计算器============\n");printf("[四则运算.如:-1+(2+3)*9/(-2)-6].\n请输入一个表达式:\n");while(1){gets(a);strcpy(b,a);Translate(a);while(1){intp;m=strlen(a);p=Can(a,m);if(p==0)break;printf("输入错误.请从新输入表达式:\n");gets(a);strcpy(b,a);Translate(a);}printf("=*=*=*=*=*=*表达式结果=*=*=*=*=*=*\n");printf("该表达式的结果为:\n%s=%-10.3lf\n",b,EvaluateExpression(a));printf("=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");printf("继续使用[四则运算.如:-1+(2+3)*9/(-2)-6].<关闭退出>.\n请再输入一个表达式:\n");}}运算结果:
for(j=0;jscanf("%d",&a[i][j]);printf("矩阵元素如下:\n");for(i=0;i{for(j=0;jprintf("%d",a[i][j]);printf("\n");}for(i=0;i{row[i]=a[i][0];for(j=1;jif(a[i][j]{row[i]=a[i][j];min_col[i]=j;}}for(j=0;j{col[j]=a[0][j];for(i=1;iif(a[i][j]>col[j]){col[j]=a[i][j];}}for(i=0;i{if(row[i]==col[min_col[i]])printf("a[%d][%d]=%d\n",i,min_col[i],row[i]);elseprintf("没有马鞍点!\n");}}运行结果如图:二、大作业简易计算器:设计编写一个计算器,要求根据算符优先算法原则可以计算由“+-,*,/,(,)”组成的任意算术表达式的值。解题思路:使用两个工作栈,一个是OPTR,用以寄存运算符;另一个是OPND,用以寄存数据。首先置数栈为空栈,表达式的起始符号为‘#’算符栈的栈底元素;然后依次读入表达式中的每一个字符,若为数则进OPND数栈,若为运算符则和OPTR算符栈的栈顶运算符比较优先级后,如果栈顶算符优先级低,则此算符进栈并返回新的栈顶算符;如果栈顶算符优先级高,则取算符栈栈顶算符theta并删除此算符,同时去数栈的最上面的两个数a和b并删除这两个数,作athetab运算并将结果进数栈;如果两个算符优先级相同,则删除算符栈顶算符并返回新的栈顶算符。直到整个表达式求值完、程序:#include#include#include//算符优先级表charFirst[7][7]={//'+','-','*','/','(',')','#'/*'+'*/'>','>','<','<','<','>','>',/*'-'*/'>','>','<','<','<','>','>',/*'*'*/'>','>','>','>','<','>','>',/*'/'*/'>','>','>','>','<','>','>',/*'('*/'<','<','<','<','<','=','',/*')'*/'>','>','>','>','','>','>',/*'#'*/'<','<','<','<','<','','='};//运算符数组charOP[7]={'+','-','*','/','(',')','#'};//数据结构体typedefstruct{doubledata[50];inttop;}OPND_Stack;//运算符结构体typedefstruct{chardata[50];inttop;}OPTR_Stack;//初始化运算符栈函数voidInitStack_R(OPTR_Stack*a){a->top=-1;}//初始化数据站函数voidInitStack_D(OPND_Stack*a){a->top=-1;}//运算符进栈函数voidPush_R(OPTR_Stack*a,charb){a->top++;a->data[a->top]=b;}//数据进栈函数voidPush_D(OPND_Stack*a,doubleb){a->top++;a->data[a->top]=b;}//取运算符栈顶符函数voidGetTop_R(OPTR_Stack*a,char*b){*b=a->data[a->top];}//取数据栈顶数函数voidGetTop_D(OPND_Stack*a,double*b){*b=a->data[a->top];}//判断数据是否为运算符函数intIn(chara,char*s){for(inti=0;i<7;i++)if(a==s[i])return1;return0;}//算符优先级判断函数charPrecede(chara,charb){intm,n;for(inti=0;i<7;i++){if(a==OP[i])m=i;if(b==OP[i])n=i;}returnFirst[m][n];}//删除运算符栈顶元素,并取新栈的栈顶元素voidPop_R(OPTR_Stack*a,char*b){a->top--;*b=a->data[a->top];}//取数据站的栈顶元素,并从栈中删除此元素voidPop_D(OPND_Stack*a,double*b){*b=a->data[a->top];a->top--;}//二元运算函数doubleOperate(doublea,chartheta,doubleb){switch(theta){case'+':returna+b;case'-':returna-b;case'*':returna*b;case'/':returna/b;default:return0;}}//将字符串转换成浮点型数据doubleGetdouble(char*a,int*b){doublex;chars[50];intm=0,n;n=strlen(a);for(inti=*b;iif(In(a[i],OP)==1){m=i;break;}for(i=*b;is[i-*b]=a[i];strcat(s,"\0");x=atof(s);*b=m;returnx;}//算符优先算法求值核心函数doubleEvaluateExpression(char*s){OPND_StackOPND;OPTR_StackOPTR;charch,theta;doublex,a,b;intk=0;strcat(s,"#");InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);GetTop_R(&OPTR,&ch);while(s[k]!='#'||ch!='#'){if(In(s[k],OP)==0){x=Getdouble(s,&k);Push_D(&OPND,x);}else{switch(Precede(ch,s[k])){case'<':Push_R(&OPTR,s[k]);k++;break;case'=':Pop_R(&OPTR,&ch);k++;break;case'>':GetTop_R(&OPTR,&theta);Pop_R(&OPTR,&ch);Pop_D(&OPND,&b);Pop_D(&OPND,&a);Push_D(&OPND,Operate(a,theta,b));break;}}GetTop_R(&OPTR,&ch);}GetTop_D(&OPND,&x);returnx;InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);}//判断表达式是否输入正确.intCan(chara[],intn){intp=0,s=0,t=0;for(inti=0;i{if(a[i]=='('||a[i]==')')p++;if((a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/')&&((a[i+1]<'0'&&a[i+1]!='(')||a[i+1]>'9'))s++;if(a[i]=='/'&&a[i+1]=='0')s++;if((a[i]=='('&&(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'))||(a[i]==')'&&a[i+1]=='('))s++;if(a[i]==')'&&a[i+1]!='\0'&&(a[i+1]!='+'&&a[i+1]!='-'&&a[i+1]!='*'&&a[i+1]!='/'))s++;if(a[i]=='.'&&a[i+1]=='.')s++;}if(p%2==0&&s==0)return0;return1;}//负数转换函数voidTranslate(char*s){charb[80];intk,t;if(s[0]=='-'){b[0]='0';b[1]='\0';strcat(b,s);strcpy(s,b);}t=strlen(s);k=t;for(inti=0;i{if(s[i]=='('&&s[i+1]=='-'){k=i+1;for(intj=t;j>=k;j--)s[j]=s[j-1];s[k]='0';s[t+1]='\0';}t=strlen(s);k=t;}}//主函数voidmain(){chara[80];intm;charb[80];printf("============简易计算器============\n");printf("[四则运算.如:-1+(2+3)*9/(-2)-6].\n请输入一个表达式:\n");while(1){gets(a);strcpy(b,a);Translate(a);while(1){intp;m=strlen(a);p=Can(a,m);if(p==0)break;printf("输入错误.请从新输入表达式:\n");gets(a);strcpy(b,a);Translate(a);}printf("=*=*=*=*=*=*表达式结果=*=*=*=*=*=*\n");printf("该表达式的结果为:\n%s=%-10.3lf\n",b,EvaluateExpression(a));printf("=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");printf("继续使用[四则运算.如:-1+(2+3)*9/(-2)-6].<关闭退出>.\n请再输入一个表达式:\n");}}运算结果:
scanf("%d",&a[i][j]);
printf("矩阵元素如下:
\n");
for(i=0;i{for(j=0;jprintf("%d",a[i][j]);printf("\n");}for(i=0;i{row[i]=a[i][0];for(j=1;jif(a[i][j]{row[i]=a[i][j];min_col[i]=j;}}for(j=0;j{col[j]=a[0][j];for(i=1;iif(a[i][j]>col[j]){col[j]=a[i][j];}}for(i=0;i{if(row[i]==col[min_col[i]])printf("a[%d][%d]=%d\n",i,min_col[i],row[i]);elseprintf("没有马鞍点!\n");}}运行结果如图:二、大作业简易计算器:设计编写一个计算器,要求根据算符优先算法原则可以计算由“+-,*,/,(,)”组成的任意算术表达式的值。解题思路:使用两个工作栈,一个是OPTR,用以寄存运算符;另一个是OPND,用以寄存数据。首先置数栈为空栈,表达式的起始符号为‘#’算符栈的栈底元素;然后依次读入表达式中的每一个字符,若为数则进OPND数栈,若为运算符则和OPTR算符栈的栈顶运算符比较优先级后,如果栈顶算符优先级低,则此算符进栈并返回新的栈顶算符;如果栈顶算符优先级高,则取算符栈栈顶算符theta并删除此算符,同时去数栈的最上面的两个数a和b并删除这两个数,作athetab运算并将结果进数栈;如果两个算符优先级相同,则删除算符栈顶算符并返回新的栈顶算符。直到整个表达式求值完、程序:#include#include#include//算符优先级表charFirst[7][7]={//'+','-','*','/','(',')','#'/*'+'*/'>','>','<','<','<','>','>',/*'-'*/'>','>','<','<','<','>','>',/*'*'*/'>','>','>','>','<','>','>',/*'/'*/'>','>','>','>','<','>','>',/*'('*/'<','<','<','<','<','=','',/*')'*/'>','>','>','>','','>','>',/*'#'*/'<','<','<','<','<','','='};//运算符数组charOP[7]={'+','-','*','/','(',')','#'};//数据结构体typedefstruct{doubledata[50];inttop;}OPND_Stack;//运算符结构体typedefstruct{chardata[50];inttop;}OPTR_Stack;//初始化运算符栈函数voidInitStack_R(OPTR_Stack*a){a->top=-1;}//初始化数据站函数voidInitStack_D(OPND_Stack*a){a->top=-1;}//运算符进栈函数voidPush_R(OPTR_Stack*a,charb){a->top++;a->data[a->top]=b;}//数据进栈函数voidPush_D(OPND_Stack*a,doubleb){a->top++;a->data[a->top]=b;}//取运算符栈顶符函数voidGetTop_R(OPTR_Stack*a,char*b){*b=a->data[a->top];}//取数据栈顶数函数voidGetTop_D(OPND_Stack*a,double*b){*b=a->data[a->top];}//判断数据是否为运算符函数intIn(chara,char*s){for(inti=0;i<7;i++)if(a==s[i])return1;return0;}//算符优先级判断函数charPrecede(chara,charb){intm,n;for(inti=0;i<7;i++){if(a==OP[i])m=i;if(b==OP[i])n=i;}returnFirst[m][n];}//删除运算符栈顶元素,并取新栈的栈顶元素voidPop_R(OPTR_Stack*a,char*b){a->top--;*b=a->data[a->top];}//取数据站的栈顶元素,并从栈中删除此元素voidPop_D(OPND_Stack*a,double*b){*b=a->data[a->top];a->top--;}//二元运算函数doubleOperate(doublea,chartheta,doubleb){switch(theta){case'+':returna+b;case'-':returna-b;case'*':returna*b;case'/':returna/b;default:return0;}}//将字符串转换成浮点型数据doubleGetdouble(char*a,int*b){doublex;chars[50];intm=0,n;n=strlen(a);for(inti=*b;iif(In(a[i],OP)==1){m=i;break;}for(i=*b;is[i-*b]=a[i];strcat(s,"\0");x=atof(s);*b=m;returnx;}//算符优先算法求值核心函数doubleEvaluateExpression(char*s){OPND_StackOPND;OPTR_StackOPTR;charch,theta;doublex,a,b;intk=0;strcat(s,"#");InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);GetTop_R(&OPTR,&ch);while(s[k]!='#'||ch!='#'){if(In(s[k],OP)==0){x=Getdouble(s,&k);Push_D(&OPND,x);}else{switch(Precede(ch,s[k])){case'<':Push_R(&OPTR,s[k]);k++;break;case'=':Pop_R(&OPTR,&ch);k++;break;case'>':GetTop_R(&OPTR,&theta);Pop_R(&OPTR,&ch);Pop_D(&OPND,&b);Pop_D(&OPND,&a);Push_D(&OPND,Operate(a,theta,b));break;}}GetTop_R(&OPTR,&ch);}GetTop_D(&OPND,&x);returnx;InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);}//判断表达式是否输入正确.intCan(chara[],intn){intp=0,s=0,t=0;for(inti=0;i{if(a[i]=='('||a[i]==')')p++;if((a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/')&&((a[i+1]<'0'&&a[i+1]!='(')||a[i+1]>'9'))s++;if(a[i]=='/'&&a[i+1]=='0')s++;if((a[i]=='('&&(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'))||(a[i]==')'&&a[i+1]=='('))s++;if(a[i]==')'&&a[i+1]!='\0'&&(a[i+1]!='+'&&a[i+1]!='-'&&a[i+1]!='*'&&a[i+1]!='/'))s++;if(a[i]=='.'&&a[i+1]=='.')s++;}if(p%2==0&&s==0)return0;return1;}//负数转换函数voidTranslate(char*s){charb[80];intk,t;if(s[0]=='-'){b[0]='0';b[1]='\0';strcat(b,s);strcpy(s,b);}t=strlen(s);k=t;for(inti=0;i{if(s[i]=='('&&s[i+1]=='-'){k=i+1;for(intj=t;j>=k;j--)s[j]=s[j-1];s[k]='0';s[t+1]='\0';}t=strlen(s);k=t;}}//主函数voidmain(){chara[80];intm;charb[80];printf("============简易计算器============\n");printf("[四则运算.如:-1+(2+3)*9/(-2)-6].\n请输入一个表达式:\n");while(1){gets(a);strcpy(b,a);Translate(a);while(1){intp;m=strlen(a);p=Can(a,m);if(p==0)break;printf("输入错误.请从新输入表达式:\n");gets(a);strcpy(b,a);Translate(a);}printf("=*=*=*=*=*=*表达式结果=*=*=*=*=*=*\n");printf("该表达式的结果为:\n%s=%-10.3lf\n",b,EvaluateExpression(a));printf("=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");printf("继续使用[四则运算.如:-1+(2+3)*9/(-2)-6].<关闭退出>.\n请再输入一个表达式:\n");}}运算结果:
for(j=0;jprintf("%d",a[i][j]);printf("\n");}for(i=0;i{row[i]=a[i][0];for(j=1;jif(a[i][j]{row[i]=a[i][j];min_col[i]=j;}}for(j=0;j{col[j]=a[0][j];for(i=1;iif(a[i][j]>col[j]){col[j]=a[i][j];}}for(i=0;i{if(row[i]==col[min_col[i]])printf("a[%d][%d]=%d\n",i,min_col[i],row[i]);elseprintf("没有马鞍点!\n");}}运行结果如图:二、大作业简易计算器:设计编写一个计算器,要求根据算符优先算法原则可以计算由“+-,*,/,(,)”组成的任意算术表达式的值。解题思路:使用两个工作栈,一个是OPTR,用以寄存运算符;另一个是OPND,用以寄存数据。首先置数栈为空栈,表达式的起始符号为‘#’算符栈的栈底元素;然后依次读入表达式中的每一个字符,若为数则进OPND数栈,若为运算符则和OPTR算符栈的栈顶运算符比较优先级后,如果栈顶算符优先级低,则此算符进栈并返回新的栈顶算符;如果栈顶算符优先级高,则取算符栈栈顶算符theta并删除此算符,同时去数栈的最上面的两个数a和b并删除这两个数,作athetab运算并将结果进数栈;如果两个算符优先级相同,则删除算符栈顶算符并返回新的栈顶算符。直到整个表达式求值完、程序:#include#include#include//算符优先级表charFirst[7][7]={//'+','-','*','/','(',')','#'/*'+'*/'>','>','<','<','<','>','>',/*'-'*/'>','>','<','<','<','>','>',/*'*'*/'>','>','>','>','<','>','>',/*'/'*/'>','>','>','>','<','>','>',/*'('*/'<','<','<','<','<','=','',/*')'*/'>','>','>','>','','>','>',/*'#'*/'<','<','<','<','<','','='};//运算符数组charOP[7]={'+','-','*','/','(',')','#'};//数据结构体typedefstruct{doubledata[50];inttop;}OPND_Stack;//运算符结构体typedefstruct{chardata[50];inttop;}OPTR_Stack;//初始化运算符栈函数voidInitStack_R(OPTR_Stack*a){a->top=-1;}//初始化数据站函数voidInitStack_D(OPND_Stack*a){a->top=-1;}//运算符进栈函数voidPush_R(OPTR_Stack*a,charb){a->top++;a->data[a->top]=b;}//数据进栈函数voidPush_D(OPND_Stack*a,doubleb){a->top++;a->data[a->top]=b;}//取运算符栈顶符函数voidGetTop_R(OPTR_Stack*a,char*b){*b=a->data[a->top];}//取数据栈顶数函数voidGetTop_D(OPND_Stack*a,double*b){*b=a->data[a->top];}//判断数据是否为运算符函数intIn(chara,char*s){for(inti=0;i<7;i++)if(a==s[i])return1;return0;}//算符优先级判断函数charPrecede(chara,charb){intm,n;for(inti=0;i<7;i++){if(a==OP[i])m=i;if(b==OP[i])n=i;}returnFirst[m][n];}//删除运算符栈顶元素,并取新栈的栈顶元素voidPop_R(OPTR_Stack*a,char*b){a->top--;*b=a->data[a->top];}//取数据站的栈顶元素,并从栈中删除此元素voidPop_D(OPND_Stack*a,double*b){*b=a->data[a->top];a->top--;}//二元运算函数doubleOperate(doublea,chartheta,doubleb){switch(theta){case'+':returna+b;case'-':returna-b;case'*':returna*b;case'/':returna/b;default:return0;}}//将字符串转换成浮点型数据doubleGetdouble(char*a,int*b){doublex;chars[50];intm=0,n;n=strlen(a);for(inti=*b;iif(In(a[i],OP)==1){m=i;break;}for(i=*b;is[i-*b]=a[i];strcat(s,"\0");x=atof(s);*b=m;returnx;}//算符优先算法求值核心函数doubleEvaluateExpression(char*s){OPND_StackOPND;OPTR_StackOPTR;charch,theta;doublex,a,b;intk=0;strcat(s,"#");InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);GetTop_R(&OPTR,&ch);while(s[k]!='#'||ch!='#'){if(In(s[k],OP)==0){x=Getdouble(s,&k);Push_D(&OPND,x);}else{switch(Precede(ch,s[k])){case'<':Push_R(&OPTR,s[k]);k++;break;case'=':Pop_R(&OPTR,&ch);k++;break;case'>':GetTop_R(&OPTR,&theta);Pop_R(&OPTR,&ch);Pop_D(&OPND,&b);Pop_D(&OPND,&a);Push_D(&OPND,Operate(a,theta,b));break;}}GetTop_R(&OPTR,&ch);}GetTop_D(&OPND,&x);returnx;InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);}//判断表达式是否输入正确.intCan(chara[],intn){intp=0,s=0,t=0;for(inti=0;i{if(a[i]=='('||a[i]==')')p++;if((a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/')&&((a[i+1]<'0'&&a[i+1]!='(')||a[i+1]>'9'))s++;if(a[i]=='/'&&a[i+1]=='0')s++;if((a[i]=='('&&(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'))||(a[i]==')'&&a[i+1]=='('))s++;if(a[i]==')'&&a[i+1]!='\0'&&(a[i+1]!='+'&&a[i+1]!='-'&&a[i+1]!='*'&&a[i+1]!='/'))s++;if(a[i]=='.'&&a[i+1]=='.')s++;}if(p%2==0&&s==0)return0;return1;}//负数转换函数voidTranslate(char*s){charb[80];intk,t;if(s[0]=='-'){b[0]='0';b[1]='\0';strcat(b,s);strcpy(s,b);}t=strlen(s);k=t;for(inti=0;i{if(s[i]=='('&&s[i+1]=='-'){k=i+1;for(intj=t;j>=k;j--)s[j]=s[j-1];s[k]='0';s[t+1]='\0';}t=strlen(s);k=t;}}//主函数voidmain(){chara[80];intm;charb[80];printf("============简易计算器============\n");printf("[四则运算.如:-1+(2+3)*9/(-2)-6].\n请输入一个表达式:\n");while(1){gets(a);strcpy(b,a);Translate(a);while(1){intp;m=strlen(a);p=Can(a,m);if(p==0)break;printf("输入错误.请从新输入表达式:\n");gets(a);strcpy(b,a);Translate(a);}printf("=*=*=*=*=*=*表达式结果=*=*=*=*=*=*\n");printf("该表达式的结果为:\n%s=%-10.3lf\n",b,EvaluateExpression(a));printf("=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");printf("继续使用[四则运算.如:-1+(2+3)*9/(-2)-6].<关闭退出>.\n请再输入一个表达式:\n");}}运算结果:
printf("%d",a[i][j]);
printf("\n");
}
for(i=0;i{row[i]=a[i][0];for(j=1;jif(a[i][j]{row[i]=a[i][j];min_col[i]=j;}}for(j=0;j{col[j]=a[0][j];for(i=1;iif(a[i][j]>col[j]){col[j]=a[i][j];}}for(i=0;i{if(row[i]==col[min_col[i]])printf("a[%d][%d]=%d\n",i,min_col[i],row[i]);elseprintf("没有马鞍点!\n");}}运行结果如图:二、大作业简易计算器:设计编写一个计算器,要求根据算符优先算法原则可以计算由“+-,*,/,(,)”组成的任意算术表达式的值。解题思路:使用两个工作栈,一个是OPTR,用以寄存运算符;另一个是OPND,用以寄存数据。首先置数栈为空栈,表达式的起始符号为‘#’算符栈的栈底元素;然后依次读入表达式中的每一个字符,若为数则进OPND数栈,若为运算符则和OPTR算符栈的栈顶运算符比较优先级后,如果栈顶算符优先级低,则此算符进栈并返回新的栈顶算符;如果栈顶算符优先级高,则取算符栈栈顶算符theta并删除此算符,同时去数栈的最上面的两个数a和b并删除这两个数,作athetab运算并将结果进数栈;如果两个算符优先级相同,则删除算符栈顶算符并返回新的栈顶算符。直到整个表达式求值完、程序:#include#include#include//算符优先级表charFirst[7][7]={//'+','-','*','/','(',')','#'/*'+'*/'>','>','<','<','<','>','>',/*'-'*/'>','>','<','<','<','>','>',/*'*'*/'>','>','>','>','<','>','>',/*'/'*/'>','>','>','>','<','>','>',/*'('*/'<','<','<','<','<','=','',/*')'*/'>','>','>','>','','>','>',/*'#'*/'<','<','<','<','<','','='};//运算符数组charOP[7]={'+','-','*','/','(',')','#'};//数据结构体typedefstruct{doubledata[50];inttop;}OPND_Stack;//运算符结构体typedefstruct{chardata[50];inttop;}OPTR_Stack;//初始化运算符栈函数voidInitStack_R(OPTR_Stack*a){a->top=-1;}//初始化数据站函数voidInitStack_D(OPND_Stack*a){a->top=-1;}//运算符进栈函数voidPush_R(OPTR_Stack*a,charb){a->top++;a->data[a->top]=b;}//数据进栈函数voidPush_D(OPND_Stack*a,doubleb){a->top++;a->data[a->top]=b;}//取运算符栈顶符函数voidGetTop_R(OPTR_Stack*a,char*b){*b=a->data[a->top];}//取数据栈顶数函数voidGetTop_D(OPND_Stack*a,double*b){*b=a->data[a->top];}//判断数据是否为运算符函数intIn(chara,char*s){for(inti=0;i<7;i++)if(a==s[i])return1;return0;}//算符优先级判断函数charPrecede(chara,charb){intm,n;for(inti=0;i<7;i++){if(a==OP[i])m=i;if(b==OP[i])n=i;}returnFirst[m][n];}//删除运算符栈顶元素,并取新栈的栈顶元素voidPop_R(OPTR_Stack*a,char*b){a->top--;*b=a->data[a->top];}//取数据站的栈顶元素,并从栈中删除此元素voidPop_D(OPND_Stack*a,double*b){*b=a->data[a->top];a->top--;}//二元运算函数doubleOperate(doublea,chartheta,doubleb){switch(theta){case'+':returna+b;case'-':returna-b;case'*':returna*b;case'/':returna/b;default:return0;}}//将字符串转换成浮点型数据doubleGetdouble(char*a,int*b){doublex;chars[50];intm=0,n;n=strlen(a);for(inti=*b;iif(In(a[i],OP)==1){m=i;break;}for(i=*b;is[i-*b]=a[i];strcat(s,"\0");x=atof(s);*b=m;returnx;}//算符优先算法求值核心函数doubleEvaluateExpression(char*s){OPND_StackOPND;OPTR_StackOPTR;charch,theta;doublex,a,b;intk=0;strcat(s,"#");InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);GetTop_R(&OPTR,&ch);while(s[k]!='#'||ch!='#'){if(In(s[k],OP)==0){x=Getdouble(s,&k);Push_D(&OPND,x);}else{switch(Precede(ch,s[k])){case'<':Push_R(&OPTR,s[k]);k++;break;case'=':Pop_R(&OPTR,&ch);k++;break;case'>':GetTop_R(&OPTR,&theta);Pop_R(&OPTR,&ch);Pop_D(&OPND,&b);Pop_D(&OPND,&a);Push_D(&OPND,Operate(a,theta,b));break;}}GetTop_R(&OPTR,&ch);}GetTop_D(&OPND,&x);returnx;InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);}//判断表达式是否输入正确.intCan(chara[],intn){intp=0,s=0,t=0;for(inti=0;i{if(a[i]=='('||a[i]==')')p++;if((a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/')&&((a[i+1]<'0'&&a[i+1]!='(')||a[i+1]>'9'))s++;if(a[i]=='/'&&a[i+1]=='0')s++;if((a[i]=='('&&(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'))||(a[i]==')'&&a[i+1]=='('))s++;if(a[i]==')'&&a[i+1]!='\0'&&(a[i+1]!='+'&&a[i+1]!='-'&&a[i+1]!='*'&&a[i+1]!='/'))s++;if(a[i]=='.'&&a[i+1]=='.')s++;}if(p%2==0&&s==0)return0;return1;}//负数转换函数voidTranslate(char*s){charb[80];intk,t;if(s[0]=='-'){b[0]='0';b[1]='\0';strcat(b,s);strcpy(s,b);}t=strlen(s);k=t;for(inti=0;i{if(s[i]=='('&&s[i+1]=='-'){k=i+1;for(intj=t;j>=k;j--)s[j]=s[j-1];s[k]='0';s[t+1]='\0';}t=strlen(s);k=t;}}//主函数voidmain(){chara[80];intm;charb[80];printf("============简易计算器============\n");printf("[四则运算.如:-1+(2+3)*9/(-2)-6].\n请输入一个表达式:\n");while(1){gets(a);strcpy(b,a);Translate(a);while(1){intp;m=strlen(a);p=Can(a,m);if(p==0)break;printf("输入错误.请从新输入表达式:\n");gets(a);strcpy(b,a);Translate(a);}printf("=*=*=*=*=*=*表达式结果=*=*=*=*=*=*\n");printf("该表达式的结果为:\n%s=%-10.3lf\n",b,EvaluateExpression(a));printf("=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");printf("继续使用[四则运算.如:-1+(2+3)*9/(-2)-6].<关闭退出>.\n请再输入一个表达式:\n");}}运算结果:
row[i]=a[i][0];
for(j=1;jif(a[i][j]{row[i]=a[i][j];min_col[i]=j;}}for(j=0;j{col[j]=a[0][j];for(i=1;iif(a[i][j]>col[j]){col[j]=a[i][j];}}for(i=0;i{if(row[i]==col[min_col[i]])printf("a[%d][%d]=%d\n",i,min_col[i],row[i]);elseprintf("没有马鞍点!\n");}}运行结果如图:二、大作业简易计算器:设计编写一个计算器,要求根据算符优先算法原则可以计算由“+-,*,/,(,)”组成的任意算术表达式的值。解题思路:使用两个工作栈,一个是OPTR,用以寄存运算符;另一个是OPND,用以寄存数据。首先置数栈为空栈,表达式的起始符号为‘#’算符栈的栈底元素;然后依次读入表达式中的每一个字符,若为数则进OPND数栈,若为运算符则和OPTR算符栈的栈顶运算符比较优先级后,如果栈顶算符优先级低,则此算符进栈并返回新的栈顶算符;如果栈顶算符优先级高,则取算符栈栈顶算符theta并删除此算符,同时去数栈的最上面的两个数a和b并删除这两个数,作athetab运算并将结果进数栈;如果两个算符优先级相同,则删除算符栈顶算符并返回新的栈顶算符。直到整个表达式求值完、程序:#include#include#include//算符优先级表charFirst[7][7]={//'+','-','*','/','(',')','#'/*'+'*/'>','>','<','<','<','>','>',/*'-'*/'>','>','<','<','<','>','>',/*'*'*/'>','>','>','>','<','>','>',/*'/'*/'>','>','>','>','<','>','>',/*'('*/'<','<','<','<','<','=','',/*')'*/'>','>','>','>','','>','>',/*'#'*/'<','<','<','<','<','','='};//运算符数组charOP[7]={'+','-','*','/','(',')','#'};//数据结构体typedefstruct{doubledata[50];inttop;}OPND_Stack;//运算符结构体typedefstruct{chardata[50];inttop;}OPTR_Stack;//初始化运算符栈函数voidInitStack_R(OPTR_Stack*a){a->top=-1;}//初始化数据站函数voidInitStack_D(OPND_Stack*a){a->top=-1;}//运算符进栈函数voidPush_R(OPTR_Stack*a,charb){a->top++;a->data[a->top]=b;}//数据进栈函数voidPush_D(OPND_Stack*a,doubleb){a->top++;a->data[a->top]=b;}//取运算符栈顶符函数voidGetTop_R(OPTR_Stack*a,char*b){*b=a->data[a->top];}//取数据栈顶数函数voidGetTop_D(OPND_Stack*a,double*b){*b=a->data[a->top];}//判断数据是否为运算符函数intIn(chara,char*s){for(inti=0;i<7;i++)if(a==s[i])return1;return0;}//算符优先级判断函数charPrecede(chara,charb){intm,n;for(inti=0;i<7;i++){if(a==OP[i])m=i;if(b==OP[i])n=i;}returnFirst[m][n];}//删除运算符栈顶元素,并取新栈的栈顶元素voidPop_R(OPTR_Stack*a,char*b){a->top--;*b=a->data[a->top];}//取数据站的栈顶元素,并从栈中删除此元素voidPop_D(OPND_Stack*a,double*b){*b=a->data[a->top];a->top--;}//二元运算函数doubleOperate(doublea,chartheta,doubleb){switch(theta){case'+':returna+b;case'-':returna-b;case'*':returna*b;case'/':returna/b;default:return0;}}//将字符串转换成浮点型数据doubleGetdouble(char*a,int*b){doublex;chars[50];intm=0,n;n=strlen(a);for(inti=*b;iif(In(a[i],OP)==1){m=i;break;}for(i=*b;is[i-*b]=a[i];strcat(s,"\0");x=atof(s);*b=m;returnx;}//算符优先算法求值核心函数doubleEvaluateExpression(char*s){OPND_StackOPND;OPTR_StackOPTR;charch,theta;doublex,a,b;intk=0;strcat(s,"#");InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);GetTop_R(&OPTR,&ch);while(s[k]!='#'||ch!='#'){if(In(s[k],OP)==0){x=Getdouble(s,&k);Push_D(&OPND,x);}else{switch(Precede(ch,s[k])){case'<':Push_R(&OPTR,s[k]);k++;break;case'=':Pop_R(&OPTR,&ch);k++;break;case'>':GetTop_R(&OPTR,&theta);Pop_R(&OPTR,&ch);Pop_D(&OPND,&b);Pop_D(&OPND,&a);Push_D(&OPND,Operate(a,theta,b));break;}}GetTop_R(&OPTR,&ch);}GetTop_D(&OPND,&x);returnx;InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);}//判断表达式是否输入正确.intCan(chara[],intn){intp=0,s=0,t=0;for(inti=0;i{if(a[i]=='('||a[i]==')')p++;if((a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/')&&((a[i+1]<'0'&&a[i+1]!='(')||a[i+1]>'9'))s++;if(a[i]=='/'&&a[i+1]=='0')s++;if((a[i]=='('&&(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'))||(a[i]==')'&&a[i+1]=='('))s++;if(a[i]==')'&&a[i+1]!='\0'&&(a[i+1]!='+'&&a[i+1]!='-'&&a[i+1]!='*'&&a[i+1]!='/'))s++;if(a[i]=='.'&&a[i+1]=='.')s++;}if(p%2==0&&s==0)return0;return1;}//负数转换函数voidTranslate(char*s){charb[80];intk,t;if(s[0]=='-'){b[0]='0';b[1]='\0';strcat(b,s);strcpy(s,b);}t=strlen(s);k=t;for(inti=0;i{if(s[i]=='('&&s[i+1]=='-'){k=i+1;for(intj=t;j>=k;j--)s[j]=s[j-1];s[k]='0';s[t+1]='\0';}t=strlen(s);k=t;}}//主函数voidmain(){chara[80];intm;charb[80];printf("============简易计算器============\n");printf("[四则运算.如:-1+(2+3)*9/(-2)-6].\n请输入一个表达式:\n");while(1){gets(a);strcpy(b,a);Translate(a);while(1){intp;m=strlen(a);p=Can(a,m);if(p==0)break;printf("输入错误.请从新输入表达式:\n");gets(a);strcpy(b,a);Translate(a);}printf("=*=*=*=*=*=*表达式结果=*=*=*=*=*=*\n");printf("该表达式的结果为:\n%s=%-10.3lf\n",b,EvaluateExpression(a));printf("=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");printf("继续使用[四则运算.如:-1+(2+3)*9/(-2)-6].<关闭退出>.\n请再输入一个表达式:\n");}}运算结果:
if(a[i][j]{row[i]=a[i][j];min_col[i]=j;}}for(j=0;j{col[j]=a[0][j];for(i=1;iif(a[i][j]>col[j]){col[j]=a[i][j];}}for(i=0;i{if(row[i]==col[min_col[i]])printf("a[%d][%d]=%d\n",i,min_col[i],row[i]);elseprintf("没有马鞍点!\n");}}运行结果如图:二、大作业简易计算器:设计编写一个计算器,要求根据算符优先算法原则可以计算由“+-,*,/,(,)”组成的任意算术表达式的值。解题思路:使用两个工作栈,一个是OPTR,用以寄存运算符;另一个是OPND,用以寄存数据。首先置数栈为空栈,表达式的起始符号为‘#’算符栈的栈底元素;然后依次读入表达式中的每一个字符,若为数则进OPND数栈,若为运算符则和OPTR算符栈的栈顶运算符比较优先级后,如果栈顶算符优先级低,则此算符进栈并返回新的栈顶算符;如果栈顶算符优先级高,则取算符栈栈顶算符theta并删除此算符,同时去数栈的最上面的两个数a和b并删除这两个数,作athetab运算并将结果进数栈;如果两个算符优先级相同,则删除算符栈顶算符并返回新的栈顶算符。直到整个表达式求值完、程序:#include#include#include//算符优先级表charFirst[7][7]={//'+','-','*','/','(',')','#'/*'+'*/'>','>','<','<','<','>','>',/*'-'*/'>','>','<','<','<','>','>',/*'*'*/'>','>','>','>','<','>','>',/*'/'*/'>','>','>','>','<','>','>',/*'('*/'<','<','<','<','<','=','',/*')'*/'>','>','>','>','','>','>',/*'#'*/'<','<','<','<','<','','='};//运算符数组charOP[7]={'+','-','*','/','(',')','#'};//数据结构体typedefstruct{doubledata[50];inttop;}OPND_Stack;//运算符结构体typedefstruct{chardata[50];inttop;}OPTR_Stack;//初始化运算符栈函数voidInitStack_R(OPTR_Stack*a){a->top=-1;}//初始化数据站函数voidInitStack_D(OPND_Stack*a){a->top=-1;}//运算符进栈函数voidPush_R(OPTR_Stack*a,charb){a->top++;a->data[a->top]=b;}//数据进栈函数voidPush_D(OPND_Stack*a,doubleb){a->top++;a->data[a->top]=b;}//取运算符栈顶符函数voidGetTop_R(OPTR_Stack*a,char*b){*b=a->data[a->top];}//取数据栈顶数函数voidGetTop_D(OPND_Stack*a,double*b){*b=a->data[a->top];}//判断数据是否为运算符函数intIn(chara,char*s){for(inti=0;i<7;i++)if(a==s[i])return1;return0;}//算符优先级判断函数charPrecede(chara,charb){intm,n;for(inti=0;i<7;i++){if(a==OP[i])m=i;if(b==OP[i])n=i;}returnFirst[m][n];}//删除运算符栈顶元素,并取新栈的栈顶元素voidPop_R(OPTR_Stack*a,char*b){a->top--;*b=a->data[a->top];}//取数据站的栈顶元素,并从栈中删除此元素voidPop_D(OPND_Stack*a,double*b){*b=a->data[a->top];a->top--;}//二元运算函数doubleOperate(doublea,chartheta,doubleb){switch(theta){case'+':returna+b;case'-':returna-b;case'*':returna*b;case'/':returna/b;default:return0;}}//将字符串转换成浮点型数据doubleGetdouble(char*a,int*b){doublex;chars[50];intm=0,n;n=strlen(a);for(inti=*b;iif(In(a[i],OP)==1){m=i;break;}for(i=*b;is[i-*b]=a[i];strcat(s,"\0");x=atof(s);*b=m;returnx;}//算符优先算法求值核心函数doubleEvaluateExpression(char*s){OPND_StackOPND;OPTR_StackOPTR;charch,theta;doublex,a,b;intk=0;strcat(s,"#");InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);GetTop_R(&OPTR,&ch);while(s[k]!='#'||ch!='#'){if(In(s[k],OP)==0){x=Getdouble(s,&k);Push_D(&OPND,x);}else{switch(Precede(ch,s[k])){case'<':Push_R(&OPTR,s[k]);k++;break;case'=':Pop_R(&OPTR,&ch);k++;break;case'>':GetTop_R(&OPTR,&theta);Pop_R(&OPTR,&ch);Pop_D(&OPND,&b);Pop_D(&OPND,&a);Push_D(&OPND,Operate(a,theta,b));break;}}GetTop_R(&OPTR,&ch);}GetTop_D(&OPND,&x);returnx;InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);}//判断表达式是否输入正确.intCan(chara[],intn){intp=0,s=0,t=0;for(inti=0;i{if(a[i]=='('||a[i]==')')p++;if((a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/')&&((a[i+1]<'0'&&a[i+1]!='(')||a[i+1]>'9'))s++;if(a[i]=='/'&&a[i+1]=='0')s++;if((a[i]=='('&&(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'))||(a[i]==')'&&a[i+1]=='('))s++;if(a[i]==')'&&a[i+1]!='\0'&&(a[i+1]!='+'&&a[i+1]!='-'&&a[i+1]!='*'&&a[i+1]!='/'))s++;if(a[i]=='.'&&a[i+1]=='.')s++;}if(p%2==0&&s==0)return0;return1;}//负数转换函数voidTranslate(char*s){charb[80];intk,t;if(s[0]=='-'){b[0]='0';b[1]='\0';strcat(b,s);strcpy(s,b);}t=strlen(s);k=t;for(inti=0;i{if(s[i]=='('&&s[i+1]=='-'){k=i+1;for(intj=t;j>=k;j--)s[j]=s[j-1];s[k]='0';s[t+1]='\0';}t=strlen(s);k=t;}}//主函数voidmain(){chara[80];intm;charb[80];printf("============简易计算器============\n");printf("[四则运算.如:-1+(2+3)*9/(-2)-6].\n请输入一个表达式:\n");while(1){gets(a);strcpy(b,a);Translate(a);while(1){intp;m=strlen(a);p=Can(a,m);if(p==0)break;printf("输入错误.请从新输入表达式:\n");gets(a);strcpy(b,a);Translate(a);}printf("=*=*=*=*=*=*表达式结果=*=*=*=*=*=*\n");printf("该表达式的结果为:\n%s=%-10.3lf\n",b,EvaluateExpression(a));printf("=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");printf("继续使用[四则运算.如:-1+(2+3)*9/(-2)-6].<关闭退出>.\n请再输入一个表达式:\n");}}运算结果:
row[i]=a[i][j];
min_col[i]=j;
for(j=0;j{col[j]=a[0][j];for(i=1;iif(a[i][j]>col[j]){col[j]=a[i][j];}}for(i=0;i{if(row[i]==col[min_col[i]])printf("a[%d][%d]=%d\n",i,min_col[i],row[i]);elseprintf("没有马鞍点!\n");}}运行结果如图:二、大作业简易计算器:设计编写一个计算器,要求根据算符优先算法原则可以计算由“+-,*,/,(,)”组成的任意算术表达式的值。解题思路:使用两个工作栈,一个是OPTR,用以寄存运算符;另一个是OPND,用以寄存数据。首先置数栈为空栈,表达式的起始符号为‘#’算符栈的栈底元素;然后依次读入表达式中的每一个字符,若为数则进OPND数栈,若为运算符则和OPTR算符栈的栈顶运算符比较优先级后,如果栈顶算符优先级低,则此算符进栈并返回新的栈顶算符;如果栈顶算符优先级高,则取算符栈栈顶算符theta并删除此算符,同时去数栈的最上面的两个数a和b并删除这两个数,作athetab运算并将结果进数栈;如果两个算符优先级相同,则删除算符栈顶算符并返回新的栈顶算符。直到整个表达式求值完、程序:#include#include#include//算符优先级表charFirst[7][7]={//'+','-','*','/','(',')','#'/*'+'*/'>','>','<','<','<','>','>',/*'-'*/'>','>','<','<','<','>','>',/*'*'*/'>','>','>','>','<','>','>',/*'/'*/'>','>','>','>','<','>','>',/*'('*/'<','<','<','<','<','=','',/*')'*/'>','>','>','>','','>','>',/*'#'*/'<','<','<','<','<','','='};//运算符数组charOP[7]={'+','-','*','/','(',')','#'};//数据结构体typedefstruct{doubledata[50];inttop;}OPND_Stack;//运算符结构体typedefstruct{chardata[50];inttop;}OPTR_Stack;//初始化运算符栈函数voidInitStack_R(OPTR_Stack*a){a->top=-1;}//初始化数据站函数voidInitStack_D(OPND_Stack*a){a->top=-1;}//运算符进栈函数voidPush_R(OPTR_Stack*a,charb){a->top++;a->data[a->top]=b;}//数据进栈函数voidPush_D(OPND_Stack*a,doubleb){a->top++;a->data[a->top]=b;}//取运算符栈顶符函数voidGetTop_R(OPTR_Stack*a,char*b){*b=a->data[a->top];}//取数据栈顶数函数voidGetTop_D(OPND_Stack*a,double*b){*b=a->data[a->top];}//判断数据是否为运算符函数intIn(chara,char*s){for(inti=0;i<7;i++)if(a==s[i])return1;return0;}//算符优先级判断函数charPrecede(chara,charb){intm,n;for(inti=0;i<7;i++){if(a==OP[i])m=i;if(b==OP[i])n=i;}returnFirst[m][n];}//删除运算符栈顶元素,并取新栈的栈顶元素voidPop_R(OPTR_Stack*a,char*b){a->top--;*b=a->data[a->top];}//取数据站的栈顶元素,并从栈中删除此元素voidPop_D(OPND_Stack*a,double*b){*b=a->data[a->top];a->top--;}//二元运算函数doubleOperate(doublea,chartheta,doubleb){switch(theta){case'+':returna+b;case'-':returna-b;case'*':returna*b;case'/':returna/b;default:return0;}}//将字符串转换成浮点型数据doubleGetdouble(char*a,int*b){doublex;chars[50];intm=0,n;n=strlen(a);for(inti=*b;iif(In(a[i],OP)==1){m=i;break;}for(i=*b;is[i-*b]=a[i];strcat(s,"\0");x=atof(s);*b=m;returnx;}//算符优先算法求值核心函数doubleEvaluateExpression(char*s){OPND_StackOPND;OPTR_StackOPTR;charch,theta;doublex,a,b;intk=0;strcat(s,"#");InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);GetTop_R(&OPTR,&ch);while(s[k]!='#'||ch!='#'){if(In(s[k],OP)==0){x=Getdouble(s,&k);Push_D(&OPND,x);}else{switch(Precede(ch,s[k])){case'<':Push_R(&OPTR,s[k]);k++;break;case'=':Pop_R(&OPTR,&ch);k++;break;case'>':GetTop_R(&OPTR,&theta);Pop_R(&OPTR,&ch);Pop_D(&OPND,&b);Pop_D(&OPND,&a);Push_D(&OPND,Operate(a,theta,b));break;}}GetTop_R(&OPTR,&ch);}GetTop_D(&OPND,&x);returnx;InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);}//判断表达式是否输入正确.intCan(chara[],intn){intp=0,s=0,t=0;for(inti=0;i{if(a[i]=='('||a[i]==')')p++;if((a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/')&&((a[i+1]<'0'&&a[i+1]!='(')||a[i+1]>'9'))s++;if(a[i]=='/'&&a[i+1]=='0')s++;if((a[i]=='('&&(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'))||(a[i]==')'&&a[i+1]=='('))s++;if(a[i]==')'&&a[i+1]!='\0'&&(a[i+1]!='+'&&a[i+1]!='-'&&a[i+1]!='*'&&a[i+1]!='/'))s++;if(a[i]=='.'&&a[i+1]=='.')s++;}if(p%2==0&&s==0)return0;return1;}//负数转换函数voidTranslate(char*s){charb[80];intk,t;if(s[0]=='-'){b[0]='0';b[1]='\0';strcat(b,s);strcpy(s,b);}t=strlen(s);k=t;for(inti=0;i{if(s[i]=='('&&s[i+1]=='-'){k=i+1;for(intj=t;j>=k;j--)s[j]=s[j-1];s[k]='0';s[t+1]='\0';}t=strlen(s);k=t;}}//主函数voidmain(){chara[80];intm;charb[80];printf("============简易计算器============\n");printf("[四则运算.如:-1+(2+3)*9/(-2)-6].\n请输入一个表达式:\n");while(1){gets(a);strcpy(b,a);Translate(a);while(1){intp;m=strlen(a);p=Can(a,m);if(p==0)break;printf("输入错误.请从新输入表达式:\n");gets(a);strcpy(b,a);Translate(a);}printf("=*=*=*=*=*=*表达式结果=*=*=*=*=*=*\n");printf("该表达式的结果为:\n%s=%-10.3lf\n",b,EvaluateExpression(a));printf("=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");printf("继续使用[四则运算.如:-1+(2+3)*9/(-2)-6].<关闭退出>.\n请再输入一个表达式:\n");}}运算结果:
col[j]=a[0][j];
for(i=1;iif(a[i][j]>col[j]){col[j]=a[i][j];}}for(i=0;i{if(row[i]==col[min_col[i]])printf("a[%d][%d]=%d\n",i,min_col[i],row[i]);elseprintf("没有马鞍点!\n");}}运行结果如图:二、大作业简易计算器:设计编写一个计算器,要求根据算符优先算法原则可以计算由“+-,*,/,(,)”组成的任意算术表达式的值。解题思路:使用两个工作栈,一个是OPTR,用以寄存运算符;另一个是OPND,用以寄存数据。首先置数栈为空栈,表达式的起始符号为‘#’算符栈的栈底元素;然后依次读入表达式中的每一个字符,若为数则进OPND数栈,若为运算符则和OPTR算符栈的栈顶运算符比较优先级后,如果栈顶算符优先级低,则此算符进栈并返回新的栈顶算符;如果栈顶算符优先级高,则取算符栈栈顶算符theta并删除此算符,同时去数栈的最上面的两个数a和b并删除这两个数,作athetab运算并将结果进数栈;如果两个算符优先级相同,则删除算符栈顶算符并返回新的栈顶算符。直到整个表达式求值完、程序:#include#include#include//算符优先级表charFirst[7][7]={//'+','-','*','/','(',')','#'/*'+'*/'>','>','<','<','<','>','>',/*'-'*/'>','>','<','<','<','>','>',/*'*'*/'>','>','>','>','<','>','>',/*'/'*/'>','>','>','>','<','>','>',/*'('*/'<','<','<','<','<','=','',/*')'*/'>','>','>','>','','>','>',/*'#'*/'<','<','<','<','<','','='};//运算符数组charOP[7]={'+','-','*','/','(',')','#'};//数据结构体typedefstruct{doubledata[50];inttop;}OPND_Stack;//运算符结构体typedefstruct{chardata[50];inttop;}OPTR_Stack;//初始化运算符栈函数voidInitStack_R(OPTR_Stack*a){a->top=-1;}//初始化数据站函数voidInitStack_D(OPND_Stack*a){a->top=-1;}//运算符进栈函数voidPush_R(OPTR_Stack*a,charb){a->top++;a->data[a->top]=b;}//数据进栈函数voidPush_D(OPND_Stack*a,doubleb){a->top++;a->data[a->top]=b;}//取运算符栈顶符函数voidGetTop_R(OPTR_Stack*a,char*b){*b=a->data[a->top];}//取数据栈顶数函数voidGetTop_D(OPND_Stack*a,double*b){*b=a->data[a->top];}//判断数据是否为运算符函数intIn(chara,char*s){for(inti=0;i<7;i++)if(a==s[i])return1;return0;}//算符优先级判断函数charPrecede(chara,charb){intm,n;for(inti=0;i<7;i++){if(a==OP[i])m=i;if(b==OP[i])n=i;}returnFirst[m][n];}//删除运算符栈顶元素,并取新栈的栈顶元素voidPop_R(OPTR_Stack*a,char*b){a->top--;*b=a->data[a->top];}//取数据站的栈顶元素,并从栈中删除此元素voidPop_D(OPND_Stack*a,double*b){*b=a->data[a->top];a->top--;}//二元运算函数doubleOperate(doublea,chartheta,doubleb){switch(theta){case'+':returna+b;case'-':returna-b;case'*':returna*b;case'/':returna/b;default:return0;}}//将字符串转换成浮点型数据doubleGetdouble(char*a,int*b){doublex;chars[50];intm=0,n;n=strlen(a);for(inti=*b;iif(In(a[i],OP)==1){m=i;break;}for(i=*b;is[i-*b]=a[i];strcat(s,"\0");x=atof(s);*b=m;returnx;}//算符优先算法求值核心函数doubleEvaluateExpression(char*s){OPND_StackOPND;OPTR_StackOPTR;charch,theta;doublex,a,b;intk=0;strcat(s,"#");InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);GetTop_R(&OPTR,&ch);while(s[k]!='#'||ch!='#'){if(In(s[k],OP)==0){x=Getdouble(s,&k);Push_D(&OPND,x);}else{switch(Precede(ch,s[k])){case'<':Push_R(&OPTR,s[k]);k++;break;case'=':Pop_R(&OPTR,&ch);k++;break;case'>':GetTop_R(&OPTR,&theta);Pop_R(&OPTR,&ch);Pop_D(&OPND,&b);Pop_D(&OPND,&a);Push_D(&OPND,Operate(a,theta,b));break;}}GetTop_R(&OPTR,&ch);}GetTop_D(&OPND,&x);returnx;InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);}//判断表达式是否输入正确.intCan(chara[],intn){intp=0,s=0,t=0;for(inti=0;i{if(a[i]=='('||a[i]==')')p++;if((a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/')&&((a[i+1]<'0'&&a[i+1]!='(')||a[i+1]>'9'))s++;if(a[i]=='/'&&a[i+1]=='0')s++;if((a[i]=='('&&(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'))||(a[i]==')'&&a[i+1]=='('))s++;if(a[i]==')'&&a[i+1]!='\0'&&(a[i+1]!='+'&&a[i+1]!='-'&&a[i+1]!='*'&&a[i+1]!='/'))s++;if(a[i]=='.'&&a[i+1]=='.')s++;}if(p%2==0&&s==0)return0;return1;}//负数转换函数voidTranslate(char*s){charb[80];intk,t;if(s[0]=='-'){b[0]='0';b[1]='\0';strcat(b,s);strcpy(s,b);}t=strlen(s);k=t;for(inti=0;i{if(s[i]=='('&&s[i+1]=='-'){k=i+1;for(intj=t;j>=k;j--)s[j]=s[j-1];s[k]='0';s[t+1]='\0';}t=strlen(s);k=t;}}//主函数voidmain(){chara[80];intm;charb[80];printf("============简易计算器============\n");printf("[四则运算.如:-1+(2+3)*9/(-2)-6].\n请输入一个表达式:\n");while(1){gets(a);strcpy(b,a);Translate(a);while(1){intp;m=strlen(a);p=Can(a,m);if(p==0)break;printf("输入错误.请从新输入表达式:\n");gets(a);strcpy(b,a);Translate(a);}printf("=*=*=*=*=*=*表达式结果=*=*=*=*=*=*\n");printf("该表达式的结果为:\n%s=%-10.3lf\n",b,EvaluateExpression(a));printf("=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");printf("继续使用[四则运算.如:-1+(2+3)*9/(-2)-6].<关闭退出>.\n请再输入一个表达式:\n");}}运算结果:
if(a[i][j]>col[j])
col[j]=a[i][j];
for(i=0;i{if(row[i]==col[min_col[i]])printf("a[%d][%d]=%d\n",i,min_col[i],row[i]);elseprintf("没有马鞍点!\n");}}运行结果如图:二、大作业简易计算器:设计编写一个计算器,要求根据算符优先算法原则可以计算由“+-,*,/,(,)”组成的任意算术表达式的值。解题思路:使用两个工作栈,一个是OPTR,用以寄存运算符;另一个是OPND,用以寄存数据。首先置数栈为空栈,表达式的起始符号为‘#’算符栈的栈底元素;然后依次读入表达式中的每一个字符,若为数则进OPND数栈,若为运算符则和OPTR算符栈的栈顶运算符比较优先级后,如果栈顶算符优先级低,则此算符进栈并返回新的栈顶算符;如果栈顶算符优先级高,则取算符栈栈顶算符theta并删除此算符,同时去数栈的最上面的两个数a和b并删除这两个数,作athetab运算并将结果进数栈;如果两个算符优先级相同,则删除算符栈顶算符并返回新的栈顶算符。直到整个表达式求值完、程序:#include#include#include//算符优先级表charFirst[7][7]={//'+','-','*','/','(',')','#'/*'+'*/'>','>','<','<','<','>','>',/*'-'*/'>','>','<','<','<','>','>',/*'*'*/'>','>','>','>','<','>','>',/*'/'*/'>','>','>','>','<','>','>',/*'('*/'<','<','<','<','<','=','',/*')'*/'>','>','>','>','','>','>',/*'#'*/'<','<','<','<','<','','='};//运算符数组charOP[7]={'+','-','*','/','(',')','#'};//数据结构体typedefstruct{doubledata[50];inttop;}OPND_Stack;//运算符结构体typedefstruct{chardata[50];inttop;}OPTR_Stack;//初始化运算符栈函数voidInitStack_R(OPTR_Stack*a){a->top=-1;}//初始化数据站函数voidInitStack_D(OPND_Stack*a){a->top=-1;}//运算符进栈函数voidPush_R(OPTR_Stack*a,charb){a->top++;a->data[a->top]=b;}//数据进栈函数voidPush_D(OPND_Stack*a,doubleb){a->top++;a->data[a->top]=b;}//取运算符栈顶符函数voidGetTop_R(OPTR_Stack*a,char*b){*b=a->data[a->top];}//取数据栈顶数函数voidGetTop_D(OPND_Stack*a,double*b){*b=a->data[a->top];}//判断数据是否为运算符函数intIn(chara,char*s){for(inti=0;i<7;i++)if(a==s[i])return1;return0;}//算符优先级判断函数charPrecede(chara,charb){intm,n;for(inti=0;i<7;i++){if(a==OP[i])m=i;if(b==OP[i])n=i;}returnFirst[m][n];}//删除运算符栈顶元素,并取新栈的栈顶元素voidPop_R(OPTR_Stack*a,char*b){a->top--;*b=a->data[a->top];}//取数据站的栈顶元素,并从栈中删除此元素voidPop_D(OPND_Stack*a,double*b){*b=a->data[a->top];a->top--;}//二元运算函数doubleOperate(doublea,chartheta,doubleb){switch(theta){case'+':returna+b;case'-':returna-b;case'*':returna*b;case'/':returna/b;default:return0;}}//将字符串转换成浮点型数据doubleGetdouble(char*a,int*b){doublex;chars[50];intm=0,n;n=strlen(a);for(inti=*b;iif(In(a[i],OP)==1){m=i;break;}for(i=*b;is[i-*b]=a[i];strcat(s,"\0");x=atof(s);*b=m;returnx;}//算符优先算法求值核心函数doubleEvaluateExpression(char*s){OPND_StackOPND;OPTR_StackOPTR;charch,theta;doublex,a,b;intk=0;strcat(s,"#");InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);GetTop_R(&OPTR,&ch);while(s[k]!='#'||ch!='#'){if(In(s[k],OP)==0){x=Getdouble(s,&k);Push_D(&OPND,x);}else{switch(Precede(ch,s[k])){case'<':Push_R(&OPTR,s[k]);k++;break;case'=':Pop_R(&OPTR,&ch);k++;break;case'>':GetTop_R(&OPTR,&theta);Pop_R(&OPTR,&ch);Pop_D(&OPND,&b);Pop_D(&OPND,&a);Push_D(&OPND,Operate(a,theta,b));break;}}GetTop_R(&OPTR,&ch);}GetTop_D(&OPND,&x);returnx;InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);}//判断表达式是否输入正确.intCan(chara[],intn){intp=0,s=0,t=0;for(inti=0;i{if(a[i]=='('||a[i]==')')p++;if((a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/')&&((a[i+1]<'0'&&a[i+1]!='(')||a[i+1]>'9'))s++;if(a[i]=='/'&&a[i+1]=='0')s++;if((a[i]=='('&&(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'))||(a[i]==')'&&a[i+1]=='('))s++;if(a[i]==')'&&a[i+1]!='\0'&&(a[i+1]!='+'&&a[i+1]!='-'&&a[i+1]!='*'&&a[i+1]!='/'))s++;if(a[i]=='.'&&a[i+1]=='.')s++;}if(p%2==0&&s==0)return0;return1;}//负数转换函数voidTranslate(char*s){charb[80];intk,t;if(s[0]=='-'){b[0]='0';b[1]='\0';strcat(b,s);strcpy(s,b);}t=strlen(s);k=t;for(inti=0;i{if(s[i]=='('&&s[i+1]=='-'){k=i+1;for(intj=t;j>=k;j--)s[j]=s[j-1];s[k]='0';s[t+1]='\0';}t=strlen(s);k=t;}}//主函数voidmain(){chara[80];intm;charb[80];printf("============简易计算器============\n");printf("[四则运算.如:-1+(2+3)*9/(-2)-6].\n请输入一个表达式:\n");while(1){gets(a);strcpy(b,a);Translate(a);while(1){intp;m=strlen(a);p=Can(a,m);if(p==0)break;printf("输入错误.请从新输入表达式:\n");gets(a);strcpy(b,a);Translate(a);}printf("=*=*=*=*=*=*表达式结果=*=*=*=*=*=*\n");printf("该表达式的结果为:\n%s=%-10.3lf\n",b,EvaluateExpression(a));printf("=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");printf("继续使用[四则运算.如:-1+(2+3)*9/(-2)-6].<关闭退出>.\n请再输入一个表达式:\n");}}运算结果:
if(row[i]==col[min_col[i]])
printf("a[%d][%d]=%d\n",i,min_col[i],row[i]);
else
printf("没有马鞍点!
运行结果如图:
二、大作业
简易计算器:
设计编写一个计算器,要求根据算符优先算法原则可以计算由“+-,*,/,(,)”组成的任意算术表达式的值。
使用两个工作栈,一个是OPTR,用以寄存运算符;另一个是OPND,用以寄存数据。
首先置数栈为空栈,表达式的起始符号为‘#’算符栈的栈底元素;然后依次读入表达式中的每一个字符,若为数则进OPND数栈,若为运算符则和OPTR算符栈的栈顶运算符比较优先级后,如果栈顶算符优先级低,则此算符进栈并返回新的栈顶算符;如果栈顶算符优先级高,则取算符栈栈顶算符theta并删除此算符,同时去数栈的最上面的两个数a和b并删除这两个数,作athetab运算并将结果进数栈;如果两个算符优先级相同,则删除算符栈顶算符并返回新的栈顶算符。
直到整个表达式求值完、
//算符优先级表
charFirst[7][7]=
//'+','-','*','/','(',')','#'
/*'+'*/'>','>','<','<','<','>','>',
/*'-'*/'>','>','<','<','<','>','>',
/*'*'*/'>','>','>','>','<','>','>',
/*'/'*/'>','>','>','>','<','>','>',
/*'('*/'<','<','<','<','<','=','',
/*')'*/'>','>','>','>','','>','>',
/*'#'*/'<','<','<','<','<','','='
};
//运算符数组
charOP[7]={'+','-','*','/','(',')','#'};
//数据结构体
typedefstruct
doubledata[50];
inttop;
}OPND_Stack;
//运算符结构体
chardata[50];
}OPTR_Stack;
//初始化运算符栈函数
voidInitStack_R(OPTR_Stack*a)
a->top=-1;
//初始化数据站函数
voidInitStack_D(OPND_Stack*a)
//运算符进栈函数
voidPush_R(OPTR_Stack*a,charb)
a->top++;
a->data[a->top]=b;
//数据进栈函数
voidPush_D(OPND_Stack*a,doubleb)
//取运算符栈顶符函数
voidGetTop_R(OPTR_Stack*a,char*b)
*b=a->data[a->top];
//取数据栈顶数函数
voidGetTop_D(OPND_Stack*a,double*b)
//判断数据是否为运算符函数
intIn(chara,char*s)
for(inti=0;i<7;i++)
if(a==s[i])
return1;
return0;
//算符优先级判断函数
charPrecede(chara,charb)
intm,n;
if(a==OP[i])
m=i;
if(b==OP[i])
n=i;
returnFirst[m][n];
//删除运算符栈顶元素,并取新栈的栈顶元素
voidPop_R(OPTR_Stack*a,char*b)
a->top--;
//取数据站的栈顶元素,并从栈中删除此元素
voidPop_D(OPND_Stack*a,double*b)
//二元运算函数
doubleOperate(doublea,chartheta,doubleb)
switch(theta)
case'+':
returna+b;
case'-':
returna-b;
case'*':
returna*b;
case'/':
returna/b;
default:
//将字符串转换成浮点型数据
doubleGetdouble(char*a,int*b)
doublex;chars[50];
intm=0,n;
n=strlen(a);
for(inti=*b;iif(In(a[i],OP)==1){m=i;break;}for(i=*b;is[i-*b]=a[i];strcat(s,"\0");x=atof(s);*b=m;returnx;}//算符优先算法求值核心函数doubleEvaluateExpression(char*s){OPND_StackOPND;OPTR_StackOPTR;charch,theta;doublex,a,b;intk=0;strcat(s,"#");InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);GetTop_R(&OPTR,&ch);while(s[k]!='#'||ch!='#'){if(In(s[k],OP)==0){x=Getdouble(s,&k);Push_D(&OPND,x);}else{switch(Precede(ch,s[k])){case'<':Push_R(&OPTR,s[k]);k++;break;case'=':Pop_R(&OPTR,&ch);k++;break;case'>':GetTop_R(&OPTR,&theta);Pop_R(&OPTR,&ch);Pop_D(&OPND,&b);Pop_D(&OPND,&a);Push_D(&OPND,Operate(a,theta,b));break;}}GetTop_R(&OPTR,&ch);}GetTop_D(&OPND,&x);returnx;InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);}//判断表达式是否输入正确.intCan(chara[],intn){intp=0,s=0,t=0;for(inti=0;i{if(a[i]=='('||a[i]==')')p++;if((a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/')&&((a[i+1]<'0'&&a[i+1]!='(')||a[i+1]>'9'))s++;if(a[i]=='/'&&a[i+1]=='0')s++;if((a[i]=='('&&(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'))||(a[i]==')'&&a[i+1]=='('))s++;if(a[i]==')'&&a[i+1]!='\0'&&(a[i+1]!='+'&&a[i+1]!='-'&&a[i+1]!='*'&&a[i+1]!='/'))s++;if(a[i]=='.'&&a[i+1]=='.')s++;}if(p%2==0&&s==0)return0;return1;}//负数转换函数voidTranslate(char*s){charb[80];intk,t;if(s[0]=='-'){b[0]='0';b[1]='\0';strcat(b,s);strcpy(s,b);}t=strlen(s);k=t;for(inti=0;i{if(s[i]=='('&&s[i+1]=='-'){k=i+1;for(intj=t;j>=k;j--)s[j]=s[j-1];s[k]='0';s[t+1]='\0';}t=strlen(s);k=t;}}//主函数voidmain(){chara[80];intm;charb[80];printf("============简易计算器============\n");printf("[四则运算.如:-1+(2+3)*9/(-2)-6].\n请输入一个表达式:\n");while(1){gets(a);strcpy(b,a);Translate(a);while(1){intp;m=strlen(a);p=Can(a,m);if(p==0)break;printf("输入错误.请从新输入表达式:\n");gets(a);strcpy(b,a);Translate(a);}printf("=*=*=*=*=*=*表达式结果=*=*=*=*=*=*\n");printf("该表达式的结果为:\n%s=%-10.3lf\n",b,EvaluateExpression(a));printf("=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");printf("继续使用[四则运算.如:-1+(2+3)*9/(-2)-6].<关闭退出>.\n请再输入一个表达式:\n");}}运算结果:
if(In(a[i],OP)==1)
m=i;break;
for(i=*b;is[i-*b]=a[i];strcat(s,"\0");x=atof(s);*b=m;returnx;}//算符优先算法求值核心函数doubleEvaluateExpression(char*s){OPND_StackOPND;OPTR_StackOPTR;charch,theta;doublex,a,b;intk=0;strcat(s,"#");InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);GetTop_R(&OPTR,&ch);while(s[k]!='#'||ch!='#'){if(In(s[k],OP)==0){x=Getdouble(s,&k);Push_D(&OPND,x);}else{switch(Precede(ch,s[k])){case'<':Push_R(&OPTR,s[k]);k++;break;case'=':Pop_R(&OPTR,&ch);k++;break;case'>':GetTop_R(&OPTR,&theta);Pop_R(&OPTR,&ch);Pop_D(&OPND,&b);Pop_D(&OPND,&a);Push_D(&OPND,Operate(a,theta,b));break;}}GetTop_R(&OPTR,&ch);}GetTop_D(&OPND,&x);returnx;InitStack_R(&OPTR);Push_R(&OPTR,'#');InitStack_D(&OPND);}//判断表达式是否输入正确.intCan(chara[],intn){intp=0,s=0,t=0;for(inti=0;i{if(a[i]=='('||a[i]==')')p++;if((a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/')&&((a[i+1]<'0'&&a[i+1]!='(')||a[i+1]>'9'))s++;if(a[i]=='/'&&a[i+1]=='0')s++;if((a[i]=='('&&(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'))||(a[i]==')'&&a[i+1]=='('))s++;if(a[i]==')'&&a[i+1]!='\0'&&(a[i+1]!='+'&&a[i+1]!='-'&&a[i+1]!='*'&&a[i+1]!='/'))s++;if(a[i]=='.'&&a[i+1]=='.')s++;}if(p%2==0&&s==0)return0;return1;}//负数转换函数voidTranslate(char*s){charb[80];intk,t;if(s[0]=='-'){b[0]='0';b[1]='\0';strcat(b,s);strcpy(s,b);}t=strlen(s);k=t;for(inti=0;i{if(s[i]=='('&&s[i+1]=='-'){k=i+1;for(intj=t;j>=k;j--)s[j]=s[j-1];s[k]='0';s[t+1]='\0';}t=strlen(s);k=t;}}//主函数voidmain(){chara[80];intm;charb[80];printf("============简易计算器============\n");printf("[四则运算.如:-1+(2+3)*9/(-2)-6].\n请输入一个表达式:\n");while(1){gets(a);strcpy(b,a);Translate(a);while(1){intp;m=strlen(a);p=Can(a,m);if(p==0)break;printf("输入错误.请从新输入表达式:\n");gets(a);strcpy(b,a);Translate(a);}printf("=*=*=*=*=*=*表达式结果=*=*=*=*=*=*\n");printf("该表达式的结果为:\n%s=%-10.3lf\n",b,EvaluateExpression(a));printf("=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");printf("继续使用[四则运算.如:-1+(2+3)*9/(-2)-6].<关闭退出>.\n请再输入一个表达式:\n");}}运算结果:
s[i-*b]=a[i];
strcat(s,"\0");
x=atof(s);
*b=m;
returnx;
//算符优先算法求值核心函数
doubleEvaluateExpression(char*s)
OPND_StackOPND;
OPTR_StackOPTR;
charch,theta;
doublex,a,b;
intk=0;
strcat(s,"#");
InitStack_R(&OPTR);Push_R(&OPTR,'#');
InitStack_D(&OPND);
GetTop_R(&OPTR,&ch);
while(s[k]!
='#'||ch!
='#')
if(In(s[k],OP)==0)
x=Getdouble(s,&k);
Push_D(&OPND,x);
switch(Precede(ch,s[k]))
case'<':
Push_R(&OPTR,s[k]);
k++;
break;
case'=':
Pop_R(&OPTR,&ch);
case'>':
GetTop_R(&OPTR,&theta);Pop_R(&OPTR,&ch);
Pop_D(&OPND,&b);Pop_D(&OPND,&a);
Push_D(&OPND,Operate(a,theta,b));
GetTop_D(&OPND,&x);
//判断表达式是否输入正确.
intCan(chara[],intn)
intp=0,s=0,t=0;
for(inti=0;i{if(a[i]=='('||a[i]==')')p++;if((a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/')&&((a[i+1]<'0'&&a[i+1]!='(')||a[i+1]>'9'))s++;if(a[i]=='/'&&a[i+1]=='0')s++;if((a[i]=='('&&(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'))||(a[i]==')'&&a[i+1]=='('))s++;if(a[i]==')'&&a[i+1]!='\0'&&(a[i+1]!='+'&&a[i+1]!='-'&&a[i+1]!='*'&&a[i+1]!='/'))s++;if(a[i]=='.'&&a[i+1]=='.')s++;}if(p%2==0&&s==0)return0;return1;}//负数转换函数voidTranslate(char*s){charb[80];intk,t;if(s[0]=='-'){b[0]='0';b[1]='\0';strcat(b,s);strcpy(s,b);}t=strlen(s);k=t;for(inti=0;i{if(s[i]=='('&&s[i+1]=='-'){k=i+1;for(intj=t;j>=k;j--)s[j]=s[j-1];s[k]='0';s[t+1]='\0';}t=strlen(s);k=t;}}//主函数voidmain(){chara[80];intm;charb[80];printf("============简易计算器============\n");printf("[四则运算.如:-1+(2+3)*9/(-2)-6].\n请输入一个表达式:\n");while(1){gets(a);strcpy(b,a);Translate(a);while(1){intp;m=strlen(a);p=Can(a,m);if(p==0)break;printf("输入错误.请从新输入表达式:\n");gets(a);strcpy(b,a);Translate(a);}printf("=*=*=*=*=*=*表达式结果=*=*=*=*=*=*\n");printf("该表达式的结果为:\n%s=%-10.3lf\n",b,EvaluateExpression(a));printf("=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");printf("继续使用[四则运算.如:-1+(2+3)*9/(-2)-6].<关闭退出>.\n请再输入一个表达式:\n");}}运算结果:
if(a[i]=='('||a[i]==')')
p++;
if((a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/')&&((a[i+1]<'0'&&a[i+1]!
='(')||a[i+1]>'9'))
s++;
if(a[i]=='/'&&a[i+1]=='0')
if((a[i]=='('&&(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'))||(a[i]==')'&&a[i+1]=='('))
if(a[i]==')'&&a[i+1]!
='\0'&&(a[i+1]!
='+'&&a[i+1]!
='-'&&a[i+1]!
='*'&&a[i+1]!
='/'))
if(a[i]=='.'&&a[i+1]=='.')
if(p%2==0&&s==0)
//负数转换函数
voidTranslate(char*s)
charb[80];intk,t;
if(s[0]=='-')
b[0]='0';
b[1]='\0';
strcat(b,s);
strcpy(s,b);
t=strlen(s);
k=t;
for(inti=0;i{if(s[i]=='('&&s[i+1]=='-'){k=i+1;for(intj=t;j>=k;j--)s[j]=s[j-1];s[k]='0';s[t+1]='\0';}t=strlen(s);k=t;}}//主函数voidmain(){chara[80];intm;charb[80];printf("============简易计算器============\n");printf("[四则运算.如:-1+(2+3)*9/(-2)-6].\n请输入一个表达式:\n");while(1){gets(a);strcpy(b,a);Translate(a);while(1){intp;m=strlen(a);p=Can(a,m);if(p==0)break;printf("输入错误.请从新输入表达式:\n");gets(a);strcpy(b,a);Translate(a);}printf("=*=*=*=*=*=*表达式结果=*=*=*=*=*=*\n");printf("该表达式的结果为:\n%s=%-10.3lf\n",b,EvaluateExpression(a));printf("=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");printf("继续使用[四则运算.如:-1+(2+3)*9/(-2)-6].<关闭退出>.\n请再输入一个表达式:\n");}}运算结果:
if(s[i]=='('&&s[i+1]=='-')
k=i+1;
for(intj=t;j>=k;j--)
s[j]=s[j-1];
s[k]='0';
s[t+1]='\0';
//主函数
chara[80];intm;charb[80];
printf("============简易计算器============\n");
printf("[四则运算.如:
-1+(2+3)*9/(-2)-6].\n请输入一个表达式:
while
(1)
gets(a);
strcpy(b,a);
Translate(a);
intp;
m=strlen(a);
p=Can(a,m);
if(p==0)break;
printf("输入错误.请从新输入表达式:
printf("=*=*=*=*=*=*表达式结果=*=*=*=*=*=*\n");
printf("该表达式的结果为:
\n%s=%-10.3lf\n",b,EvaluateExpression(a));
printf("=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");
printf("继续使用[四则运算.如:
-1+(2+3)*9/(-2)-6].<关闭退出>.\n请再输入一个表达式:
运算结果:
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2