在 C++ 中对对象数组进行冒泡排序
Bubble Sorting an Array of Objects in C++
我需要使用冒泡排序对由 Date
个对象组成的数组进行排序。对象包含私有属性,所以我尝试使用友元函数。目前,该程序是 运行 但打印的日期未排序,我猜想在 swap
和 BubbleSortDates
函数中使用指针存在一些问题。我的代码如下。
#define N 10
#include <iostream>
using namespace std;
class Date;
bool compareDates(Date *date1, Date *date2);
class Date
{
// Data fields
int Year;
int Month;
int Day;
friend bool compareDates(Date *date1, Date *date2);
public:
Date(); // Constructor
Date(int YearIn, int MonthIn, int DayIn);
bool SetDate(int YearIn, int MonthIn, int DayIn);
void Print();
};
Date::Date()
{
Year = 1970;
Month = 1;
Day = 1;
}
Date::Date(int YearIn, int MonthIn, int DayIn)
{
bool IsValid = SetDate(YearIn, MonthIn, DayIn);
if (!IsValid)
{
Year = 1970;
Month = 1;
Day = 1;
}
}
bool Date::SetDate(int YearIn, int MonthIn, int DayIn)
{
if (YearIn <= 0 || MonthIn <= 0 || DayIn <= 0)
{
return false;
}
else
{
Year = YearIn;
Month = MonthIn;
Day = DayIn;
return true;
}
}
void Date::Print()
{
cout << "The day is: " << Day << "/" << Month << "/" << Year << endl;
}
bool compareDates(Date *date1, Date *date2)
{
if (date1->Year > date2->Year)
return true;
else if (date1->Year < date2->Year)
return false;
else
{
if (date1->Month > date2->Month)
return true;
else if (date1->Month < date2->Month)
return false;
else
{
if (date1->Year > date2->Year)
return true;
else if (date1->Year < date2->Year)
return false;
else
return true;
}
}
}
void swap(Date *xp, Date *yp)
{
Date temp = *xp;
*xp = *yp;
*yp = temp;
}
void BubbleSortDates(Date datesIn[])
{
for (int i = 0; i < N - 1; i++)
{
for (int j = 0; j < N - i - 1; j++)
{
Date *date1 = &datesIn[i];
Date *date2 = &datesIn[j];
if(compareDates(date1, date2))
{
swap(date1, date2);
}
}
}
for (int i = 0; i < N; i++)
{
datesIn[i].Print();
}
}
如何更正这些功能?提前致谢。
我注意到的第一件事是 compareDates
再次比较 Year
、Month
和 Year
- 而不是 Day
。所以这是一回事。
这个else语句
中的函数compareDates
有错别字
else
{
if (date1->Month > date2->Month)
return true;
else if (date1->Month < date2->Month)
return false;
else
{
if (date1->Year > date2->Year)
return true;
else if (date1->Year < date2->Year)
return false;
else
return true;
}
}
你的意思好像是
else
{
if (date1->Month > date2->Month)
return true;
else if (date1->Month < date2->Month)
return false;
else
{
if (date1->Day > date2->Day)
return true;
else if (date1->Day < date2->Day)
return false;
else
return true;
}
}
在函数 BubbleSortDates 中,索引为 N - i - 1 的数组的最后一个元素(在内部 for 循环中)在循环的每次迭代中保持不变。
for (int i = 0; i < N - 1; i++)
{
for (int j = 0; j < N - i - 1; j++)
{
// ...
你需要像这样编写循环
for (int i = 0; i < N - 1; i++)
{
for (int j = i + 1; j < N; j++)
{
//...
我需要使用冒泡排序对由 Date
个对象组成的数组进行排序。对象包含私有属性,所以我尝试使用友元函数。目前,该程序是 运行 但打印的日期未排序,我猜想在 swap
和 BubbleSortDates
函数中使用指针存在一些问题。我的代码如下。
#define N 10
#include <iostream>
using namespace std;
class Date;
bool compareDates(Date *date1, Date *date2);
class Date
{
// Data fields
int Year;
int Month;
int Day;
friend bool compareDates(Date *date1, Date *date2);
public:
Date(); // Constructor
Date(int YearIn, int MonthIn, int DayIn);
bool SetDate(int YearIn, int MonthIn, int DayIn);
void Print();
};
Date::Date()
{
Year = 1970;
Month = 1;
Day = 1;
}
Date::Date(int YearIn, int MonthIn, int DayIn)
{
bool IsValid = SetDate(YearIn, MonthIn, DayIn);
if (!IsValid)
{
Year = 1970;
Month = 1;
Day = 1;
}
}
bool Date::SetDate(int YearIn, int MonthIn, int DayIn)
{
if (YearIn <= 0 || MonthIn <= 0 || DayIn <= 0)
{
return false;
}
else
{
Year = YearIn;
Month = MonthIn;
Day = DayIn;
return true;
}
}
void Date::Print()
{
cout << "The day is: " << Day << "/" << Month << "/" << Year << endl;
}
bool compareDates(Date *date1, Date *date2)
{
if (date1->Year > date2->Year)
return true;
else if (date1->Year < date2->Year)
return false;
else
{
if (date1->Month > date2->Month)
return true;
else if (date1->Month < date2->Month)
return false;
else
{
if (date1->Year > date2->Year)
return true;
else if (date1->Year < date2->Year)
return false;
else
return true;
}
}
}
void swap(Date *xp, Date *yp)
{
Date temp = *xp;
*xp = *yp;
*yp = temp;
}
void BubbleSortDates(Date datesIn[])
{
for (int i = 0; i < N - 1; i++)
{
for (int j = 0; j < N - i - 1; j++)
{
Date *date1 = &datesIn[i];
Date *date2 = &datesIn[j];
if(compareDates(date1, date2))
{
swap(date1, date2);
}
}
}
for (int i = 0; i < N; i++)
{
datesIn[i].Print();
}
}
如何更正这些功能?提前致谢。
我注意到的第一件事是 compareDates
再次比较 Year
、Month
和 Year
- 而不是 Day
。所以这是一回事。
这个else语句
中的函数compareDates
有错别字
else
{
if (date1->Month > date2->Month)
return true;
else if (date1->Month < date2->Month)
return false;
else
{
if (date1->Year > date2->Year)
return true;
else if (date1->Year < date2->Year)
return false;
else
return true;
}
}
你的意思好像是
else
{
if (date1->Month > date2->Month)
return true;
else if (date1->Month < date2->Month)
return false;
else
{
if (date1->Day > date2->Day)
return true;
else if (date1->Day < date2->Day)
return false;
else
return true;
}
}
在函数 BubbleSortDates 中,索引为 N - i - 1 的数组的最后一个元素(在内部 for 循环中)在循环的每次迭代中保持不变。
for (int i = 0; i < N - 1; i++)
{
for (int j = 0; j < N - i - 1; j++)
{
// ...
你需要像这样编写循环
for (int i = 0; i < N - 1; i++)
{
for (int j = i + 1; j < N; j++)
{
//...