| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1843 人关注过本帖, 1 人收藏
标题:计算器中的字符串问题
只看楼主 加入收藏
chichu
Rank: 2
来 自:安徽阜阳
等 级:论坛游民
帖 子:71
专家分:89
注 册:2010-4-14
结帖率:100%
收藏(1)
已结贴  问题点数:100 回复次数:8 
计算器中的字符串问题

刚学过栈,想制作一个计算器出来,但在数字和字符分别入栈中的数入栈上出了问题,不知如何将字符串中的数字拿出转化成数放入栈中,想了几天没有头绪,特来请教。。。。。。。。。。。。。
例如输入100+75-60如何将100 75 60分别拿出入栈
几天了没人回答,分数就提高点吧
搜索更多相关主题的帖子: 字符 计算器 
2010-05-11 18:12
skyhe1a
Rank: 2
等 级:论坛游民
帖 子:55
专家分:62
注 册:2010-4-10
收藏
得分:0 
#include <stdio.h>
main()
{
float a,b,c,d;
int i;
char P;
  scanf("%f",&a);
  for(i=0;i<=5;i++)
  {   scanf("%c",&P);

    switch(P)
   {case '+':  scanf("%f",&b);a=a+b;break;
    case '*':  scanf("%f",&b);a=a*b;break;
    case '/':  scanf("%f",&b);a=a/b;break;
    case '-':  scanf("%f",&b);a=a-b;break;
    default:  printf("%f",a);
     }
     }


getch();
}
2010-05-11 18:24
skyhe1a
Rank: 2
等 级:论坛游民
帖 子:55
专家分:62
注 册:2010-4-10
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册
2010-05-11 18:26
jcslt
Rank: 8Rank: 8
来 自:90-xx.com
等 级:蝙蝠侠
帖 子:251
专家分:975
注 册:2009-10-10
收藏
得分:0 
直接mfc还有界面

[ 本帖最后由 jcslt 于 2010-5-11 18:57 编辑 ]

www.
2010-05-11 18:52
jcslt
Rank: 8Rank: 8
来 自:90-xx.com
等 级:蝙蝠侠
帖 子:251
专家分:975
注 册:2009-10-10
收藏
得分:0 
直接scanf("%d%c%d",&a,&b,&c),然后case  b不就行了

www.
2010-05-11 18:55
skyhe1a
Rank: 2
等 级:论坛游民
帖 子:55
专家分:62
注 册:2010-4-10
收藏
得分:0 
回复 5楼 jcslt
那样写不能无限计算了~~分离了~~计算几个数都可以得
2010-05-11 19:02
zhangxf1989
Rank: 6Rank: 6
等 级:侠之大者
帖 子:96
专家分:419
注 册:2009-9-5
收藏
得分:90 
程序代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<conio.h>

#define SIZE1 20   //栈的大小
#define SIZE2 100  //表达式的最大长度

int check(char ch[]);  //检查表达式是否合乎规则
double convert(int *place);   //将表达式中的表示数字的字符串转化为双精度数
int OPSWR(char c);  //将运算符c存入运算符栈
int OVSWR(double s);  //将数s存入数字栈
int OPSRE(char *c);   //将处于运算栈顶的运算符取出
int OVSRE(double *s);   //同上
int OPSDEL();         //将运算符栈栈顶的运算符清除
int OVSDEL();         //同上
int ERRORINF(int flag);   //检查错误信息
int CALCULATE();       //主要功能的实现部分,运算原理的实现部分
int COMP();       //数值计算
// 运算符栈,top表示栈顶的位置
struct OPSSTA {
    char stack[SIZE1];
    int top;
} OPS;
//同上
struct OVSSTA {
    double stack[SIZE1];
    int top;
} OVS;
double RESULT;
char str[SIZE2],str1[SIZE1]; 

int main () {
    int flag=0,sign=0;
    OPS.top=-1;
    OVS.top=-1;
    printf("请输入表达式:");
    gets(str);
    strcpy(str1,str);    
    flag=check(str);
    sign=ERRORINF(flag);
    if(sign!=1) {
        getch();
        return -1;
    }
    flag=CALCULATE();
    sign=ERRORINF(flag);
    if(sign!=1) {
        getch();
        return -1;
    }
    else
        printf("\n%s = %.10f",str1,RESULT);        
    getch();
    return 1;
}
int check(char ch[])  {
    int i=0,j=0,left=0,right=0;    
    for(i=0;ch[i]!='\0';i++) {
        if(ch[i]>='('&&ch[i]<='9') {
            if(ch[i]=='(')
                left++;
            if(ch[i]==')')
                right++;            
            if(ch[i]==44)
                return -1;    
        }
    }
    ch[i]=';';
    ch[i+1]='\0';    
    if(left!=right)
        return -1;    
    for(i=0;ch[i]!='\0';i++) {
        if(ch[i]>='0'&&ch[i]<='9')
            continue;            
        if(ch[i]=='.')
            if(!((ch[i+1]>='0'&&ch[i+1]<='9')&&(ch[i-1]>='0'&&ch[i-1]<='9')))    
                return -1;                
        if(ch[i]=='+'||ch[i]=='-'||ch[i]=='*'||ch[i]=='/') {
            if(!((ch[i+1]>='0'&&ch[i+1]<='9'||ch[i+1]=='(')&&(ch[i-1]>='0'&&ch[i-1]<='9'||ch[i-1]==')')))
                return -1;
            continue;
        }        
        if(ch[i]=='(')
            if(ch[i-1]>='0'&&ch[i-1]<='9')
                return -1;        
        if(ch[i]==')')
            if(ch[i+1]>='0'&&ch[i+1]<='9')
                return -1;
    }
    return 1;
}
int ERRORINF(int flag) {
    switch(flag) {
        case 1:
            return 1;        
        case -1:
            printf("表达式格式错误!");
            return 0;        
        case -2:
            printf("栈OPS溢出!");
            return 0;        
        case -3:
            printf("除0!");
            return 0;        
        case -4:
            printf("栈OVS溢出!");
            return 0;        
        case -5:
            printf("栈OVS访问越界!");
            return 0;        
        case -6:
            printf("栈OPS访问越界!");
            return 0;        
        default:
            printf("程序运行错误!");
            return 0;
    }
} 

double convert(int *place) {
    char num[SIZE1];
    int i=0,j=*place;
    
    for(;str[j]>='0'&&str[j]<='9'||str[j]=='.';j++,i++)
        num[i]=str[j];
    num[i]='\0';
    *place=j;
    return atof(num);
}
int OPSWR(char c) {
    OPS.top++;
    if(OPS.top>=SIZE1)
        return -2;
    OPS.stack[OPS.top]=c;
    return 1;
}
int OVSWR(double s) {
    OVS.top++;
    if(OVS.top>=SIZE1)
        return -4;
    OVS.stack[OVS.top]=s;
    return 1;
}
int OPSRE(char *c) {
    if(OPS.top<0)
        return -5;
    else {
        *c=OPS.stack[OPS.top];
        OPSDEL();
    }
    return 1;
}
int OVSRE(double *s) {
    if(OVS.top<0)
        return -6;
    else {
        *s=OVS.stack[OVS.top];
        OVSDEL();    
    }
    return 1;
}
int OPSDEL() {
    if(OPS.top<0)
        return -5;
    else {
        OPS.stack[OPS.top]='\0';
        OPS.top--;
    }    
    return 1;
}
int OVSDEL() {
    if(OVS.top<0)
        return -6;
    else {
        OVS.stack[OVS.top]=0;
        OVS.top--;
    }
    return 1;
}
int CALCULATE() {
    int place,flag=0;
    double RES;
    flag=OPSWR(';');    
    if(flag!=1)
        return flag;
    for(place=0;str[place]!='\0';place++) {
        flag=0;        
        if(str[place]>='0'&&str[place]<='9') {
            RES=convert(&place);
            place--;
            flag=OVSWR(RES);
            if(flag!=1)
                return flag;
            continue;
        }        
        if(str[place]=='(') {
            flag=OPSWR('(');
            if(flag!=1)
                return flag;
            continue;
        }        
        if(str[place]==')')  {
            if(OPS.stack[OPS.top]!='(') {
                flag=COMP();
                if(flag!=1)
                    return flag;
                place--;
                continue;
            }
            else {
                flag=OPSDEL();
                if(flag!=1) {
                    return flag;
                }
            }
            continue;
        }        
        if(str[place]=='+'||str[place]=='-') {
            if(OPS.stack[OPS.top]=='('||OPS.stack[OPS.top]==';') {
                flag=OPSWR(str[place]);    
                if(flag!=1) {
                    return flag;
                }
                continue;
            }
            else {
                flag=COMP();
                if(flag!=1)
                    return flag;
                place--;
                continue;
            }        
        }        
        if(str[place]=='*'||str[place]=='/') {
            if(OPS.stack[OPS.top]=='*'||OPS.stack[OPS.top]=='/') {
                flag=COMP();
                if(flag!=1)
                    return flag;
                place--;
                continue;            
            }
            else {
                flag=OPSWR(str[place]);
                if(flag!=1)
                    return flag;
                continue;
            }    
        }        
        if(str[place]==';') {
            if(OPS.stack[OPS.top]==';') {
                RESULT=OVS.stack[OVS.top];
                return 1;
            }
            else {
                flag=COMP();
                if(flag!=1) {
                    return flag;
                }
                place--;
                continue;                
            }
        }
        return -1;
    }
    return 1;
}
int COMP() {
    int flag;
    double A,B,RES;
    char ops;    
    flag=OPSRE(&ops);
    if(flag!=1) {
        return flag;
    }    
    flag=OVSRE(&B);
    if(flag!=1) {
        return flag;
    }    
    flag=OVSRE(&A);
    if(flag!=1) {
        return flag;
    }
    switch(ops) {
        case '+':
            RES=A+B;
            break;
        case '-':
            RES=A-B;
            break;
        case '*':
            RES=A*B;
            break;
        case '/':
            if(B==0.0)
                return -3;
            RES=A/B;
            break;
        default:
            return -1;
    }
    flag=OVSWR(RES);
    if(flag!=1) {
        return flag;
    }
    return 1;
} 

这个是我以前写的,红色部分应该就是你说的问题,这个比较简单,但错误很多,推介看下面一个。(程序在 MinGW 3.4.5 编译通过)

以下这个是我不久前改写的版本(错误应该会比上面的那个少,但是复杂了很多)
https://bbs.bccn.net/thread-303187-1-1.html

[ 本帖最后由 zhangxf1989 于 2010-5-11 19:51 编辑 ]
2010-05-11 19:33
jcslt
Rank: 8Rank: 8
来 自:90-xx.com
等 级:蝙蝠侠
帖 子:251
专家分:975
注 册:2009-10-10
收藏
得分:0 
回复 6楼 skyhe1a
很多方法让他无限计算的吧!while(TRUE) while(1)

www.
2010-05-11 20:52
南国利剑
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:29
帖 子:1165
专家分:3536
注 册:2010-4-12
收藏
得分:10 
回复 楼主 chichu
给楼主提供一个现成的。
计算器.rar (1.63 MB)

南国利剑
2010-05-12 01:48
快速回复:计算器中的字符串问题
数据加载中...
 
   



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

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