아래의 코드는 리버스 폴리쉬 표기법 계산을 수행하는 서브 프로그램입니다. 기본적으로 +, -, * 및 /입니다. 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;
사소한 세부 사항 :'state == 0'에서'state = 1'으로 진행할 때 왜'k = 0'을 설정하지 않습니까? – mvds
나는 이것을 C라고 생각합니까? – Ryan
디버거에 넣고 코드를 단계별로 실행하십시오. – abelenky