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

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

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

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

23.11.2014, 17:27. Просмотров 287. Ответов 14
Метки нет (Все метки)

Объясните в чем ошибка)

Задание:
2. Примером удачного применения функции шаблона есть функция find (), которая ищет элемент object в массиве list и возвращает его или индекс найденного элемента (если его удалось найти), или "-1", если заданного элемента не найдено. Ниже приведен прототип конкретной версии функции find (). Превратите функцию find () в родовую функцию и проверьте решение в программе для массива целых чисел, чисел с плавающей точкой, массива символов. Параметр size задает количество элементов массива.
int find(int object, int *list, int size) { ... }

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
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
template <class A> 
int find(A object, A *list, int size)
{
  int i;
  for(i = 0; i < size; i++)
  {
    if(object == list[i])
    {
      return object;
    }
  }
  if(object != list[i])
  return -1;
}
void main()
{
setlocale(LC_ALL, "Russian");
  int a[] = {2, 3, 4, 5, 7, 1};
  char b[] = {'f', 'a', 'm'};
  double c[] = {22.4, 5.67, 54.2};
  cout << "Поиск элемента целого типа: \n" << find(4, a, 6) << endl;
  cout << "Поиск элемента символьного типа: \n" << find('m', b, 5) << endl;
  cout << "Поиск элемента с плавающей точкой: \n" << find(5.67, c, 8) << endl;
  system("pause");
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2014, 17:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шаблон функции (C++):

Используя перегруженные функции и шаблон функции удалить из массива элемент по индексу - C++
Стоит следующая задача: Используя перегруженные функции и шаблон функции удалить из массива элемент по индексу. Функцию написал, но я...

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

Ошибка в шаблоне функции: "Отсутствуют экземпляры шаблон функции, соответствующие списку аргументов" - C++
#include &lt;iostream&gt; #include &lt;iterator&gt; #include &lt;map&gt; #include &lt;Windows.h&gt; #include &lt;functional&gt; #include &lt;string&gt; #include...

Перегруженные функции и шаблон функции - C++
Указания: 1. Перегрузить функции для массивов типа char, int, и double. 2. Инстанцировать шаблон функции для типов char, int, и double....

Шаблон функции - C++
компилятор пишет, что неудается составить аргумент шаблон для &quot;L&quot;, как это можно исправить?? template &lt;class T, class L&gt; L Sum(T x1,...

Шаблон функции в С++ - C++
Добрый день. Я только начал изучать С++, около 3х месяцев. Пытаюсь сделать консольный телефонный справочник. Вопрос в шаблоне функции...

14
lss
921 / 850 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
23.11.2014, 17:41 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <class A> 
int find(A object, A *list, int size)
{
  int i;
  for(i = 0; i < size; i++)
  {
    if(object == list[i])
    {
       return object;
    }
  }
  
  return -1;
}
Зачем неправильные размеры массивов передаются?
0
Yana_Chernobay
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 77
23.11.2014, 17:51  [ТС] #3
lss, не совсем понимаю
Зачем неправильные размеры массивов передаются?
0
lss
921 / 850 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
23.11.2014, 17:58 #4
Цитата Сообщение от Yana_Chernobay Посмотреть сообщение
не совсем понимаю
Цитата Сообщение от Yana_Chernobay Посмотреть сообщение
find('m', b, 5)
Цитата Сообщение от Yana_Chernobay Посмотреть сообщение
find(5.67, c, 8)
Размер массива b разве 5? Размер массива c разве 8?
0
Nosey
1348 / 399 / 107
Регистрация: 22.10.2014
Сообщений: 862
Завершенные тесты: 2
23.11.2014, 18:00 #5
C++
1
2
3
* cout << "Поиск элемента целого типа: \n" << find(4, a, 6) << endl;// массив а имеет размер 6 - правильно
* cout << "Поиск элемента символьного типа: \n" << find('m', b, 5) << endl;// массив b имеет размер 3, а не 5
* cout << "Поиск элемента с плавающей точкой: \n" << find(5.67, c, 8) << endl;// массив c имеет размер .., а не ..
0
Yana_Chernobay
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 77
23.11.2014, 18:30  [ТС] #6
lss, оу....согласна, не внимательность - моя проблема

Добавлено через 8 минут
lss, все поменяла, работает.
Но в массиве с символами, оно выводит не символ а число. Так же в массиве с типом double выводит округленное число.

Поиск элемента целого типа:
4
Поиск элемента символьного типа:
109
Поиск элемента с плавающей точкой:
5
0
Nosey
1348 / 399 / 107
Регистрация: 22.10.2014
Сообщений: 862
Завершенные тесты: 2
23.11.2014, 18:36 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Yana_Chernobay Посмотреть сообщение
Но в массиве с символами, оно выводит не символ а число. Так же в массиве с типом double выводит округленное число.
У вас в коде функция возвращает int
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <class A> 
int find(A object, A *list, int size)
{
  int i;
  for(i = 0; i < size; i++)
  {
    if(object == list[i])
    {
       return object;
    }
  }
  
  return -1;
}
А нужно чтобы возвращала шаблонный тип. т.е.:
C++
1
2
template <class A> 
A find(A object, A *list, int size)
Иначе если возможно происходит неявное приведение шаблонного типа к int. В вашем случае все типы можно привести к int.
1
lss
921 / 850 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
23.11.2014, 18:36 #8
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
#include <iostream>
 
using namespace std;
 
template <class A> 
A find(A object, A *list, int size)
{
  int i;
  for(i = 0; i < size; i++)
  {
    if(object == list[i])
    {
       return object;
    }
  }
  
  return -1;
}
 
int main()
{
  setlocale(LC_ALL, "Russian");
  int a[] = {2, 3, 4, 5, 7, 1};
  char b[] = {'f', 'a', 'm'};
  double c[] = {22.4, 5.67, 54.2};
  
  cout << "Поиск элемента целого типа: ";
  int n = find(4, a, 6);
  if (n != -1)
    cout << n << endl;
  else
      cout << "Елемент не найден!\n";
  
  cout << "Поиск элемента символьного типа: ";
  char ch = find('m', b, 3);
  if (ch != -1)
    cout << ch << endl;
  else
      cout << "Елемент не найден!\n";
  
  cout << "Поиск элемента с плавающей точкой: ";
  double d = find(5.67, c, 3);
  if (d != -1)
    cout << d << endl;
  else
      cout << "Елемент не найден!\n";
  
  
  system("pause");
}
0
Yana_Chernobay
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 77
23.11.2014, 18:46  [ТС] #9
lss, Вы все организовали в одной функции, это очень хорошо, но у меня задание с функцией - шаблоном или родовой функцией))

Добавлено через 53 секунды
Nosey, Я поняла, спасибо Вам большое)
0
lss
921 / 850 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
23.11.2014, 18:56 #10
Цитата Сообщение от Yana_Chernobay Посмотреть сообщение
Вы все организовали в одной функции, это очень хорошо, но у меня задание с функцией - шаблоном или родовой функцией))
В какой одной? find() перестала быть шаблонной функцией?
0
hoggy
6672 / 2856 / 491
Регистрация: 15.11.2014
Сообщений: 6,371
Завершенные тесты: 1
23.11.2014, 19:02 #11
если делать по уму, то выглядеть это должно как то так:

http://rextester.com/ONG89301

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
#include <iostream>
using namespace std;
 
template <class T, size_t N> 
size_t find(const T& target, const T (&arr)[N])
{
  for(size_t i = 0; i < N; ++i)
    if(target == arr[i])
      return i;
  return -1;
}
 
 
 
int main()
{
 
  const int a[]    = {2, 3, 4, 5, 7, 1};
  const char b[]   = {'f' , 'a' , 'm' };
  const double c[] = {22.4, 5.67, 54.2};
  
  cout << "Поиск элемента целого типа: "        << (int)find(4, a)    << endl;
  cout << "Поиск элемента символьного типа: "   << (int)find('m', b)  << endl;
  cout << "Поиск элемента с плавающей точкой: " << (int)find(5.67, c) << endl;
    
  cout << "----------------\n";
    
  cout << "Поиск элемента с плавающей точкой: " << (int)find(100.67, c) << endl;
}
Ключевые особенности:

1. Не нужно передавать размер массива. Потому что этот размер можно вывести автоматически.

2. Тип данных, задача которого - хранение индекса массива, должен быть size_t.
0
Nosey
1348 / 399 / 107
Регистрация: 22.10.2014
Сообщений: 862
Завершенные тесты: 2
23.11.2014, 19:07 #12
Цитата Сообщение от hoggy Посмотреть сообщение
1. Не нужно передавать размер массива. Потому что этот размер можно вывести автоматически.
Стоит отметить, что не прокатит с динамическим массивом.

Цитата Сообщение от hoggy Посмотреть сообщение
2. Тип данных, задача которого - хранение индекса массива, должен быть size_t.
Почему должен? best practices?
0
lss
921 / 850 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
23.11.2014, 19:08 #13
Цитата Сообщение от hoggy Посмотреть сообщение
если делать по уму, то выглядеть это должно как то так:
Хоть бы "по уму" не писал, народ бы не смешил.
0
hoggy
6672 / 2856 / 491
Регистрация: 15.11.2014
Сообщений: 6,371
Завершенные тесты: 1
23.11.2014, 19:10 #14
Цитата Сообщение от Nosey Посмотреть сообщение
Почему должен? best practices?
Этот тип данных специально для этого предназначен.
Он гарантированно способен вместить максимальный индекс доступный на данной платформе.

Цитата Сообщение от Nosey Посмотреть сообщение
Стоит отметить, что не прокатит с динамическим массивом.
На языке с++ не существует динамических массивов.
0
Nosey
1348 / 399 / 107
Регистрация: 22.10.2014
Сообщений: 862
Завершенные тесты: 2
23.11.2014, 19:16 #15
Цитата Сообщение от hoggy Посмотреть сообщение
Этот тип данных специально для этого предназначен.
Он гарантированно способен вместить максимальный индекс доступный на данной платформе.
Спасибо, наверное я что-то понял.

Цитата Сообщение от hoggy Посмотреть сообщение
На языке с++ не существует динамических массивов.
Очень остроумно
0
23.11.2014, 19:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2014, 19:16
Привет! Вот еще темы с ответами:

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

шаблон функции - C++
подсчитать среднее арифметическое элементов расположенных выше главной диагонали. Непойму где ошибка. #include&lt;iostream&gt; using...

Шаблон функции - C++
Написать шаблон функции для вычисления суммы элементов, находящихся между первым и последним нулевыми элементами. Помогите пожалуста! ...

c++ шаблон функции - C++
Есть некая структура, которая хранит информацию о фигурах (площадь основания, радиус и т.д.). Нужно описать шаблонную функцию, которая в...


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

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

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