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.
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? –
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