| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 746 人关注过本帖
标题:第一次发调通的代码(给辛苦的kai斑竹)
只看楼主 加入收藏
想你的天空
Rank: 2
等 级:新手上路
威 望:5
帖 子:610
专家分:0
注 册:2004-12-30
收藏
 问题点数:0 回复次数:4 
第一次发调通的代码(给辛苦的kai斑竹)

#include<iostream> using namespace std;

template<class T> class polyNomial; template<class T> class polyNode { friend class polyNomial<T>; public: polyNode(){} private: T quotiety; //项的系数 T quotiety_degree;//项的指数 polyNode<T> *next; };

template<class T> ostream& operator<<(ostream& outs,const polyNomial<T>& x);

template<class T> class polyNomial { public: polyNomial(){ first = new polyNode<T>; } //~polyNomial(); polyNomial<T> *creatPoly(); //操作结果:输入m项的系数和指数,建立一元多项式p bool isEmpty(); //多项式存在返回false,否则返回true polyNomial<T> *order(); polyNomial<T> *addPoly(polyNomial<T>& pa,polyNomial<T>& pb, polyNomial<T>& pc); //前条件:存在多项式pa,pb //后条件:完成多项式加法运算,pa = pa+pb,并销毁pb polyNomial<T> *subPoly(polyNomial<T>& pa,polyNomial<T>& pb,polyNomial<T>& pc); //前条件:存在多项式pa,pb //后条件:完成多项式加法运算,pa = pa-pb,并销毁pb polyNomial<T> *mulPoly(polyNomial<T>& pa,polyNomial<T>& pb, polyNomial<T>& pc); //前条件:存在多项式pa,pb //后条件:完成多项式加法运算,pa = pa*pb,并销毁pb void Output(ostream& outs) const ; //前条件:存在多项式 //后条件:输出多项式 ostream& operator<< <>(ostream& outs,const polyNomial<T>& x); //重载输出流 private: mutable T polyNumber; //项数 polyNode<T> *first; }; #include "multinomial.h"

//创建多项式函数 template<class T> polyNomial<T> *polyNomial<T>::creatPoly() { polyNode<T> *link,*s; link = first; cout<<"输入多项式的项数"<<endl; cin>> polyNumber ; for(int i = 0; i < polyNumber ; i++) { cout<<"输入多项式的系数"<<endl; s = new polyNode<T>; cin>>s->quotiety; cout<<"输入多项式的指数"<<endl; cin>>s->quotiety_degree;

link->next = s; link = s; } link->next = NULL; return this; }

/* //析构函数 template<class T> polyNomial<T>::~polyNomial<T>() { polyNode<T>* link; while(first) { link = first->next; delete first; first = link; } } */

//判断多项式是否为空 template<class T> bool polyNomial<T>::isEmpty() { if(first == NULL) return true; else return false; }

template<class T> polyNomial<T> *polyNomial<T>::order() { polyNode<T> *p = first->next; polyNode<T> *q = first->next; T _quotiety; T _quotiety_degree;

for( ; p ; p = p->next ) for( q = p->next ; q ; q = q->next ) if( (p->quotiety_degree)< (q->quotiety_degree)) { _quotiety = p->quotiety ; _quotiety_degree = p->quotiety_degree; p->quotiety = q->quotiety; p->quotiety_degree = q->quotiety_degree; q->quotiety = _quotiety; q->quotiety_degree = _quotiety_degree; } return this; }

//多项式相加函数 template<class T> polyNomial<T> *polyNomial<T>::addPoly(polyNomial<T>& pa,polyNomial<T>& pb,polyNomial<T>& pc) { //多项式的项已经以指数低到高的顺序排序了 polyNode<T> *p1 = pa.first->next; polyNode<T> *p2 = pb.first->next; polyNode<T> *link,*s; link = pc.first; // link 指向pc多项式(初始pc是空的)

while( p1 && p2 ) { if((p1->quotiety_degree)==(p2->quotiety_degree)) { //如果指数相同,则pa,pb的系数相加 s = new polyNode<T>; s->quotiety = p1->quotiety + p2->quotiety; s->quotiety_degree = p1->quotiety_degree;

link->next = s; link = s; p1 = p1->next ; p2 = p2->next ; }

else { //pa,pb的指数不同 s = new polyNode<T>; //把pa插入pc的最后1个节点 s->quotiety = p1->quotiety; s->quotiety_degree = p1->quotiety_degree; link->next = s; link =s; p1 = p1->next ; s = new polyNode<T>; //把pb插入pc的最后1个节点 s->quotiety = p2->quotiety; s->quotiety_degree = p2->quotiety_degree; link->next = s; link =s; p2 = p2->next ; } }

while (p1) //若pb的项数为空,则把pa继续插入pc的最后 { s = new polyNode<T>; s->quotiety = p1->quotiety; s->quotiety_degree = p1->quotiety_degree; link->next = s; link =s; p1 = p1->next ; }

while (p2 ) //若pa的项数为空,则把pb继续插入pc的最后 { s = new polyNode<T>; s->quotiety = p2->quotiety; s->quotiety_degree = p2->quotiety_degree; link->next = s; link =s; p2 = p2->next ; } link->next = NULL; return this; }

//多项式相减函数 template<class T> polyNomial<T> *polyNomial<T>::subPoly(polyNomial<T>& pa,polyNomial<T>& pb,polyNomial<T>& pc) { //多项式的项已经以指数低到高的顺序排序了 polyNode<T> *p1 = pa.first->next; polyNode<T> *p2 = pb.first->next; polyNode<T> *link,*s; link = pc.first; // link 指向pc多项式(初始pc是空的)

while( p1 && p2 ) { if((p1->quotiety_degree)==(p2->quotiety_degree)) { //如果指数相同,则pa,pb的系数相加 s = new polyNode<T>; s->quotiety = p1->quotiety - p2->quotiety; s->quotiety_degree = p1->quotiety_degree;

link->next = s; link = s; p1 = p1->next ; p2 = p2->next ; }

else { //pa,pb的指数不同 s = new polyNode<T>; //把pa插入pc的最后1个节点 s->quotiety = p1->quotiety; s->quotiety_degree = p1->quotiety_degree; link->next = s; link =s; p1 = p1->next ;

s = new polyNode<T>; //把pb插入pc的最后1个节点 s->quotiety = p2->quotiety; s->quotiety_degree = p2->quotiety_degree; link->next = s; link =s; p2 = p2->next ; } }

while (p1) //若pb的项数为空,则把pa继续插入pc的最后 { s = new polyNode<T>; s->quotiety = p1->quotiety; s->quotiety_degree = p1->quotiety_degree; link->next = s; link =s; p1 = p1->next ; }

while (p2 ) //若pa的项数为空,则把pb继续插入pc的最后 { s = new polyNode<T>; s->quotiety = p2->quotiety; s->quotiety_degree = p2->quotiety_degree; link->next = s; link =s; p2 = p2->next ; } link->next = NULL; return this; } //多项式相乘函数 template<class T> polyNomial<T> *polyNomial<T>::mulPoly(polyNomial<T>& pa,polyNomial<T>& pb, polyNomial<T>& pc) { polyNode<T> *p1 = pa.first->next; polyNode<T> *p2 = pb.first->next; polyNode<T> *q; polyNode<T> *link,*s; link = pc.first; // link 指向pc多项式(初始pc是空的) while(p1) { while(p2) //pa里的第1项和pb里的每一项,类推 { s = new polyNode<T>; s->quotiety = p1->quotiety * p2->quotiety; s->quotiety_degree =p1->quotiety_degree + p2->quotiety_degree; link->next = s; link = s; if(p2) p2 = p2->next;

} if(p1) p1 = p1->next; p2 = pb.first->next;

} link->next = NULL;

order(); //按指数从高到低排序

//整理相乘后的新链表:把相邻的元素比较,若指数相同的,则相加的结果放到比较的第2个项,并删除与之相连的项 link = pc.first ; //link指向当前指针的前驱

q = link->next ; for( ; q->next!=NULL ; link = link->next , q = link->next) { if(q->quotiety_degree == q->next->quotiety_degree)//若指数相同的,则把相加的结果放到比较的第1个项 { q->next->quotiety += q->quotiety; //指数相同的系数相加,指数不变 if(q->next!=NULL) link->next = q->next; //删除与之相连的项 q = q->next ; } } return this ; } //输出 template<class T> void polyNomial<T>::Output(ostream& outs) const { polyNode<T> *current; polyNode<T> *p; outs<<"结果是:"<<endl; current = first ; for( p = current->next ; p != NULL; current = current->next , p = current->next) //current指向当前节点的前驱, p指向当前节点 { if(p->quotiety == 0) //如果项系数是0的项,则删除 { current->next = p->next ; p = p->next ; } if(p->quotiety_degree!=0) { if(p->quotiety>0) //系数为>0则不打印+,系数为>0则不打印- outs<<"+" << p->quotiety<<"y" <<" ^ "<<p->quotiety_degree; else outs<<"-" <<"y" <<" ^ "<<p->quotiety_degree; } //指数为0的情况,则不打印 x else { if(p->quotiety>0) outs<<"+" << p->quotiety; else if(p->quotiety == 0) outs<<p->quotiety; else outs<<"-" <<p->quotiety; } } } //重载<< template<class T> ostream& operator<<(ostream& outs,const polyNomial<T>& x) { x.Output(outs); return outs; } #include"multinomial.cpp" int main() { polyNomial<int> pa,pb,add,sub,mul; pa.creatPoly(); pa.order(); cout<<"排序后的链表pa:"<<endl; cout<<pa<<endl;

pb.creatPoly(); pb.order(); cout<<"排序后的链表pb:"<<endl; cout<<pb<<endl;

add.addPoly(pa,pb,add); cout<<"输出相加后的链表:"<<endl; cout<<add<<endl;

sub.subPoly(pa,pb,sub); cout<<"输出相减后的链表:"<<endl; cout<<sub<<endl;

mul.mulPoly(pa,pb,mul); cout<<"输出2个多项式相乘的结果:"<<endl; cout<<mul<<endl;

system("pause"); return 0; }

自己用断点调试, 终于可以用了, 谢谢kai斑竹的提醒, 您的1句话,胜过帮我改一万个代码!

搜索更多相关主题的帖子: kai 代码 斑竹 辛苦 
2005-09-16 23:24
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
想你的天空, 你最近算是跟指针干上啦。 你的程序我就不看了, 你的进步是你自己的努力啊. 单步调试是程序员必须会的. 还有写程序不可以一气呵成, 必须一步一步来,比如写完Contructor 函数, 就马上测试, VC是可以看地址下的情况的. 还有就是自己写个display 函数,来看每个变量在一行或一段程序执行后的变量情况. 这就好比向前走了一步后,马上看看前面走的对不对? 这样做的目的是为了不把错误累积,错误有时有个传递效应. 以后不要用 "您" 来称呼. 上海话里没有这个单词.

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-09-17 01:53
想你的天空
Rank: 2
等 级:新手上路
威 望:5
帖 子:610
专家分:0
注 册:2004-12-30
收藏
得分:0 
kai斑竹, 我喜欢全部写完函数,然后屏蔽其他函数,来测试第一个函数,一个个函数调通,当然涉及到不调试的函数就屏蔽掉。
  我用.NET的VC++,来跟踪地址和变量的,一步步看执行的结果

2005-09-17 10:26
zinking
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:35
帖 子:916
专家分:0
注 册:2004-12-5
收藏
得分:0 
kai斑竹还是那么热心啊,辛苦了啊!顶一下

http://kongfuziandlife. http://codeanddesign.
2005-09-17 10:58
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
想你的天空, 对于你目前的程序,全部写完程序后再来调试,还可以做,因为程序的规模还不大。但是对于规模比较大或者很大的程序,这样做的可行性几乎是没有的。举个极端点的例子,如果让你来写 windows操作系统,你也打算全部写完后再来调试吗?那个错误就大了,而且错误之间往往互相有联系性。这个互相联系性意味着什么?你知道吗?这个互相联系性,意味着有些所谓的错误,并不是错误,当你删除或修改那所谓的错误的时候,你正在犯一个新的错误。所以你如果现在就有了一个好的编程习惯,那么以后当你真正写比较大的程序时,就不会乱了阵脚了。还有你现在的程序就那么一两个class,几百行代码,不用规划,落笔就可以写。但是一个大的Project可不是你落笔就可以写的。仔细的规划就是一个好的开端,而且要将你的规划与客户讨论,直到他满意,认可,才能写程序,程序的阶段成果都要告诉你的客户,让他看效果,如果他不满意,或有新的想法,你就可以及时修改。要不然,等你程序全部写完了,客户却说,这个不行,那个不行,或者他有新的想法,那你就惨了。到那个时候,修改代码可比重新写还难。 还有就是代码的模式问题,有两种模式可以采用。我把它命名为消息机制模式和对象互相认识模式。 这两种模式互有优缺点。采用消息机制模式,可以开发大的Project,也可以开发小的Project。优点在于,他对程序的收缩性具有很好的支持,你想象一下,如果客户经常地更改他的想法,比如在你最终将执行代码或程序交给他之前,他突然对你说,他要增加或去掉某个功能,那你准备怎么做?采用消息机制模式,你只需对一个控制类中的代码进行修改,而无需对其他class做任何改动,这样是不是很方便?因为这个控制类是整个程序的灵魂,换句话话说,每个类所生成的Object不需要互相认识,他们只需认识那个控制类就可以了。而如果采用对象互相认识模式,那那个改动就大了,你要对所有想关的类做代码改动了,我是不喜欢这样做的。不过如果程序结合使用这两种模式,将使程序的效率和开发速度大大提高。另外也取决于你是否具有这个能力。 我没有看过Pattern Design 这本书,据说这本书中提到几十种模式,好像是30多种。我大概已经用到了某种模式,不过我还是根据我的经验,总结出了以上两种模式。 如果有兴趣,可以单独来讨论这两种模式。

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-09-17 20:09
快速回复:第一次发调通的代码(给辛苦的kai斑竹)
数据加载中...
 
   



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

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