Есть код задачи, скриншот работы добавил. Но мне нужно переделать следующее:
Цитата:
1. массив структур оставить неизменным, сортировать указатели на структуру.
2. заменить 2 функции сортировки на одну, с дополнительным параметром типа "указатель на функцию"
3. (если возможно) написать "универсальную" функцию сортировки указателей, независимую от типа указываемых элементов, т.е. сортировать элементы типа void*
|
Прошу подсказать может указать где почитать.
Код:
#pragma hdrstop
#pragma argsused
#ifdef _WIN32
#include <tchar.h>
#else
typedef char _TCHAR;
#define _tmain main
#endif
#include <stdio.h>
#include <cstdlib>
#include <iostream>
using namespace std;
const int N=10;
struct Sizes{
double width;
double height;
};
struct RectParams{
double area;
double perimeter;
Sizes rect;
};
/*ФУНКЦИЯ ОБЕСПЕЧИВАЕТ ВЫВОД ДАННЫХ НА ЭКРАН*/
void showData(RectParams *R,int N)
{
cout<<"\n";
cout<<"AREA PERIMETER WIDTH HEIGHT"<<"\n\n";
for (int i=0;i<N;i++)
{
cout<<R[i].area<<" ";
cout<<R[i].perimeter<<" ";
cout<<R[i].rect.width<<" ";
cout<<R[i].rect.height<<" ";
cout<<"\n";
}
cout<<"\n";
}
/*ФУНКЦИЯ ЗАНОСИТ ДАННЫЕ В СТРУКТУРУ*/
void getData(RectParams *R,int N)
{
for (int i=0;i<N;i++)
{
R[i].area = 0;
R[i].perimeter = 0;
R[i].rect.width = rand()%50;
R[i].rect.height = rand()%50;
}
}
/*ФУНКЦИЯ ОБЕСПЕЧИВАЕТ РАСЧЕТ ПЕРИМЕТРА И ПЛОЩАДИ*/
void getPerimeterArea(RectParams *R,int N)
{
for (int i=0;i<N;i++)
{
R[i].perimeter = 2*(R[i].rect.width + R[i].rect.height);
R[i].area = R[i].rect.width * R[i].rect.height;
}
}
/*ФУНКЦИЯ ОБЕСПЕЧИВАЕТ СОРТИРОВКУ ПО ПЛОЩАДИ*/
void sortArea(RectParams *R,int N)
{
for(int i = N-1;i>0;i--)
{
bool inspect = true;
for(int j = 0; j< i; j++)
{
if(R[j].area < R[j+1].area)
{
inspect = false;
swap(R[j],R[j+1]);
}
}
if(inspect == true)
break;
}
}
/*ФУНКЦИЯ ОБЕСПЕЧИВАЕТ СОРТИРОВКУ ПО ПЕРИМЕТРУ*/
void sortPerimeter(RectParams *R,int N)
{
for(int i = N-1;i>0;i--)
{
bool inspect = true;
for(int j = 0; j< i; j++)
{
if(R[j].perimeter < R[j+1].perimeter)
{
inspect = false;
swap(R[j],R[j+1]);
}
}
if(inspect == true)
break;
}
}
int main() {
RectParams *R=new RectParams[N];
getData(R,N); //Ввод данных в массив структур
showData(R,N); //Вывод массива структур на экран
getPerimeterArea(R,N); //Расчет периметра и площади
showData(R,N); //Вывод массива структур на экран
cout<<"SORTED BY AREA";
sortArea(R,N); //Сортировка по площади
showData(R,N); //Вывод массива структур на экран
cout<<"SORTED BY PERIMETER";
sortPerimeter(R,N); //Сортировка по периметру
showData(R,N); //Вывод массива структур на экран
delete []R;
system("PAUSE");
}