2012-09-18 3 views
-2

아래의 코드는 리버스 폴리쉬 표기법 계산을 수행하는 서브 프로그램입니다. 기본적으로 +, -, * 및 /입니다. 2.5와 2.5를 추가하려고 할 때를 제외하고 프로그램에서 모든 것이 작동합니다. 프로그램에서 나에게 4.0을 제공합니다 ... 왜 그런 생각이 들지만, 어떻게 수정해야할지 모르겠군요 ... 지금은 모든 것을 읽고 있습니다. 숫자 및 연산자를이 할당에 필요한 명령 줄에서 다음 문자열을 가져와 그것을 밖으로 숫자를 얻으려면 sscanf를 사용하여 ... 나는 어떻게 든 '3'문자가 포함 된 배열을 생각하고 '.', 및 '5', 완전히 float로 변환되지 않습니다 ... 대신 나는 단지 '2'라고 생각합니다. 누군가 내 코드를 살펴보고이를 확인하거나 거부 할 수 있습니까? 아마도 올바른 답을 얻을 수 있도록 문제를 해결하는 방법을 알려주시겠습니까? 어떤 도움을 주셔서 미리 감사드립니다! 여기 float addition 2.5 + 2.5 = 4.0? RPN

float 
fsm (char mystring[]) 
{ 
    int i = -1, j, k = 0, state = 0; 
    float num1, num2, ans; 
    char temp[10]; 
    c_stack top; 
    c_init_stack (&top); 
    while (1) 
    { 
     switch (state) 
    { 
    case 0: 
     i++; 
     if ((mystring[i]) == ' ') 
     { 
      state = 0; 
     } 
     else if ((isdigit (mystring[i])) || (mystring[i] == '.')) 
     { 
      state = 1; 
     } 
     else if ((mystring[i]) == '\0') 
     { 
      state = 3; 
     } 
    else 
    { 
     state = 4; 
    } 
    break; 
case 1: 
    temp[k] = mystring[i]; 
    k++; 
    i++; 
    if ((isdigit (mystring[i])) || (mystring[i] == '.')) 
    { 
     state = 1; 
    } 
    else 
    { 
     state = 2; 
    } 
    break; 
case 2: 
    temp[k] = '\0'; 
    sscanf (temp, "%f", &num1); 
    c_push (&top, num1); 
    i--; 
    k = 0; 
    state = 0; 
    break; 
case 3: 
    ans = c_pop (&top); 
    if (c_is_empty (top)) 
    return ans; 
    else 
    { 
     printf ("There are still items on the stack\n"); 
     exit (0); 
case 4: 
     num2 = c_pop (&top); 
     num1 = c_pop (&top); 
     if (mystring[i] == '+'){ 
      ans = num1 + num2; 
     return ans; 
    } 
     else if (mystring[i] == '-'){ 
    ans = num1 - num2; 
    return ans; 
    } 
     else if (mystring[i] == '*'){ 
    ans = num1 * num2; 
    return ans; 
    } 
     else if (mystring[i] == '/'){ 
      if (num2){ 
      ans = num1/num2; 
      return ans; 
     } 
     else{ 
     printf ("Error: cannot divide by 0\n"); 
     exit (0); 
      } 
    } 
     c_push (&top, ans); 
     state = 0; 
     break; 
    } 
} 
} 
} 

내 주요 프로그램 :

#include <stdio.h> 
#include <stdlib.h> 
#include "boolean.h" 
#include "c_stack.h" 
#include <string.h> 

int main(int argc, char *argv[]) 
{ 
    char mystring[100]; 
    int i; 
    sscanf("", "%s", mystring); 
    for (i=1; i<argc; i++){ 
    strcat(mystring, argv[i]); 
    strcat(mystring, " "); 
    } 
    printf("%.2f\n", fsm(mystring)); 
    } 

여기에 프로토 타입 헤더 파일 및 c_stack에 대한 정의입니다 : sixlettervariables에 응답

#include "boolean.h" 

#ifndef CSTACK_H 
#define CSTACK_H 

    typedef struct c_stacknode{ 
    char data; 
    struct c_stacknode *next; 
    } *c_stack; 

#endif 

void c_init_stack(c_stack *); 
boolean c_is_full(void); 
boolean c_is_empty(c_stack); 
void c_push(c_stack *,char); 
char c_pop(c_stack *); 
void print_c_stack(c_stack); 
boolean is_open(char); 
boolean is_brother(char, char); 
float fsm(char[]); 

:

할당의 일부는 배열에서 숫자와 소수로 이루어진 기존 문자열을 가져 오는 것입니다

case 1: 
temp[k] = mystring[i]; 
k++; 
i++; 
if ((isdigit (mystring[i])) || (mystring[i] == '.')) { 
state = 1; } else { 
    state = 2; 
} 
break; 
case 2: 
temp[k] = '\0'; 
sscanf (temp, "%f", &num1); 
c_push (&top, num1); 
i--; 
k = 0; 
state = 0; 
break; 
+0

사소한 세부 사항 :'state == 0'에서'state = 1'으로 진행할 때 왜'k = 0'을 설정하지 않습니까? – mvds

+0

나는 이것을 C라고 생각합니까? – Ryan

+0

디버거에 넣고 코드를 단계별로 실행하십시오. – abelenky

답변

1

당신은 또한 c_stack의 정의를 공유 할 수 없습니다 : 내가 코드 줄에서 뭐하는 거지 인 float를 생성하는 데 사용할? 부동 소수점 입력을 반올림하여 정수형 스택처럼 보입니다. 그런 식으로 2.5 + 2.5 == 4. 당신이

int x=2.5; 

int y=2.5; 

로 변수를 정의하면

0

는 나중에 그것은 사실이 될 것이다

if((x+y)==4.0) 

같은 것을합니다.

엔진은 부동 소수점 수를 정수로 변환합니다. 나는 당신이 이런 일을하고있는 것 같아요.

변수 정의를 찾으십시오.

4

귀하의 스택에 저장 char 데이터 :

typedef struct c_stacknode{ 
char data; 
struct c_stacknode *next; 
} *c_stack; 

char

, 정의에 의해, 부동 소수점 데이터 저장하지 않습니다. 대신 c_push을 호출 할 때 2.52으로 잘림하면 정수 변환이 발생합니다.

float 데이터를 지원하려면 struct c_stacknode 및 관련 방법 계열 정의를 업데이트해야합니다.