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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> функция-шаблон 
:(
    Опции темы
zhenya1
Дата 22.2.2011, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



У меня такое задание: написать функцию-шаблон, которая переставляет эл-ты в массиве. Правильно ли я это сделал?

Код

template <class T,int n>
void fun()
{
    int m,k,first,second;;
    T *arr = new T [n];
    for(int i=0;i<n;i++){ arr[i] =i;
    cout<<arr[i]<<endl;}cout<<" input first:"<<endl;
    cin>> first;

        for(int i=0;i<n;i++)
            if(arr[i]==first) m=i;

        cout<<" input second:"<<endl;
        cin>>second;

        for(int i=0;i<n;i++)
            if(arr[i]==second) k=i;

        system("cls");
            cout<<" changing..."<<endl;
            arr[m]=second;
            arr[k]=first;
            for(int i=0;i<n;i++)
            {
                cout<<arr[i]<<endl;;
            }
delete []arr;        
system("pause");
}
void main()
{
    fun<char,5>();            
}

PM MAIL   Вверх
mes
Дата 23.2.2011, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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



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


Шустрый
*


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

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



Вот так?


Код

template <class TYPE>
void fun (TYPE *arr, int n)
{
    int m,k,first,second;;
    cin>> first;

        for(int i=0;i<n;i++)
            if(arr[i]==first) m=i;

        cout<<" input second:"<<endl;
        cin>>second;

        for(int i=0;i<n;i++)
            if(arr[i]==second) k=i;

        system("cls");
            cout<<" changing..."<<endl;
            arr[m]=second;
            arr[k]=first;        
}
void main()
{
int n=5;
int *arr = new int[n];
    for(int i=0;i<n;i++){ arr[i] =i;
    cout<<arr[i]<<endl;}cout<<" input first:"<<endl;
    fun<int>(arr,n);
                for(int i=0;i<n;i++)
            {
                cout<<arr[i]<<endl;;
            }
delete []arr;
system("pause");
}

PM MAIL   Вверх
mes
Дата 23.2.2011, 01:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



прочитайте задание :
Цитата(zhenya1 @  22.2.2011,  22:36 Найти цитируемый пост)
, которая переставляет эл-ты в массиве. 


Цитата(zhenya1 @  23.2.2011,  00:05 Найти цитируемый пост)
    cin>> first;

Цитата(zhenya1 @  23.2.2011,  00:05 Найти цитируемый пост)
  cout<<" input second:"<<endl;
        cin>>second;

Цитата(zhenya1 @  23.2.2011,  00:05 Найти цитируемый пост)
 system("cls");
            cout<<" changing..."<<endl


это откуда внутри функции появилось то ?!


--------------------
PM MAIL WWW   Вверх
zhenya1
Дата 23.2.2011, 01:47 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Исправил. Большое спасибо!
PM MAIL   Вверх
volatile
Дата 23.2.2011, 02:14 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



mes, это, если не ошибаюсь, оно запрашивает у юзера номера элементов которые переставлять надо. smile
Функция с диалоговым интерфейсом!

zhenya1, Зачем вы себе усложняете жизнь?
У вас задание 
Цитата(zhenya1 @  22.2.2011,  23:36 Найти цитируемый пост)
функцию-шаблон, которая переставляет эл-ты в массиве

Там ничего не сказано о диалоге.

Предлагаю сделать проще:
Код

template <class T>
void exchange(T* arr, int first, int second)
{
    // А здесь ровно 3 строчки. для обмена arr[first] и arr[second]
    // Не хочу вас лишать удовольствия написать это самому.
}


PM MAIL   Вверх
mes
Дата 23.2.2011, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(mes @  23.2.2011,  00:14 Найти цитируемый пост)
это откуда внутри функции появилось то ?! 

Цитата(volatile @  23.2.2011,  01:14 Найти цитируемый пост)
mes, это, если не ошибаюсь, оно запрашивает у юзера номера элементов которые переставлять надо.

smile 
 
Код

           if(arr[i]==first) m=i;

а вообще какая разница, что запрашивает... главное, что это лишнее..girl_crazy 



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


Бывалый
*


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

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



Цитата(volatile @  23.2.2011,  02:14 Найти цитируемый пост)
// А здесь ровно 3 строчки. для обмена arr[first] и arr[second]

думаю 4 строчки.

--------------------
Oaks may fall when reeds stand the storm.
PM MAIL   Вверх
mes
Дата 23.2.2011, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(миг @  23.2.2011,  10:56 Найти цитируемый пост)
думаю 4 строчки.

если нужно поменять два элемента массива местами, то достаточно и одной строчки..
 smile 


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


Эксперт
****


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

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



Цитата(mes @  23.2.2011,  14:02 Найти цитируемый пост)
если нужно поменять два элемента массива местами, то достаточно и одной строчки..


mes, как одной строчкой?
при условии конечно одно выражение, разделенное ( ; ) или ( , ) - одна строчка. (Иначе можно любую программу записать в 1 строчку smile )
PM MAIL   Вверх
volatile
Дата 24.2.2011, 01:53 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(миг @  23.2.2011,  11:56 Найти цитируемый пост)
думаю 4 строчки.

миг, 
Код

T temp = arr[first],       // Раз
arr[first] =  arr[second], // Два
arr[second] = temp;        // Три

mes, знает как одной, я не знаю...

PM MAIL   Вверх
mes
Дата 24.2.2011, 01:56 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(volatile @  24.2.2011,  00:53 Найти цитируемый пост)
 знает как одной, я не знаю...

см std::swap


--------------------
PM MAIL WWW   Вверх
volatile
Дата 24.2.2011, 02:14 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А, точно. Про свап я и забыл совсем. 
Но всё-же, еще придется одну строчку дописать в начале
#include <algorithm>
так что две строчки.  smile


PM MAIL   Вверх
миг
Дата 24.2.2011, 05:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



В три строчки.
Код

#include<iostream.h>
template <class T>
void exchange(T* x, T* y)
{
    *x=*x^*y;
    *y=*x^*y;
    *x=*x^*y;
}

int main()
{
    int m[3];
    m[0]=3;
    m[1]=5;
    m[2]=8;
    exchange(m,m+2);
    cout<<m[0]<<endl;
    cout<<m[1]<<endl;
    cout<<m[2]<<endl;
    return 0;
}

--------------------
Oaks may fall when reeds stand the storm.
PM MAIL   Вверх
mes
Дата 24.2.2011, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(миг @  24.2.2011,  04:36 Найти цитируемый пост)
  *x=*x^*y;
    *y=*x^*y;
    *x=*x^*y;

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


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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