// Logic.cpp : Defines the entry posize_t for the console application.
//
#include "stdafx.h"
#include "string.h"
#include "stdio.h"
#include <stdlib.h>
#include <math.h>
float logic(char* pStr){
char* inData=pStr;
// 去空格
size_t iIndex=1,iFlag=0;
for(iIndex;iIndex<strlen(inData);iIndex++){
if(*(inData+iIndex-1) == ' '){
iFlag=iIndex;
for(iFlag;iFlag<=strlen(inData);iFlag++){
*(inData+iFlag-1)=*(inData+iFlag);
}
}
}
// 计算乘除
for(;;){
size_t found=0;//是否找到操作符标记 每次查找前置0 表示没找到
size_t leftFlag=65535,rightFlag=65535; //分别 记录左边字符串的结束位置 右边字符串的起始位置
for(size_t i=1;i<=strlen(inData);i++){
char score=*(inData+i-1);
if( (score == '*') || (score == '/') ){
found=1;
char strLeft[255]={0},strRight[255]={0};
size_t ileft=i-1,iright=i+1;
for(ileft;ileft>0;ileft--){ // 获取左操作数
if((*(inData+ileft-1) == '+') || (*(inData+ileft-1) == '-') || ( ileft == 1) )
{
leftFlag=ileft;
size_t leftIndex=0;
if(ileft == 1){
for(size_t lStart=ileft;lStart<i;lStart++){
strLeft[leftIndex]=*(inData+lStart-1);
leftIndex++;
}
}else{
for(size_t lStart=ileft+1;lStart<i;lStart++){
strLeft[leftIndex]=*(inData+lStart-1);
leftIndex++;
}
}
break;
}
}
for(iright;iright<=strlen(inData);iright++){ //获取右操作数
if((*(inData+iright-1) == '+') || (*(inData+iright-1) == '-') || (*(inData+iright-1) == '*') ||(*(inData+iright-1) == '/') || (iright == strlen(inData)))
{
rightFlag=iright;
size_t rightIndex=0;
if( iright == strlen(inData)){
for(size_t rStart=i+1;rStart<=iright;rStart++){
strRight[rightIndex]=*(inData+rStart-1);
rightIndex++;
}
}else{
for(size_t rStart=i+1;rStart<iright;rStart++){
strRight[rightIndex]=*(inData+rStart-1);
rightIndex++;
}
}
break;
}
}
float res=0.0;
if( score == '*' ){ // 计算结果
res=atof(strLeft)*atof(strRight);
}else{
res=atof(strLeft)/atof(strRight);
}
char proStr[255]={0};
sprintf(proStr,"%.3f",res);
char lLeftStr[255]={0},lRightStr[255]={0};
if(leftFlag == 1){ //获取左边遗留字符串
memset(lLeftStr,0,255);
}else{
for(size_t a=1;a<=leftFlag;a++)
{
lLeftStr[a-1]=*(inData+a-1);
}
}
if(rightFlag == strlen(inData)){ //获取右边遗留字符串
memset(lRightStr,0,255);
}else{
int rIndex=0;
for(size_t b=rightFlag;b<=strlen(inData);b++){
lRightStr[rIndex]=*(inData+b-1);
rIndex++;
}
}
memset(inData,0,255); //拼接字符串,形成新的表达式
strcat(inData,lLeftStr);
strcat(inData,proStr);
strcat(inData,lRightStr);
break;
}
}
if(found==0)
break; //没找到,说明全部* /都计算完了 跳出继续找加减
}
// 下面处理加减
for(;;){
size_t found=0;//是否找到操作符标记 每次查找前置0 表示没找到
size_t rightFlag=65535;
for(size_t i=1;i<strlen(inData);i++){
char score=*(inData+i-1);
if( (score == '+') || (score == '-')){
found=1;
char strLeft[255]={0},strRight[255]={0};
size_t ileft=i-1,iright=i+1;
size_t leftIndex=0;// 获取 + 或 - 的左操作数
for(size_t lStart=1;lStart<=ileft;lStart++){
strLeft[leftIndex]=*(inData+lStart-1);
leftIndex++;
}
//1+2+3
for(iright;iright<=strlen(inData);iright++){// 获取 + 或 - 的右操作数
if((*(inData+iright-1) == '+') || (*(inData+iright-1) == '-') || (iright == strlen(inData)))
{
rightFlag=iright;
size_t rightIndex=0;
if(iright == strlen(inData)){
for(size_t rStart=i+1;rStart<=iright;rStart++){
strRight[rightIndex]=*(inData+rStart-1);
rightIndex++;
}
}else{
for(size_t rStart=i+1;rStart<iright;rStart++){
strRight[rightIndex]=*(inData+rStart-1);
rightIndex++;
}
}
break;
}
}
float res=0.0;
if( score == '+' ){
res=atof(strLeft)+atof(strRight);
}else{
res=atof(strLeft)-atof(strRight);
}
char proStr[255]={0};
sprintf(proStr,"%.3f",res);
char lRightStr[255]={0};
int rIndex=0;
if(rightFlag == strlen(inData)){
memset(lRightStr,0,255);
}else{
int len=strlen(inData);
for(size_t b=rightFlag;b<=strlen(inData);b++){
lRightStr[rIndex]=*(inData+b-1);
rIndex++;
}
}
memset(inData,0,255);
strcat(inData,proStr);
strcat(inData,lRightStr);
break;
}
}
if(found==0)
break; //没找到,说明全部+ -都计算完了
}
return atof(inData);
}
int main(size_t argc, char* argv[])
{
char buf[255]={0};
printf("请输入您要计算的表达式:\n");
fgets(buf,255,stdin);
if( (strlen(buf)==254) && (buf[253]!='\n') ){
scanf("%*[^\n]");
scanf("%*c");
}
int len = strlen(buf);
buf[len-1]='\0';
printf("计算后的结果是%.3f\n",logic(buf));
getchar();
return 0;
}
本文出自 “日知其所无” 博客,谢绝转载!