2017-04-04 9 views
1

私のプログラミングクラスでは、スタックで機能する電卓をプログラムする必要があります。変数の値を変更するスタック計算機

ここで私は、スタック自体のために作られたコードです:

#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に変更)を加えてメークファイルを破棄しました。元々何が起きているのか分かりませんが、うまくいきました。

+0

私はあなたが説明するように、あなたが私たちに提示したコードはおそらく振る舞うことができるとは思いません。残っているオブジェクトファイルをきれいにして、本当にここに表示されているものをコンパイルしていますか? –

+0

いいえ、私は関連性がないと思った部分を除外しました。おそらくそれは間違いだったと私は理解しています。ファイル全体を編集します。 – Zhior

答えて

0

私は1つのファイルにすべてのあなたのロジックを入れて、シンプルなメインを追加します。

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

はその後gcc main.cとして、すべてをコンパイルします。そして、それは正常に動作します:

ポップ:3.800000
ポップ:4.000000
NUM1:3.800000からnum2:4.000000合計:あなたはあなたが本当に正常にプロジェクトをリンクする(そして壊れていることを確認してください7.800000

ですあなたいくつかのモジュールへのコード)?あなたのバージョンをどのようにコンパイルするかについての詳細を記入できますか?
P.このコードを削除して、最初の行に#include "Stack.h"を追加Stack.c

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

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

:あなたは、あなたが同じテキストでStack.hファイルを追加する必要が
更新

プログラムロジック内のすべての良いを持っています。
Main.cには、#include "Stack.h"を6行(システム#includeディレクティブの直後)に追加します。
メイクファイルを変更しないでください。それは必須ではありません。


AJIOB

+0

"私はあなたのロジックをひとつのファイルにまとめて、簡単なメインを追加しました" そうですね、それは機能すると思っていましたが、エクササイの一部はモデルとビューを分けることです。 私のmakefileはとてもシンプルですが、ここではhttps://pastebin.com/ZbKCeNgKです makeを使ってコンパイルし、./Programだけ実行します。 – Zhior

+0

あなたのコメントは、実際に私に違った方法でコンパイルするアイデアを与えました(私にはメイクファイルが問題になることさえありませんでした)。だから、私は#include "Stack.h"をメイン/電卓ファイルに書いていました。私はまだエラーが何だったのか理解していませんが、今は動作して以来、私はそれを疑うつもりはありません。 – Zhior

+0

@Zhior私が考えるように、 'Stack.c'ファイルと' Main.c'のpush()とpop()(と他の関数)は同等です。したがって、正しく動作しませんでした – AJIOB