Δημοσιεύτηκε: 11 Μαρ 2012, 01:48
Ilias95 έγραψε:Να και η λύση μου στο programming project 6 στη σελίδα 239:
- Μορφοποιημένος Κώδικας: Επιλογή όλων
#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 σε ένα πρόγραμμα σαν το παραπάνω;
1. Οχι αν τις συναρτήσεις τις γράφεις - ορίζεις στην αρχή . Δηλαδη πανω απο την κεντρική συνάρτηση ( main )
2. Οχι. Οι συναρτήσεις στην C μπορούν να επιστρέψουν μοναχα μια τιμή καθε φορα . Για αυτο και δουλευεις με δεικτες μεσα στις συναρτήσεις
για να αλλάζεις τα περιεχόμενα της μνήμης σου εκ νέου. Αυτο που λες πιο μετα αναφέρεται σε προσομοίωση του call "by reference" στην C μεσω των δεικτων. Στην C δεν υπάρχουν πραγματικες αναφορες.
Btw θα μπορουσαμε να το συζητησουμε εκτενέστερα αλλα προχωραω πιο αργα οπως εχω αποφασισει εξαρχης.... δεν ξερω αν με ζημιώσει ή οχι αλλα ειναι καθαρα προιον δικης μου επιλογης.