none
有关《The C Programming Language》的个别例题疑问和见解1 RRS feed

  • 常规讨论

  • 4.3章主要举了一个计算器的例子,不好意思的说我这个新人看了两天才算基本搞明白,里面有很多具体的使用的C语言的使用方法值得我学习,另外我发现例子中我认为有好几处错误,不知道大家注意到没有,反正我将程序完全拷贝到vs2010里面是无法得到正确结果的。后来经过修改可以正常使用。

    下面我就把我修改的过的全部的部分提出来,欢迎大家讨论。(多个源文件 逐一贴出)

    头文件:calc.h

    #include<stdio.h>
    #include<stdlib.h>
    #include<ctype.h>
    
    #define NUMBER '0'
    
    void push(double);
    double pop(void);
    int getop(char []);
    char getch(void);
    void ungetch(char);

    main.cpp

    /*calculator*/
    
    #include"calc.h"
    
    #define MAXOP 100
    
    int main(void)
    {
    	char s[MAXOP];
    	int type;
    	double op2;
    
    	while ((type=getop(s))!=EOF)
    	{
    		switch (type)
    		{
    		case NUMBER:
    			push(atof(s));
    			break;
    		case '+': //以“+”为例进行修改
    			if (type=='+')
    				if (getop(s)==NUMBER)
    				{
    					push(atof(s));
    					push(pop()+pop());
    				}
    			break;
    		case '*':
    			push(pop()-pop());
    			break;
    		case '-':
    			op2 = pop();
    			push(pop()-op2);
    			break;
    		case '/':
    			op2 = pop();
    			if (op2!=0.0)
    				push(pop()/op2);
    			else
    				printf("error:divisor is zero!\n");
    			break;
    		case '\n':
    			printf("RESULT: %6.8f\n",pop());
    			break;
    		default:
    			printf("error:unknown command %s\n",s);
    			break;
    		}
    	}
    	system("pause");
    	return 0;
    }

    getop.cpp

    #include"calc.h"
    
    int getop(char s[])
    {
    	int i=0;
    	char c;
    
    	s[0] = c = getch();
    	if (c=='+' || c=='-' || c=='*' || c=='/')
    	{
    		s[1] = '\0';
    		return c;
    	}
    	else if ((c>=48 && c<=57) || c=='.') //经过反复查看发现函数的返回值类型有问题(书上的程序)
    	{
    		if (c>=48 && c<=57)
    			while ((s[++i]=c=getch())>=48 && c<=57);
    		if (c=='.')
    			while ((s[++i]=c=getch())>=48 && c<=57);
    		s[i] = '\0';
    		if (c!=EOF)
    			ungetch(c);
    		return NUMBER;
    	}
    	else if (c=='\n')
    	{
    		printf("结果为:");
    		return c;
    	}
    	else
    	{
    		printf("error:input character is invaid!\n");
    		return -1;
    	}
    }

    getch.cpp

    #include"calc.h"
    
    #define BUFSIZE 100
    
    int i=0;
    char bufchar[BUFSIZE];
    
    char getch(void)
    {
    	return (i>0) ? bufchar[--i] : getchar();
    }
    void ungetch(char c)
    {
    	if (i>=BUFSIZE)
    		printf("error:buffer full, can't be stored!\n");
    	else
    		bufchar[i++] = c;
    }

    stack.cpp

    #include"calc.h"
    
    #define MAXVAL 100
    
    int sp=0;
    double val[MAXVAL];
    
    void push(double f)
    {
    	if (sp<MAXVAL)
    		val[sp++] = f;
    	else
    		printf("error:stack full,can't push %g\n",f);
    }
    double pop(void)
    {
    	if (sp>0)
    		return val[--sp];
    	else
    	{
    		printf("error:stack empty\n");
    		return 0.0;
    	}
    }


    煮酒论英雄

    2012年2月10日 14:19