// 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;

}