1

'f'创建用户可以输入或'i'在整数和浮点之间切换的浮点模式的最有效方法是什么?我想这样做而不必复制花车的整个代码。我知道类型转换是一种选择,但我不完全确定这是否是最安全的方式。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 100

int *p;
int *tos;
int *bos;

void push(int i);
int pop(void);

int main (void)
{
    int a, b;
    char s[80];

    p = (int *) malloc(MAX*sizeof(int));    /* get stack memory */
    if (!p) {
        printf("Allocation Failure\n");
        exit(1);
    }

    tos = p;
    bos = p + MAX-1;

    printf("\nRPN Calculator\n");
    printf("Enter 'i' for integer mode\n");
    printf("Enter 'f' for floating point mode\n");
    printf("Enter 'q' to quit\n\n");
    char *endptr;

    do {        
        printf("> ");
        scanf("%s", s);
        int val = strtol(s, &endptr, 10);

        if (*endptr == '\0') {
            //printf("Got only the integer: %d\n", val);
        }
        else {  
            printf("operator: %s\n", endptr); 
            printf("integer: %d\n", val);
                if (val != 0){      /* don't push val on stack if 0 */
                push(val);
            }
        }

        switch(*endptr) {
            case 'i':
                printf("(Integer Mode)\n");
                break;
            case 'f':
                printf("(Floating Point Mode)\n");
                break;
            case '+':
                a = pop();
                b = pop();
            //  printf("%d\n",a);
            //  printf("%d\n",b);
            //  printf("%d\n",val);
                printf("%d\n", a+b);
                push(a+b);
                break;
            case '-':
                a = pop(); 
                b = pop(); 
                printf("%d\n", b-a); 
                push(b-a);
                break;  
            case '*':
                a = pop(); 
                b = pop(); 
                printf("%d\n", a*b); 
                push(a*b);
                break;
            case '/':
                a = pop(); 
                b = pop();
                if(a == 0){
                    printf("Cannot divide by zero\n");
                    break;
                }
                printf("%d\n", b/a);
                push(b/a);
                break;
            case '.':
                a = pop(); push(a);
                printf("Current value on top of stack: %d\n", a);

                break;  
            default:
            //  push(atoi(s));
                push(val);
        }
    } while (*s != 'q');    /* Do until 'q' is entered */

    return 0;
    }       

void push (int i)   /* Put an element on the stack */
{
    if (p > bos){
        printf("Stack Full\n");
        return;
    }
    *p = i;
    p++;
}

int pop (void)  /* Get the element from the top of the stack */
{
    p--;
    if(p < 0) {
        printf("Stack Underflow\n");
        return 0;
    }
    return *p;
}
4

2 回答 2

2

在 C 中没有办法重载函数,所以无论如何你都必须做两个副本。但是,您可以概括推送/弹出,以便它在具有任意数据的节点上运行。为了安全地做到这一点,您可以使用标记的联合,例如:

typedef struct {
  enum {INT, FLOAT} type;
  union {
    int i;
    float f;
  } data;
} Node;

这也使您将来可以轻松地扩展到其他数据类型。

或者您可以只使用void*数据并在每次要对其进行操作时不安全地对其进行转换,傲慢地假设您总能找到您想要的(不推荐)。

于 2010-02-06T06:49:41.663 回答
0

你可以用宏预处理器做一些魔术。

将常用操作隔离到头文件中,提供一些宏变量,例如 TYPE。将 TYPE 连接到函数名称以创建不同的名称,用 TYPE 替换显式类型。在主文件中包含两次宏/头文件,一次将 TYPE 定义为 int,下一次将 TYPE 定义为 double。调用特殊函数,其名称附加 TYPE。

这就像穷人 C++ 模板

于 2010-02-06T06:59:22.287 回答