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

📄 stod.cpp

📁 此程序实现了表达式求值
💻 CPP
字号:
//stod.cpp

#include "mycommon.h"
#include "stod.h"
#include <windows.h>

//函数定义
double atod(const char* str, int* pReturn)
{
	int flag = 1;
	int flag_exp = 1;
	double exp = 0.0;
	double reti = 0.0;
	double retf = 0.0;
	double ret = 0.0;
	char* buf = new char[strlen(str) + 1];

	lstrcpy(buf, str);
	trim(buf);

	//检查字符串是否符合标准
	if(!StringTest(buf))
	{
		if(pReturn)*pReturn = 0;
		return 0.0;
	}

	int index = 0;
	int len = strlen(buf);
	//负数
	if(buf[0] == '-')
	{
		flag = -1;
		index = 1;
	}
	else if(buf[0] == '+')
	{
		flag = 1;
		index = 1;
	}
	//处理整数部分
	while(index < len && IsNumeric(buf[index]))
	{
		reti = reti * 10 + buf[index++] - 48;
	}
	//printf("%f\n", reti);
	//处理小数部分(如果有)
	if(index < len && buf[index] == '.')
	{
		//printf("retf\n");
		index++;
		double e = 1;
		while(index < len && IsNumeric(buf[index]))
		{
			e = e/10;
			retf = retf + (buf[index++] - 48) * e;
		}
	}
	//printf("%f\n", retf);
	//处理指数部分(如果有)
	if(index < len && (buf[index] == 'E' || buf[index] == 'e'))
	{
		index++;
		if(buf[index] == '-')
		{
			flag_exp = -1;
			index++;
		}
		else if(buf[index] == '+')
		{
			flag_exp = 1;
			index++;
		}
		while(index < len && IsNumeric(buf[index]))
		{
			exp = exp * 10 + buf[index++] - 48;
		}
		exp = exp * flag_exp;
	}
	//printf("%f\n", exp);

	ret = (reti + retf) * pow(10, exp) * flag;
	if(pReturn)*pReturn = 1;
	delete[] buf;
	return ret;
}

int StringTest(const char* str)
{
	if(str == NULL)	return 0;
	if(strlen(str) == 0) return 0;

	int i = 0;
	int len = strlen(str);
	int id = 0, ie = 0;//小数点和E出现的次数

	if(IsNumeric(str))
		return 1;//成功

	//如果第一个字符不是数字或减号
	if((str[0] != '-') && (str[0] != '+') && !IsNumeric(str[0]))//失败
		return 0;

	for(i=1; i<len; i++)
	{
		if(i == len - 1)
		{
			if(!IsNumeric(str[i]))
				return 0;
		}
		//
		if(str[i] == '.')
		{
			//E后面不能有小数点
			//数中不能有两个小数点
			if(ie > 0 || id > 0)return 0;

			//小数点前后必须是数字
			if(!IsNumeric(str[i-1]) || !IsNumeric(str[i+1]))
			{
				return 0;
			}
			id ++;
		}
		else if((str[i] == 'e') || (str[i] =='E'))
		{
			//一个数中只能有一个E
			if(ie > 0) return 0;

			//E前必须是数字,E后必须是数字或加减号
			if(!IsNumeric(str[i-1]) || 
				(!IsNumeric(str[i+1]) && 
				(str[i+1] != '-') &&
				(str[i+1] != '+')))
			{
				return 0;
			}
			ie++;
		}
		//此时出现的减号或加号只可能在指数部分,即E后面
		else if((str[i] == '-') || (str[i] == '+'))
		{
			//加减号前面必须是E,加减号后面必须是数字
			if(((str[i-1] != 'e') && (str[i-1] != 'E')) || !IsNumeric(str[i+1]))
			{
				return 0;
			}
		}
		else if(!IsNumeric(str[i]))
		{
			return 0;
		}
	}
	return 1;
}

⌨️ 快捷键说明

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