| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2407 人关注过本帖
标题:[求助]连续四则运算的调试
只看楼主 加入收藏
heliujin
Rank: 2
等 级:论坛游民
帖 子:249
专家分:14
注 册:2006-3-14
结帖率:100%
收藏
 问题点数:0 回复次数:35 
[求助]连续四则运算的调试

程序如下:
#include<iostream.h>

class continual
{
public:
continual(){}

continual(int size):topa(0),bottoma(0),topb(1),bottomb(1),ta(0),tb(0),w(0)
{
a=new double[size];
b=new char[size];
b[0]='\0';
}

~continual()
{
delete []a;
delete []b;
}

void pusha(double q)
{
if(topa-bottoma>100)
{
cout<<"full!"<<endl;
}
else
{
if(topa==bottoma)
{
a[topa]=q;
topa=topa+2;
}
else
{
a[topa]=q;
topa=topa+2;
}
}
}

double popa()
{
if(topa<=bottoma)
{
cout<<"empty!"<<endl;
return 0;
}
else
{
return a[topa-2];
topa=topa-2;
}
}

void pushb(char p)
{
if(topb-bottomb>99)
{
cout<<"full!"<<endl;
}
else
{
if(topb=bottomb)
{
b[topb]=p;
topb=topb+2;
}
else
{
b[topb]=p;
topb=topb+2;
}
}
}

char popb()
{
if(topb<=bottomb)
{
cout<<"empty!"<<endl;
return 0;
}
else
{
return b[topb-2];
topb=topb-2;
}
}

void lianxv()
{
if(topa==0&&topb==1)
{
for(int i=0;i<100;i++)
{
if(i%2==0)
{
double q;
cout<<"请输入要操作的数:"<<endl;
cin>>q;
pusha(q);
ta=ta+1;
w=w+1;
}

if(i%2==1)
{
char p;
cout<<"请输入要进行的符号:"<<endl;
cin>>p;
const char e='e';
if(p==e)
{
break;
}
else
{
pushb(p);
tb=tb+1;
w=w+1;
}
}
}
}

cout<<"要进行操作的式子是:";

for(int j=0;j<w;j=j+2)
{
cout<<a[j];
cout<<b[j+1];
}
cout<<endl;

for(int k=1;k<=2*tb-1;k=k+2)
{
if(b[k]=='*'||b[k]=='/')
{
if(b[k]=='*')
{
a[k-1]=a[k-1]*a[k+1];
for(int d=k+3;d<=2*ta-1;d=d+2)
{
a[d-2]=a[d];
topa=topa-2;
}
for(int e=k+2;e<=2*tb-1;e=e+2)
{
b[e-2]=b[e];
topb=topb-2;
}
}
else
{
a[k-1]=a[k-1]/a[k+1];
for(int d=k+3;d<=2*ta-1;d=d+2)
{
a[d-2]=a[d];
topa=topa-2;
}
for(int e=k+2;e<=2*tb-1;e=e+2)
{
b[e-2]=b[e];
topb=topb-2;
}
}
}
}

for(int h=1;h<=2*tb-1;h=h+2)
{
if(b[h]=='+'||b[h]=='-')
{
if(b[h]=='+')
{
a[h-1]=a[h-1]+a[h+1];
for(int d=h+3;d<=2*ta-1;d=d+2)
{
a[d-2]=a[d];
topa=topa-2;
}
for(int e=h+2;e<=2*tb-1;e=e+2)
{
b[e-2]=b[e];
topb=topb-2;
}
}
else
{
a[h-1]=a[h-1]-a[h+1];
for(int d=h+3;d<=2*ta-1;d=d+2)
{
a[d-2]=a[d];
topa=topa-2;
}
for(int e=h+2;e<=2*tb-1;e=e+2)
{
b[e-2]=b[e];
topb=topb-2;
}
}
}
}
}

private:
int topa;
int topb;
int bottoma;
int bottomb;
int ta;
int tb;
int w;
double *a;
char *b;
};

int main()
{
continual x(100);

x.lianxv();

cout<<x.popa();

return 0;
}

其结果不是我要的结果 肯定哪个地方出错了 我找了好久也没找出来 希望大家帮帮忙 谢谢大家了




搜索更多相关主题的帖子: continual 运算 调试 double 
2006-07-25 08:39
heliujin
Rank: 2
等 级:论坛游民
帖 子:249
专家分:14
注 册:2006-3-14
收藏
得分:0 
怎么没人回呢?我自己回一个吧

各位高手们 帮帮小弟吧
急用啊
2006-07-25 19:47
ysol
Rank: 1
等 级:新手上路
帖 子:107
专家分:0
注 册:2006-6-11
收藏
得分:0 
楼主啊,你写的东西不想让人看哈
这么长代码没有一行注释,让别人怎么帮你调?
2006-07-25 21:29
ysol
Rank: 1
等 级:新手上路
帖 子:107
专家分:0
注 册:2006-6-11
收藏
得分:0 

#include <iostream>

using namespace std;

class continual
{
public:
continual(){}

continual(int size):topa(0),bottoma(0),topb(0),bottomb(0),ta(0),tb(0),w(0)
{
a=new double[size];
b=new char[size];
// b[0]='\0'; //完全没有必要
}

~continual()
{
delete []a;
delete []b;
}

void pusha(double q)
{
if(topa-bottoma>100)
{
cout<<"full!"<<endl;
return;
}
else
{
// if(topa==bottoma)
// {
a[topa]=q;//此处与else完全一样帮你改了完全没有必要+2
topa++;
// }
// else
// {
// a[topa]=q;
// topa=topa+2;
// }
}
}

double popa()
{
if(topa==bottoma)
{
cout<<"empty!"<<endl;
exit(1);
// return 0;//都空了还return?????????
}
else
{
return a[topa]//-2];//先return 了下面就执行不了
topa--;//******************此处要做修改修改***********************************
}
}//此函数的return???????????????

void pushb(char p)
{
if(topb-bottomb>99)
{
cout<<"full!"<<endl;
return;//满了还不继续执行帮你return了?????
}
else
{
//if(topb=bottomb)
//{
//b[topb]=p;
//topb=topb+2;
//}
//else
//{
b[topb]=p;
topb++;
//}
}
}

char popb()
{
if(topb<=bottomb)
{
cout<<"empty!"<<endl;
return 0;
}
else
{
topb--;
return b[topb];//此处修改了
}
}

void lianxv()//这个函数够牛X这么长!!后面的2个for给点注释!!!!
{
if(topa==0&&topb==1)//此处自己看着改吧
{
for(int i=0;i<100;i++)
{
if(i%2==0)
{
double q;
cout<<"请输入要操作的数:"<<endl;//这里要做判断接受的是否为数字
cin>>q;//此时输入e会导致什么结果????
pusha(q);
ta=ta+1;
// w=w+1;//w完全没有存在的必要
}

if(i%2==1)
{
char p;
cout<<"请输入要进行的符号:"<<endl;//这里要判断接受的是否为运算符
cin>>p;
//const char e='e';//有必要还定义个e????
if(p=='e')//修改了.
{
break;
}
else
{
pushb(p);
tb=tb+1;
//w=w+1;
}
}
}
}

cout<<"要进行操作的式子是:";

//for(int j=0;j<w;j=j+2)
//{
// cout<<a[j];
// cout<<b[j+1];//有必要这么做吗?
//}
for(int j=0; j<(ta>tb?ta:tb); j++)
{
cout<<a[j]<<b[j];
}
cout<<endl;
//下面自己修改吧!!!一个字累!!!!!!!!
for(int k=1;k<=2*tb-1;k=k+2)
{
if(b[k]=='*'||b[k]=='/')
{
if(b[k]=='*')
{
a[k-1]=a[k-1]*a[k+1];
for(int d=k+3;d<=2*ta-1;d=d+2)
{
a[d-2]=a[d];
topa=topa-2;
}
for(int e=k+2;e<=2*tb-1;e=e+2)
{
b[e-2]=b[e];
topb=topb-2;
}
}
else
{
a[k-1]=a[k-1]/a[k+1];
for(int d=k+3;d<=2*ta-1;d=d+2)
{
a[d-2]=a[d];
topa=topa-2;
}
for(int e=k+2;e<=2*tb-1;e=e+2)
{
b[e-2]=b[e];
topb=topb-2;
}
}
}
}

for(int h=1;h<=2*tb-1;h=h+2)
{
if(b[h]=='+'||b[h]=='-')
{
if(b[h]=='+')
{
a[h-1]=a[h-1]+a[h+1];
for(int d=h+3;d<=2*ta-1;d=d+2)
{
a[d-2]=a[d];
topa=topa-2;
}
for(int e=h+2;e<=2*tb-1;e=e+2)
{
b[e-2]=b[e];
topb=topb-2;
}
}
else
{
a[h-1]=a[h-1]-a[h+1];
for(int d=h+3;d<=2*ta-1;d=d+2)
{
a[d-2]=a[d];
topa=topa-2;
}
for(int e=h+2;e<=2*tb-1;e=e+2)
{
b[e-2]=b[e];
topb=topb-2;
}
}
}
}
}

private:
int topa;
int topb;
int bottoma;
int bottomb;
int ta;
int tb;
int w;
double *a;
char *b;
};

int main()
{
continual x(100);

x.lianxv();

cout<<x.popa();

return 0;
}

[此贴子已经被作者于2006-7-25 22:22:47编辑过]

2006-07-25 22:17
heliujin
Rank: 2
等 级:论坛游民
帖 子:249
专家分:14
注 册:2006-3-14
收藏
得分:0 

楼上的可能没明白是程序的意思 都怪我没表明注释 我下次不敢这么做了 我的总体意思是
用两个栈,一个存储数字 一个存储符号
比如:
a中的元素: 3 5 2
b中的元素: + *
此时数组a中的元素就是a[0],a[2],a[4],用来存储要操作的数,而a[1],a[3]里都没有值或是默认的 反正不管它了
此时数组b中的元素就是b[1],b[3],用来存储符号。
然后判断*和/这两个运算符号的优先级别比+和-的要高
最后进行计算 最后剩一个 弹出栈 就是要求的结果了
请大家再指教指教吧

2006-07-26 06:50
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
heliujin,

算法是很重要的, 一般面对一个问题, 你知道是怎样一个解题过程吗? 我说说我的看法, 当你拿到一个问题后, 你或许马上会有一种直觉, 那就是什么数据结构比较合适, 对于比较简单的问题, 往往这种直觉更强烈, 但是这种直觉并不一定是正确的. 如果你面对一个庞大的问题的时候, 你就不会有那种数据结构的直觉了, 取而代之的是算法, 你会首先去思考, 改用什么算法, 然后再是考虑用什么数据结构.

你的这个题, 同样也是这个问题, 你不应该先确定数据结构. 你应该先确定算法, 在算法确定下来后再确定数据结构, 请注意, 你必须确保你的算法是正确的, 可行的, 这里不谈效率的问题, 至少是可行的算法. 然后再来讨论数据结构.

你的代码比较长, 也没有详细地说明, 要让人直接深入代码去研究, 去理解, 这样是很吃力的.

你5楼介绍了你所用的数据结构, 但是没有谈到算法, 其实这道题目很有意思的是算法. 希望你说说你的算法. 这样才能帮你进一步看代码.

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2006-07-26 07:14
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
heliujin,

刚才, 我想了想,( 对不起我没有看你的代码) 我想到了一个很有意思的算法, 一个完全 OOP 的算法, 用我的这个算法, 你不需要什么 stack, 你需要一个完全新的数据结构.

如果你想告诉我你的算法, 我很乐意听.

我现在要睡觉了, 明天再来和你讨论.

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2006-07-26 07:23
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

kai,

期待ing...


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-07-26 13:27
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
楼主还是没有给出他的算法, 很遗憾, 其实讨论编程没有必要在代码层面来讨论, 在逻辑层面讨论就可以了, 合格的程序员应该有能力将逻辑层面的算法在代码层面实现。

我不知道, 楼主到底是在输入的同时就得到结果呢还是在表达式输入完毕以后再求答案? 这两者的做法是不同的。

这里针对表达式输入完毕以后求解来具体说说。

第一, 对表达式的合法性做出判断, 如果合法继续, 否则给出出错信息。

第二, 表达式肯定是合法的。 计算表达式。

从程序过程来看就这么两步。 如果从OOP 的角度来看, 表达式是一个对象。 这个对象有些什么功能呢? 显然那个计算功能是必须有的。 在表达式这个类中应该有一个静态函数, 用于判断某个String 是否为一个合法的表达式, 如果合法, 则通过构造函数建立表达式对象。 然后调用表达式对象的计算方法, 计算出结果。 就这么简单。

这个计算方法的实现, 是通过表达式的私有成员成员函数的辅助得以实现的。 这句话怎么来理解? 要理解这句话, 要来看什么是表达式了, 一个表达式的最基本的结构为 一个运算符加两个运算元。 运算符可以是加减乘除中的任何一个, 乘除的优先级高于加减, 对于同等优先级, 按先来先做的原则进行。 对于乘除, 必须同时具有左运算元和右运算元, 而对于加减就没有这个强求, 但是右运算元必须是存在的。 这些是一些基本的概念。 那么对于一个复杂的表达式, 如何来具体操作呢? 接下来, 必须提一个新的概念, 那就是一个运算元可以是一个具体的值, 也可以是一个合法的表达式, 这样的话, 一个复杂的表达式就是多个表达式的整合。 对复杂表达式的运算就是对多个表达式的整合运算。 也就是说, 一个表达式嵌套了其他的表达式。 那么这样的数据结构看来是什么样的呢? 是一个树形的结构。 如果你将一个复杂的表达式最后拆解为一个树形的结构, 然后对整个树形结构组建成的对象求解就可得出最终的解。

现在来看看这个树形结构, 一个节点的组成为 left, op(运算符), right, value, 其中的left , right 也为 节点本身。 这样整个问题就是将表达式转换为树形结构的问题了。

举个具体一点的例子: 1 + 2 * 3 - 4
首先是一个parse 的过程, 读到第一个数 1, 当做出这样的确定的时候, 是因为 你已经读到了那个加号。 这个时候, 你可以确定两样东西, 那就是一个左节点 1, 一个中间节点 + . 这样右节点便是剩余的部分了。 这样问题就转换了, 问题现在转换为 将剩余部分转换为一棵树, 运用同样的方法, 我们可以将 2*3 - 4 建立树的模型, 首先 2 * 3 建立起来, 由于下面出现的是 - , 所以我们可以将 2 * 3 这个树 转换为节点, 即 6, 这样, 6 为 left, - 为中间节点, 4 为 right. 现在来看整体, left 为 1 , 中间为 +, right 为 树(6 - 4), 得出6 - 4 的结果为 2 。 现在整体就是 树( 1 + 2 ), 最后得出 3

如果, 你不建立树的模型, 你也可以用递归的方式来做, 这就是 functional programming 了。 这个在 lisp 和 scheme 语言中被广泛的用到。 这个递归的想法很简单, 思想的出发点就是 result = first op rest. 而 rest 又回到了这个计算模式。 

算法就说到这里。

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2006-07-26 14:49
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
heliujin,
今天没有时间帮你写代码了, 明天吧.

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2006-07-26 16:21
快速回复:[求助]连续四则运算的调试
数据加载中...
 
   



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

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