Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
2 / 2 / 0
Регистрация: 08.05.2018
Сообщений: 32
1

Шаблонные функции в массивах

19.02.2019, 20:10. Просмотров 1054. Ответов 9

Делаю лабу по шаблонам функции.Застрял на реализации 3 задания(не могу шаблон для него написать и нормально вызвать)
Само задание:
Используя шаблоны функций реализовать следующие задачи:
1) считывание массива из стандартного ввода;
2) вывод элементов массива на стандартный вывод;
3.)Заменяет в массиве все элементы что совпадают с заданным значением на другое значение
Полный код представляю ниже
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
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    int arr_one [arr_size];
    double arr_two [arr_size];
    inArray(arr_one, arr_size);
    inArray(arr_two, arr_size);
    
 
    cout << "int:" << endl; printArray(arr_one, arr_size);
    cout << "double:" << endl; printArray(arr_two, arr_size);
 
    cout << "Max znachenie massiva int:"<<change(arr_one)   << endl;
    cout << "Max znachenie massiva double:" <<change(arr_two)  << endl;
 
    system("pause");
    return 0;
}
template<typename T>
T change(T * arr) //3 задание
{
    T trigger = 5;
    T change = 10;
 
    for (size_t i = 0; i < arr_size; ++i)
        if (arr[i] == trigger)
            arr[i]=change;
    
}
template <typename T>
void inArray(T * arr, size_t count) //генерация значений
{
    srand(time(0));
 
    if (sizeof(T) == sizeof(int))
    {
        for (size_t i = 0; i < count; i++)
        {
            arr[i] = 1 + rand() % 99;
        }
        
    }
    else if (sizeof(T) == sizeof(double))
    {
        for (size_t i = 0; i < count; i++)
        {
            arr[i] = 1 + rand() % 99 + ((1 + rand() % 99)*0.01);
        }
    }
}
template <typename T>
void printArray(const T * arr, const size_t count) //вывод
{
    for (size_t i = 0; i < count; i++)
        cout << arr[i] << "  ";
    cout << endl << endl;
}
Добавлено через 12 минут
Цитата Сообщение от Kott_Matroskin Посмотреть сообщение
int main()
Не закинул часть кода до мейна
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "pch.h"
#include <iostream>
#include <locale>
#include "windows.h"
#include "time.h"
#include <cstdlib>
using namespace std;
 
const int arr_size = 10;
using namespace std;
template<typename T>
T change(T * arr);
 
template <typename T>
void inArray(T * arr, size_t count);
 
template <typename T>
void printArray(const T * arr, const size_t count);
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.02.2019, 20:10
Ответы с готовыми решениями:

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

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

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

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

9
213 / 160 / 52
Регистрация: 09.12.2017
Сообщений: 520
19.02.2019, 22:56 2
Цитата Сообщение от Kott_Matroskin Посмотреть сообщение
3). Заменяет в массиве все элементы что совпадают с заданным значением на другое значение
Функция change не должна возвращать никакое значение, так как она меняет элементы массива.
Ближе к делу. Вот ее реализация :
C++
1
2
3
4
5
6
7
template <typename type>
void change(int length, type *arr, type elementToChange, type newElement) // функция замены одного элемента массива на другой
{
    for (int i = 0; i < length; i++)
        if (arr[i] == elementToChange)
            arr[i] = newElement;
}
0
2 / 2 / 0
Регистрация: 08.05.2018
Сообщений: 32
19.02.2019, 23:35  [ТС] 3
А как вывести тогда данный измененный массив,при попытке вывести,ерорит выход.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int elementtochange2 = 5, newelement2 = 10;
    double elementtochange1 = 15.2, newelement1 = 20;
    //cin >> elementtochange2 >> newelement2 >> endl;
    //cin >> elementtochange1 >> newelement1 >> endl;
    inArray(arr_one, arr_size);
    inArray(arr_two, arr_size);
    change(arr_size, arr_one, elementtochange2, newelement2);
    change(arr_size, arr_two, elementtochange1, newelement1);
 
    cout << "int:" << endl; printArray(arr_one, arr_size);
    cout << "double:" << endl; printArray(arr_two, arr_size);
 
    cout << "Измененный int массив"<< change << endl; //ошибка в этих двух выводах(такая же ошибка была когда пытался значения которые меняют вводить из клавы)
    cout << "Измененный double массив:"<< change << endl;
0
Миниатюры
Шаблонные функции в массивах  
213 / 160 / 52
Регистрация: 09.12.2017
Сообщений: 520
20.02.2019, 00:09 4
Код
int *массив = new int[размер];
fill_array(...);
int a = 1, b = -100;
change (размер, массив, а, b);
print_array(...);
По идее все должно работать. В противном случае найду проблему завтра (поищите ошибки в коде в целом) и отвечу.
0
2 / 2 / 0
Регистрация: 08.05.2018
Сообщений: 32
20.02.2019, 00:20  [ТС] 5
Заполнение массива и вывод брал отсюда.Немножко переделал,сделал что-бы был ввод размера массива с клавиатуры,но по той схеме что предоставили, ошибка остается.Закину сюда уже полный код,у меня идей и знаний нехватает.
Шаблонные функции для заполнения массива
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
#include "pch.h"
#include <iostream>
#include <locale>
#include "windows.h"
#include "time.h"
#include <cstdlib>
using namespace std;
 
 
 
 
 
template <typename type>
void change(int length, type *arr, type elementToChange, type newElement);
 
template <typename T>
void inArray(T * arr,  size_t count);
 
template <typename T>
void printArray(const T * arr, const size_t count);
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int arr_size;
    cout << "Введите размер массива: ";
    cin >> arr_size;
    int *arr_one= new int[arr_size];
    double *arr_two=new double [arr_size];
    int elementtochange2 = 5, newelement2 = 10;
    double elementtochange1 = 15.2, newelement1 = 20;
    
    //cin >> elementtochange2 >> newelement2 >> endl;
    //cin >> elementtochange1 >> newelement1 >> endl;
    inArray(arr_one, arr_size);
    inArray(arr_two, arr_size);
    change(arr_size, arr_one, elementtochange2, newelement2);
    change(arr_size, arr_two, elementtochange1, newelement1);
 
    cout << "int:" << endl; printArray(arr_one, arr_size);
    cout << "double:" << endl; printArray(arr_two, arr_size);
 
    cout << "Измененный int массив"<<printArray(arr_one,arr_size) << endl;
    cout << "Измененный double массив:"<<  << endl;
    delete [] arr_one;
    delete[] arr_two;
    system("pause");
    return 0;
}
 
    
template <typename T>
void change(size_t count, T *arr, T elementToChange, T newElement) // функция замены одного элемента массива на другой
{
    for (int i = 0; i < count; i++)
        if (arr[i] == elementToChange)
            arr[i] = newElement;
    
}
 
template <typename T>
void inArray(T * arr, size_t count) //генерация значений
{
    srand(time(0));
 
    if (sizeof(T) == sizeof(int))
    {
        for (size_t i = 0; i < count; i++)
        {
            arr[i] = 1 + rand() % 99;
        }
        
    }
    else if (sizeof(T) == sizeof(double))
    {
        for (size_t i = 0; i < count; i++)
        {
            arr[i] = 1 + rand() % 99 + ((1 + rand() % 99)*0.01);
        }
    }
}
template <typename T>
void printArray(const T * arr, const size_t count) //вывод
{
    for (size_t i = 0; i < count; i++)
        cout << arr[i] << "  ";
    cout << endl << endl;
}
0
13712 / 7335 / 1751
Регистрация: 30.01.2014
Сообщений: 12,306
20.02.2019, 00:29 6
Kott_Matroskin,

Объявление должно соответствовать определению. У вас в объявлении int - в определении size_t.
C++
1
2
template <typename type>
void change(size_t length, type *arr, type elementToChange, type newElement);
printArr возвращает void, его нельзя вывести в поток. По задумке, очевидно, что printArray сама по себе функция печати, посему вот так должно работать:
C++
1
2
3
4
5
......
    cout << "Измененный int массив" << endl;
    printArray(arr_one,arr_size);
    cout << "Измененный double массив:"<< endl;
......
0
213 / 160 / 52
Регистрация: 09.12.2017
Сообщений: 520
20.02.2019, 00:35 7
Лучший ответ Сообщение было отмечено Kott_Matroskin как решение

Решение

Kott_Matroskin, вот тест моей функции :
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
#include <iostream>
#include <ctime>
 
template <typename type>
void randomArray(int length, type *arr, int range_min, int range_max) // функция заполнения массива псевдослучайными значениями в заданном диапазоне
{
    for (int i = 0; i < length; i++)
    {
        arr[i] = range_min + rand() % (range_max - range_min + 1);
    }
}
 
template <typename type>
void printArray(int length, type *arr) // функция вывода массива на экран
{
    for (int i = 0; i < length; i++)
    {
        std::cout << " " << arr[i];
    }
    std::cout << std::endl;
}
 
template <typename type>
void change(int length, type *arr, type elementToChange, type newElement) // функция замены одного элемента массива на другой
{
    for (int i = 0; i < length; i++)
    {
        if (arr[i] == elementToChange)
        {
            arr[i] = newElement;
        }
    }
}
 
int main()
{
    srand(time(0));
 
    int cnt; std::cout << " Enter cnt = "; std::cin >> cnt;
    int *arr = new int[cnt];
 
    randomArray(cnt, arr, 1, 5);
    printArray(cnt, arr);
 
    change(cnt, arr, 1, -100);
    printArray(cnt, arr);
 
    return 0;
}
Как видите, все работает (в примере 1 заменяем на -100).
1
Миниатюры
Шаблонные функции в массивах  
2 / 2 / 0
Регистрация: 08.05.2018
Сообщений: 32
20.02.2019, 00:36  [ТС] 8
Да,спасибо заработало.Последний вопрос.Значения для нашей замены только задать можна?В поток его никак не закинуть получается?
0
13712 / 7335 / 1751
Регистрация: 30.01.2014
Сообщений: 12,306
20.02.2019, 00:37 9
PS. Если бы я был вашим преподавателем, то такую шаблонную функцию не принял бы. Т.к. из вашей реализации видно, что вы не поняли что это такое.

Впрочем, в С++17 (если он для вас доступен) есть возможность оставить решение почти таким же (но при этом принципиально его изменить) - называется if constexpr. Если же у вас нет С++17 в доступе, то вы должны использовать специализацию (или перегрузку, что для функций лучше почти всегда - не смотря на то, что у вас задание такое).

Добавлено через 36 секунд
Цитата Сообщение от Kott_Matroskin Посмотреть сообщение
В поток его никак не закинуть получается?
Он у вас закинут в поток внутри функции.
0
2 / 2 / 0
Регистрация: 08.05.2018
Сообщений: 32
20.02.2019, 00:38  [ТС] 10
Спасибо
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.02.2019, 00:38

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

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

Шаблонные функции
Читал у Праты про шаблонные функции, и везде они описаны наподобие template &lt;typename Any&gt; void...

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

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


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

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

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