gpt4 book ai didi

c - 堆栈计算器改变变量的值

转载 作者:太空宇宙 更新时间:2023-11-04 04:24:20 24 4
gpt4 key购买 nike

在我的编程课上,我必须编写一个使用堆栈运行的计算器。

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

#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 等等。

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

我真的很困惑错误是从哪里来的,我实际上正在考虑将整个堆栈重写为链表,但我想最后一次尝试。

预先感谢您的帮助。

编辑:我在我的计算器文件中添加了#include "Stack.h"(将 Stack.c 更改为 Stack.h)并处理了 makefile,现在它可以工作了。我不知道最初发生了什么,但我很高兴它起作用了。

最佳答案

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

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

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

Pop:3.800000
Pop: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

关于c - 堆栈计算器改变变量的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43216363/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com