| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2224 人关注过本帖
标题:长整形四则运算
只看楼主 加入收藏
SSY006
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2015-12-13
结帖率:75%
收藏
 问题点数:0 回复次数:11 
长整形四则运算

#include<stdio.h>
#include<malloc.h>
union nuionnum
{
double num1;
char num2;
};
struct lianbiao
{
struct lianbiao *p;
union nuionnum num;
int flage;/* 标志数字符号 */
};

void main()
{
 char c;
 struct lianbiao lianhe;
 struct lianbiao *next;
 printf("请输入计算机能识别四则运算表达式:a+b*(c+d)/e\n");
 while(1)
 {
  first:
  next=&lianhe;
  while((int)(c=getchar())!=10)
  {
   loop:
   /* 表达式放入复合链表 */
   if (c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')')
   {
     next->num.num2=c;
     if (c== '+' || c== '-' )
      next->flage =1;
     else if(c== '*' ||c== '/' )
      next->flage =2;
     else if(c== '(' )
      next->flage =3;
     else if(c== ')' )
      next->flage =4;
     next->p=calloc(1,sizeof(struct lianbiao));
     next=next->p;
     next->p=NULL;
   }
   else if(c>='0'&&c<='9')
   { long int t=1;
     int flag=0;
     next->num.num1=c-48;
     while(((c=getchar())>='0'&&c<='9')||c=='.')
     {
       if (flag==1 && c!='.')
       {
         t=t*10;
         next->num.num1=next->num.num1+(c-48.0)/t;
       }
       else if(c>='0'&&c<='9')
        next->num.num1=next->num.num1*10+c-48;
       if (c=='.')
       {
         flag=1;
       }
     }
     next->flage =0;
     next->p=calloc(1,sizeof(struct lianbiao));
     next=next->p;
     next->p=NULL;
     if (c=='\n')break;
     goto loop;
   }
   else
   {
     printf("不是合法算术表达式!!!\n请重新输入:\n");
     while(getchar()!='\n') ;/* 设置重新输入 */
     goto first;
   }
  }
  /* 链表数字符号别入栈 */
  next=&lianhe;
  {
    int i=0,j=0;/* 用标记栈顶点 */
    double arrd[100];
    char arrc[2][100];
    while(next->p!=NULL)
    {
      if (next->flage !=0&&next->num.num2==')')/* 括号外理 */
      {
        while(arrc[0][i-1]!='(')/* 栈 */
        {
          if (arrc[0][i-1]=='+')
          {
            arrd[j-2]=arrd[j-2]+arrd[j-1];
            i=i-1;
            j=j-1;
          }
          else if(arrc[0][i-1]=='-')
          {
            arrd[j-2]=arrd[j-2]-arrd[j-1];
            i=i-1;
            j=j-1;
          }
          else if(arrc[0][i-1]=='*')
          {
            arrd[j-2]=arrd[j-2]*arrd[j-1];
            i=i-1;
            j=j-1;
          }
          else if(arrc[0][i-1]=='/')
          {
            arrd[j-2]=arrd[j-2]/arrd[j-1];
            i=i-1;
            j=j-1;
          }
        }
        i=i-1;
      }
      else if (next->num.num2 =='(')/* 入栈 */
      {
        arrc[1][i]=next->flage;
        arrc[0][i]=next->num.num2;
        i++;
      }
      else if (next->flage !=0)/* 运算复符理 */
      {
       front:
        if (i>0&&next->flage<arrc[1][i-1]&&arrc[1][i-1]!=3)
        {
          if (arrc[0][i-1]=='*')
          {
            arrd[j-2]=arrd[j-2]*arrd[j-1];
            i=i-1;
            j=j-1;
          }
          else if(arrc[0][i-1]=='/')
          {
            arrd[j-2]=arrd[j-2]/arrd[j-1];
            i=i-1;
            j=j-1;
          }
          goto front;
        }
        arrc[1][i]=next->flage;
        arrc[0][i]=next->num.num2;
        i++;
      }
      else
      {
        arrd[j]=next->num.num1; /* 数字理 */
        j++;
      }
      next=next->p;
    }
    while(i!=0)/* 全部入栈椎外理 */
    {
      if (arrc[0][i-1]=='+')
      {
        arrd[j-2]=arrd[j-2]+arrd[j-1];
        i=i-1;
        j=j-1;
      }
      else if (arrc[0][i-1]=='-')
      {
        arrd[j-2]=arrd[j-2]-arrd[j-1];
        i=i-1;
        j=j-1;
      }
      else if (arrc[0][i-1]=='*')
      {
        arrd[j-2]=arrd[j-2]*arrd[j-1];
        i=i-1;
        j=j-1;
      }
      else if(arrc[0][i-1]=='/')
      {
        arrd[j-2]=arrd[j-2]/arrd[j-1];/* 1+2*3/4+5  5   ++ 1 1.5  */
        i=i-1;
        j=j-1;
      }
    }
    printf("%lf\n",arrd[0]);
  }
 }
}
==============================end=============================
为什么老提示“不是合法的算术表达式”,要重新输入呢???
搜索更多相关主题的帖子: include 计算机 double 表达式 
2016-12-14 17:25
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
先说说哪里出了问题,调试没有发现问题,除了没有结束程序的机制之外~

还有,把你的输入方式也发来看看~

[此贴子已经被作者于2016-12-14 18:41编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-14 18:29
SSY006
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2015-12-13
收藏
得分:0 
调试没问题,但是输入测试数据的时候总提示那个输入错误时候才会弹出的错误,就是说测试不了数据。



图片附件: 游客没有浏览图片的权限,请 登录注册


2016-12-14 20:30
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10570
专家分:43038
注 册:2014-5-20
收藏
得分:0 
是否不支持空格,或是全角字符。
2016-12-14 20:42
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:0 
回复 3楼 SSY006
跟踪一下c的值看是怎么跳进那一块去的
2016-12-14 21:22
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
2*后面多了个空格,空格识别不了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-14 22:03
SSY006
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2015-12-13
收藏
得分:0 
我试过把括号都改成英语输入的了,但是还是不行,还是那个提示
2016-12-15 08:37
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
试试把这个表达式copy到你的程序试试,或者把输入方式改为命令行参,直接在控制台输入调试试试看~有问题再把你的输入copy过来~
2+3*(4-1)/5

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-15 19:17
SSY006
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2015-12-13
收藏
得分:0 
回复 8楼 九转星河
图片附件: 游客没有浏览图片的权限,请 登录注册
2016-12-16 21:00
SSY006
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2015-12-13
收藏
得分:0 
回复 8楼 九转星河
命令形参也试过也,还是那样
2016-12-16 21:02
快速回复:长整形四则运算
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014667 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved