| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2257 人关注过本帖, 1 人收藏
标题:长整形四则运算
只看楼主 加入收藏
SSY006
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2015-12-13
结帖率:75%
收藏(1)
已结贴  问题点数:10 回复次数:2 
长整形四则运算
#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-13 16:48
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:10 
题主输入什么了有这些提示?我检查的都正常啊!
只是对申请内存的最好做强制类型转换,如“next->p=calloc(1,sizeof(struct lianbiao));”修改为“next->p=(lianbiao*)calloc(1,sizeof(struct lianbiao));”
2016-12-16 10:45
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
//看到你在c版的讨论,才知道是输入了运算符号和数字符号以外的字符造成的,其实这些字符不处理就行了,注释掉处理非法字符的代码后正常,如下:
程序代码:
#include "StdAfx.h"
#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)

 {
  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=(lianbiao *)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=(lianbiao *)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]);
  }

 }
}
2016-12-18 18:48
快速回复:长整形四则运算
数据加载中...
 
   



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

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