| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 335 人关注过本帖
标题:帮忙改进四则运算 算法
只看楼主 加入收藏
wuyouyao
Rank: 1
来 自:广东茂名
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-4-29
结帖率:50%
收藏
已结贴  问题点数:2 回复次数:1 
帮忙改进四则运算 算法
我写的四则运算程序,请帮忙改进一下,添加更多的功能,或优化
程序代码:
[/code[code]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

 
int main(void)
{
    while(1)
    {
    char sc[222]={0};
    char *ps=sc;
    char bijiao[5]={'+','-','*','/'};
    //功能2
    int n[222]={0};//存放数字
    unsigned int   i,j,k;
    char stemp[222]={0};//存放字符数字
    //3
    char s[222]={0};//存放 +,-,*,/
    //读取表达式字串存放sc[222]数组里
    while(1)
    {
     *ps=getchar();
     if (*ps=='\n')
     {
         *ps='\0'; //*ps=0;
         break;
     }
     ps++;

    }
    //测试打印表达式
    printf("%s \n",sc);
    


    //分离出数字和运算符 分别保存int n[222],char s[222]
    //--------------------------------------
    //分离数字
    //指针ps指向表达头部
    ps=sc;
    j=0;
    k=0;
    for(i=0;i<=strlen(sc);i++)
    { //"888+333*777"
        
        if (isalnum(*ps))
        { 
            stemp[j]=*ps;
            j++;
        }else
        {
            //如果+,-,*,/,\0
           stemp[j]='\0';
           n[k]=atoi(stemp);
           k++;
           j=0; //下标归零
        }
        ps++;//指向sc数的下一字符
    }

 //测试一下 n[222]

    for (i=0;i<=k-1;i++)
    {
        printf("%d ",n[i]);
    }
    printf("\n");



    //---------------------------------------------
    //分离提取 运算符
    ps= sc;
    j=0;

 
    for(i=0;i<=strlen( sc);i++)
    { //"888+333*777"

        if (isalnum(*ps))
        { 
            
            
        }else
        {
            //如果+,-,*,/,\0
            s[j]=*ps;
            j++;
             
        }
        ps++;//指向sc数的下一字符
    }
    printf("\n");
    for (i=0;i<=strlen(s);i++)
    {
        printf("%c ",s[i]);
    }
    printf("\n");
    //功能3--------------------------------------------------------------------------
    //n[222],s[222]

    //键盘输入错误检查
    if(isalnum(sc[0])==0)                       //检查第一个字符是否为数字
    {printf("输入错误");
      goto shuru;//跳到输入端,重新输入
    }
    for(i=0;i<strlen(s);i++)                   //检查s[]中是否都是四则运算符

    {    int w=1;
        for(j=0;j<strlen(bijiao);j++)
    
      if(s[i]==bijiao[j])
        w=0  ;
      if(w==1)                               
      {
      printf("输入错误");
      goto shuru;//跳到输入端,重新输入
      }
    }
    while(1)
    {


 
    for (i=0;i<=strlen(s);i++)
    {   
        //*,/
        if (s[i]=='*'||s[i]=='/')
        {
            if (s[i]=='*')
            {
                n[i+1]=n[i]*n[i+1];
            }
            else
            {
                n[i+1]=n[i]/n[i+1];
            }
            //数据前移一位
            for (j=i;j<=strlen(s)+1;j++)
            {
                n[j]=n[j+1];
                s[j]=s[j+1];
            }
            break;
        }
    }

    //打印出当前一步计算结果 的表达式
    for (i=0;i<=strlen(s);i++)
    {
        printf("%d%c",n[i],s[i]);
    }
    printf("\n");
     //退出条件
     j=1;
     for (i=0;i<=strlen(s);i++)
     {
         if (s[i]=='*'||s[i]=='/')
         {
             j=0;//表示继续循环
         }
     }
     if (j)
     {
         break;//如果j==1退出while 1
     }
    }//end while 1

    //进行 加减运算
    while(2)
    {
        for (i=0;i<=strlen(s);i++)
        {
            if (s[i]=='+')
            {
              n[i+1]=n[i]+n[i+1];
            }else if (s[i]=='-')
            {
               n[i+1]=n[i]-n[i+1];
            }
             
            //数据前移一位
            for (j=i;j<=strlen(s)+1;j++)
            {
                n[j]=n[j+1];
                s[j]=s[j+1];
            }
            break;
        }
        //break; while2 结束条件
        //退出条件
        j=1;
        for (i=0;i<=strlen(s);i++)
        {
            if (s[i]=='+'||s[i]=='-')
         {
             j=0;//表示继续循环
         }
        }
        //打印出当前一步计算结果 的表达式
        for (i=0;i<=strlen(s);i++)
        {
            printf("%d%c",n[i],s[i]);
        }
        printf("\n");

        if (j)
        {
            break;//如果j==1退出while 1
        }
    }

    //
    //打印最终结果
    printf("\n %s=%d \n",sc,n[0]);
    shuru:
    printf("\n请继续输入字串");
        }//死循环
    getchar();
    getchar();
    return 0;
}
]
2015-05-17 09:20
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:2 
四则混合运算必须考虑括号以及较完全的检测表达式合法性。四则混合运算属正则表达式算法,通过根据规则不断检索替换,使表达式不断简化,最后返回一个结果,一般用递归解决。容我空闲时做一个。

能编个毛线衣吗?
2015-05-17 10:37
快速回复:帮忙改进四则运算 算法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020931 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved