c语言 逆波兰式输入 计算器程序

原创 2013年12月02日 19:07:23
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

#define MAXOP 100
#define NUMBER '0'

int getop(char []) ;
void push(double) ;
double pop(void) ;

/*逆波兰式输入计算器程序*/ 
main()
{
	char s[MAXOP] ;
	int type ;
	double op2 ;

	while((type = getop(s)) != EOF){
		switch(type){
		case NUMBER:
			push(atof(s)) ;
			break ;
		case '+'   :
			push(pop()+pop()) ;
			break ;
		case '*'   :
			push(pop()*pop()) ;
			break ;
		case '-'   :
			op2 = pop() ;
			push(pop() - op2) ;
			break ;
		case '/'   :
			op2 = pop() ;
			if(op2)
				push(pop()/op2) ;
			else
				printf("error : zero divisor\n") ;
			break ;
		case '%'  :
			op2 = pop() ;
			
			if(op2)
				push(fmod(pop(),op2)) ;
			else
				printf("error:") ;
			break ;
		case '\n'   :
	
			printf("\t%.8g\n",pop()) ;
			break ;
	
		default    :
			printf("ERROR! unknown command %s \n") ;
			break ;
		}
	}
}

/*构建栈*/ 
#define MAXVAL 100 
#define OK 1
#define TRUE 1
#define FALSE 0

double val[MAXVAL] ;
int sp  = 0 ;

void push(double f)
{
	if(sp < MAXVAL)
		val[sp++] = f ;
	else
 		printf("error : stack full ,can't push %g\n",f) ;
}

double pop(void)
{
	if(sp > 0)
		return(val[--sp]) ;
	else {
		printf("error : stack empty\n") ;
		return 0.0 ;	
	}
}


#include<ctype.h>

int getch(void) ;
void ungetch(int) ;

int getop(char s[])
{
	int i , c ;
	i = 0 ;
	while(( s[0] = c = getch()) == ' ' || c == '\t') ;
	s[1] = '\0' ;
	if(!isdigit(c) && c != '.' && c != '-')
		return c ;
	if(c == '-')
		if(isdigit(c = getch())||c == '.')
			s[++i] = c ;
		else{
			if(c != EOF)
				ungetch(c) ;
			return '-' ;
				
		} 
		
	if(isdigit(c))
		while(isdigit(s[++i] = c = getch())) ;
	if(c == '.')
		while(isdigit(s[++i] = c = getch())) ;
	s[i] = '\0' ;
	if(c != EOF)
		ungetch(c) ;
	return NUMBER ;
}

#define BUFSIZE 100

char buf[BUFSIZE] ;
int bufp = 0 ;  

int getch(void)
{
	return (bufp > 0) ? buf[--bufp] : getchar() ;
}

void ungetch(int c)
{
	if(bufp >= BUFSIZE)
		printf("error:too many characters\n") ;
	else
		buf[bufp++] = c ;
}

使用逆波兰式(后缀表达式)实现多功能计算器

由于这是之前的小作业了,之前贴出来没注意,后来发现格式太乱了根本看不了,所以今天再贴出来一下,这次的计算器比我之前写的要复杂很多,主要是通过逆波兰式实现的,没有界面,计算器是我之前的一个软肋啊,编了好...
  • u014616233
  • u014616233
  • 2015年08月17日 01:06
  • 2243

C语言编写的简单计算器程序

这两天在看一个C语言写的计算器程序,做了不少的功夫,跟着作者一步步的进行完善,了解了许多细节性的东西,在此自己做个总结,加深自己对程序的印象,也算是梳理。 在该计算器程序,能进行加减乘除、sin、c...
  • talent_CYJ
  • talent_CYJ
  • 2016年07月01日 10:03
  • 6833

简单计算器-逆波兰式

C - 简单计算器 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Statu...
  • qq_18661257
  • qq_18661257
  • 2015年07月21日 18:51
  • 775

C语言实现计算器(包含加减乘除和括号)

#include                          /*包含头文件*/   #include #define MAX_SIZE 1024                ...
  • zh3201
  • zh3201
  • 2017年01月19日 20:33
  • 2741

[C++]利用逆波兰式,简单实现下加减乘除的混合运算

测试代码此处显示之前逆波兰式求法后的增量代码! http://blog.csdn.net/u010989191/article/details/53135563//简单加减乘除法运算 因为数据是放...
  • u010989191
  • u010989191
  • 2016年11月13日 20:08
  • 937

使用逆波兰式进行表达式求值

中缀表达式及后缀表达式图解中说明了使用逆波兰式进行表达式求值的方法,这里使用C++进行实现。实现和原理讲解有一点不同,需要进一步进行细化。 关于将中缀表达式转换成后后缀表达式的规则: 规则:从左到...
  • u012501459
  • u012501459
  • 2015年08月13日 23:12
  • 2137

用C语言实现一个简单的计算器代码

#include #include #include //预处理指令 int main(void) { double bNumber, Number, Result; ...
  • lishuangqiao
  • lishuangqiao
  • 2013年12月05日 18:32
  • 19279

纯C语言写计算器界面

纯C语言写计算器界面,GDI绘制控件,HOOK拦截键盘按键。 主文件源码预览: // Calculator.cpp : 定义应用程序的入口点。 // #include "stdafx.h" ...
  • goosdy
  • goosdy
  • 2013年04月04日 21:40
  • 3180

用c语言编写的可以计算+-*/的计算器

写了一个计算器程序,想分享给大家;同时写到最后感觉有点凌乱,希望各位帮忙给优化下,共同提高。这个计算器可以计算输入的字符串,字符串中可以含括号,可以是小数,也可以包含负数。此程序被拆分在5个文件中,我...
  • rzc666
  • rzc666
  • 2016年01月20日 16:39
  • 4556

C语言 - 自创题目:字符串输入的计算器(加减乘除计算器)

题目: 用字符串输入的方式写加减乘除一个计算器 目的: 字符串不能加减,打破常规,做不一样的程序猿!#include int main() { char a[999], b[3];...
  • u012495182
  • u012495182
  • 2013年12月10日 00:01
  • 2867
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c语言 逆波兰式输入 计算器程序
举报原因:
原因补充:

(最多只允许输入30个字)