签到

06月21日
尚未签到

共有回帖数 0

    李小主任

    等级:
    下面是我写的一个计算器程序,请大家赏个脸看一看。
    用法很简单,输入式子就可以得到答案。
    支持一般的数学符号,有兴趣的可以补充。
    如果看得懂得话就给个评价,这很重要。好就表扬一下,不好就批评漫骂都可以,最好是指出缺点,这也很重要。
    如果看不懂代码,那么就拿去编译成文件用一用,好还是不好也评价一下。(我觉得读代码很难,特别是不明朗得代码,然而我这次写的代码很不好看.)
    感谢大家,我是新来的PT,说明完毕,谢幕,退��
    #includestdio.h
    #includeconio.h
    #includemath.h
    #includestdlib.h

    #define UNKNOWN_CHAR 2
    #define DIVISOR_IS_ZERO 3
    #define FALSE 0
    #define TRUE 1

    /*定义结构,主要用于GetString函数,可以不管它*/
    typedef struct string
    {char str;
    struct string *next;
    }string;

    /*函数声明*/  

    /*可以无限接受字符,输入一个字符就给你个空间,返回一个字符串首地址 . */
    /*这个函数可以看成普通的scanf()*/  
    char *GetString();
    /*从字符串str第*rank个字符开始分析直到遇到 ')' or ']' or '}' or '' . */
    /*有错误就把错误代号装在*errorNum中,返回从中计算出的值*/  
    double GetASResultOf(char * str, int *rank, int *errorNum);
    /*从字符串str第*rank个字符开始分析直到遇到不符合要求的字符,返回这个单位值.*/
    /*如:str="12+sin(30)+[12+cos(60)]"
    GetUnitageOf(str,0,errorNum)=12
    GetUnitageOf(str,3,errorNum)=0.5
    GetUnitageOf(str,11,errorNum)=12.5 */
    double GetUnitageOf(char * str, int *rank, int *errorNum);
    /*Are you ready? Let's go!----------------------------------*/
    int main()
    {
    /*定义变量*/  
    double value;
    int rank=0;
    int errorNum=TRUE;
    char * str;

    /*接收字符*/
    printf("counter v1.0n");
    printf("Made by PTn");
    printf("Date 2005-07-16nn");
    printf("Please input your arithmetic:n");
    str=GetString();

    /*调用处理函数,*/
    value = GetASResultOf(str, &rank, &errorNum);
     
    /*错误处理(没完善)*/
    if (errorNum==TRUE) printf("The result is: %lfn",value, rank);
    else if (errorNum==UNKNOWN_CHAR) printf("char error!n");
    else if (errorNum==DIVISOR_IS_ZERO) printf("Divisor could not be 0n");
    else printf("Other errorn");

    getch();
    return 0;
    }


    /*0==[=========无限动态字符接受函数*/
    char *GetString()
    {
    char *CharToString(string * sHead, int arraySize);
    int arraySize=0;  
    string *s;
    string *sHead;
     
    s = (string *)malloc(sizeof(string));
    sHead = s;
    s-str = getchar();
    arraySize++;
     
    while((s-str)!='n')
    {
    arraySize++;
    s-next=(string *)malloc(sizeof(string));
    s=s-next;
    s-str=getchar();
    }
     
    return CharToString(sHead, arraySize);
    }

    char *CharToString(string * sHead, int arraySize)
    {
    char *strArray;
    string *s=sHead;
    int i=0;
    strArray = (char*)malloc(arraySize*sizeof(char));
     
    while(iarraySize)
    {
    if (s-str=='=' || s-str=='n') break;
    if (s-str!=32) strArray[i++]=s-str;
    s=s-next;
    }
    strArray='';
    return strArray;
    }

    /*0==[========= 得到一个单位的值*/
    double GetUnitageOf(char * str, int *rank, int *errorNum)
    {
    double CharToNum(char * str, int *rank);
    double value;  
     
    /*如果是数字或负号就返回这个数字*/  
    if ((str[*rank]=48 && str[*rank]=57) || (str[*rank]=='-'))
    {if (str[*rank]=='-') {(*rank)++;value = (-1)*GetUnitageOf(str, rank,errorNum);}
    else {value = CharToNum(str, rank);}}
     
    /*如果是括号就用GetASResultOf取得括号里面的值并返回*/
    else if (str[*rank]=='(' ||
    str[*rank]=='[' ||
    str[*rank]=='{' )
    {(*rank)++;
    value = GetASResultOf(str, rank, errorNum);}
     
    /*返回sin(x)*/
    else if (str[*rank]=='s' &&
    str[(*rank)+1]=='i' &&
    str[(*rank)+2]=='n')
    { (*rank)=(*rank)+3;
    value = GetUnitageOf(str, rank, errorNum);
    value = sin(value);
    }
     
    /*返回cos(x)*/
    else if (str[*rank]=='c' &&
    str[(*rank)+1]=='o' &&
    str[(*rank)+2]=='s')
    {*rank=*rank+3;
    value = cos(GetUnitageOf(str, rank, errorNum));}
     
    /*返回tan(x)*/
    else if (str[*rank]=='t' &&
    str[(*rank)+1]=='a' &&
    str[(*rank)+2]=='n')
    {*rank=*rank+3;
    value = tan(GetUnitageOf(str, rank, errorNum));}
    /*还可以加一些的,懒得加了*/  
     
    /*defult:处理错误*/
    else {*errorNum = UNKNOWN_CHAR;value = 0;}
     
    /*检查errorNum*/
    if (*errorNum==TRUE){return value;}
    else return FALSE;
    }

    /*0==[=========这个是把字符转换成数字的函数,只在GetUnitageOf()里用*/
    /*数字不能超过15个,其余的将被抹去.*/
    double CharToNum(char * str, int *rank)
    {
    int j=0;
    double value=0;
     
    while((str[*rank]=48 && str[*rank]=57) || (str[*rank]==46))
    {
    if (str[*rank]!='.')
    {if ((j++)=15) {value = value*10+(str[*rank]-48);}}
    else
    {if (j=15)
    {
    for ((*rank)++,j=1; (str[*rank]=48 && str[*rank]=57 && str[*rank]!=''); (*rank)++, j++)
    {value = value+(str[*rank]-48)*pow(0.1,j);}
    return value;
    }
    }
     
    (*rank)++;
    }
    return value;
    }

    /*0==[=========这个函数写的太复杂了,实在不好作解释,反正是在GetPDResultOf
    函数和GetUnitageOf函数之间转啊转的*/
    /*简单地说就是把str中第一个加减号前的式子算出来放在value变量中.再用函数  
    GetPDResultOf算出直到二个加减号前的式子然后与value相加或相减放在
    变量value中,以此类推,直到遇上 ')' or ']' or '}' or '' */
    double GetASResultOf(char * str, int *rank, int *errorNum)
    {
    double GetPDResultOf(char * str, int *rank, int *errorNum);
    double value;
    double dwIf_Zero;
     
    /*遇上 ')' or ']' or '}' or '' 就返回*/  
    while (str[*rank]!=')' &&
    str[*rank]!=']' &&
    str[*rank]!='}' &&
    str[*rank]!='')
    {
    if ((str[*rank]=48 && str[*rank]=57) ||
    str[*rank]=='s' ||
    str[*rank]=='c' ||
    str[*rank]=='t')
    {
    if ((str[*rank-1]==')' ||
    str[*rank-1]==']' ||  
    str[*rank-1]=='}') &&
    *rank!=0)  
    {value = value*GetUnitageOf(str, rank, errorNum);}  
    else  
    {value = GetUnitageOf(str, rank, errorNum);}  
    }
     
    else if (str[*rank]=='+')
    {if (str[*rank-1]!= '(' &&
    str[*rank-1]!= '[' &&
    str[*rank-1]!= '{' && (*rank)!=0 )
    {(*rank)++; value = value + GetPDResultOf(str, rank, errorNum);}
    else {*errorNum=UNKNOWN_CHAR;return 0;}}
     
     
    else if (str[*rank]=='-')
    {if (str[*rank-1]!= '(' &&
    str[*rank-1]!= '[' &&
    str[*rank-1]!= '{' && (*rank)!=0 )
    {(*rank)++; value = value - GetPDResultOf(str, rank, errorNum);}
    else {value = GetUnitageOf(str, rank, errorNum);}}
     
    else if (str[*rank]=='*')
    {if (str[*rank-1]!= '(' &&
    str[*rank-1]!= '[' &&
    str[*rank-1]!= '{' && (*rank)!=0 )
    {(*rank)++; value = value * GetUnitageOf(str, rank, errorNum);}
    else {*errorNum=UNKNOWN_CHAR;return 0;}}

    else if (str[*rank]=='/')
    {if (str[*rank-1]!= '(' &&
    str[*rank-1]!= '[' &&
    str[*rank-1]!= '{' && (*rank)!=0 )
    {(*rank)++;
    dwIf_Zero=GetUnitageOf(str, rank, errorNum);
    if (dwIf_Zero==0) {*errorNum=DIVISOR_IS_ZERO;return 0;}
    else value = value /dwIf_Zero;}
    else {*errorNum=UNKNOWN_CHAR;return 0;}}

    else if (str[*rank]== '(' ||
    str[*rank]== '[' ||
    str[*rank]== '{' )
    {if (str[*rank-1]!= '(' &&
    str[*rank-1]!= '[' &&
    str[*rank-1]!= '{' && (*rank)!=0 )
    {(*rank)++; value = value*GetASResultOf(str, rank, errorNum);}
    else {value = GetUnitageOf(str, rank, errorNum);}}


    else {*errorNum=UNKNOWN_CHAR;return FALSE;}


    if (*errorNum!=TRUE) return FALSE;
    }
    (*rank)++;
    return value;
    }

    double GetPDResultOf(char * str, int *rank, int *errorNum)
    {
    double value;
    double dwIf_Zero;
    value = GetUnitageOf(str, rank, errorNum);
    if (str[*rank]=='') return value;
     
    while (str[*rank]!='+' &&
    str[*rank]!='-' &&
    str[*rank]!=')' &&
    str[*rank]!=']' &&
    str[*rank]!='}')
    {
    if (str[*rank]=='*')  
    value = value * GetUnitageOf(str, rank, errorNum);
    else if (str[*rank]=='/')
    {
    dwIf_Zero= GetUnitageOf(str, rank, errorNum);
    if (dwIf_Zero=0) {*errorNum=DIVISOR_IS_ZERO;return 0;}
    else value = value /dwIf_Zero;
    }
    else if (str[*rank]=='(' ||
    str[*rank]=='[' ||
    str[*rank]=='{')
    {(*rank)++;
    value = value * GetUnitageOf(str, rank, errorNum);}
    else {*errorNum=UNKNOWN_CHAR;return FALSE;}
    if (*errorNum!=TRUE) return FALSE;
    }
     
    return value;
    }
    我在xp下用TC(准确的说是WinTc v1.2)和dev-C++4.9.9.2下通过。
    完毕,收工。
    又是一个通宵��

    楼主 2016-03-16 12:38 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知