Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.73/22: Рейтинг темы: голосов - 22, средняя оценка - 4.73
10 / 10 / 0
Регистрация: 01.02.2011
Сообщений: 100
1

Шаблоны функций: обработка одномерных массивов

20.01.2012, 11:01. Просмотров 4598. Ответов 21
Метки нет (Все метки)


Всех приветствую! народ помогите задали лабораторку, а в с++ я только новичок подскажите как сделать следующее:
Задание 1: создать модуль библиотеки шаблонов функций по обработке одномерных массивов и продемонстрировать работу библиотеки для типов int, float и char. Все необходимые данные для функций должны передаваться им в качестве параметров. Использование глобальных пе¬ременных в функциях не допускается. Основные алгоритмы, которые должны быть реализованы в библиотеке:
- заполнение случайными значениями;
- файловый ввод/вывод;
- вставка и удаление k-ого элемента в массив;
- сортировка массива;
- поиск максимального и минимального элемента;
- поиск k-ого элемента (положительного, отрицательного, нулевого и др.) с применением предикатов;
- подсчет количества элементов с указанной характеристикой (положительные, отрицательные, нулевые, кратные m) с применением предикатов;
- специализированные шаблоны для обработки типов char*(строка символов).
Примечание: для создания модуля использовать Header File, т.к. шаблоны описывают в заголовочных файлах.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.01.2012, 11:01
Ответы с готовыми решениями:

Обработка одномерных массивов. Сортировка массивов
Здравствуйте, помогите пожалуйста решить задачу легким способом. В одномерном массиве, состоящем...

Обработка одномерных массивов. Сортировка массивов
Здравствуйсте! Помогите пожалуйста написать программу! В одномерном массиве, состоящем из n...

Обработка одномерных массивов С++
Написать программу решения задачи, используя оператор цикла FOR. Значения элементов массива ввести...

Обработка одномерных массивов
1. a) Одномерный массив из 5 элементов целого типа в диапазоне ; b) Дополнить исходный массив,...

21
20 / 20 / 16
Регистрация: 22.08.2011
Сообщений: 79
20.01.2012, 13:17 2
Чем смог =)
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
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
 
bool predicat(int z)
{
    if(z<4) return true;
    else return false;
}
 
template<typename T>
int deamCount(T arr[], int size, bool (predicat)(T))
{
    int count = 0;
    for(int i = 0;i<size;i++)
        if(predicat(arr[i]))
            count++;
    return count;
}
 
 
template<typename T>
T Max(T arr[], int size)
{
    T Max = arr[0];
    for(int i =0; i< size;i++)
        if(arr[i]>Max)
            Max = arr[i];
   return Max;
}
 
template<typename T>
T Min (T arr[], int size)
{
    T Max = arr[0];
    for(int i =0; i< size;i++)
        if(arr[i]<Max)
            Max = arr[i];
   return Max;
}
 
template<typename T>
void Sort(T arr[], int size)
{
    for(int i =0; i<size;i++)
        for(int j =0; j<size-i-1;j++)
            if(arr[j]>arr[j+1])
            {
                T tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
}
 
int main (void)
{
    int A[5] = {1,3,2,6,4};
    for(int i=0;i<5;i++)
        printf( " %d", A[i]);
    printf("\n Maximum: %d\n", Max(A,5));
    Sort(A,5);
    for(int i=0;i<5;i++)
        printf( " %d", A[i]);
        printf("\n count: %d\n", deamCount(A,5, predicat));
    scanf("\n%d",&A[1]);
}
1
go
Эксперт С++
3643 / 1375 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
20.01.2012, 13:43 3
Цитата Сообщение от k_a_t_y Посмотреть сообщение
- подсчет количества элементов с указанной характеристикой (положительные, отрицательные, нулевые, кратные m) с применением предикатов;
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
#include <iostream>
 
template <class T, class Predicate> size_t count_if(T first, T last, Predicate pred)
{
   size_t count;
   for ( count = 0 ; first != last ; ++first )
      if ( pred (*first) )
         ++count;
   return count;
}
 
bool odd(int val) { return val % 2; }  
 
template <typename T> void print (T *first, T *last)
{
   std::cout << std::endl;
   for ( ; first != last ; ++first )
      std::cout << *first << " ";
   std::cout << std::endl;
}             
 
int main()
{
   int arr[] = { 1, 2 ,3 ,4 , 5};
   const size_t size = sizeof(arr) / sizeof(arr[0]);
   
   print(arr, arr + size);
   std::cout << "Coutn odd = "  << count_if(arr, arr + size, odd) << std::endl
             << "Count Even = " << count_if(arr, arr + size, [](int val) { return !(val % 2); }) << std::endl;
   return 0;
}
http://liveworkspace.org/code/... 8085007141
2
Эксперт С++
5042 / 3103 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
20.01.2012, 15:16 4
Лучший ответ Сообщение было отмечено как решение

Решение

Что-то подобное. Единственное - не понял смысла в специализации шаблонов для char, поэтому не стал делать (да и лень). В остальном всё по заданию плюс ещё немного отсебятинки:
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
#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>
const T *array_find_if(const T *array, size_t size, bool (*predicate)(T));
template<typename T>
const T *array_find_nth_if(const T *array, size_t size, size_t n, bool (*predicate)(T));
 
template<typename T>
size_t array_count(const T *array, size_t size, const T& value);
template<typename T>
size_t array_count_if(const T *array, size_t size, bool (*predicate)(const T&));
 
//-----------------------------------------------------------------------------
 
// Заполнение массива случайными числами, лежащими в границах
// [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(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>
const T *array_find_if(const T *array, size_t size, bool (*predicate)(T))
{
    for (const T *p = array; p != array + size; ++p)
        if ((*predicate)(*p))
            return p;
    
    return 0;
}
 
// Поиск n-того элемента, удовлетворяющего условию predicate. Результат -
// указатель на искомый элемент; если элемент не найден - нулевой указатель.
template<typename T>
const T *array_find_nth_if(const T *array, size_t size, size_t n, bool (*predicate)(T))
{
    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>
size_t array_count_if(const T *array, size_t size, bool (*predicate)(T))
{
    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
#include <iostream>
#include <algorithm>
#include <iterator>
#include <cstdlib>
#include <ctime>
 
#include "arrays.hpp"
 
bool pred(char ch)
{
    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, pred) - 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, pred) - 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, pred) - 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, pred) << std::endl;
    
    return 0;
}
3
go
Эксперт С++
3643 / 1375 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
20.01.2012, 15:27 5
silent_1991,

Не по теме:

с Лямбда не хочет работать? http://liveworkspace.org/code/... d2966651f9

0
Jupiter
20.01.2012, 15:41
  #6

Не по теме:

Цитата Сообщение от go Посмотреть сообщение
с Лямбда не хочет работать?
указатель на функцию не является функциональным объектом коим является лямбда

0
10 / 10 / 0
Регистрация: 01.02.2011
Сообщений: 100
20.01.2012, 16:27  [ТС] 7
silent_1991 , Что то не компилируется, выдает ошибки
0
Вложения
Тип файла: rar laba1.rar (12.3 Кб, 12 просмотров)
dimcoder
20.01.2012, 16:48
  #8

Не по теме:

Цитата Сообщение от k_a_t_y Посмотреть сообщение
выдает ошибки
Connecting to k_a_t_y...
Retrying to connect k_a_t_y...
Access denied, telepaty v otpuske.

4
Эксперт С++
5042 / 3103 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
20.01.2012, 17:53 9
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, что-то в коде меняли?
0
10 / 10 / 0
Регистрация: 01.02.2011
Сообщений: 100
20.01.2012, 18:07  [ТС] 10
нет ничего
0
Эксперт С++
5042 / 3103 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
20.01.2012, 18:07 11
k_a_t_y, и какие ошибки выдаёт?
0
10 / 10 / 0
Регистрация: 01.02.2011
Сообщений: 100
20.01.2012, 18:16  [ТС] 12
у меня что не получается (извините за тупость), но можно вас попросить прикрепить файликом вашу програмку.... плиз
0
Эксперт С++
5042 / 3103 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
20.01.2012, 18:19 13
Пожалуйста.
1
Вложения
Тип файла: rar Arrays.rar (2.5 Кб, 21 просмотров)
10 / 10 / 0
Регистрация: 01.02.2011
Сообщений: 100
20.01.2012, 18:27  [ТС] 14
У меня не запускается ваша программа пишет следующие ошибки:
[C++ Error] main.cpp(7): E2209 Unable to open include file 'arrays.hpp'
[C++ Error] main.cpp(25): E2268 Call to undefined function 'time'
[C++ Error] main.cpp(30): E2268 Call to undefined function 'array_random_fill'
[C++ Error] main.cpp(32): E2268 Call to undefined function 'array_output'
[C++ Error] main.cpp(34): E2268 Call to undefined function 'array_input'
[C++ Error] main.cpp(35): E2268 Call to undefined function 'array_output_to_file'
[C++ Error] main.cpp(38): E2268 Call to undefined function 'array_input_from_file'
[C++ Error] main.cpp(48): E2268 Call to undefined function 'array_insert'
[C++ Error] main.cpp(52): E2268 Call to undefined function 'array_erase'
[C++ Error] main.cpp(69): E2268 Call to undefined function 'array_min_element'
[C++ Error] main.cpp(70): E2268 Call to undefined function 'array_max_element'
[C++ Error] main.cpp(71): E2268 Call to undefined function 'array_sort'
[C++ Error] main.cpp(80): E2268 Call to undefined function 'array_find'
[C++ Error] main.cpp(80): E2086 Illegal pointer subtraction
[C++ Error] main.cpp(81): E2086 Illegal pointer subtraction
[C++ Error] main.cpp(82): E2268 Call to undefined function 'array_find_if'
[C++ Error] main.cpp(82): E2188 Expression syntax
[C++ Error] main.cpp(83): E2268 Call to undefined function 'array_find_nth_if'
[C++ Error] main.cpp(83): E2086 Illegal pointer subtraction
[C++ Error] main.cpp(84): E2086 Illegal pointer subtraction
[C++ Error] main.cpp(85): E2086 Illegal pointer subtraction
[C++ Error] main.cpp(86): E2086 Illegal pointer subtraction
[C++ Error] main.cpp(87): E2268 Call to undefined function 'array_count'
[C++ Error] main.cpp(88): E2268 Call to undefined function 'array_count_if'
[C++ Error] main.cpp(88): E2188 Expression syntax
[C++ Error] main.cpp(88): E2228 Too many error or warning messages
0
Эксперт С++
5042 / 3103 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
20.01.2012, 18:28 15
k_a_t_y, компилятор какой?
0
10 / 10 / 0
Регистрация: 01.02.2011
Сообщений: 100
20.01.2012, 18:31  [ТС] 16
билдер 6, если вы это имеете ввиду
0
Эксперт С++
5042 / 3103 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
20.01.2012, 18:31 17
k_a_t_y, не знаю я тонкостей билдера. Скорее всего, надо arrays.hpp в проект добавить.
0
10 / 10 / 0
Регистрация: 01.02.2011
Сообщений: 100
20.01.2012, 18:36  [ТС] 18
а как arrays.hpp в проект добавить? А у вас какой компилятор?
0
Эксперт С++
5042 / 3103 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
20.01.2012, 18:48 19
Цитата Сообщение от k_a_t_y Посмотреть сообщение
а как arrays.hpp в проект добавить?
По-моему это
Цитата Сообщение от silent_1991 Посмотреть сообщение
не знаю я тонкостей билдера
даёт вполне красноречивый ответ. А именно: понятия не имею.

Цитата Сообщение от k_a_t_y Посмотреть сообщение
А у вас какой компилятор?
Компилятор и IDE - разные вещи. Билдер - IDE (интегрированная среда разработки), и её тонкостей я не знаю. Я использую mingw, мне достаточно в командной строке указать, что компилировать необходимо файл main.cpp.
0
go
Эксперт С++
3643 / 1375 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
20.01.2012, 19:01 20
k_a_t_y, Вы этот хедер не добавили в проект

Добавлено через 58 секунд
silent_1991, у меня только на рандом ругался буилдер. Только у меня 10-ый буилдер стоит.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.01.2012, 19:01

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Обработка одномерных массивов
Помогите пожалуйста с написанием программы. ПОСЛЕДОВАТЕЛЬНОСТЬ ВЫПОЛНЕНИЯ: 1. Сформировать...

Обработка одномерных массивов С++
Написать программу решения задачи, используя оператор цикла FOR. Значения элементов массива ввести...

Обработка одномерных массивов
При заданных XT,YT, абциссах X1,X2,..,Xn и ординатах Y1,Y2,..,Yn n точек плоскости XOY...

Обработка одномерных массивов


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

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

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