- Μορφοποιημένος Κώδικας: Επιλογή όλων
-
#include <stdio.h>
#include <stdlib.h> // exit()
#define STACK_SIZE 30
#define IS_FULL (top == STACK_SIZE)
#define IS_EMPTY (top == 0)
#define CLEAR_STACK (top = 0)
int operands_stack[STACK_SIZE];
int top = 0;
int read(void);
void push_to_stack(int x);
int pop_from_stack(void);
void compute(char ch);
void print_and_clear(void);
void stack_overflow(void);
void stack_underflow(void);
int main(void)
{
for (;;) {
printf("Enter an RPN expression: ");
if (read() == 1)
exit(EXIT_SUCCESS);
}
}
int read(void) {
char ch;
for (;;) {
scanf(" %c", &ch);
if (ch >= '0' && ch <= '9') {
int x = ch - '0';
push_to_stack(x);
}
else if (ch == '+' || ch == '-' || ch == '*' || ch == '/')
compute(ch);
else if (ch == '=') {
print_and_clear();
break;
}
else
return 1;
}
return 0;
}
void push_to_stack(int x) {
if (IS_FULL)
stack_overflow();
else
operands_stack[top++] = x;
}
int pop_from_stack(void) {
if (IS_EMPTY) {
stack_underflow();
return 0;
}
else
return operands_stack[--top];
}
void compute(char ch) {
int a = pop_from_stack(), b = pop_from_stack();
switch (ch) {
case '+': push_to_stack(b + a); break;
case '-': push_to_stack(b - a); break;
case '*': push_to_stack(b * a); break;
case '/': push_to_stack(b / a); break;
}
}
void print_and_clear(void) {
printf("Value of expression: %d\n", operands_stack[top - 1]);
CLEAR_STACK;
}
void stack_overflow(void) {
printf("Expression is too complex.\n");
exit(1);
}
void stack_underflow(void) {
printf("Not enough operands in expression.\n");
exit(1);
}
Δύο πράγματα δεν μου αρέσουν.
1. Ότι πρέπει να δηλώνω κάθε φορά το prototype της κάθε function (αυτό γενικά στη γλώσσα, ανεξάρτητα απ' το πρόγραμμα).
2. Ότι αναγκάστηκα να χρησιμοποιήσω global μεταβλητές λόγο του ότι δεν μπορώ από μία συνάρτηση να επιστρέψω παραπάνω από μία τιμές.
Βέβαια έχω την εντύπωση ότι με χρήση pointers μπορείς να μεταβάλεις τις τιμές κάποιων local μεταβλητών μίας συνάρτησης μέσα από μια άλλη συνάρτηση.
Αλλά θα το δω παρακάτω αυτό. Ή υπάρχει άλλος τρόπος να αποφύγω την χρήση global variables σε ένα πρόγραμμα σαν το παραπάνω;



