| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 415 人关注过本帖
标题:希望各位大大从实际工作的角度来分析下我写的程序
只看楼主 加入收藏
毕业旅行
Rank: 4
等 级:业余侠客
威 望:1
帖 子:130
专家分:280
注 册:2010-7-7
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
希望各位大大从实际工作的角度来分析下我写的程序
刚完成一个计算器的程序,
满足如下的一些操作:优先乘除,优先括号,负数可以直接在数字前加-号表示,也可以先-号再在外面加一个括号,对于输入格式也会先做一个检查
基本的测试我自己大致试过了,希望各位大大能指出各方面的不足,因为我希望从事这个行业,所以需要提升的地方有很多。
我自己大致觉得不足的地方:几个函数看起来有点臃肿,有些变量命名都不太好。
希望能得到意见和建议。
顺便问下,看完老谭的C和C++以及MFC后,是不是应该看windows编程啊
程序代码:
#include<iostream.h>
#include<string.h>
#include<stdio.h>
double change(char str)
{
    return (double)str-'0';
}

char change_c(int n)
{
    return n+'0';
}

double calculate(char str[])
{
    double num[100];
    double temp[100];
    char strCtrl[100];
    int i=0,j,k,len;
    double bit;
    int nCount=-2;
    int key=0;
    while(str[i]!='\0')//字符串赋值给数组
    {

        if(str[i]<'0'||str[i]>'9')
        {
            if(str[i]=='-')
            {
                key=1;
                if(nCount>=0&&(str[i-1]>='0'&&str[i-1]<='9'))
                {
                    strCtrl[nCount+1]='+';
                }
            }
            else
            {
                strCtrl[nCount+1]=str[i];
            }
            i++;
        }
        if(str[i]>='0'&&str[i]<='9')
        {
            nCount+=2;
            num[nCount]=0;
            len=0;
            while(str[i]>='0'&&str[i]<='9')
            {   
                temp[len]=change(str[i]);
                len++;
                i++;
            }
            bit=1;
            for(k=len-1;k>=0;k--)
            {
                num[nCount]+=temp[k]*bit;
                bit*=10;
            }
            len=0;
            if(str[i]=='.')
            {
                i++;
                while(str[i]>='0'&&str[i]<='9')
                {
                    //right=1;   
                    temp[len]=change(str[i]);
                    len++;
                    i++;
                }
                bit=0.1;
                for(k=0;k<len;k++)
                {
                    num[nCount]+=temp[k]*bit;
                    bit/=10;
                }
            }
            if(key)
            {
                num[nCount]=-num[nCount];
            }
            key=0;
        }
    }
    strCtrl[nCount+1]='\0';
    strcpy(str,strCtrl);
    i=0;
    while(str[i]!='\0')//先算乘除法
    {
        if(str[i]=='*')
        {
            num[i-1]*=num[i+1];
            j=i;
            while(str[j+2]!='\0')
            {
                num[j+1]=num[j+3];
                str[j]=str[j+2];
                j++;
            }
            str[j]='\0';
            i--;
        }
        if(str[i]=='/')
        {
            num[i-1]/=num[i+1];
            j=i;
            while(str[j+2]!='\0')
            {
                num[j+1]=num[j+3];
                str[j]=str[j+2];
                j++;
            }
            str[j]='\0';
            i--;
        }
        i++;
    }
    double sum=0;
    for(i=0;i<strlen(str);i+=2)
        sum+=num[i];
    return sum;
}

char cStr[100];

void dtoch(double num)
{
    int integ;
    double dec;
    int tem[100],nCount=0,i;
    int Isneg=0;
    if(num<0)
    {
        num=-num;
        cStr[0]='-';
        Isneg=1;
    }
    integ=(int)num;
    dec=num-integ;
    while(integ!=0)
    {
        tem[nCount]=integ%10;
        integ/=10;
        nCount++;
    }
    for(i=0;i<nCount;i++)
    {
        cStr[i+Isneg]=change_c(tem[nCount-i-1]);
    }
    if(dec!=0)
    {
        cStr[i+Isneg]='.';
        nCount=0;
        while(dec!=0)
        {
            tem[nCount]=int(dec*10);
            dec=dec*10-int(dec*10);
            nCount++;
        }
        for(int j=0;j<nCount;j++)
        {
            i++;
            cStr[i+Isneg]=change_c(tem[j]);           
        }
    }
    cStr[i+Isneg+1]='\0';
}


double bracket(char str[])
{
    int nblk=0;
    int place[100];
    int i=0;
    char temp[100];
    char str_tail[100];
    while(str[i]!='\0')
    {
        if(str[i]=='(')
        {
            place[nblk]=i;
            nblk++;
        }
        i++;
    }//搜索字符串中的'(',并将其位置存放在数组place中,nblk表示括号'('的序数
    for(int j=nblk-1;j>=0;j--)
    {
        int k=0;
        int ntail=0;
        int nstr=place[j]+1;
        while(str[nstr]!=')')
        {
            temp[k]=str[nstr];
            k++;nstr++;
        }   
        nstr++;
        while(str[nstr]!='\0')
        {
            str_tail[ntail]=str[nstr];
            ntail++;nstr++;
        }
        str_tail[ntail]='\0';
        temp[k]='\0';
        dtoch(calculate(temp));
        str[place[j]]='\0';
        strcat(str,cStr);
        strcat(str,str_tail);
    }
    return calculate(str);
}

int check(char str[]) //检查字符串格式是否正确
{
    int i=0;
    int nleft=0,nright=0;
    int lastblk;
    int nNum=0;
    while(str[i]!='\0')
    {
        if(str[i]=='(')
        {
            nleft++;lastblk=0;
        }
        else if(str[i]==')')
        {
            nright++;lastblk=1;
        }
        else if(str[i]=='.')
        {
            if((str[i-1]<'0'||str[i-1]>'9')||(str[i+1]<'0'||str[i+1]>'9'))
            {
                printf("输入格式错误,请重新输入\n");return 0;
            }
        }
        else if(str[i]=='+'||str[i]=='*'||str[i]=='/')
        {
            if(((str[i-1]<'0'||str[i-1]>'9')&&str[i-1]!=')')||((str[i+1]<'0'||str[i+1]>'9')&&str[i+1]!='('&&str[i+1]!='-'))
            {
                printf("输入格式错误,请重新输入\n");return 0;
            }
        }
        else if((str[i]>='0'&&str[i]<='9')||str[i]=='-')
        {
                if(str[i]!=0)
                nNum++;
         }
        else
        {
            printf("输入格式错误,请重新输入\n");return 0;
        }
        i++;
    }
    if(nleft!=nright||lastblk==0)
    {
        printf("输入格式错误,请重新输入\n");return 0;
    }
    if(nNum==0&&nleft!=0)
    {
        printf("输入格式错误,请重新输入\n");return 0;
    }
    return 1;
}

int main()
{
    char str[100];
    printf("本计算器支持小数,括号优先和乘除法优先原则\n");
    printf("输入一个计算表达式,包括.()+-*/和数字,输入回车退出\n");
    while(1)
    {
        gets(str);
        if(check(str))
        printf("%f\n",bracket(str));
    }
    getchar();
    return 0;

}





[ 本帖最后由 毕业旅行 于 2010-7-23 17:01 编辑 ]
搜索更多相关主题的帖子: 角度 
2010-07-23 14:11
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:14 
1 判断合法性               输入 () 就没了 (合法性没通过测试)
2 字符串拆成几个部分 进行处理
   先把左括号记录下来。。。。
   剩下的没多看
   
   输入(-2+8)+(-3+1)
    输出 60.000000 (内部数据出现紊乱交换)
  没能通过测试
   

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2010-07-23 15:21
毕业旅行
Rank: 4
等 级:业余侠客
威 望:1
帖 子:130
专家分:280
注 册:2010-7-7
收藏
得分:0 
以下是引用do8do8do8在2010-7-23 15:21:44的发言:

1 判断合法性               输入 () 就没了 (合法性没通过测试)
2 字符串拆成几个部分 进行处理
   先把左括号记录下来。。。。//我是把所有括号位置先存到一个数组里,然后从后往前对括号里的式子进行计算,从后往前的好处就是肯定是从内而外的算的
   剩下的没多看
   
   输入(-2+8)+(-3+1)
    输出 60.000000 (内部数据出现紊乱交换)
  没能通过测试
   
第一个问题我修正了,添加一个对0-9数字的计数器,如果为0就报出错,同时添加一个括号计数器不为0的条件,就不影响回车作为退出主函数里的循环的条件了。

第二个问题我不知道这么办了。。。我试来试去,都是(-2+8)这个式子出错,而且值还会有变化的。。。一会62,一会65,过一会又69了。。。求高手解答原因。。。
2010-07-23 16:57
毕业旅行
Rank: 4
等 级:业余侠客
威 望:1
帖 子:130
专家分:280
注 册:2010-7-7
收藏
得分:0 
顶起,有大大帮看下么。。
2010-07-25 08:36
快速回复:希望各位大大从实际工作的角度来分析下我写的程序
数据加载中...
 
   



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

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