⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 errortest.c

📁 基本的计算器程序
💻 C
字号:
#include "ErrorTest.h"
#include "calculate.h" 

//#define DEBUG_E 0

int InvalidTest(char *s)
{
	char *cp;
	
	cp = s;
	while(*cp)
	{
		if(JudgeChar(*cp) != 1)
		{
			if(((*cp) < '0')||((*cp) > '9'))
			{
				printf("非法输入!!\n");
				return ERROR;
			}
		}
		if((*cp) == '=')
		{
			printf("非法输入!!\n");
			return ERROR;
		}	
		cp++;
	}
	return !ERROR;
}

int TestStackEmpty(StackChar *s)	//检测栈是否为空 
{
    if(s->Top == -1)
        return EMPTY;
    else
        return !EMPTY;
}

int GenFlag(char a)    //产生特征值
{
    switch(a)
    {
        case '+':return 1;
        case '-':return 1;
        case '*':return 2;
        case '/':return 2;
        case '(':return 3;
        case ')':return 4;
        default: return 0;

    }
}

char *strInsert(char *source,const char *insert,int destin)
{
	char *cp = source;
	char *tail;
	
	if(destin < 0)
		destin = 0;				//超过字串头部,仍插在头部 
	if(destin > strlen(source))
		destin = strlen(source);//超过字串尾部,仍插在尾部	
	if((source == NULL)||(insert == NULL))
	    exit(0);                //指针为空,退出 
	
	tail = (char *)malloc(sizeof(source));
	while((cp - source) != destin)
		cp++;                     //获得后半部字串 
	
	strcpy(tail,cp);              //将后半部字串保存 
	*cp = '\0';	  				  //将原字串从后半部截断 
	strcat(source,insert);        //在前半部后面接上待插入字串 	
	strcat(source,tail);          //在前一步的基础上,接着插入原字串的后半部 
	
	free(tail);
	return source;
}


/*检错函数*/
/*检错主要包括:被零除,括号匹配等等*/
//其中形如:(5+)(/5)这样的非法输入应被检出
//另外还应该兼容负数的输入,如:(-5)+9或-5+9
int ErrorTest(char *s)
{                   // 0 1 2 3 4
    int Flag[5][5] = {{1,1,1,3,1},//0         //特征值矩阵 
                      {1,0,0,1,0},//1
                      {1,0,0,1,0},//2
                      {1,2,0,1,0},//3
                      {3,1,1,3,1}};//4        
    int pointer = 0,LeftMiss = 0,RightMiss = 0;
    StackChar *PAREN;	//用于检测括号匹配的栈 
    InitStackChar(&PAREN);
    
    while(*(s+pointer) != '\0')
    {
        if(pointer == strlen(s)-1)		//尾字符不能是除数字和右括号以外的字符 
        {
			if((GenFlag(*(s+pointer)) != 0)&&(GenFlag(*(s+pointer)) != 4))
			{
				printf("最后一个字符错误!!\n");
	            PAREN->Top = -1;		//把栈清空
    	        return ERROR;	
			}
		}
        if(*(s+pointer) == '(')  //遇到左括号入栈
        {
            PushChar(PAREN,*(s+pointer));
        }
        if(*(s+pointer) == ')')
        {
            if(TestStackEmpty(PAREN) == EMPTY)  //遇到右括号时若发现栈为空,说明缺左括号,记下缺几个左括号 
            {
                LeftMiss++;
                #ifdef DEBUG_E
                printf("缺%d个左括号!!\n",LeftMiss); 
                system("PAUSE");
                #endif
				//printf("does not match!!\n");
                //PAREN->Top = -1;		//把栈清空 
                //return ERROR;
            }
            else                               //否则将左括号出栈
                PopChar(PAREN);
        }
        if(pointer != strlen(s)-1)  //判断是否为合法输入
        {
            if(pointer == 0)
            {
				if((GenFlag(*(s+pointer)) == 2)||(GenFlag(*(s+pointer)) == 4))	//首字符不能为乘除号和右括号 
				{
					printf("第一个字符错误!!\n");
                	PAREN->Top = -1;		//把栈清空
                	return ERROR;	
				}
				if(GenFlag(*(s+pointer)) == 1)	//首字符为加减号,在前面加一个零 
				{
					strInsert(s,"0",0);	
				}
			}
			if(Flag[GenFlag(*(s+pointer))][GenFlag(*(s+pointer+1))] == 0)
            {   
                printf("第%d位与第%d位输入错误!!\n",pointer+1,pointer+2);
                PAREN->Top = -1;		//把栈清空
                return ERROR;
            }
            if(Flag[GenFlag(*(s+pointer))][GenFlag(*(s+pointer+1))] == 2)  //"(+"或"(-"可能需要插入'0'
			{
				if(GenFlag(*(s+pointer+2)) == 0)	//如"(+5"这样的情况	
					strInsert(s,"0",pointer+1);	
			}
			if(Flag[GenFlag(*(s+pointer))][GenFlag(*(s+pointer+1))] == 3)	//插入乘号 
			{
				strInsert(s,"*",pointer+1);	
			}                    
        }
        pointer++;
    }
    if(TestStackEmpty(PAREN) == !EMPTY)       //表达式扫描完以后发现栈非空,说明缺右括号,记下缺几个右括号 
    {
        RightMiss = PAREN->Top+1;
		//printf("does not match!!!!\n");
        //PAREN->Top = -1;		//把栈清空
        //return ERROR;
    }
    for(;LeftMiss > 0;LeftMiss--)	//在表达式头补齐左括号 
    {
		strInsert(s,"(",0);	
	}
	for(;RightMiss > 0;RightMiss--)	//在表达式尾补齐右括号 
	{
		strInsert(s,")",strlen(s));
	}
	PAREN->Top = -1;		//把栈清空
	free(PAREN);			//free很重要!! 
    return !ERROR;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -