1 / 1 / 4
Регистрация: 28.09.2011
Сообщений: 113
1

Шаблонные функции и указатели на функции

25.04.2012, 17:54. Показов 1224. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите доделать и исправить...
Задание:
1. Создать структуру Прямоугольник, с полями Высота и Ширина. Создать массив объектов типа Прямоугольник из 10
элементов и иницилизировать его случайными числами в диапазоне (1,10). Вывести значение на экран. Отсортировать
массив стандартной функцией qsort (отдельно по ширине, по высоте и по площади прямоугольника). Для этого потребуется
написать три разные функции сравнения двух элементов типа Прямоугольник, каждая из которых имеет свое имя и соответсвует
следующему прототипу:
int имя_функции(const void *el1, const void *el2);


вот, что я написал
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <iostream>
#include <stdlib.h>
#include <math.h>
#include <string>
 
#define ARR_SIZE 10
 
struct rectangle  
{
    unsigned int height;
    unsigned int width;
 
    bool operator < (const Rectangle &sg) // bool vozvras4aemyj tip &sg - ssylka
    {
        return (this->width < sg.width); 
    }
};
 
int height_comparator(const void *el1, const void *el2) // dva argumenta ne znaem kakie 
{
    rectangle *r1 = (rectangle *)el1; // ukazatelj na rectangle = k obwemu slu4aju
    rectangle *r2 = (rectangle *)el2; 
    if(r1->height < r2->height)     // sravnievaem goda, vozras4aem komparatorom int
    {
        return -1;              // < to -1   >to 1     =to 0
    }
    else if(r1->height > r2->height)
    {
        return 1;
    }
    return 0;
};
 
int width_comparator(const void *el1, const void *el2) 
{
    rectangle *r1 = (rectangle *)el1; 
    rectangle *r2 = (rectangle *)el2; 
    if(r1->width < r2->width)       
    {
        return -1;              
    }
    else if(r1->width > r2->width)
    {
        return 1;
    }
    return 0;
};
 
int area_comparator(const void *el1, const void *el2)  
{
    rectangle *r1 = (rectangle *)el1; 
    rectangle *r2 = (rectangle *)el2; 
    
    
    if(r1->width < r2->width)       
    {
        return -1;              
    }
    else if(r1->width > r2->width)
    {
        return 1;
    }
    return 0;
};
 
 
 
 
 
void rectangle_singleout(rectangle *item) // item - ukazatelj , funkcija dlja vyvoda (kak vyvoditj)
{
    std::cout << "Height: " << item->height << std::endl;
    std::cout << "Width: " << item->width << std::endl;
    std::cout << std::endl;
};
 
void rectangle_print(rectangle *arr) // pe4atj vseh elementov massvia rectangle        (chto vyvoditj)
{ 
    for (int i = 0; i < ARR_SIZE; i++)
    {
        rectangle_singleout(&arr[i]); // aress i-togo elementa massiva
    }
    std::cout << "-----------------------------------------------" << std::endl;
    std::cout << std::endl;
};
 
 
void rectangle_fill(Person *arr)  // inicializacija , 10 raz shirina, visota ... zapolnenije strukt Rectangle 10 sluch chislami 1-10
{
    for (int i = 0; i < ARR_SIZE; i++)
    {
        std::cout << "[" << i << "]: " << std::endl;
        std::cout << "Height: "; std::cin >> arr[i].height = rand() % 10 + 1; std::cout << std::endl;
        std::cout << "Width: "; std::cin >> arr[i].width = rand() % 10 + 1; std::cout << std::endl;
    }
};
 
 
rectangle_fill(&rectangle[0]); // zapolnenie massiva , adress nulevogo elementa
rectangle_print(&rectangle[0]); // pe4atj massiva
qsort((void *)rectangle, ARR_SIZE, sizeof(rectangle[0]), height_comparator); // sortirovka po visote
rectangle_print(&rectangle[0]); //pechatj massiva                                    
 
qsort((void *)rectangle, ARR_SIZE, sizeof(rectangle[0]), width_comparator); // sortirovka po shirine
rectangle_print(&rectangle[0]); //pechatj massiva
Добавлено через 11 часов 8 минут
Подскажите, как сделать сортировку по площади в рамках задания. Я понимаю, как считается площадь прямоугольника, но вот как все это реализовать не очень понимаю?

Добавлено через 5 часов 28 минут
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.04.2012, 17:54
Ответы с готовыми решениями:

Шаблонные указатели на функции и их генерация
Здравствуйте! Насколько я понимаю, не существует синтаксиса для объявления указателей на функции...

Указатели на функции. Указатели на функции как формальные параметры у функциях высшего уровня
Найти наименьшее значение для функций используя функции и указатели на функции ...

Шаблонные функции
Доброго времени суток. Есть шаблонная функция(двоичный сумматор прямого кода): template &lt;class T&gt;...

шаблонные функции
Добрый день, у меня есть куча файлов, мне необходимо с ними работать, но данные в них разные,...

2
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
25.04.2012, 17:54 2
jvov, Внимание, вопрос! Где функция main?
0
1 / 1 / 4
Регистрация: 28.09.2011
Сообщений: 113
25.04.2012, 18:18  [ТС] 3
Цитата Сообщение от ForEveR Посмотреть сообщение
jvov, Внимание, вопрос! Где функция main?
Почему-то весь кода целиком не скопировал.

Добавлено через 6 минут
Как думаете так можно сортировать по площади?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int area_comparator(const void *el1, const void *el2)  
{
    int ereaEl1;
    int ereaEl2;
    rectangle *r1 = (rectangle *)el1; 
    rectangle *r2 = (rectangle *)el2; 
    ereaEl1= r1->height * r1->width;
    ereaEl2=r2->height * r2->width;
    if(ereaEl1 < ereaEl2)       
    {
        return -1;              
    }
    else if(ereaEl1 > ereaEl1)
    {
        return 1;
    }
    return 0;
};
Добавлено через 13 минут
Цитата Сообщение от jvov Посмотреть сообщение
Почему-то весь кода целиком не скопировал.

Добавлено через 6 минут
Как думаете так можно сортировать по площади?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int area_comparator(const void *el1, const void *el2)  
{
    int ereaEl1;
    int ereaEl2;
    rectangle *r1 = (rectangle *)el1; 
    rectangle *r2 = (rectangle *)el2; 
    ereaEl1= r1->height * r1->width;
    ereaEl2=r2->height * r2->width;
    if(ereaEl1 < ereaEl2)       
    {
        return -1;              
    }
    else if(ereaEl1 > ereaEl1)
    {
        return 1;
    }
    return 0;
};

в этой функции ругается на равно, не могу понять почему так нельзя заполнить структуру-
C++
1
2
3
4
5
6
7
8
9
void rectangle_fill(Rectangle *arr)  // inicializacija , 10 raz shirina, visota ... zapolnenije strukt Rectangle 10 sluch chislami 1-10
{
    for (int i = 0; i < ARR_SIZE; i++)
    {
        std::cout << "[" << i << "]: " << std::endl;
        std::cout << "Height: "; std::cin >> arr[i].height = rand() % 10 + 1; //std::cout << std::endl;
        std::cout << "Width: "; std::cin >> arr[i].width = rand() % 10 + 1; //std::cout << std::endl;
    }
};
0
25.04.2012, 18:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2012, 18:18
Помогаю со студенческими работами здесь

Шаблонные функции
Чет не получается написать шаблонную функцию. func.h template &lt;class T&gt; T strnstr (T str, T...

Шаблонные функции
Такой код работает. #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;cstring&gt; using namespace...

шаблонные функции
доброго времени суток уважаемые форумчане, помогите пожалуйста разобраться с шаблонными функциями,...

Шаблонные функции
Помогите, пожалуйста, реализовать шаблонную функцию определения, есть ли число в массиве


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru