我在班级城市中有以下私人数据:城市名称,城市的宽度,长度和高度。我必须创建动态数组,默认情况下由构造函数插入 - City(),当程序启动时。然后程序使用方法output()并打印插入的城市数组。
我应该使用冒泡排序按城市长度对城市进行排序。当这样做时,程序应该以不断增加的长度显示已排序的城市。
问题是我的数据是私密的(在公共场合,一切都很好但是封装原则被违反了!)所以我不能做冒泡排序。
我尝试做另一个double double Lengths [n]类型的动态数组,其内容是第一个数组的长度。然后我做排序,但程序打印只排序长度,这不是我的目标。
我应该打印按长度排序的城市名称。
代码:
class City{
private: char *name;
double width;
double length;
double height;
public:void Output();
City();
~City();
double GetLength()
{
return length;
}
double GetWidth(){ return width; }
double GetHeight(){ return height; }
char GetName(){ return *name; }
};
City::City()
{
char ime[20];
cout << "Name= ";
cin >> ime;
name = new char[strlen(ime) + 1];
for (int i = 0; i <=strlen(ime); i++)
name[i] = ime[i];
cout << "Width= ";
cin >> width;
cout << "Length= ";
cin >> length;
cout << "Height= ";
cin >> height;
}
void City::Output()
{
cout << "Name is: " << name << endl;
cout << " Width is: " << width <<" deg"<< endl;;
cout << " Length is: " << length << " deg"<<endl;
cout << " Height is: " << height <<" m"<<endl;
return;
}
City::~City()
{
cout << " " << endl;
cout << "Destructor of City!" << endl;
delete[] name;
}
int main()
{
//City town;
//town.Input();
//town.Output();
int n;
City *mA;
cout << "Input number of cities: " << endl;
cin >> n;
mA = new City[n];
for (int j = 0; j < n; j++)
{
mA[j].Output();
}
cout << "Cities from west to east, sorted by their length" << endl;
double *Lengths = new double[n];
for (int j = 0; j < n; j++)
{
Lengths[j] = mA[j].GetLength();
}
int k = 0;//counter
double max = Lengths[0];
for (int j = 1; j < n; j++)
{
if (Lengths[j - 1] >Lengths[j])
{
max = Lengths[j - 1];
Lengths[j - 1] = Lengths[j];
Lengths[j] = max;
}
}
for (int j = 0; j < n; j++)//cycle for output
{
mA[j].Output();
}
delete[]mA;
return 0;
}
答案 0 :(得分:0)
我没有看到直接的问题,但我可以通过你的故事来解决大部分问题。关于如何解决此案例,您有多种选择。解决此问题的一种简单方法是在对象中创建一个函数,该函数允许您获取对象成员的长度,例如在您的情况下,它将是城市的名称。
在对象内创建一个方法,您可以调用该方法以返回私有方法的长度。创建一个调用此方法的循环并并排检查每个元素,直到您无法再细化它为止。是否有特定原因使用char而不是字符串作为名称?
答案 1 :(得分:0)
我不完全确定你在问什么。
但是,从我可以告诉您的主要问题是,您无法排序,因为您正在尝试比较来自两个对象的两个私有变量。
如果将对象放入类型为city的数组中,则可以按长度进行冒泡,但是您需要使用getter来引用排序期间私有的变量。
例如(不是确切的语法)
if(cityArray[0].getLength() < cityArray[1].getLength())
{
//Do Something
}
答案 2 :(得分:0)
由于我不能对你的回答发表评论,我会给你一些建议。首先是:
Array [j] = mA [j] .GetName();
您有一个随机空间,可能是副本更改而且相对较小,但出于阅读目的是错误的。
其次,您的命名约定确实是您应该处理的事情。我应该能够读取一个变量并理解它的含义,但我很难理解一个名为mA的变量意味着什么。
第三个你的else子句在字面上没有任何作用。你没有移动阵列的任何部分,如果这是你的意图我说:
mA[j+1];
您只是将数组中的元素定位在迭代之上。我看到你坚持你想要为泡泡排序制作类似于并行数组的东西,这很好,但你在第一个循环中没有任何动作。
这不是冒泡排序,因为你只需要经历每次迭代并检查Lengths中的元素长度是否与mA中的元素相等,然后将该元素存储在数组中,但是else语句不执行任何操作。 / p>
你的循环看起来应该类似于这样的东西,但是由于某种原因,我将摆脱字符数组和额外的数组,因为它是不必要的,让我们说你从一个对象数组开始:
if(myObjects[i].GetLength() > myObjects[i+1].GetLength()) //Shortest to longest name or vice versa?
{
//Store myObject[i] in temp spot
//myObject[i] = myObject[i+1]
//myObject[i+1] = temp Storage
}
这将为您提供第一轮对象的冒泡。当然,您必须找到如何在循环中遍历数组以验证所有元素是否已正确排序,因为这当然需要多次迭代才能进行冒泡排序。