-3

以下のコードは、逆ポーランド記法の計算を行うためのサブプログラムです... 基本的に +、-、*、および / です。2.5 と 2.5 を追加しようとすると、プログラムが 4.0 を返すことを除いて、すべてがプログラムで機能します...理由はわかっていると思いますが、修正方法がわかりません...現在、すべてを読んでいますこの割り当ての必要に応じてコマンドラインから数値と演算子を入力し、その文字列を取得して sscanf を使用して数値を取得します...どういうわけか、「2」、「.」、そして「5」は完全にフロートに変換されていません...代わりに「2」だけだと思います。誰かが私のコードを見て、これを確認または拒否し、適切な答えが得られるように修正する方法を教えてください。助けてくれてありがとう!

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 の定義を含むヘッダー ファイルは次のとおりです。

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

sixlettervariables への応答:

割り当ての一部は、配列内の数字と小数を含む既存の文字列を取得し、それらを使用してフロートを作成することです。これは、これらのコード行で行っていることです。

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;
4

3 に答える 3

5

スタックには次のcharデータが保存されます。

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

charは、定義上、浮動小数点データを格納しません。代わりに、 を呼び出すと整数変換が行われc_push、 に切り捨て2.5られ2ます。

struct c_stacknodeデータをサポートするために、 および関連するメソッドのファミリの定義を更新する必要がありfloatます。

于 2012-09-18T03:19:41.980 に答える
1

の定義も教えてくださいc_stack。浮動小数点入力を切り捨てた整数型のスタックのようです。そうすれば、2.5 + 2.5 == 4.

于 2012-09-18T02:53:27.140 に答える
0

変数を次のように定義する場合

int x=2.5;

int y=2.5;

後であなたは次のようなものを作ります

if((x+y)==4.0)

それは本当でしょう。

エンジンはfloat数を整数に変換します。私はあなたがこのようなことをしていると思います。

変数の定義を探します。

于 2012-09-18T03:15:38.790 に答える