| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 638 人关注过本帖
标题:[求助]动态数组内存错误
只看楼主 加入收藏
weishj
Rank: 1
等 级:新手上路
威 望:2
帖 子:141
专家分:0
注 册:2007-4-22
收藏
 问题点数:0 回复次数:2 
[求助]动态数组内存错误
大家好,小弟这几天比较晕,用动态数组编了个有关多项式计算的程序,编译时没错,但运行时老出现内存错误.希望高手们帮看下呀,在此先谢谢大家了
下面是源程序:为了方便调试,附件里传了那个程序的三个源文件.
wmahS4n1.rar (1.98 KB) [求助]动态数组内存错误


///////////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;
}

[此贴子已经被作者于2007-6-13 12:25:05编辑过]

搜索更多相关主题的帖子: 内存 动态 Polynomial namespace 接口 
2007-06-13 11:07
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

最好加上+=,-=这两个运算符,就更完善些。。。

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;
}

[此贴子已经被作者于2007-6-13 12:58:54编辑过]


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2007-06-13 12:55
weishj
Rank: 1
等 级:新手上路
威 望:2
帖 子:141
专家分:0
注 册:2007-4-22
收藏
得分:0 
非常感谢楼上的校友大哥
另外我想说一下,在VC6.0下,友元函数要想成功访问私有成员,只要把类和类的实现部分都放在一个名空间里即可,要不编译会出现内部错误.这样的话即可以正常使用像<string>这样的类,又可正常使用友元.小弟不才,这两天才发现这一点.

If you shed tears when you miss the sun, you also miss the stars.
2007-06-13 15:40
快速回复:[求助]动态数组内存错误
数据加载中...
 
   



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

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