• #include using namespace std;   typedef struct SqStack{  int * base;  int * top;  int size; }SqStack;   #define STACK_INIT_SIZE 100 #define STACKINCREMENT 20 ...InitSq


#include<iostream>

using
namespace
std; 

typedef
struct
SqStack{

 
int
* base;

 
int
* top;

 
int
size;

}SqStack; 

#define STACK_INIT_SIZE  100

#define STACKINCREMENT   20

void
InitSqStack(SqStack &t);

void
push(SqStack &t, 
int
n);

int
 out(SqStack &t);

int
 Empty( SqStack &t);

char
GetTop(SqStack &t);

char
Precede(
char
,
char
); 

int
 main(){

    
char
ch;

 
SqStack OPTR;InitSqStack(OPTR);

 
SqStack OPND;InitSqStack(OPND);

    
push(OPTR,
'='
);

    

 

 
ch=
getchar
();

 
if
(ch==
'-'
){        
//第一个数为负数

  
int
m=0;

  
ch=
getchar
();

   
while
(ch<=
'9'
&&ch>=
'0'
){

    
m=m*10+ch-48;

    
ch=
getchar
();                          

       
}

    
push(OPND,m*(-1));

 
}

   

 

 

 
while
(ch!=10){

  
int
m=0; 
int
flag=1;   
char
ch1=ch; 

        
if
(ch1==
'('
){  

   
char
ch2;

   
push(OPTR,ch);

   
while
((ch=
getchar
())==
'('
)

                 
push(OPTR,ch);

   

   
ch2=ch;

   
if
(ch2==
'-'
){               
//出现负数

    
flag=-1;

    
ch=
getchar
();

    
}

      

  
while
(ch<=
'9'
&&ch>=
'0'
){

      
m=m*10+ch-48;

      
ch=
getchar
();                          

         
}

  

      

  
if
(ch==
')'
)              
//形如（-1）的负数 还有形如（-1+2*5  中的负数

     
{

     
out(OPTR);

     
ch=
getchar
();

     
}

 
}

 
else
{ 

     
while
(ch<=
'9'
&&ch>=
'0'
){

    
m=m*10+ch-48;

    
ch=
getchar
();                          

     
}

 
}

  
if
(m)

    
push(OPND,m*flag);

  
switch
(Precede(GetTop(OPTR),ch)){

                 

        
case
'<'
:push(OPTR,ch);ch=
getchar
();
break
;

         

        
case
'='
:out(OPTR);ch=
getchar
();
break
;

          

        
case
'>'
:{

                     
int
m2=out(OPND),m1=out(OPND); 

                                  
//注意m1和m2的顺序  后一个操作数先出来用m2接收

                     
switch
(out(OPTR))

                     
{

                          
case
'+'
:push(OPND,m1+m2);
break
;

                                   
case
'-'
:push(OPND,m1-m2);
break
;

                                   
case
'*'
:push(OPND,m1*m2);
break
;

                                   
case
'/'
:push(OPND,m1/m2);
break
;

                      
}

       

             
break
;

      

     
}

    
}

 
}

 
printf
(
"%d"
,out(OPND));

 

 

 
getchar
();

 

} 

  

void
push(SqStack &t, 
int
n){               

 
if
((t.top-t.base)>=t.size){

  
t.base=(
int
*)
realloc
(t.base,(t.size+STACKINCREMENT)*
sizeof
(
int
));

  
if
(!t.base)

   
exit
(1);

 
}

  
*(t.top)=n;

     
t.top++;

 

}          

int
out(SqStack &t){             

 
t.top--;

 
return
*(t.top);

}            

int
Empty( SqStack &t){

 
int
m=(t.top-t.base);  

 
return
m;

}    

char
GetTop(SqStack &t){

   
return
*(t.top-1);

}       

char
Precede(
char
c,
char
 d)

{

    
char
youxian[7][7]=

    
{

        
{
'>'
,
'>'
,
'<'
,
'<'
,
'<'
,
'>'
,
'>'
},

        
{
'>'
,
'>'
,
'<'
,
'<'
,
'<'
,
'>'
,
'>'
},

        
{
'>'
,
'>'
,
'>'
,
'>'
,
'<'
,
'>'
,
'>'
},

        
{
'>'
,
'>'
,
'>'
,
'>'
,
'<'
,
'>'
,
'>'
},

        
{
'<'
,
'<'
,
'<'
,
'<'
,
'<'
,
'='
,
'>'
},

        
{
'>'
,
'>'
,
'>'
,
'>'
,
'>'
,
'>'
,
'>'
},

        
{
'<'
,
'<'
,
'<'
,
'<'
,
'<'
,
'>'
,
'='
}

    
};

    
char
opt[7]={
'+'
,
'-'
,
'*'
,
'/'
,
'('
,
')'
,
'='
};

    
int
m,n,i;

    
for
(i=0;i<7;i++)

    
{

        
if
(c==opt[i])

        
{

            
m=i;

        
}

        
if
(d==opt[i])

        
{

            
n=i;

        
}

    
}

 
return
youxian[m][n];

} 

void
InitSqStack(SqStack &t){

 
t.base=(
int
*)(
malloc
(
sizeof
(
int
)*STACK_INIT_SIZE));

 
if
(!t.base)

   
exit
(1);

 
t.top=t.base;

 
t.size=STACK_INIT_SIZE;

}   


展开全文
• 本文实例为大家分享了C++实现四则混合运算的计算器，供大家参考，具体内容如下计算器是带括号的四则运算实际上利用的是栈后进先出的原则转换思想：#define _CRT_SECURE_NO_WARNINGS 1#include"stdio.h"#include...

本文实例为大家分享了C++实现四则混合运算的计算器，供大家参考，具体内容如下
计算器是带括号的四则运算实际上利用的是栈后进先出的原则

转换思想：

#define _CRT_SECURE_NO_WARNINGS 1
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#define maxsize 1024
typedef struct
{
float data[maxsize];
int top;
}Stack1;
void Initstack1(Stack1 *S)
{
S = (Stack1*)malloc(sizeof(Stack1));
S->top = -1;
}
int Push1(Stack1 *S, float ch)
{
if (S->top == maxsize - 1)
return 0;
else
{
S->top++;
S->data[S->top] = ch;
return 1;
}
}//入栈Push
int Pop1(Stack1 *S, float ch)
{
if (S->top == -1)
printf("栈上溢出!\n");
else
ch = S->data[S->top];
S->top--;
return 1;
}//出栈
typedef struct
{
char data[maxsize];
int top;
}Stack2;
void Initstack2(Stack2 *S)
{
S = (Stack2*)malloc(sizeof(Stack2));
S->top = -1;
}
int Push2(Stack2 *S, char ch)
{
if (S->top == maxsize - 1)
return 0;
else
{
S->top++;
S->data[S->top] = ch;
return 1;
}
}//入栈Push
int Pop2(Stack2 *S, char ch)
{
if (S->top == -1)
printf("栈上溢出!\n");
else
ch = S->data[S->top];
S->top--;
return 1;
}//出栈
int Comop(char ch) //判断是否是运算符
{
switch (ch)
{
case'+':
case'-':
case'*':
case'/':
case'(':
case')':
case'#':
return 1;
default:
return 0;
}
}//判断ch是否为运算符
char Prior[7][7] =
{ // 运算符优先级表
// '+' '-' '*' '/' '(' ')' '#'
/*'+'*/{ '>', '>', '', '>' },
/*'-'*/{ '>', '>', '', '>' },
/*'*'*/{ '>', '>', '>', '>', '', '>' },
/*'/'*/{ '>', '>', '>', '>', '', '>' },
/*'('*/{ '
/*')'*/{ '>', '>', '>', '>', ' ', '>', '>' },
/*'#'*/{ ' ', '=' },
};
int Opid(char op1)
{
switch (op1)
{
case'+':return 0;
case'-':return 1;
case'*':return 2;
case'/':return 3;
case'(':return 4;
case')':return 5;
case'#':return 6;
default:return -123456;
}
}
char Precede(char op1, char op2) //优先级比较
{
int a, b;
a = Opid(op1); b = Opid(op2);
return(Prior[a][b]);
}
float Operation(float a, char op, float b)
{
switch (op)
{
case '+':
return b + a;
case '-':
return b - a;
case '*':
return b * a;
case '/':
return b / a;
default:
return -123456;
}
}
void CreateExpression(char *exp)
{
if (exp == NULL)
{
exit(1);
}
scanf("%s", exp);
}
void TransmitExpression(char *exp, char postexp[]) //中缀表达式转换后缀表达式
{
Stack2 FZ;
Initstack2(&FZ);
int i = 0;
char x;
FZ.top = -1;
Push2(&FZ, '#');
FZ.data[FZ.top] = '#';
while (*exp != '\0')
{
if (!Comop(*exp))
{
while (*exp >= '0'&&*exp <= '9')//读取一个数字串
{
postexp[i++] = *exp;
exp++;
}
postexp[i++] = '#';
}
else
switch (Precede(FZ.data[FZ.top], *exp))
{
case'
Push2(&FZ, *exp);
exp++;
break;
case'=':
x = FZ.data[FZ.top];
Pop2(&FZ, x);
exp++;
break;
case'>':
postexp[i++] = FZ.data[FZ.top];
x = FZ.data[FZ.top];
Pop2(&FZ, x);
break;
}
}
while (FZ.data[FZ.top] != '#')
{
postexp[i++] = FZ.data[FZ.top];
x = FZ.data[FZ.top];
Pop2(&FZ, x);
}
postexp[i] = '\0';
}
float EvaluateExpression(char *postexp) //后缀表达式的计算
{
Stack1 SZ;
Initstack1(&SZ);
float a, b, d;
SZ.top = -1;
while (*postexp != '\0')
{
switch (*postexp)
{
case'+':
case'-':
case'*':
case'/':
a = SZ.data[SZ.top];
Pop1(&SZ, a);
b = SZ.data[SZ.top];
Pop1(&SZ, b);
Push1(&SZ, Operation(a, *postexp, b));
break;
default:
d = 0;
while (*postexp >= '0'&&*postexp <= '9')
{
d = 10 * d + *postexp - '0';
postexp++;
}
Push1(&SZ, d);
SZ.data[SZ.top] = d;
break;
}
postexp++;
}
return(SZ.data[SZ.top]);
}
int Error(char *exp) //错误表达式判断
{
int i = 0;
while (exp[i] != '\0')
{
if (
((exp[i] == '+' || exp[i] == '-' || exp[i] == '*' || exp[i] == '/') && (exp[i + 1] == ')'))
|| ((exp[i] == '+' || exp[i] == '-' || exp[i] == '*' || exp[i] == '/') && (exp[i - 1] == '('))
|| (exp[i] == ')'&&exp[i + 1] == '(')
|| (exp[i] == '('&&exp[i + 1] == ')')
|| ((exp[i] == ')') && exp[i + 1] >= '0'&&exp[i + 1] <= '9')
|| (exp[i] >= '0'&&exp[i] <= '9'&&exp[i + 1] == '(')
|| (exp[0] == '+' || exp[0] == '-' || exp[0] == '*' || exp[0] == '/' || exp[0] == ')')
|| ((exp[i] == '+' || exp[i] == '-' || exp[i] == '*' || exp[i] == '/') && (exp[i + 1] == '+' || exp[i + 1] == '-' || exp[i + 1] == '*' || exp[i + 1] == '/'))
|| (exp[i] == '/'&&exp[i + 1] == '0')
)
return 1;
else
if (exp[i] == '\0')
return 0;
i++;
}
return 0;
}
{
printf("\t\t--------------------------------------------\n");
printf("\t\t| 计算器 |\n");
printf("\t\t| ---------------- |\n");
printf("\t\t| | | |\n");
printf("\t\t| ---------------- |\n");
printf("\t\t| 1 2 3 + |\n");
printf("\t\t| 4 5 6 - |\n");
printf("\t\t| 7 8 9 * |\n");
printf("\t\t| 0 ( ) / |\n");
printf("\t\t--------------------------------------------\n");
printf("\t\t 请输入你要进行的操作：\n");
printf("\t\t a表达式求值 b清空 c退出\n");
}
void clear()
{
system("cls");
}
void Quit()
{
system("cls");
exit(1);
}
void main()
{
char c;
char exp[maxsize];
char postexp[maxsize] = { 0 };
while (1)
{
scanf("%c", &c);
switch (c)
{
case 'a':
sr :
printf("请输入要计算的表达式:\n");
CreateExpression(exp);
if (!Error(exp))
{
TransmitExpression(exp, postexp);
printf("后缀表达式为：%s\n", postexp);
printf("表达式结果为：%s=", exp);
printf("%g\n", EvaluateExpression(postexp));
break;
}
else
if (Error(exp))
{
printf("您输入的表达式有误！\n");
goto sr;//goto语句在循环体里进行跳转
}
case'b':
clear();
break;
case'c':
Quit();
break;
}
}
system("pause");
}
以上就是本文的全部内容，希望对大家的学习有所帮助，也希望大家多多支持脚本之家。

展开全文
• 该楼层疑似违规已被系统折叠隐藏此楼查看此楼#include #include int putlogo(HANDLE handle);int main(){HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);putlogo(handle);while(1){printf(" Mather >...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include
#include
int putlogo(HANDLE handle);
int main()
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
putlogo(handle);
while(1)
{
printf(" Mather >");
//mather();
getchar();
}
}
int putlogo(HANDLE handle)
{
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN);
printf(" \n");
printf(" \n");
printf(" _/ _/ _/ \n");
printf(" _/_/ _/_/ _/ _/ \n");
printf(" _/ _/ _/ _/_/_/ _/_/_/ _/_/_/ \n");
printf(" _/ _/ _/ _/ _/ _/ _/ \n");
printf(" _/ _/ _/_/ _/ _/_/ _/ _/ \n");
printf(" \n");
printf(" \n");
SetConsoleTextAttribute(handle,7);
printf("\n");
return 0;
}
/*void mather()
{
const char *a;
scanf("%s",a)
int x = 0;
int b = 0;
double s = 0;
while(a[x] != 0)
{
if(a[x] != "+")
{
if(a[x] != "-")
{
if(a[x] != "*")
{
if(a[x] != "/")
{
}
else
{
}
}
else
{
}
}
else
{
}
}
else
{
char c0[x-b] = a[b+1];
s =(double)c0 + s;
b = x;
}
}
}*/

展开全文
• c语言简易计算器实现中缀表达式四则混合运算
• 给出四则混合运算的详细实现，代码较为全面给出了包括错误检查等各个发面的问题
• 采用编译原理的方法用c语言实现四则混合运算，其中有词法分析和语法分析，并用尾动作文法实现求值。请先看action表和goto表，一定要对照着这两个表来看程序。
• 一个简单的程序，但是很实用，适合C语言初学者
• 满意答案夏x夕2013.09.06采纳率：51%等级：12已帮助：11673人scanf("%c",&c[i]);}for(i=0;c[i]!='=';i++){if(c[i]=='*'||c[i]=='/'){switch(c[i]){case '*': a[i]=a[i]*a[i+1];a[i+1]=0;t=i;...

满意答案

夏x夕
2013.09.06

采纳率：51%    等级：12
已帮助：11673人
scanf("%c",&c[i]);
}
for(i=0;c[i]!='=';i++)
{
if(c[i]=='*'||c[i]=='/')
{
switch(c[i])
{
case '*': a[i]=a[i]*a[i+1];
a[i+1]=0;
t=i;
h=i;
break;
case '/': if(a[i+1]==0)
{
printf("error");
break;
}
else
{
a[i]=a[i]/a[i+1];
a[i+1]=0;
t=i;
h=i;
break;
}
}
}
break;
}
for(i=t+1;c[i]!='=';i++)
{
if(c[i]=='*'||c[i]=='/')
{
if(i==h+1)
{
switch(c[i])
{
case '*': a[t]=a[t]*a[i+1];
a[i+1]=0;
h++;
break;
case '/': if(a[i+1]==0)
{
printf("error");
break;
}
else
{
a[i]=a[i]/a[i+1];
a[i+1]=0;
t=i;
h=i;
break;
}
}
}
else
{
switch(c[i])
{
case '*': t=i;
h=i;
a[t]=a[t]*a[i+1];
a[i+1]=0;
break;
case '/': if(a[i]==0)
{
printf("error");
break;
}
else
{
t=i;
h=i;
a[t]=a[t]/a[i+1];
a[i+1]=0;
break;
}
}
}
}
}
for(i=0;c[i]!='=';i++)
{
switch(c[i])
{
case '+': a[i+1]=a[i]+a[i+1];break;
case '-': a[i+1]=a[i]-a[i+1];break;
default: a[i+1]=a[i]+a[i+1];break;
}
}
printf("%d",a[i]);
}
14分享举报

展开全文
• ## C语言实现四则运算

千次阅读 2013-10-10 11:31:04
default: printf("运算错误！\n"); break; } } int calculate(int len, char *expStr) { //表达式异常处理，注意len 要加括号 if ((len ) || (expStr == NULL)) { printf("表达式为空！\n"); ...
• 从标准输入中读入一个整数算术运算表达式，如5 - 1 * 2 * 3 + 12 / 2 / 2 = 。计算表达式结果，并输出。 要求： 1、表达式运算符只有+、-、*、/，表达式末尾的’=’字符表示表达式输入结束，表达式中可能会出现空格...
• 使用堆栈实现对算数四则混合运算表达式的求值（C语言） 一个运算数和运算符之间没有空格的算术表达式字符串，采用堆栈的方法对其进行计算
• 满意答案dwjn1d8qqu72013.12.31采纳率：42%等级：11已帮助：10300人#include //函数，读数操作数int getNextNum(){int ret;scanf("%d",&ret);return ret;}//函数，读运算符char getOpt(){return getchar();...
• 后缀表达式计算结果 不断读数，如果遇到数字就入栈，遇到符号就将栈顶两个元素进行运算然后将结果进栈。如果是除法或者减法栈顶元素是除数，栈顶前一个是被除数 #include #include #include #define max 100 struct ...
• 一个用从语言来实现的算法实例，模拟计算机的混合运算机制
• C语言写的秒速计算四则混合运算项目 开发语言：C语言 开发工具：Visual Studio 2017 整理时间：2017年8月2日 源代码：500行； 开发方式：C语言多文件模式开发 实现功能：在文件中写入四则混合运算表达式（无论有多长...
• 练习2-9整数四则运算(10分)本题要求编写程序，计算2个正整数的和、差、积、商并输出。...输入样例:3 2输出样例:3 + 2 = 53 - 2 = 13 * 2 = 63 / 2 = 1分析：本题是最常规的整数四则混合运算，一般思路就是分...
• 之前在网上找了好多相似的文章，不过有的是功能不够，无法实现多级括号，有的是用到了栈，代码对于初学者来说不好理解。所以自己写了一个。不过不是完整代码，但是能够很好的解释这个逻辑 #include&lt;stdio.h...
• 四则运算相关功能函数使用文档 实现加法 void Add(double m,double n){ printf("%g + %g = %g\n",m,n, m+n); } 实现减法 void Reduce(double m,double n){ printf("%g - %g = %g\n",m,n, m-n); } 实现乘法 ...
• 在编程计算时, 程序设计...本文把计算机原理中的数值运算方法应用于高级语言编程, 总结出了一个提高计算精度的有效方法, 叫做分段运算法, 如不考虑机器的运行时间和内存容量, 采用这种方法可以使计算精度达到任意位。
• 小学生四则运算实现c语言编写。 实现小学生加法、减法、乘法和除法运算。 并选择难易度，简单运算和混合运算，具有界面选择功能。
• C程序的设计首要考虑的是如何通过一个过程，对输入（或环境条件）进行运算处理得到输出（或实现过程（事务）控制）。 C++，首要考虑的是如何构造一个对象模型，让这个模型能够契合与之对应的问题域，这样就可以通过...
• 混合运算 缺省事实1 一个十进制小数换算成二进制时可能会变为无限小数，为了不损失精度，计算机默认将float常量转换为double常量处理。 缺省事实2 对于整型常量，计算机会根据其大小，默认作为对应的有符号型整数来...
• ## C语言程序：用栈实现四则运算

千次阅读 多人点赞 2019-02-19 21:58:48
用栈实现四则运算 第一部分 ：LinkStack.h #ifndef LINKSTACK_H #define LINKSTACK_H #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #define SUCCESS 10000 #define FAILURE 10001 #define ...
• 下面这个程序使用C语言的结构体实现了分数的加减乘除四则运算，同时将结果最简化#include <stdio.h>struct fraction { int numerator; int denominator; };// 将分数化为最简形式 struct fraction reduce_fraction...
• 没什么可说的，很简单，写出加减乘除函数...代码实现如下： #include float add(float a,float b) { return a+b; } float sub(float a,float b) { return a-b; } float mul(float a,float b) { return a*b; } f
• 使用c语言实现带括号的四则运算的程序(使用Visual Studio的完整程序 )

...

c语言 订阅