共有回帖数 0 个
-

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

只看楼主
收藏
回复
c_vs
毛蛋1

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

(0)
回复
1楼
2012-04-21 02:15
举报 |个人企业举报垃圾信息举报
c_vs
毛蛋1
/****************************************
* 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;
________}
}
楼主 2016-03-31 13:54 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知