设为首页收藏本站

新微赢技术网

 找回密码
 注册
搜索
热搜: 回贴
查看: 1476|回复: 2
打印 上一主题 下一主题

[求助]动态数组内存错误

[复制链接]
跳转到指定楼层
1#
发表于 2009-11-6 02:03:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,小弟这几天比较晕,用动态数组编了个有关多项式计算的程序,编译时没错,但运行时老出现内存错误.希望高手们帮看下呀,在此先谢谢大家了
下面是源程序:为了方便调试,附件里传了那个程序的三个源文件.

///////////C12_6.h/////////
//////////类的接口文件////
#ifndef __C12_6__
#define __C12_6__
#include <iostream>
using namespace std;
namespace wei
{
class Polynomial
{
public:
Polynomial();
Polynomial(int n);//n为最高幂指数
~Polynomial();
int size();// 返回项数
void resize(int n);//重新设定数组大小
void set(double*,int);//为数组填入数据
friend ostream& operator<<(ostream& outs,Polynomial& p);
friend Polynomial& operator +(Polynomial& P1,Polynomial& p2);
friend Polynomial& operator +(const double m, Polynomial p2);
friend Polynomial& operator +( Polynomial P1,const double m);
friend Polynomial& operator -(Polynomial& P1,Polynomial& p2);
friend Polynomial& operator -(const double m, Polynomial p2);
friend Polynomial& operator -( Polynomial P1,const double m);
friend Polynomial& operator *(Polynomial& P1,Polynomial& p2);
friend Polynomial& operator *(const double m, Polynomial p2);
friend Polynomial& operator *( Polynomial P1,const double m);
void operator =(Polynomial p1);
private:
double* data;//存放系数 次数从0到n
int n;//记录数据数量(即项数)
};
}
#endif
///////////////////C12_6.cpp////////////
///////////////////类的实现/////////////
#include <iostream>
#include "c12_6.h"
using namespace std;
namespace wei
{
Polynomial::Polynomial()
{
n=50;
data=new double[n];
}
Polynomial::Polynomial(int n)//n为最高幂指数
{
this->n=n+1;
data=new double[n];
}
Polynomial::~Polynomial()
{
delete []data;
}
int Polynomial:: size()
{
return n;
}// 返回项数
void Polynomial::resize(int m)
{
n=m;
data=new double[n];
}
void Polynomial::set(double* m,int sz)
{
n=sz;
data=new double[n];
for(int i=0;i<sz;i++)
data[i]=m[i];
}
Polynomial& operator +(Polynomial& P1,Polynomial& p2)
{
Polynomial temp;
temp=(P1.size()>=p2.size())?P1:p2;
if(P1.size()>=p2.size())
for(int i=0;i<p2.size();i++)
temp.data[i]=P1.data[i]+p2.data[i];
else
for(int i=0;i<P1.size();i++)
temp.data[i]=P1.data[i]+p2.data[i];
return temp;
}
Polynomial& operator +(const double m, Polynomial p2)
{
p2.data[0]+=m;
return p2;
}
Polynomial& operator +( Polynomial P1,const double m)
{
P1.data[0]+=m;
return P1;
}
Polynomial& operator -(Polynomial& P1,Polynomial& p2)//p1-p2
{
Polynomial temp;
if(P1.size()>=p2.size())//p1项数多
{
temp=P1;
for(int i=0;i<p2.size();i++)
temp.data[i]-=p2.data[i];
}
else//p2项数多
{
temp=p2;
for(int i=0;i<temp.size();i++)
temp.data[i]=-temp.data[i];
for(int j=0;j<P1.size();j++)
temp.data[j]+=p2.data[j];
}
return temp;
}
Polynomial& operator -(const double m, Polynomial p2)
{
for(int i=0;i<p2.size();i++)
p2.data[i]=-p2.data[i];
p2.data[0]+=m;
return p2;
}
Polynomial& operator -( Polynomial P1,const double m)
{
P1.data[0]-=m;
return P1;
}
Polynomial& operator *(Polynomial& P1,Polynomial& p2)
{
Polynomial temp;
temp.resize(P1.size()+p2.size());
int i,j,k;
int s=P1.size()+p2.size();
for(i=0;i<s;i++)
temp.data[i]=0.0;
for(i=0;i<s;i++)
for(j=0;j<p2.size();j++)
for(k=0;k<P1.size();k++)
{
if((j+k)==i)
temp.data[i]+=p2.data[j]*P1.data[k];
}
return temp;
}
Polynomial& operator *(const double m, Polynomial p2)
{
for(int i=0;i<p2.size();i++)
p2.data[i]*=m;
return p2;
}
Polynomial& operator *( Polynomial P1,const double m)
{
for(int i=0;i<P1.size();i++)
P1.data[i]*=m;
return P1;
}
void Polynomial::operator =(Polynomial p1)
{
n=p1.size();
data=new double[n];
for(int i=0;i<n;i++)
data[i]=p1.data[i];
}
ostream& operator<<(ostream& outs,Polynomial& p)
{
for(int i=0;i<p.size();i++)
{
if(p.data[i]!=0.0)
{
outs<<p.data[i];
for(int j=0;j<i;j++)
outs<<"*x";
if(i<p.size()-1 && p.data[i]>0.0)
outs<<" + ";
}
}
outs<<endl;
return outs;
}
}
/////////////////////////测试程序/////////////////
/////////////////////////main.cpp/////////////////
#include <iostream>
#include "C12_6.h"
using namespace std;
using namespace wei;
void main()
{
Polynomial p1(3),p2(2),p3(5);
//暂时记p1为三次多项式,p2为二次
double* temp=new double[p1.size()];
double* b=new double[p2.size()];
cout<<"按升幂依次输入第一个多项式系数:"<<endl;
for(int i=0;i<p1.size();i++)
cin>>temp[i];
p1.set(temp,p1.size());
cout<<"按升幂依次输入第二个多项式系数:"<<endl;
for(int j=0;j<p2.size();j++)
cin>>b[j];
p2.set(b,p2.size());
cout<<"你输入的第一个多项式是: ";
cout<<p1<<"你输入的第二个多项式是: "<<p2;
// cout<<p1-p2<<endl;
// cout<<p1+p2<<endl;
// cout<<p1*p2<<endl;
// cout<<p1+3.0<<endl;
// cout<<p1-3.0<<endl;
// cout<<3.0-p1<<endl;
// cout<<3.0*p1<<endl;
// cout<<p1*3.0<<endl;
// cout<<3.0+p1<<endl;
delete []temp;
delete []b;
}

附件: 只有本站会员才能下载或查看附件,请您 登录 或 注册
2#
发表于 2009-11-6 02:03:26 | 只看该作者
最好加上+=,-=这两个运算符,就更完善些。。。

程序代码:
class Polynomial
{
double* data;//存放系数 次数从0到n
int n;//记录数据数量(即项数)
public:
Polynomial()
{
n=50;
data=new double[n];
}
Polynomial(int num)//n为最高幂指数
{
this->n=num;
data=new double[n];
}
Polynomial(const Polynomial& p)
{
n=p.n;
data=new double[n];
copy(p.data,p.data+n,data);
}
Polynomial& operator =(Polynomial p)
{
resize(p.size());
for(int i=0;i<p.size();i++)
data[i]=p.data[i];
return *this;
}
~Polynomial()
{
delete []data;
}
int size()
{
return n;
}// 返回项数
void resize(int m)
{
n=m;
delete []data;
data=new double[n];
}
void set(double* m,int sz)
{
resize(sz);
for(int i=0;i<sz;i++)
data[i]=m[i];
}
Polynomial operator -()
{
Polynomial temp(*this);
for(int i=0;i<size();i++)
{
temp.data[i]*=-1;
}
return temp;
}
Polynomial operator +(Polynomial& p)
{
Polynomial temp;
temp=(size()>=p.size())?(*this):p;
if(size()>=p.size())
for(int i=0;i<p.size();i++)
temp.data[i]=data[i]+p.data[i];
else
for(int i=0;i<size();i++)
temp.data[i]=data[i]+p.data[i];
return temp;
}
friend Polynomial operator +(const double m, Polynomial p)
{
Polynomial temp=p;
temp.data[0]+=m;
return temp;
}
Polynomial operator +(const double m)
{
Polynomial temp=*this;
temp.data[0]+=m;
return temp;
}
Polynomial operator -(Polynomial& p)
{
Polynomial temp;
if(size()>=p.size())//p1项数多
{
temp=*this;
for(int i=0;i<p.size();i++)
temp.data[i]-=p.data[i];
}
else//p2项数多
{
temp=p;
for(int i=0;i<temp.size();i++)
temp.data[i]=-temp.data[i];
for(int j=0;j<size();j++)
temp.data[j]+=p.data[j];
}
return temp;
}
friend Polynomial operator -(const double m, Polynomial p)
{
Polynomial temp=p;
temp.data[0]-=m;
return -temp;
}
Polynomial operator -(const double m)
{
Polynomial temp=*this;
temp.data[0]-=m;
return temp;
}
Polynomial operator *(Polynomial& p)
{
Polynomial temp;
temp.resize(size()+p.size());
int i,j,k;
int s=size()+p.size();
for(i=0;i<s;i++)
temp.data[i]=0.0;
for(i=0;i<s;i++)
for(j=0;j<p.size();j++)
for(k=0;k<size();k++)
{
if((j+k)==i)
temp.data[i]+=p.data[j]*data[k];
}
return temp;
}
friend Polynomial operator *(const double m, Polynomial p2)
{
for(int i=0;i<p2.size();i++)
p2.data[i]*=m;
return p2;
}
Polynomial operator *(const double m)
{
Polynomial temp(*this);
for(int i=0;i<size();i++)
temp.data[i]*=m;
return temp;
}
friend istream& operator>>(istream& ins,Polynomial& p)
{
printf("输入%d项式(按升幂依次输入多项式系数,例如:1+2x+3x*x*x,需要输入1 2 0 3):\n",p.size());
for(int i=0;i<p.size();i++)
{
ins>>p.data[i];
}
ins.clear();
ins.sync();
cout<<"输入完毕"<<endl;
return ins;
}
friend ostream& operator<<(ostream& outs,Polynomial& p)
{
for(int i=0;i<p.size();i++)
{
if(p.data[i]!=0.0)
{
outs<<p.data[i];
for(int j=0;j<i;j++)
outs<<"*x";
if(i<p.size()-1 && p.data[i+1]>0.0)
outs<<" + ";
}
}
return outs;
}
};
void Test()
{
Polynomial p1(3),p2(2),p3(5);
cin>>p1;
cin>>p2;
cout<<p1<<endl;
cout<<p2<<endl;
cout<<"("<<p1<<")"<<"-("<<p2<<")="<<p1-p2<<endl;
cout<<"("<<p1<<")"<<"+("<<p2<<")="<<p1+p2<<endl;
cout<<"("<<p1<<")"<<"*("<<p2<<")="<<p1*p2<<endl;
cout<<"("<<p1<<")"<<"+("<<3.0<<")="<<p1+3.0<<endl;
cout<<"("<<p1<<")"<<"-("<<3.0<<")="<<p1-3.0<<endl;
cout<<"("<<3.0<<")"<<"-("<<p1<<")="<<3.0-p1<<endl;
cout<<"("<<3.0<<")"<<"*("<<p1<<")="<<3.0*p1<<endl;
cout<<"("<<p1<<")"<<"*("<<3.0<<")="<<p1*3.0<<endl;
cout<<"("<<3.0<<")"<<"+("<<p1<<")="<<3.0+p1<<endl;
}
回复 支持 反对

使用道具 举报

3#
发表于 2009-11-6 02:03:28 | 只看该作者
非常感谢楼上的校友大哥
另外我想说一下,在VC6.0下,友元函数要想成功访问私有成员,只要把类和类的实现部分都放在一个名空间里即可,要不编译会出现内部错误.这样的话即可以正常使用像<string>这样的类,又可正常使用友元.小弟不才,这两天才发现这一点.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

申请友链|小黑屋|最新主题|手机版|新微赢技术网 ( 苏ICP备08020429号 )  

GMT+8, 2024-11-19 12:09 , Processed in 0.107172 second(s), 9 queries , Gzip On, Memcache On.

Powered by xuexi

© 2001-2013 HaiAn.Com.Cn Inc. 寰耽

快速回复 返回顶部 返回列表