|  | 
 
 发表于 2016-7-6 09:12:48
|
显示全部楼层 
| 本帖最后由 yundi 于 2016-7-6 09:57 编辑 
 继续完善一下,按照我给的思路,代码其实也不好写。楼主做个参考吧。
 
 复制代码#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
        char strin[100] = "1+4*5*4.5+6.7";//为简化,直接给表达式串
        char strtmp[10];
        char * ps,* qs;
        int slen,i=0,j=0,k,l;
        float num[50]={0};
        char ch[25]={0};
        int f1;//循环开关
        slen = strlen(strin);
        //1.处理串,数符分别存到num、ch数组
        ps = strin;//指向串首
        while(ps<strin+slen)
        {
                qs = ps;//初始化游标,用于截取串中的数字字符串
                f1 = 1;
                while(qs<strin+slen && f1==1)
                {
                        switch(*qs)
                        {
                        case '+':
                        case '-':
                        case '*':
                        case '/':
                                ch[j++] = *qs;//保存符号
                                memset(strtmp,0,10);
                                strncpy(strtmp,ps,qs-ps);//截取两运算符之间数字串
                                num[i++] = atof(strtmp);//数字串转换为浮点数,并保存该数
                                f1 = 0;//找到符号后退出内部循环,ps移到下一位置
                                ps = qs+1;
                                break;
                        default:
                                qs++;//游标移到下个位置
                                break;
                        }
                }
                if(qs==strin+slen)
                {
                        memset(strtmp,0,10);
                        strncpy(strtmp,ps,qs-ps);
                        num[i++] = atof(strtmp);//保存最后一个数
                        ps = qs + 1;
                }
        }
        //2.处理两个数组
        //2.1处理* /
        for(j=0;j<strlen(ch);j++)
        {
                if(ch[j] == '*')
                {
                        //1.运算相邻两个数
                        num[j] = num[j]*num[j+1];
                        //2.将后面的数、运算符前移
                        k = j;
                        while(ch[k]!='\0')  //移动运算符
                        {
                                ch[k] = ch[k+1];
                                k++;
                        }
                        k = j;
                        while(num[k+1]!=0.0) //移动数
                        {
                                num[k+1] = num[k+2];
                                k++;
                        }
                        j--; //因移动,当前处理的数组元素前移,所以-1
                }else if(ch[j] == '/')
                {
                        num[j] = num[j]/num[j+1];
                        k = j;
                        while(ch[k]!='\0')
                        {
                                ch[k] = ch[k+1];
                                k++;
                        }
                        k=j;
                        while(num[k+1]!=0.0)
                        {
                                num[k+1] = num[k+2];
                                k++;
                        }
                        j--;
                }else{
                        ;  //非*/不作处理
                }
        }
        //2.2处理+-
        for(j=0;j<strlen(ch);j++)
        {
                if(ch[j] == '+')
                {
                        //1.运算相邻两个数
                        num[j] = num[j]+num[j+1];
                        //2.将后面的数、运算符前移
                        k = j;//移动运算符
                        while(ch[k]!='\0')
                        {
                                ch[k] = ch[k+1];
                                k++;
                        }
                        k=j;//移动数字
                        while(num[k+1]!=0.0)
                        {
                                num[k+1] = num[k+2];
                                k++;
                        }
                        j--;
                }else if(ch[j] == '-')
                {
                        num[j] = num[j]-num[j+1];
                        k = j;
                        while(ch[k]!='\0')
                        {
                                ch[k] = ch[k+1];
                                k++;
                        }
                        k=j;
                        while(num[k+1]!=0.0)
                        {
                                num[k+1] = num[k+2];
                                k++;
                        }
                        j--;
                }else{
                        ;
                }
        }
        //3.输出结果,保留二位小数
        if(num[1]==0.0 && ch[1]=='\0'){
                printf("%s = %.2f",strin,num[0]);
        }else{
                printf("计算有误!");
        }
        getchar();
}
 这种算式字符串计算更好的办法是:后缀表达式计算,要了解栈数据结构,代码网上一搜大把。
 | 
 |