用C内置类型做四则运算

不知道当初为什么写这段代码,不过记得当时写出来费不少劲呢,呵呵,现在看看,原来没判断右括号是否少的情况,只判断了是否多,不过应该不影响使用,当然了,完全用浮点数来算的,也别指望计算的精确性了

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define ISOP(c) ( c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')' ? true : false )


typedef struct point{
	char c;
	double n;
	struct point * p;
} PO;

static int op ( char c );
static PO * creat(int kh_fla);
static double todo(PO *p);

static void PR(PO * p)
{
	while ( p != NULL ) {
		if ( p -> c == '\0' ) printf ( "%lf " , p -> n );
		else printf ( "%c " , p -> c );
		p = p -> p;
	}
}

int main(int argc, char** argv)
{
	PO *p;
	printf ( "输入你要计算的表达式吧,拜托别输入错误哦,程序没做错误检测的:\n" );
	if ( ( p = creat(0) ) != NULL ) {
		PR(p);
		printf ( "结果是:%lf\t是否正确呢?" , todo( p ) );
	}
	printf ( "\n" );
	return 0;
}

static int op ( char c )
{
	if ( c == '+' || c == '-' ) return 1;
	if ( c == '*' || c == '/' ) return 2;
	return 0;
}

static void ql(PO *p)
{
	PO *p_tmp;
	while ( p != NULL ) {
		p_tmp = p;
		p = p -> p;
		free(p_tmp);
	}
}

static PO * creat(int kh_fla)
{
	PO * p_op = NULL;
	PO * p_bds = NULL;
	PO * p_tmp = NULL;
	PO * p_tmp_to = NULL;
	char c = '\0';
	double n;
	do {
		if ( scanf ( "%lf" , &n ) == 1 ) {
			p_tmp = ( PO * ) ( malloc ( sizeof ( PO ) ) );
			p_tmp -> c = '\0';
			p_tmp -> n = n;
			p_tmp -> p = p_bds;
			p_bds = p_tmp;
		}
me:	if ( scanf ( "%c" , &c ) == 1 ) {
			switch ( c ) {
				case '(' : {
					p_tmp_to = p_tmp = creat ( kh_fla+1 );
					if ( p_tmp_to == NULL ) return NULL;
					while ( p_tmp -> p != NULL ) p_tmp = p_tmp -> p;
					p_tmp -> p = p_bds;
					p_bds = p_tmp_to;
					goto me;
				}
				case ')' : {
					if ( kh_fla == 0 ) {
						printf ( "括号不匹配,程序异常退出" );
						ql(p_op);
						ql(p_bds);
						ql(p_tmp);
						return NULL;
					} else {
						while ( p_op != NULL ) {
							p_tmp = p_op;
							p_op = p_op -> p;
							p_tmp ->p = p_bds;
							p_bds = p_tmp;
						}
						return p_bds;
					}
				}
				case '+' :
				case '-' :
				case '*' :
				case '/' : {
					if ( p_op != NULL && op ( p_op -> c ) >= op ( c ) ){
						p_tmp = p_op;
						p_op = p_op->p;
						p_tmp->p = p_bds;
						p_bds = p_tmp;
					}
					p_tmp = ( PO * ) ( malloc ( sizeof ( PO ) ) );
					p_tmp -> c = c;
					p_tmp -> n = 0.0;
					p_tmp -> p = p_op;
					p_op = p_tmp;
				}
			}
		} else {
			printf ( "程序出错了,异常退出" );
			ql(p_op);
			ql(p_bds);
			ql(p_tmp);
			return NULL;
		}
	} while (ISOP(c));
	while ( p_bds != NULL ) {
		p_tmp = p_bds;
		p_bds = p_bds->p;
		p_tmp->p = p_op;
		p_op = p_tmp;
	}
	return p_op;
}

static double js( double a , char op , double b )
{
	switch ( op ) {
		case '+' : return a+b;
		case '-' : return a-b;
		case '*' : return a*b;
		case '/' : return a/b;
	}
	return 0.0;
}

static double todo(PO *p)
{
	PO * p_bds = NULL;
	PO * p_tmp;
	while ( p != NULL ) {
		if ( p -> c == '\0' ) {
			p_tmp = p;
			p = p -> p;
			p_tmp -> p = p_bds;
			p_bds = p_tmp;
		} else {
			if ( p_bds != NULL && p_bds->p != NULL ) {
				(p_bds -> p) -> n = js ( (p_bds -> p) -> n , p -> c , p_bds -> n );
				p_tmp = p_bds;
				p_bds = p_bds -> p;
				free(p_tmp);
			} else {
				if ( p_bds != NULL ) {
					p_bds -> n = js ( 0.0 , p -> c , p_bds -> n );
				}
			}
			p_tmp = p;
			p = p -> p;
			free(p_tmp);
		}
	}
	return p_bds == NULL ? 0 : p_bds->n;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值