C++初学者 求助!!(关于排序和释放内存)

kkk_19 2016-01-24 04:40:57
加精
构建一个球类Ball,其成员为球心坐标(x,y,z)和球半径r,并设计构造函数(可以赋初值也可以不赋初值),复制构造函数,析构函数(打印信息,表示其被调用),设置新值成员函数Set(), 取球心坐标成员函数GetX()、GetY()、GetZ(),取球半径成员函数GetR(),打印成员值成员函数Print(),计算球体积成员函数Volume()。并用此类分别定义长度为10的静态对象数组,长度为20的动态对象数组,每个对象的球心坐标(x,y,z)和球半径r由随机数rand()产生(球半径r的值应该为正数),打印每个球对象的(x,y,z)、r和体积;然后分别将对象数组按照其r值从小到大排序,并打印排序后每个对象的(x,y,z)、r和体积;并计算打印出所有对象的平均(x,y,z)、平均r和平均体积。(并释放动态对象数组,注意析构顺序与构造顺序的不同。)
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
class ball
{
public:
ball(int x=0,int y=0, int z=0,int r=0):x(x),y(y),z(z),r(r){}
ball(ball &b){x=b.x;y=b.y;z=b.z;r=b.r;}
~ball(){cout<<"destructor!"<<endl;}
void set(int x,int y,int z,int r){this->x=x;this->y=y;this->z=z;this->r=r;}
void print(){cout<<"球心坐标为("<<x<<","<<y<<","<<z<<") 半径为"<<r;}
int GetX(){return x;}
int GetY(){return y;}
int GetZ(){return z;}
int GetR(){return r;}
double volume(){return 4/3*3.14*r*r*r;}
private:
int x,y,z,r;
};
void bubsort(ball *d,int n)
{
int i,j;
ball temp;
bool change;
for(i=n,change=true;i>0&&change;--i)
{
change=false;
for(j=0;j<i;++j)
if(d[j+1].GetR()<d[j].GetR())
{
temp=d[j+1];
d[j+1]=d[j];
d[j]=temp;
change=true;
}
}
return;
}
void main()
{
int i,x=0,y=0,z=0,r=0;
double v=0;
ball b[10],*c,d[30];
c=new ball[20];
srand((unsigned int)time(NULL));
for(i=0;i<10;i++)
{
b[i].set(rand()%100,rand()%100,rand()%100,abs(rand()%100));
d[i]=b[i];
b[i].~ball();
}
for(i=0;i<20;i++)
{
c[i].set(rand()%100,rand()%100,rand()%100,abs(rand()%100));
d[i+10]=c[i];
c[i].~ball();
}
for(i=0;i<30;i++)
{
d[i].print();
cout<<" 该球体积为"<<d[i].volume()<<endl;
}
cout<<"*******************************************排序*****************************************"<<endl;
bubsort(d,30);
for(i=0;i<30;i++)
{
d[i].print();
cout<<" 该球体积为"<<d[i].volume()<<" ";
x+=d[i].GetX();y+=d[i].GetY();z+=d[i].GetZ();r+=d[i].GetR();v+=d[i].volume();
d[i].~ball();
}
cout<<"平均球心坐标为("<<double (x/30)<<","<<double (y/30)<<","<<double (z/30)<<") 平均半径为"<<double (r/30)<<" 平均体积为"<<v/30<<endl;
system("pause");
}
拍完序后总会有一个球的成员变量全部变成未初始化的数值 同时会提示堆被损坏 求高手帮助 这是为什么??
...全文
2083 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
跟大神学C++/C 2018-12-20
  • 打赏
  • 举报
回复
小编推荐一个学C语言/C++的学习裙【 玖四捌,玖伍四,四捌四 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!
饶择一 2017-10-12
  • 打赏
  • 举报
回复
学习一下,嘻嘻,我也是自学小白
qq_33748997 2016-01-30
  • 打赏
  • 举报
回复
学习一下 谢谢啦
cattpon 2016-01-26
  • 打赏
  • 举报
回复
这个网上有实例~
YXTS122 2016-01-26
  • 打赏
  • 举报
回复
有时间看一看。。。。。。。。。。。。。。。。。。。
paschen 2016-01-25
  • 打赏
  • 举报
回复
通常不会显示去调用析构函数~ball()
赵4老师 2016-01-25
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 “多一少一”问题占程序员常犯错误的10%以上! 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断,搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个? <、<=、==、>、>=中的哪个?
qq20004604 2016-01-25
  • 打赏
  • 举报
回复
引用 4 楼 kkk_19 的回复:
[quote=引用 1 楼 qq20004604 的回复:] 1.咱能用加了格式的发么,这样看起来好累。 2.我搜索了一下,有new,但是没有delete,这显然是不好的。更何况题目要求还说要释放动态数组 3.出问题的时候,不给程序写注释,这显然也是不好的。 4.
	for (i = n, change = true;i>0 && change;--i)
	{
		change = false;
		for (j = 0;j<i;++j)
			if (d[j + 1].GetR()<d[j].GetR())
			{
				temp = d[j + 1];
				d[j + 1] = d[j];
				d[j] = temp;
				change = true;
			}
	}
你传递的参数是30,当i=30时,下面的j最大是29,你告诉我,d[29+1]是不是一个有效的?肯定出错呀
第一次发帖 不太清楚格式 带来不便不好意思!非常感谢你的解答~[/quote] 如果有用的话,就来点分呗
kkk_19 2016-01-25
  • 打赏
  • 举报
回复
引用 1 楼 qq20004604 的回复:
1.咱能用加了格式的发么,这样看起来好累。 2.我搜索了一下,有new,但是没有delete,这显然是不好的。更何况题目要求还说要释放动态数组 3.出问题的时候,不给程序写注释,这显然也是不好的。 4.
	for (i = n, change = true;i>0 && change;--i)
	{
		change = false;
		for (j = 0;j<i;++j)
			if (d[j + 1].GetR()<d[j].GetR())
			{
				temp = d[j + 1];
				d[j + 1] = d[j];
				d[j] = temp;
				change = true;
			}
	}
你传递的参数是30,当i=30时,下面的j最大是29,你告诉我,d[29+1]是不是一个有效的?肯定出错呀
第一次发帖 不太清楚格式 带来不便不好意思!非常感谢你的解答~
qq20004604 2016-01-24
  • 打赏
  • 举报
回复
1.咱能用加了格式的发么,这样看起来好累。 2.我搜索了一下,有new,但是没有delete,这显然是不好的。更何况题目要求还说要释放动态数组 3.出问题的时候,不给程序写注释,这显然也是不好的。 4.
	for (i = n, change = true;i>0 && change;--i)
	{
		change = false;
		for (j = 0;j<i;++j)
			if (d[j + 1].GetR()<d[j].GetR())
			{
				temp = d[j + 1];
				d[j + 1] = d[j];
				d[j] = temp;
				change = true;
			}
	}
你传递的参数是30,当i=30时,下面的j最大是29,你告诉我,d[29+1]是不是一个有效的?肯定出错呀

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧