Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
#1

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

25.04.2012, 17:54. Просмотров 836. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2012, 17:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шаблонные функции и указатели на функции (C++):

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

Шаблонные функции - C++
Любимой нужно, это свято... Поэтому прошу помощи... Перегрузить операторы &gt;, &lt;, == для класса Книга относительно сравнения года...

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

Шаблонные функции - C++
1) Написать шаблонную функцию для нахождения минимального из трех передаваемых чисел (для чисел типа int, double, char). В функции...

Шаблонные функции в C++ - C++
Каждый раз когда вижу код, который должен быть простым и понятным, я понимаю его немного хуже. Вот наш код: template &lt;typename T,...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
25.04.2012, 17:54 #2
jvov, Внимание, вопрос! Где функция main?
0
jvov
1 / 1 / 0
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2012, 18:18
Привет! Вот еще темы с ответами:

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

Шаблонные функции - C++
С помощью http://ru.wikipedia.org/wiki/Шаблоны_C%2B%2B пытался написать программу с шаблонной функцией по примеру использования который там...

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru