English 中文(简体)
What is the easiest way to add a float mode to this C Calculator?
原标题:
  • 时间:2010-02-06 06:33:51
  •  标签:
  • c
  • calculator

What is the most efficient way to create a floating point mode where the user can enter f or i to switch between integer and floating point? I d like to do this without having to copy the entire code for floats. I know typecasting is an option but I m not completely sure if it s the safest way.

#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
");
        exit(1);
    }

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

    printf("
RPN Calculator
");
    printf("Enter  i  for integer mode
");
    printf("Enter  f  for floating point mode
");
    printf("Enter  q  to quit

");
    char *endptr;

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

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

        switch(*endptr) {
            case  i :
                printf("(Integer Mode)
");
                break;
            case  f :
                printf("(Floating Point Mode)
");
                break;
            case  + :
                a = pop();
                b = pop();
            //  printf("%d
",a);
            //  printf("%d
",b);
            //  printf("%d
",val);
                printf("%d
", a+b);
                push(a+b);
                break;
            case  - :
                a = pop(); 
                b = pop(); 
                printf("%d
", b-a); 
                push(b-a);
                break;  
            case  * :
                a = pop(); 
                b = pop(); 
                printf("%d
", a*b); 
                push(a*b);
                break;
            case  / :
                a = pop(); 
                b = pop();
                if(a == 0){
                    printf("Cannot divide by zero
");
                    break;
                }
                printf("%d
", b/a);
                push(b/a);
                break;
            case  . :
                a = pop(); push(a);
                printf("Current value on top of stack: %d
", 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
");
        return;
    }
    *p = i;
    p++;
}

int pop (void)  /* Get the element from the top of the stack */
{
    p--;
    if(p < 0) {
        printf("Stack Underflow
");
        return 0;
    }
    return *p;
}
问题回答

There s no way to overload functions in C, so you ll have to do two copies in any case. However, you can generalize the pushing/popping so that it operates on nodes with arbitrary data. To do it safely, you can use a tagged union like:

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

This also allows you to easily extend to other data types in the future.

Or you could just go with a void* data and cast it unsafely each time you want to operate on it, arrogantly assuming that you ll always find what you want (not recommended).

you could do some magic with macro preprocessor.

Isolate common operations into header file, provide some macro variable, for example TYPE. concatenate TYPE to function names to create distinct names, replace explicit types with TYPE. in main file include macro/header file twice, one time with TYPE defined to int, next time with TYPE defined as double. call special functions with their names appended with TYPE.

This is like poor man C++ template





相关问题
Fastest method for running a binary search on a file in C?

For example, let s say I want to find a particular word or number in a file. The contents are in sorted order (obviously). Since I want to run a binary search on the file, it seems like a real waste ...

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

Tips for debugging a made-for-linux application on windows?

I m trying to find the source of a bug I have found in an open-source application. I have managed to get a build up and running on my Windows machine, but I m having trouble finding the spot in the ...

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

Good, free, easy-to-use C graphics libraries? [closed]

I was wondering if there were any good free graphics libraries for C that are easy to use? It s for plotting 2d and 3d graphs and then saving to a file. It s on a Linux system and there s no gnuplot ...

Encoding, decoding an integer to a char array

Please note that this is not homework and i did search before starting this new thread. I got Store an int in a char array? I was looking for an answer but didn t get any satisfactory answer in the ...

热门标签