签到

05月06日
尚未签到

共有回帖数 0

    孤单的狼

    等级:


    如果你是新手并且你看了我之前的程序你会发现这个程序的代码清单惊人的简洁。
    感谢Rich吧主的提示让我见识到这种程序的设计风格。
    KCP:


    /****************************************
    * A normal console calculator program. *
    * Use recursion downward design(LL1). *
    *--------------------------------------*
    * E --- TE_ *
    * E_ --- +TE_ | -TE_ | 0 *
    * T --- FT_ *
    * T_ --- *FT_ | /FT_ | 0 *
    * F --- (E) | NUM *
    * *************************************/

    #include stdio.h
    #include string.h

    #define N 30 /* Allocation space for express */
    #define PLUS 0
    #define SUBT 1
    #define MULT 2
    #define DIVI 3
    #define NUM 4
    #define LBRK 5
    #define RBRK 6
    #define END 7
    #define OTHER 8

    int err;
    int pCur;
    int TOKEN;
    char Get_str[N]; /* save express */
    double T_value;

    int parser(void); /* A function for syntax analysis */
    void Match(void); /* read token */
    double E(void); /* figure plus and sub */
    double E_(void); /* sub faction of E */
    double T(void); /* figure mult and divi */
    double T_(void); /* sub faction of T */
    double F(void); /* read value and analyse resursion */

    int main(int argc, char *argv[]) /* contain command mode */
    {
    ________if (argc == 2) {
    ________________strcpy(Get_str, argv[1]);
    ________________Match(); /* initialize value */
    ________________printf("The result is: %lfnn", E());
    ________}
    ________else {
    ________________printf("Enter a express:n");
    ________________while (!err) { /* iterate condition */
    ________________________scanf("%s", Get_str);
    ________________________Match(); /* initialize value */
    ________________________printf("%s%lf%sn",
    ________________________________"The result is: ", E(),
    ________________________________"n Input express continue, "
    ________________________________"and input any letter Exit.n");
    ________________________T_value = pCur = 0; /* initialisation */
    ________________}
    ________________printf("ERROR: Contain undefinition charactor - bye!nn");
    ________}

    getchar();

    return 0;
    }

    //Read a token

    void Match(void)
    {
    ________TOKEN = parser();
    }

    //analyse express

    int parser(void)
    {
    ________int cnt = 0;
    ________char Tmp[N];

    while (Get_str[pCur] == ' ')
    ________________pCur++;
    ________while (Get_str[pCur] = '0' && Get_str[pCur] = '9' || Get_str[pCur] == '.')
    ________________Tmp[cnt++] = Get_str[pCur++];
    ________if (cnt) {
    ________________sscanf(Tmp, "%lf", &T_value);
    ________________return NUM;
    ________}
    ________switch (Get_str[pCur++]) {
    ________________case '+' : return PLUS;
    ________________case '-' : return SUBT;
    ________________case '*' : return MULT;
    ________________case '/' : return DIVI;
    ________________case '(' : return LBRK;
    ________________case ')' : return RBRK;
    ________________case '' : return END;
    ________________default : return OTHER;
    ________}
    }

    //E--TE'

    double E(void)
    {
    ________switch (TOKEN) {
    ________________case LBRK :
    ________________case NUM :
    ________________________return T() + E_();
    ________________case END : return F();
    ________________default : err = 1; return -1;
    ________}
    }

    //E--+TE' | -TE' | empty

    double E_(void)
    {
    ________switch(TOKEN) {
    ________________case PLUS :
    ________________________Match();
    ________________________return T() + E_();
    ________________case SUBT :
    ________________________Match();
    ________________________return -(T() - E_());
    ________________case RBRK :
    ________________case END :
    ________________________return 0;
    ________________default : err = 1; return -1;
    ________}
    }

    //T--TE'

    double T(void)
    {
    ________switch(TOKEN) {
    ________________case LBRK :
    ________________case NUM :
    ________________________return F() * T_();
    ________________default : err = 1; return -1;
    ________}
    }

    //T'--*FT' | /FT' | empty

    double T_(void)
    {
    ________switch(TOKEN) {
    ________________case MULT :
    ________________________Match();
    ________________________return F() * T_();
    ________________case DIVI :
    ________________________Match();
    ________________________return 1 / (F() / T_());
    ________________case PLUS :
    ________________case SUBT :
    ________________case RBRK :
    ________________case END:
    ________________________return 1;
    ________________default : err = 1; return -1;
    ________}
    }

    //E--E | value

    double F(void)
    {
    ________double Tmp;

    switch(TOKEN) {
    ________________case LBRK :
    ________________________Match();
    ________________________Tmp = E();
    ________________________Match();
    ________________________return Tmp;
    ________________case NUM :
    ________________________Tmp = T_value;
    ________________________Match();
    ________________________return Tmp;
    ________________default : err = 1; return -1;
    ________}
    }

    楼主 2015-11-05 13:39 回复

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

登录直线网账号

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