c - 如何用科学记数法计算小数和 float - 例如{1.23e4}。在后缀中?

标签 c stack postfix-mta

我已经编写了从后缀到结果的评估代码。然而,当后缀采用科学符号中的小数和 float 时,我陷入了困境 - 例如{1.23e4}。任何具体建议将不胜感激。谢谢。

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

#define SIZE 50 /* Size of Stack */

double s[SIZE];
int top=-1; /* Global declarations */
int flag=0;
double pop()
{                      /* Function for POP operation */
  return(s[top--]);
}
double push(double elem)
{ /* Function for PUSH operation */
  if(flag==1){
    int num;
    num=pop();
    s[++top]=elem+10*num;
  }
  else if(flag==0){
    s[++top]=elem;
    flag=1;
  }
}


void main()
{                         /* Main Program */
  char pofx[50],ch;
  int i=0;

  double op1,op2;
  printf("Enter the Postfix Expression:");
  fgets(pofx,100,stdin);
  while( (ch=pofx[i++]) != '\n')
  {
    if(isdigit(ch)) push(ch-'0'); /* Push the operand */
    else if(ch==' ')
      flag=0;
    else
    {        /* Operator,pop two  operands */
      flag=0;
      op2=pop();
      op1=pop();
      switch(ch)
      {
        case '+':push(op1+op2);break;
        case '-':push(op1-op2);break;
        case '*':push(op1*op2);break;
        case '/':push(op1/op2);break;
        case '^':push(pow(op1,op2));break;
        default:
                 printf("Input invalid ... give proper input\n");
                 return 0;
      }
    }
  }
  printf("Result: %lf\n",s[top]);
}

最佳答案

How do I evaluate decimals & floating point numbers in scientific e notation ... (?)

要将字符串转换为 FP 值,请使用 strtod() @M Oehm

<小时/>

但是代码还存在其他问题,因为运算符符号 '-''+' 也可能以有效值标记开头,例如 -123.45 .

// insufficient test to determine if the next part of the string is a number or operator.
if(isdigit(ch)) 
  push(ch-'0');

使用strtod()将文本转换为double确定字符串的下一部分是否为double.

替代代码:

  const char *st = pofx;
  while (*st) {
    char *end; //location to store end of FP parsing
    double value = strtod(st, &end);
    if (end > st) {
      push(value);
      st = end; 
    } else if (isspace((unsigned char) *st)) {
      st++;
    } else {
      switch (*st) {
        case '+':push(pop() + pop());break; // pop order irrelevant
        case '-':{ double t = pop(); push(pop() - t);break; } // pop order relevant
        case '*':push(pop() * pop());break;
        ...
        default: {
          printf("Input invalid operator: character code %d\n", *st);
          return 0;
        } 
      }  // end switch
      st++;
    }
  }
<小时/>

重写push()

void push(double elem) {
  if (top + 1 >= SIZE) {
    printf("Stack overflow\n");
    return;
  }
  s[++top] = elem;
}
<小时/>

fgets() 的参数错误

char pofx[50];
// fgets(pofx,100,stdin); // 100??
fgets(pofx, sizeof pofx, stdin); // better

关于c - 如何用科学记数法计算小数和 float - 例如{1.23e4}。在后缀中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46811063/

相关文章:

windows - 调用_freea 真的有必要吗?

mysql - postfix mail.warn 日志中的奇怪错误

iOS 检测 IPv6 支持

C : redefinition of ‘struct'

c - STRLEN 错误 - 字符串类型

c - 检测到堆栈溢出时强制 gcc 编译

c - 接收多条消息的socket编程C

c - 我们如何轮询堆栈状态 - 未使用(可用)内存

centos - 没有域名/主机名的后缀设置

ruby-on-rails - Action Mailer 无法与 sendmail 一起使用