Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегрузка и шаблоны функций 
:(
    Опции темы
Kolenval
Дата 25.5.2008, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.5.2008

Репутация: нет
Всего: нет



Может кто поможет сделать это:

1. Выполнить задание, реализовав его через механизм функций и обеспечив их перегрузку для типов int, float, double.
Из двух массивов разной длины сформировать общий массив и вычислить сумму положительных элементов.
2.Выполнить задание, оформив его в виде шаблона функции. Написать программы, использующие эти шаблоны для типов int, float, double.
Выполнить задание, если дана  целочисленная матрица порядка nxm. Упорядочить строки по неубыванию наибольших элементов.

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

PM MAIL   Вверх
bronislav
Дата 25.5.2008, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

Репутация: 2
Всего: 3



В первом задании тебе надо написать 3 функции с одним и тем же именем, но с параметрами разных типов.

А во втором, тебе надо написать одну шаблонную функцию, которую можно использовать для 3 разных типов.

Понятно? Или нет?


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
relevant
Дата 25.5.2008, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 25.5.2008

Репутация: нет
Всего: нет



не понятно ЧТО должны делать эти функции
PM MAIL   Вверх
mes
Дата 25.5.2008, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(relevant @  25.5.2008,  21:32 Найти цитируемый пост)
не понятно ЧТО должны делать эти функции 


Цитата(Kolenval @  25.5.2008,  16:59 Найти цитируемый пост)
Из двух массивов разной длины сформировать общий массив и вычислить сумму положительных элементов.

и
Цитата(Kolenval @  25.5.2008,  16:59 Найти цитируемый пост)
Выполнить задание, если дана  целочисленная матрица порядка nxm. Упорядочить строки по неубыванию наибольших элементов.




--------------------
PM MAIL WWW   Вверх
Kolenval
Дата 26.5.2008, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.5.2008

Репутация: нет
Всего: нет



ну а можно пожалуйста пример функции (основаной на шаблонах) далающей из a[10] и b[5], с[15].
PM MAIL   Вверх
mes
Дата 26.5.2008, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



лови примерчик по исполэзованию шаблоных функций

Код


#include "iostream"
#include "vector"

using namespace std;

template<class T> void push_back (T& dest, T& src)
{
  for (typename T::iterator it=src.begin(); it!=src.end(); ++it) dest.push_back(*it);
};
template<class T> void print_all (T& src)
{
  for (typename T::iterator it=src.begin(); it!=src.end(); ++it) cout <<*it <<" ";
};
template<class T> void fill_random (T& dest, size_t count)
{
  for (size_t i=0; i<count; ++i) dest.push_back( ((typename T::value_type) (rand()%10)/10)+rand()%20 );
};

template <class T> void Test ()
{
vector<T> a;
vector<T> b;
vector<T> c;

fill_random(a,10);
fill_random(b,20);

push_back (c,a);
push_back (c,b);

 cout << "vector a: "; print_all (a);
 cout << endl;
 cout << "vector b: "; print_all (b);
 cout << endl;
 cout << "vector c: "; print_all (c);
 cout << endl;
};

int main(){
cout << "Test type int: ";
  Test<int>();
cout << endl;

cout << "Test type float: ";
  Test<float> ();
cout << endl;

cout << "Test type double: ";
  Test<double>();
cout << endl;

system ("PAUSE");

return 0;

};



Это сообщение отредактировал(а) mes - 26.5.2008, 20:19


--------------------
PM MAIL WWW   Вверх
Kolenval
Дата 26.5.2008, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.5.2008

Репутация: нет
Всего: нет



от эт спасибо, от это я понимаю красиво написал
PM MAIL   Вверх
Rififi
Дата 27.5.2008, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 3
Всего: 36



Цитата(Kolenval @  25.5.2008,  16:59 Найти цитируемый пост)
2.Выполнить задание, оформив его в виде шаблона функции. Написать программы, использующие эти шаблоны для типов int, float, double.
Выполнить задание, если дана  целочисленная матрица порядка nxm. Упорядочить строки по неубыванию наибольших элементов.


кодируем в стиле C++ :gigi:

Код
#include <vector>
#include <functional>
#include <algorithm>
#include <iostream>

/*
Дана  целочисленная матрица порядка nxm.
Упорядочить строки по неубыванию наибольших элементов.
`Матрица` = двумерный массив
*/

// Поиск максимального элемента в одной строке
// формирует вектор пар: итератор указывающий на максимальный элемент в строке, индекс строки в матрице
template <typename T, const size_t Rows>
struct maxer : public std::unary_function<
    const T (&)[Rows],
    std::vector<std::pair<typename std::allocator<T>::const_pointer, size_t> > >
{
    // ---------------------------------------------------------------------------------------------------------------------------
    typedef std::unary_function<
        const T (&)[Rows],
        std::vector<std::pair<typename std::allocator<T>::const_pointer, size_t> > > base_type;
    typedef typename base_type::argument_type argument_type;
    typedef typename base_type::result_type result_type;
    // ---------------------------------------------------------------------------------------------------------------------------

    maxer() : index_(0) {}

    void operator()(argument_type v)
    {        
        res_.push_back(std::make_pair(std::max_element(&v[0], &v[0]+Rows), index_++));
    }

    operator result_type() const { return res_; }

    result_type res_;
    size_t index_;
};

// Класс-предикат для сравнения первых элементов (итераторов) в паре
template <typename T>
struct pair_comparer : public std::binary_function<
    typename T::value_type, typename T::value_type, bool>
{
    // ---------------------------------------------------------------------------------------------------------------------------
    typedef std::binary_function<
        typename T::value_type, typename T::value_type, bool> base_type;
    typedef typename base_type::first_argument_type first_argument_type;
    typedef typename base_type::second_argument_type second_argument_type;
    typedef typename base_type::result_type result_type;
    // ---------------------------------------------------------------------------------------------------------------------------

    result_type operator()(const first_argument_type& v1, const second_argument_type& v2) const
    {
        return *v1.first < *v2.first;
    }
};

// погнали :)
template <typename T, const size_t Cols, const size_t Rows>
void reorder_max(T (&arr)[Cols][Rows])
{
    // получить вектор максимальных элементов с индексами строк
    typedef maxer<T, Rows> pred_type;
    typedef typename pred_type::result_type result_type;
    result_type v = std::for_each(&arr[0], &arr[0]+Cols, pred_type());
    
    // создание упорядоченной матрицы и замещение ею оригинальной
    std::sort(v.begin(), v.end(), pair_comparer<result_type>());
    T tmp[Cols][Rows];
    for(size_t i=0; i<v.size(); i++)
        std::copy(arr[v[i].second], arr[v[i].second]+Rows, tmp[i]);
    std::copy(&tmp[0][0], &tmp[0][0]+Cols*Rows, &arr[0][0]);
}

// вспомогательные функции для вывода матрицы на экран
template <
    typename _E, typename _Tr, template <typename, typename> class O,
    typename T, const size_t Rows>
struct outer : public std::unary_function<const T (&)[Rows], void>
{
    // ---------------------------------------------------------------------------------------------------------------------------
    typedef std::unary_function<const T (&)[Rows], void> base_type;
    typedef typename base_type::argument_type argument_type;
    typedef typename base_type::result_type result_type;
    // ---------------------------------------------------------------------------------------------------------------------------

    outer(O<_E,_Tr>& os) : os_(os) {}
    result_type operator()(argument_type v) const
    {
        const _E sep[] = { _E(' '), 0 };
        std::ostream_iterator<T,_E,_Tr> oi(os_, sep); 
        std::copy(&v[0], &v[0]+Rows, oi);
        os_ << std::endl;
    }
    O<_E,_Tr>& os_;
};

template <
    typename _E, typename _Tr, template <typename, typename> class O,
    typename T, const size_t Cols, const size_t Rows>
O<_E,_Tr>& operator << (O<_E,_Tr>& os, T (&arr)[Cols][Rows])
{
    std::for_each(&arr[0], &arr[0]+Cols, outer<_E, _Tr, O, T, Rows>(os));
    return (os);
}

int main()
{
    const size_t Rows = 5;
    int arr[][Rows] =
    {
        {4,1,31,2,1},
        {3,1,13,1,2 },
        {0,-2,2,2, 3},                
        {1, 20,1,2, 4},        
    };

    std::cout << arr << std::endl;
    reorder_max(arr);
    std::cout << arr;
    return (0);
}


вывод:

Код
4 1 31 2 1
3 1 13 1 2
0 -2 2 2 3
1 20 1 2 4

0 -2 2 2 3
3 1 13 1 2
20 1 2 4
4 1 31 2 1


Это сообщение отредактировал(а) Rififi - 27.5.2008, 21:44
PM MAIL   Вверх
Kolenval
Дата 27.5.2008, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.5.2008

Репутация: нет
Всего: нет



Эм... z.exe - 19 error(s), 0 warning(s)
PM MAIL   Вверх
mes
Дата 27.5.2008, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Kolenval @  27.5.2008,  19:35 Найти цитируемый пост)
Эм... z.exe - 19 error(s), 0 warning(s) 

это сообщение  для телепатов ?  smile
 smile 


--------------------
PM MAIL WWW   Вверх
Kolenval
Дата 27.5.2008, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.5.2008

Репутация: нет
Всего: нет



вот модно нынче про телепатов говорить (сдает гугл, сдает...)) это к предыдущему сообщеню от Rififi
PM MAIL   Вверх
Rififi
Дата 27.5.2008, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 3
Всего: 36



Программа откомпилирована в Visual Studio 2008.
PS. Я тут ещё после попытался присунуть её Комо, и он не прожевал. Случай как раз для ихнего FAQ'а..
Исправил текст программы. Комо компилирует. Исправления отмечены жёлтым.

Полный лог компиляции, максимальный уровень предупреждений:

Код
1>------ Build started: Project: StlTest, Configuration: Debug Win32 ------
1>Compiling...
1>test.cpp
1>c:\develop\temp\test.cpp(70) : warning C4996: 'std::copy': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'
1>        c:\program files\microsoft visual studio 9.0\vc\include\xutility(2576) : see declaration of 'std::copy'
1>        c:\develop\temp\test.cpp(115) : see reference to function template instantiation 'void reorder_max<int,4,5>(T (&)[4][5])' being compiled
1>        with
1>        [
1>            T=int
1>        ]
1>Build log was saved at "file://c:\develop\temp\Debug\BuildLog.htm"
1>StlTest - 0 error(s), 1 warning(s)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========


Это сообщение отредактировал(а) Rififi - 27.5.2008, 21:50
PM MAIL   Вверх
JackYF
Дата 27.5.2008, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162



Цитата(Kolenval @  27.5.2008,  19:26 Найти цитируемый пост)
это к предыдущему сообщеню от Rififi 

Лол. Сами сообщения об ошибках будут или нам входить в медитацию?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Kolenval
Дата 27.5.2008, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.5.2008

Репутация: нет
Всего: нет



Уш простите коли грешен, компиляю в Visual C++ 6 )). А вот сопсна лог (уже исправленого исходника, уже 21 еррор):

Код

--------------------Configuration: func_z3 - Win32 Debug--------------------
Compiling...
z3.cpp
c:\program files\microsoft visual studio\myprojects\func_z3\z3.cpp(16) : error C2265: '<Unknown>' : reference to a zero-sized array is illegal
        c:\program files\microsoft visual studio\myprojects\func_z3\z3.cpp(38) : see reference to class template instantiation 'maxer<T,Rows>' being compiled
c:\program files\microsoft visual studio\myprojects\func_z3\z3.cpp(16) : error C2266: '<Unknown>' : reference to a non-constant bounded array is illegal
        c:\program files\microsoft visual studio\myprojects\func_z3\z3.cpp(38) : see reference to class template instantiation 'maxer<T,Rows>' being compiled
c:\program files\microsoft visual studio\myprojects\func_z3\z3.cpp(21) : error C2265: '<Unknown>' : reference to a zero-sized array is illegal
        c:\program files\microsoft visual studio\myprojects\func_z3\z3.cpp(38) : see reference to class template instantiation 'maxer<T,Rows>' being compiled
c:\program files\microsoft visual studio\myprojects\func_z3\z3.cpp(21) : error C2266: '<Unknown>' : reference to a non-constant bounded array is illegal
        c:\program files\microsoft visual studio\myprojects\func_z3\z3.cpp(38) : see reference to class template instantiation 'maxer<T,Rows>' being compiled
c:\program files\microsoft visual studio\myprojects\func_z3\z3.cpp(61) : error C2265: '<Unknown>' : reference to a zero-sized array is illegal
c:\program files\microsoft visual studio\myprojects\func_z3\z3.cpp(61) : error C2087: '<Unknown>' : missing subscript
c:\program files\microsoft visual studio\myprojects\func_z3\z3.cpp(78) : error C2954: template definitions cannot nest
c:\program files\microsoft visual studio\myprojects\func_z3\z3.cpp(78) : error C2951: template declarations are only permitted at global or namespace scope
c:\program files\microsoft visual studio\myprojects\func_z3\z3.cpp(78) : error C2991: redefinition of template parameter '__unnamed'
c:\program files\microsoft visual studio\myprojects\func_z3\z3.cpp(78) : error C2226: syntax error : unexpected type 'O'
c:\program files\microsoft visual studio\myprojects\func_z3\z3.cpp(81) : error C2143: syntax error : missing '>' before '{'
c:\program files\microsoft visual studio\myprojects\func_z3\z3.cpp(97) : error C2059: syntax error : '<end Parse>'
c:\program files\microsoft visual studio\myprojects\func_z3\z3.cpp(100) : error C2954: template definitions cannot nest
c:\program files\microsoft visual studio\myprojects\func_z3\z3.cpp(100) : error C2954: template definitions cannot nest
c:\program files\microsoft visual studio\myprojects\func_z3\z3.cpp(100) : error C2951: template declarations are only permitted at global or namespace scope
c:\program files\microsoft visual studio\myprojects\func_z3\z3.cpp(100) : error C2991: redefinition of template parameter '__unnamed'
c:\program files\microsoft visual studio\myprojects\func_z3\z3.cpp(100) : error C2226: syntax error : unexpected type 'O'
c:\program files\microsoft visual studio\myprojects\func_z3\z3.cpp(103) : error C2143: syntax error : missing '>' before '{'
c:\program files\microsoft visual studio\myprojects\func_z3\z3.cpp(106) : error C2059: syntax error : '<end Parse>'
c:\program files\microsoft visual studio\myprojects\func_z3\z3.cpp(109) : error C2143: syntax error : missing ';' before '{'
c:\program files\microsoft visual studio\myprojects\func_z3\z3.cpp(109) : error C2447: missing function header (old-style formal list?)
Error executing cl.exe.

func_z3.exe - 21 error(s), 0 warning(s)

PM MAIL   Вверх
Rififi
Дата 27.5.2008, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 3
Всего: 36



Цитата(Kolenval @  27.5.2008,  23:19 Найти цитируемый пост)
компиляю в Visual C++ 6

С этим компилятором ты можешь с совершенно спокойной совестью расслабиться. "Ну не шмогла я, не шмогла" © :oops:
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1157 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.