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

Шаблоны функций - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Сформировать массив http://www.cyberforum.ru/cpp-beginners/thread431786.html
1.Сформировать массив структур данных об N точках P(x k,y k), k, принадлежащих прямоугольнику -a<x<a -a<y<a a>0 . В структуру включить следущие поля. Номер точки. Координаты точки.Координаты вычислить с помощью генератора псевдослучайных чисел. Расстояние от точки P(x k ,y k) до начала координат. 2.Расположить в конце массива структуры данных о точках, принадлежащих 2-ой четверти...
C++ Вычислить сумму ряда. Где-то напутал знаки или формула ряда не правильная. Посмотрите свежим взглядом. Привет! Пишу простую контрольную, не могу понять, то ли я где-то со знаками туплю, то ли формула не корректна. Задание: написать функцию вычисления суммы ряда. для диапазона значений 0.1 .. 0.9 и шага 0.1 изменения аргумента вычислить значения суммы ряда и контрольной функции, к которой он сходится, с точностью до 4 знаков после запятой. Ряд: sin(x) - sin(2x) / 2+..+(-1)*n * sin(nx)... http://www.cyberforum.ru/cpp-beginners/thread431779.html
Оператор continue. C++
Помогите:Вывести нечетные числа от 0 до 100, используя оператор continue.
для чего и как исползовать "template"? C++
Привет всем... может ктото обяснит как исползовать template? спасибо заранее... П.С гугл не впомош, если ктото даст пример то буду рад.. ;)
C++ Найти наибольший общий делитель всех элементов массива http://www.cyberforum.ru/cpp-beginners/thread431725.html
Такая задача: Найти наибольший общий делитель всех элементов массива (на который они все делятся без остатка).
C++ Запуск функции О_о есть функция void Account::Save (FILE *f) { int nlen = strlen (card_holder); fprintf (f, "%d %s %c%c%c %c%c/%c%c %d\r\n", sum, card_number, cvc2, cvc2, cvc2, validity.month, validity.month, validity.year, validity.year, nlen); fprintf (f, "%s\r\n", card_holder); подробнее

Показать сообщение отдельно
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
20.01.2012, 17:53     Шаблоны функций
go, вот так заработает и с лямбдами, и с функторами, и с указателями на функции:
arrays.hpp
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
#ifndef ARRAYS_HPP
#define ARRAYS_HPP
 
#include <iostream>
#include <fstream>
#include <cstdlib>
 
//-----------------------------------------------------------------------------
 
template<typename T>
void array_random_fill(T *array, size_t size, const T& lower_bound, const T& upper_bound);
 
template<typename T>
void array_input(T *array, size_t size, std::istream& input = std::cin);
template<typename T>
void array_output(const T *array, size_t size, std::ostream& output = std::cout, const char *separator = " ");
template<typename T>
void array_input_from_file(T *array, size_t size, const char *filename);
template<typename T>
void array_output_to_file(const T *array, size_t size, const char *filename, const char *separator = " ");
 
template<typename T>
void array_insert(T *array, size_t size, const T& elem, size_t pos);
template<typename T>
void array_erase(T *array, size_t size, size_t pos);
 
template<typename T>
void array_sort(T *array, size_t size);
 
template<typename T>
T array_min_element(const T *array, size_t size);
template<typename T>
T array_max_element(const T *array, size_t size);
 
template<typename T>
const T *array_find(const T *array, size_t size, const T& value);
template<typename T, typename Pred>
const T *array_find_if(const T *array, size_t size, Pred predicate);
template<typename T, typename Pred>
const T *array_find_nth_if(const T *array, size_t size, size_t n, Pred predicate);
 
template<typename T>
size_t array_count(const T *array, size_t size, const T& value);
template<typename T, typename Pred>
size_t array_count_if(const T *array, size_t size, Pred predicate);
 
//-----------------------------------------------------------------------------
 
// Заполнение массива случайными числами, лежащими в границах
// [upper_bound; lowrer_bound)
template<typename T>
void array_random_fill(T *array, size_t size, const T& lower_bound, const T& upper_bound)
{
    // Сгенерировать число для каждого элемента массива
    for (size_t i = 0; i < size; ++i)
        //array[i] = T(Random::generate(double(lower_bound), double(upper_bound)));
        array[i] = T(double(lower_bound) + (double(upper_bound) - double(lower_bound)) * double(rand()) / RAND_MAX);
}
 
//-----------------------------------------------------------------------------
 
// Ввод массива из потока input
template<typename T>
void array_input(T *array, size_t size, std::istream& input)
{
    // Очередной считанный элемент
    T elem;
    
    // Ввод производится до тех пор, пока массив не заполнен или пока есть данные
    // в потоке
    for (size_t i = 0; (i < size) && (input >> elem); ++i)
        array[i] = elem;
}
 
// Вывод массива в поток output
template<typename T>
void array_output(const T *array, size_t size, std::ostream& output, const char *separator)
{
    // Выводи каждый элемент в поток
    for (size_t i = 0; i < size; ++i)
        output << array[i] << separator;
}
 
// Ввод массива из файла filename
template<typename T>
void array_input_from_file(T *array, size_t size, const char *filename)
{
    std::ifstream fin(filename);
    
    array_input(array, size, fin);
}
 
// Вывод массива в файл filename
template<typename T>
void array_output_to_file(const T *array, size_t size, const char *filename, const char *separator)
{
    std::ofstream fout(filename);
    
    array_output(array, size, fout, separator);
}
 
//-----------------------------------------------------------------------------
 
// Вставка элемента elem в позицию pos
// ВНИМАНИЕ! Массив должен быть способен вместить как минимум size + 1 элемент
template<typename T>
void array_insert(T *array, size_t size, const T& elem, size_t pos)
{
    if (pos > size)
        pos = size;
    
    // Сдвигаем все элементы с конца массиво до позиции pos врпаво на 1 элемент
    for (int i = int(size); i > int(pos); --i)
        array[i] = array[i - 1];
    
    // В позицию pos записываем элемент elem
    array[pos] = elem;
}
 
// Удаление элемента из массива
template<typename T>
void array_erase(T *array, size_t size, size_t pos)
{
    // Сдвигаем все элементы, начиная с позиции pos и до конца массива на 1
    // элемент влево
    for (size_t i = pos; i < size - 1; ++i)
        array[i] = array[i + 1];
}
 
//-----------------------------------------------------------------------------
 
// Пузырьковая сортировка массива
template<typename T>
void array_sort(T *array, size_t size)
{
    for (size_t i = 0; i < size - 1; ++i)
        for (size_t j = 0; j < size - i - 1; ++j)
            if (array[j] > array[j + 1])
                std::swap(array[j], array[j + 1]);
            
}
 
//-----------------------------------------------------------------------------
 
// Поиск минимального элемента
template<typename T>
T array_min_element(const T *array, size_t size)
{
    T min = array[0];
    
    for (size_t i = 1; i < size; ++i)
        if (min > array[i])
            min = array[i];
    
    return min;
}
 
// Поиск максимального элемента
template<typename T>
T array_max_element(const T *array, size_t size)
{
    T max = array[0];
    
    for (size_t i = 1; i < size; ++i)
        if (max < array[i])
            max = array[i];
    
    return max;
}
 
//-----------------------------------------------------------------------------
 
// Линейный поиск заданного элемента в массиве. Результат - указатель на искомый
// элемент; если элемент не найден - нулевой указатель.
template<typename T>
const T *array_find(const T *array, size_t size, const T& value)
{
    for (const T *p = array; p != array + size; ++p)
        if (*p == value)
            return p;
    
    return 0;
}
 
// Поиск первого элемента, удовлетворяющего условию predicate. Результат -
// указатель на искомый элемент; если элемент не найден - нулевой указатель.
template<typename T, typename Pred>
const T *array_find_if(const T *array, size_t size, Pred predicate)
{
    for (const T *p = array; p != array + size; ++p)
        if (predicate(*p))
            return p;
    
    return 0;
}
 
// Поиск n-того элемента, удовлетворяющего условию predicate. Результат -
// указатель на искомый элемент; если элемент не найден - нулевой указатель.
template<typename T, typename Pred>
const T *array_find_nth_if(const T *array, size_t size, size_t n, Pred predicate)
{
    if (n == 0)
        return 0;
    
    const T *res = array - 1;
    
    while (n-- != 0)
        if ((res = array_find_if(res + 1, size - (res + 1 - array), predicate)) == 0)
            return 0;
    
    return res;
}
 
//-----------------------------------------------------------------------------
 
// Подсчёт вхождений элемента value в массив
template<typename T>
size_t array_count(const T *array, size_t size, const T& value)
{
    size_t count = 0;
    
    for (size_t i = 0; i < size; ++i)
        if (array[i] == value)
            ++count;
    
    return count;
}
 
// Подсчёт вхождений элементов, удовлетворяющих условию predicate, в массив
template<typename T, typename Pred>
size_t array_count_if(const T *array, size_t size, Pred predicate)
{
    size_t count = 0;
    
    for (size_t i = 0; i < size; ++i)
        if (predicate(array[i]))
            ++count;
    
    return count;
}
 
//-----------------------------------------------------------------------------
 
#endif
main.cpp
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
#include <iostream>
#include <algorithm>
#include <iterator>
#include <cstdlib>
#include <ctime>
 
#include "arrays.hpp"
 
bool pred(char ch)
{
    return ch > 'b';
}
 
class Predicate : public std::unary_function<char, bool>
{
public:
    virtual bool operator()(char ch) const
    {
        return ch > 'b';
    }
};
 
int main()
{
    srand(unsigned(time(0)));
    
    const size_t size = 10;
    
    int arr1[size];
    array_random_fill(arr1, size, 0, 100);
    std::cout << "arr1: ";
    array_output(arr1, size);
    std::cout << std::endl;
    array_input(arr1, size);
    array_output_to_file(arr1, size, "test1.txt");
    
    int arr2[size] = {0};
    array_input_from_file(arr2, size, "test2.txt");
    std::cout << "arr2: ";
    array_output(arr2, size);
    std::cout << std::endl;
    
    int arr3[size + 1] = {0};
    array_random_fill(arr3, size, 0, 100);
    std::cout << "arr3: ";
    array_output(arr3, size);
    std::cout << std::endl;
    array_insert(arr3, size, 200, 0);
    std::cout << "arr3 after inserting 200 in position 0: ";
    array_output(arr3, size + 1);
    std::cout << std::endl;
    array_erase(arr3, size + 1, 0);
    array_insert(arr3, size, 200, 10);
    std::cout << "arr3 after inserting 200 in position 10: ";
    array_output(arr3, size + 1);
    std::cout << std::endl;
    array_erase(arr3, size + 1, 10);
    array_insert(arr3, size, 200, 5);
    std::cout << "arr3 after inserting 200 in position 5: ";
    array_output(arr3, size + 1);
    std::cout << std::endl;
    array_erase(arr3, size + 1, 5);
    
    double arr4[size];
    array_random_fill(arr4, size, 0.0, 20.0);
    std::cout << "arr4: ";
    array_output(arr4, size);
    std::cout << std::endl;
    std::cout << "min element in arr4: " << array_min_element(arr4, size) << std::endl;
    std::cout << "max element in arr4: " << array_max_element(arr4, size) << std::endl;
    array_sort(arr4, size);
    std::cout << "arr4 after sorting: ";
    array_output(arr4, size);
    std::cout << std::endl;
    
    char arr5[size] = "abcabcacc";
    std::cout << "arr5: ";
    array_output(arr5, size);
    std::cout << std::endl;
    std::cout << "pos of first symbol \'c\' in arr5: " << array_find(arr5, size, 'c') - arr5 << std::endl;
    std::cout << "pos of first symbol \'d\' in arr5: " << array_find(arr5, size, 'd') - arr5 << std::endl;
    std::cout << "pos of first symbol which more \'b\' in arr5: " << array_find_if(arr5, size, [](char ch) -> bool { return ch > 'b'; }) - arr5 << std::endl;
    std::cout << "pos of second symbol which more \'b\' in arr5: " << array_find_nth_if(arr5, size, 2, pred) - arr5 << std::endl;
    std::cout << "pos of third symbol which more \'b\' in arr5: " << array_find_nth_if(arr5, size, 3, Predicate()) - arr5 << std::endl;
    std::cout << "pos of fourth symbol which more \'b\' in arr5: " << array_find_nth_if(arr5, size, 4, pred) - arr5 << std::endl;
    std::cout << "pos of fifth symbol which more \'b\' in arr5: " << array_find_nth_if(arr5, size, 5, Predicate()) - arr5 << std::endl;
    std::cout << "count of symbols \'a\' in arr5: " << array_count(arr5, size, 'a') << std::endl;
    std::cout << "count of symbols which more \'b\' in arr5: " << array_count_if(arr5, size, [](char ch) -> bool { return ch > 'b'; }) << std::endl;
    
    return 0;
}
Добавлено через 1 минуту
k_a_t_y, что-то в коде меняли?
 
Текущее время: 22:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru