私のプログラミングクラスでは、スタックで機能する電卓をプログラムする必要があります。変数の値を変更するスタック計算機
ここで私は、スタック自体のために作られたコードです:
#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]);
}
}
}
はこれが(別のファイルにある、私はコンパイルするメイクファイルを使用しています)電卓です:
#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();
}
プログラムは正常にコンパイルされます。私はそれを実行すると、私は+に続く6に続いて5を入力して、それをテストし、私はこの出力を得る:
Pop:6.000000
Pop:4.000000
num1:13.000000 num2:13.000000 sum:26.000000
に割り当てるときに明らかに数ポップ()関数が返すことが正しいですが、それは何らかの理由でそれを13に変える関数です。それは必ずしも13ではありません。 500を入力すると14が返され、1000が15を返し、10000が16を返します。
私は最初、intの配列でスタックを作成しましたが、実際には完全に機能しました(すべてのdoubleをintに変更すると、それでも動作します)。また、display()関数はユーザーが入力したすべての値を正しく出力するので、スタック自体は正常に動作しているようです。
エラーがどこから来ているのか本当に混乱しています。実際にスタック全体をリンクリストとして書き直すことを考えていますが、これを最後のショットにしたかったのです。
ご協力いただきありがとうございます。
EDIT:私の電卓ファイルに#include "Stack.h"(Stacked.cをStack.hに変更)を加えてメークファイルを破棄しました。元々何が起きているのか分かりませんが、うまくいきました。
私はあなたが説明するように、あなたが私たちに提示したコードはおそらく振る舞うことができるとは思いません。残っているオブジェクトファイルをきれいにして、本当にここに表示されているものをコンパイルしていますか? –
いいえ、私は関連性がないと思った部分を除外しました。おそらくそれは間違いだったと私は理解しています。ファイル全体を編集します。 – Zhior