2017-04-04 23 views
1

Für meine Programmierklasse muss ich einen Taschenrechner programmieren, der mit einem Stack funktioniert.Stack-Rechner den Wert einer Variablen ändern

Hier ist der Code, den ich für den Stapel machte sich:

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

#define MAXSIZE 10 

double stk[MAXSIZE]; //Stack array 
int top=-1; //Top position in stack 

void push(double n); 
double pop(void); 
void display(void); 

/* Add an element to the stack */ 
void push(double n) { 

    if (top == (MAXSIZE - 1)) { 
     printf ("Stack is full\n"); 
    } 
    else { 
     //s.top++; 
     //stk = (double *) malloc(MAXSIZE*sizeof(double)); 
     stk[++top] = n; 
    } 

    return; 
} 

/* Remove and return the top element from the stack */ 
double pop() { 

    double num; 

    if (top == -1) { 
     printf ("Stack is empty\n"); 
     return (top); 
    } 
    else { 
     num = stk[top--]; 
     printf ("Pop:%f\n", num); //Debugging line 
     return (num); 
    } 
} 

/* Prints all elements in the stack */ 
void display() { 

    int i; 

    if (top == -1) { 
     printf ("Stack is empty\n"); 
     return; 
    } 
    else { 
     for (i = top; i >= 0; i--) { 
      printf ("%f\n", stk[i]); 
     } 
    } 
} 

Und das ist der der Rechner (die in einer anderen Datei, ich Make-Datei bin mit kompilieren):

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

int isNumber(const char *s); 
void insert(double num); 
void sum(void); 

int main(int argc, char *argv[]) { 

    int loop = 1; 
    char input[10]; 

    /* Main Loop */ 
    while (loop == 1) { 
     printf("> "); 
     scanf(" %[^\n]", input); 

     if (isNumber(input)) { 
      double nu = atof(input); 
      insert(nu); 
     } 

     else if (strcmp(input, "+") == 0) 
      sum(); 
     else if (strcmp(input, "l") == 0) 
      list(); 
     else if (strcmp(input, "exit") == 0) //exit 
      loop = 0; 
    } //end while 

} //end main 

int isNumber(const char *s) { 
    while (*s) { 
     if((*s<'0' || *s>'9') && *s!='-' && *s!='.') 
      return 0; 
     s++; 
    } 

    return 1; 
} 

void insert(double num) { 
    push(num); 
} 

/* This function is called when the user enters a '+' instead of a number into the command line. It takes the top two numbers from the stack and adds them together */ 
void sum() { 
    double num1, num2, res; 

    num1 = pop(); 
    num2 = pop(); 
    res = num1+num2; 

    printf("num1:%f num2:%f sum:%f\n", num1, num2, res); //Debug 
} 

int list() { 
    display(); 
} 

Das Programm kompiliert gut. Als ich es betreibe ich testen Sie es durch einen 5 durch einen 6 durch ein + gefolgt gefolgt Eingabe und ich diese Ausgabe:

Pop:6.000000 
Pop:4.000000 
num1:13.000000 num2:13.000000 sum:26.000000 

die Zahl also offensichtlich, dass die Pop() gibt korrekt ist, aber wenn es um die Zuordnung Variablen in der Rechnerfunktion ändert es aus irgendeinem Grund in eine 13. Es ist nicht immer 13, für größere Zahlen ist es höher; die Eingabe von 500 gibt 14 zurück, 1000 gibt 15 zurück, 10000 gibt 16 zurück und so weiter.

machte ich zunächst meinen Stack mit einem Array von ints und es funktionierte wirklich perfekt (es tut immer noch, wenn ich alle verdoppelt Ints ändern). Auch der Stapel selbst scheint gut zu funktionieren, da die Funktion display() alle vom Benutzer eingegebenen Werte korrekt ausgibt.

Ich bin wirklich verwirrt, wo der Fehler herkommt und ich denke tatsächlich von den ganzen Stapel als eine verknüpfte Liste stattdessen Umschreiben aber ich wollte diese eine letzte Chance geben.

Vielen Dank im Voraus für Ihre Hilfe.

EDIT: Ich habe ein # include "Stack.h" (Changed Stack.c zu Stack.h) in meinem Rechner Datei und entsorgt das Makefile und es funktioniert jetzt. Ich habe keine Ahnung, was ursprünglich passiert ist, aber ich bin nur froh, dass es funktioniert.

+0

Ich glaube nicht, den Code, den Sie uns vorgestellt haben, können möglicherweise verhalten, wie Sie beschreiben. Sind Sie sicher, dass Sie alle veralteten Objektdateien gelöscht haben und genau das kompilieren, was Sie hier zeigen? –

+0

Nein, ich habe einige Teile weggelassen, die ich für nicht relevant hielt. Mir ist klar, dass das wahrscheinlich ein Fehler war, ich bearbeite mit der ganzen Datei. – Zhior

Antwort

0

Ich habe alle Ihre Logik in einer Datei, und einfach hinzufügen Haupt:

int main() 
{ 
    push(4.0); 
    push(3.8); 
    sum(); 
    return 0; 
} 

Dann werden alle als gcc main.c kompilieren. Und es funktioniert:

Pop: 3,800000
Pop: 4,000000
num1: 3,800000 num2: 4,000000 Summe: 7,800000

Sind Sie sicher, dass Sie wirklich normalerweise Ihr Projekt verknüpfen (und brechen Sie Ihre Code zu einigen Modulen)? Kannst du mehr Informationen darüber geben, wie du deine Version kompilierst?
P.S. Sie haben alle gut in der Programmlogik

aktualisiert
Sie benötigen Stack.h Datei mit dem gleichen Text hinzuzufügen:

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

void push(double n); 
double pop(void); 
void display(void); 

In Stack.c diesen Code entfernen und #include "Stack.h" in der ersten Zeile hinzufügen.
In Main.c fügen nur #include "Stack.h" in der 6-Leitung (nur nach dem System #include Richtlinien).
Ändern Sie Ihr Makefile nicht. Es ist nicht erforderlich.

Mit Grüßen,
AJIOB

+0

"Ich habe alle Ihre Logik in eine Datei und fügen Sie einfache Haupt" Ja, ich dachte, dass würde es funktionieren, aber ein Teil der Übung ist, Modell und Sicht zu trennen. Mein Makefile ist wirklich ziemlich einfach, aber hier ist es: https://pastebin.com/ZbKCeNgK Ich benutze dann make zu kompilieren und einfach laufen ./Program. – Zhior

+0

Dein Kommentar hat mir tatsächlich die Idee gegeben, es anders zu kompilieren (es war mir nicht einmal aufgefallen, das Makefile könnte das Problem sein). Also habe ich #include "Stack.h" in meine Haupt/Rechner-Datei geschrieben und es hat funktioniert. Ich verstehe immer noch nicht, was der Fehler war, aber ich werde es nicht in Frage stellen, da es jetzt funktioniert. – Zhior

+0

@Zhior, wie ich denke, Compiler verstehe nicht, dass push() und pop() (und andere Funktionen) in 'Stack.c' Datei und in' Main.c' sind gleichwertig. Deshalb hat es nicht richtig funktioniert – AJIOB

Verwandte Themen