堆栈计算器改变变量的值

时间:2017-04-04 19:46:21

标签: c

对于我的编程类,我必须编写一个使用堆栈运行的计算器。

这是我为堆栈本身编写的代码:

#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]);
        }
    }
}

这是计算器(在不同的文件中,我正在使用makefile进行编译):

#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();
}

该程序编译良好。当我运行它时,我通过输入5然后输入6然后输入+来测试它,我得到这个输出:

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

显然pop()函数返回的数字是正确的,但是当它分配给计算器函数中的变量时,它会因某种原因将其更改为13。它并不总是13,对于更大的数字它更高;输入500返回14,1000返回15,10000返回16,依此类推。

我最初使用一组int来制作我的堆栈,它实际上工作得很好(如果我将所有双打更改为整数,它仍然可以)。此外,堆栈本身似乎工作正常,因为display()函数正确打印了用户输入的所有值。

我真的很困惑这个错误来自哪里,而我实际上是在考虑将整个堆栈重写为链接列表,但是我想给这个最后一个镜头。

提前感谢您的帮助。

编辑:我在计算器文件中添加了#include“Stack.h”(将Stack.c更改为Stack.h)并丢弃了makefile,现在可以正常工作了。我不知道最初发生了什么,但我很高兴它有效。

1 个答案:

答案 0 :(得分:0)

我将所有逻辑放在一个文件中,并添加简单的main:

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

然后将全部编译为gcc main.c。它工作正常:

  

流行:3.800000
  流行:4.000000
  num1:3.800000 num2:4.000000 sum:7.800000

您确定通常链接项目(并将代码分解为某些模块)吗?您能否提供有关如何编译版本的更多信息? 附:你有很好的程序逻辑

<强>更新
您需要使用相同的文本添加Stack.h文件:

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

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

Stack.c中删除此代码并在第一行添加#include "Stack.h"Main.c仅在6行中添加#include "Stack.h"(在系统#include指令之后)。
不要更改你的makefile。这不是必需的。

关于,
AJIOB