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

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

Восстановить пароль Регистрация
 
Yana_Chernobay
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 76
23.11.2014, 17:27     Шаблон функции #1
Объясните в чем ошибка)

Задание:
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");
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2014, 17:27     Шаблон функции
Посмотрите здесь:

C++ Шаблон функции
шаблон функции C++
Шаблон функции C++
шаблон функции C++
C++ Шаблон функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lss
919 / 849 / 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;
}
Зачем неправильные размеры массивов передаются?
Yana_Chernobay
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 76
23.11.2014, 17:51  [ТС]     Шаблон функции #3
lss, не совсем понимаю
Зачем неправильные размеры массивов передаются?
lss
919 / 849 / 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?
Nosey
 Аватар для Nosey
1184 / 351 / 102
Регистрация: 22.10.2014
Сообщений: 786
Завершенные тесты: 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 имеет размер .., а не ..
Yana_Chernobay
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 76
23.11.2014, 18:30  [ТС]     Шаблон функции #6
lss, оу....согласна, не внимательность - моя проблема

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

Поиск элемента целого типа:
4
Поиск элемента символьного типа:
109
Поиск элемента с плавающей точкой:
5
Nosey
 Аватар для Nosey
1184 / 351 / 102
Регистрация: 22.10.2014
Сообщений: 786
Завершенные тесты: 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.
lss
919 / 849 / 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");
}
Yana_Chernobay
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 76
23.11.2014, 18:46  [ТС]     Шаблон функции #9
lss, Вы все организовали в одной функции, это очень хорошо, но у меня задание с функцией - шаблоном или родовой функцией))

Добавлено через 53 секунды
Nosey, Я поняла, спасибо Вам большое)
lss
919 / 849 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
23.11.2014, 18:56     Шаблон функции #10
Цитата Сообщение от Yana_Chernobay Посмотреть сообщение
Вы все организовали в одной функции, это очень хорошо, но у меня задание с функцией - шаблоном или родовой функцией))
В какой одной? find() перестала быть шаблонной функцией?
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 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.
Nosey
 Аватар для Nosey
1184 / 351 / 102
Регистрация: 22.10.2014
Сообщений: 786
Завершенные тесты: 2
23.11.2014, 19:07     Шаблон функции #12
Цитата Сообщение от hoggy Посмотреть сообщение
1. Не нужно передавать размер массива. Потому что этот размер можно вывести автоматически.
Стоит отметить, что не прокатит с динамическим массивом.

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

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

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

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

Или воспользуйтесь поиском по форуму:
Nosey
 Аватар для Nosey
1184 / 351 / 102
Регистрация: 22.10.2014
Сообщений: 786
Завершенные тесты: 2
23.11.2014, 19:16     Шаблон функции #15
Цитата Сообщение от hoggy Посмотреть сообщение
Этот тип данных специально для этого предназначен.
Он гарантированно способен вместить максимальный индекс доступный на данной платформе.
Спасибо, наверное я что-то понял.

Цитата Сообщение от hoggy Посмотреть сообщение
На языке с++ не существует динамических массивов.
Очень остроумно
Yandex
Объявления
23.11.2014, 19:16     Шаблон функции
Ответ Создать тему
Опции темы

Текущее время: 02:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru