小小项目2:多项式四目计算器

这是这两天写的第二个项目,准确的来书我还没有完全掌握,很多地方都是借鉴的老师讲的和网上一些代码。

而且这个程序我写了很多头文件和函数文件,还不怎么好发。

我整理了一下,决定就发几个头文件和几个核心函数。

先是主函数

#include<stdio.h>
#include<stdlib.h>
#include"NumStack.h"
#include"CharStack.h"
#include"judge.h"
#include"error.h"

#define MAX 100

int main()
{
	NUM_STACK num;   //创建数字栈
	CHAR_STACK ch;   //创建字符栈
	
	//清空栈
	Init_CharStack(&ch);   
	Init_NumStack(&num);
	
	char str[MAX];    //存放输入字符
	char num_str[MAX];
	char x;
	
	gets(str);
	
	int i = 0,t; 	
	while (str[i])
	{
	
		if (jud_num(str[i]) == TRUE)                 //判断是否是数字
		{
			t = 0;
			while(jud_num(str[i]) == TRUE)
			{
				num_str[t] = str[i];
				i++;
				t++;
			}
			num_str[t] = '\0';                      //获取数字字符串
			Push_Num(&num,atoi(num_str));           //将字符串转化为整数
		}
		else                                        //剩余是运算符的情况
		{
			if(jud_ch(&ch,str[i]) == IN)            //判断是否要入栈
			{
				Push_Char(&ch,str[i]);
			}
			else
			{
				if(str[i] != ')')                   //右括号特别考虑
				{
					counter(&num,&ch);
					Push_Char(&ch,str[i]);
				}
				else                                //考虑右括号                                
				{
					do
					{
						counter(&num,&ch);
					}
					while(ch.ch[ch.top] != '(');	
					Pop_Char(&ch,&x);	
				}
			}
			i++;
		}
	}
	
	while(ch.top != -1)                             //最后所有预算符全部出栈
	{
		counter(&num,&ch);
	}
	
	printf("%d\n",num.num[num.top]);
	
	return 0;
}

然后是判断函数
#include"judge.h"

//判断是否是数字
int jud_num(char ch)
{
	if(ch >= '0' && ch <= '9')
		return TRUE;
	return FALSE;
}

//判断预算符是否要入栈
int jud_ch(CHAR_STACK *s,char ch)
{
	if(s->top == -1)
		return IN;
	else
	{
		if (Char_Full (s) == TRUE)
			return FALSE;
		switch(s->ch[s->top])
		{
			case '+':                  //在'+'和'-'的时候,'*','/','('进栈。
			case '-': 
				if (ch == '+' || ch == '-' || ch == ')')
					return OUT;
				else return IN;
				break;
			case '*':                  //在'*'和'/'的时候,'('进栈。
			case '/':
				if (ch == '(')
					return IN;
				else return OUT;
				break;
			case '(':                  //在'('的时候,全部进栈
				return IN;
				break;
			default :
				break;
		}
	}
	return TRUE;
}
运算函数
#include"counter.h"


//运算
void counter(NUM_STACK * n,CHAR_STACK * c)
{
	int a ;                //第一个数出栈
	Pop_Num(n,&a);
	int b ;				   //第二个数出栈
	Pop_Num(n,&b);  	   
	char ch ;
	Pop_Char(c,&ch);  	   //第一个字符出栈
	
	int result;
	switch(ch)
	{
		case '+':
			result = a + b;
			break;
		case '-':
			result = b - a;    //同下
			break;
		case '*':
			result = b * a;
			break;
		case '/':
			result = b / a;    //这里要b/a,因为a是后入栈的
			break;
		default :
			break;
	}
	Push_Num(n,result);
	return ;
}
最后是这种头文件

#ifndef __CHARSTACK_H__
#define __CHARSTACK_H__

#define FALSE 0
#define TRUE 1

#define CHAR_SIZE 100


typedef struct char_stack
{
	char ch[CHAR_SIZE];
	
	int top;
	
}CHAR_STACK;

//清空栈
int Init_CharStack(CHAR_STACK * s);

//判断是否空栈
int Char_Empty (CHAR_STACK * s);

//判断是否满栈
int Char_Full (CHAR_STACK * s);

//入栈
int Push_Char(CHAR_STACK * s,char x);

//出栈
int Pop_Char(CHAR_STACK * s,char *x);

// 取栈顶
int GetTop_Char (CHAR_STACK *s, char *x); 


#ifndef __NUMSTACK_H__
#define __NUMSTACK_H__

#define FALSE 0
#define TRUE 1

#define NUM_MAX 100


typedef struct num_stack
{
	int num[NUM_MAX];
	
	int top;
	
}NUM_STACK;

//清空栈
int Init_NumStack(NUM_STACK * s);

//判断是否空栈
int Num_Empty (NUM_STACK * s);

//判断是否满栈
int Num_Full (NUM_STACK * s);

//入栈
int Push_Num(NUM_STACK * s,int x);

//出栈
int Pop_Num(NUM_STACK * s,int *x);

// 取栈顶
int GetTop_Num (NUM_STACK *s, int  *x); 



#ifndef __JUDGE_H__
#define __JUDGE_H__
#include"CharStack.h"
#define FALSE 0
#define TRUE 1

#define IN 2
#define OUT 3


//判断是否是数字
int jud_num(char ch);

//判断预算符是否要入栈
int jud_ch(CHAR_STACK *s,char ch);
#endif



#ifndef __ERROR_H__
#define __ERROR_H__

#define ERROR -1
#define FULL -2
#define EMPTY -3
#define EMPTY_STACK  -4
int errno ;

//向屏幕输出错误原因
void myerror (char *str);

//向字符串传送错误原因
char * myStrErroe (int num);

#endif


#ifndef __COUNTER_H__
#define __COUNTER_H__

#include"NumStack.h"
#include"CharStack.h"

void counter(NUM_STACK * n,CHAR_STACK * c);

#endif




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值