#include<stdio.h>
#include<stdlib.h>
#include<string.h>
double calc(char * str); // 函数的声明
//字符串替换函数
/********************************************************************
* Function: my_strstr()
* Description: 在一个字符串中查找一个子串;
* Input: ps: 源; pd:子串
* Return : 0:源字符串中没有子串; 1:源字符串中有子串;
*********************************************************************/
char * my_strstr(char * ps,char *pd)
{
char *pt = pd;
int c = 0;
while(*ps != '\0')
{
if(*ps == *pd)
{
while(*ps == *pd && *pd!='\0')
{
ps++;
pd++;
c++;
}
}else
{
ps++;
}
if(*pd == '\0')
{
return (ps - c);
}
c = 0;
pd = pt;
}
return 0;
}
/********************************************************************
* Function: memcpy()
* Description: 复制一个内存区域到另一个区域;
* Input: src: 源;
count: 复制字节数.
* Output: dest: 复制目的地;
* Return : dest;
*********************************************************************/
void * memcpy(void * dest,const void *src,size_t count)
{
char *tmp = (char *) dest, *s = (char *) src;
while (count--)
*tmp++ = *s++;
return dest;
}
/********************************************************************
* Function: str_replace()
* Description: 在一个字符串中查找一个子串,并且把所有符合的子串用
另一个替换字符串替换。
* Input: p_source:要查找的母字符串; p_seach要查找的子字符串;
* p_repstr:替换的字符串;
* Output: p_result:存放结果;
* Return : 返回替换成功的子串数量;
* Others: p_result要足够大的空间存放结果,所以输入参数都要以\0结束;
*********************************************************************/
int str_replace(char *p_result,char* p_source,char* p_seach,char *p_repstr)
{
int c = 0;
int repstr_leng = 0;
int searchstr_leng = 0;
char *p1;
char *presult = p_result;
char *psource = p_source;
char *prep = p_repstr;
char *pseach = p_seach;
int nLen = 0;
repstr_leng = strlen(prep);
searchstr_leng = strlen(pseach);
do{
p1 = my_strstr(psource,p_seach);
if (p1 == 0)
{
strcpy(presult,psource);
return c;
}
c++; //匹配子串计数加1;
//printf("结果:%s\r\n",p_result);
//printf("源字符:%s\r\n",p_source);
// 拷贝上一个替换点和下一个替换点中间的字符串
nLen = p1 - psource;
memcpy(presult, psource, nLen);
// 拷贝需要替换的字符串
memcpy(presult + nLen,p_repstr,repstr_leng);
psource = p1 + searchstr_leng;
presult = presult + nLen + repstr_leng;
}while(p1);
return c;
}
/****************************************************
***函数名称:char* charProcess(char str[])
***函数参数:char* charProcess(char str[]) 输入字符串,返回值为结果
***函数功能:判断混合运算中是否有括号(),如没有不做任何处理,
*** 如有则先将括号中内容处理完后再进行混合运算
***
***
***
****************************************************/
char* charProcess(char str[]) //
{
char flag = 0;
char strTemp[20] = "";
char strTemp2[20] = "";
char strTemp3[100] = "-";
char strTempDes[20] = "";
char strResult[100] = "";
char flagChar = 0;
char flagChar2 = 0;
int i = 0; // 循环变量
int j = 0;
int k = 0;
int n = 0;
int cnt = 0;
int index = 0;
int index1 = 0; // 记录(出现的位置(坐标)
int index2 = 0; // 记录)出现的位置(坐标)
for(i = 0; i<(int)strlen(str); i++)
{
if('(' == str[i])
{
cnt++;
flag++;
}
}
printf("cnt = %d\n",cnt);
if(flag >= 1)
{
for(i=0; i<cnt; i++)
{
for(j = 0; j<(int)strlen(str); j++)
{
if('(' == str[j])
{
index1 = j; // ( 出现的位置记录 取最后一个
}
}
for(j = 0; j<(int)strlen(str); j++)
{
if(')' == str[j])
{
index2 = j; // ) 出现的位置记录 取最后一个
if(index2>index1)
{
break;
}
}
}
for(k = index1+1; k<index2;k++)
{
strTemp[n] = str[k];
n++;
}
strTemp[n] = '\0';
n = 0;
sprintf(strTemp2,"%.2f",calc(strTemp));
puts(strTemp2);
for(k = index1; k<=index2;k++)
{
strTempDes[n] = str[k];
n++;
}
strTempDes[n] = '\0';
n = 0;
str_replace(strResult,str,strTempDes,strTemp2);
strcpy(str,strResult);
puts(str);
memset(strTemp,0,sizeof(strTemp));
memset(strTempDes,0,sizeof(strTempDes));
memset(strTemp2,0,sizeof(strTemp2));
memset(strResult,0,sizeof(strResult));
}
/// 增加处理
str_replace(strResult,str,"+-","-");
strcpy(str,strResult);
str_replace(strResult,str,"--","+");
strcpy(str,strResult);
for(i=0;i<(int)strlen(str)-1;i++)
{
if('*' == str[i] && '-' == str[i+1])
{
flagChar2 = 1;
index = i;
for(j=index;j>=0;j--)
{
if('+' == str[j])
{
str[j] = '-';
break;
}
if('-' == str[j])
{
str[j] = '+';
break;
}
}
continue;
}
if('/' == str[i] && '-' == str[i+1])
{
flagChar2 = 1;
index = i;
for(j=index;j>=0;j--)
{
if('+' == str[j])
{
str[j] = '-';
break;
}
if('-' == str[j])
{
str[j] = '+';
break;
}
}
continue;
}
}
for(i=0;i<(int)strlen(str)-1;i++)
{
if('*' == str[i] && '-' == str[i+1])
{
index = i;
for(j=index;j>=0;j--)
{
if('+' == str[j])
{
flagChar++;
}
if('-' == str[j])
{
flagChar++;
}
}
break;
}
if('/' == str[i] && '-' == str[i+1])
{
index = i;
for(j=index;j>=0;j--)
{
if('+' == str[j])
{
flagChar++;
}
if('-' == str[j])
{
flagChar++;
}
}
break;
}
}
if(0 == flagChar && 0 != flagChar2)
{
strcat(strTemp3,str);
strcpy(str,strTemp3);
}
str_replace(strResult,str,"*-","*");
strcpy(str,strResult);
str_replace(strResult,str,"/-","/");
strcpy(str,strResult);
puts(str);
return str; // 输入字符串有括号
}
else
{
return str; // 字符串中没有括号
}
}
double calc(char * str)
{
int i,j=0,k=0,l=0;
char op[100] = "";//符号字符串
char aq[100] = "";//数字字符串
double num[100] = {0};//数字
double res=0;//结果
for(i=0;str[i]!='\0';i++)
{
if(str[i]>='0'&&str[i]<='9'||str[i]=='.')
{
aq[j++]=str[i];
}//将输入的字符串中的数字提取出来
else
{
num[l++]=atof(aq);//数字存入double类型
memset(aq,0,sizeof(aq));//清空aq
op[k++]=str[i];//符号存入op
j=0;
}
}
num[l++]=atof(aq);
op[k]='\0';
//puts(op);
//for(i=0;num[i]!='\0';i++)
//{
// printf("%.2lf\t",num[i]);
//}
//printf("\n");
for(i=0;op[i]!='\0';i++)
{
if(op[i]=='*')
{
for(j=i;op[j]!='\0';j++)
{
op[j]=op[j+1];//符号递进
}
num[i]=num[i]*num[i+1];
for(j=i+1;num[j]!='\0';j++)
{
num[j]=num[j+1];//数字递进
}
i--; //符号前进i要退一
}//乘法运算
if(op[i]=='/')
{
for(j=i;op[j]!='\0';j++)
{
op[j]=op[j+1];
}
num[i]=num[i]/num[i+1];
for(j=i+1;num[j]!='\0';j++)
{
num[j]=num[j+1];
}
i--;
}//除法运算
}
res=num[0];
for(i=0;op[i]!='\0';i++)
{
if(op[i]=='+')
{
res=res+num[i+1];
}
if(op[i]=='-')
{
res=res-num[i+1];//进行加减运算
}
}
//printf("%.2lf\n",res); // 输出结果
return res;
}
void main()
{
char str[100] = "";
gets(str);
printf("result = %f\n",calc(charProcess(str)));
}