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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблем с выводом результата функции 
:(
    Опции темы
mes
Дата 13.1.2009, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Kinch @  13.1.2009,  20:19 Найти цитируемый пост)
можете пошагово пояснить 


Код

void mirror (
             int * begin,  // начало массива
             int * end     // конец (последний+1) массива 
            )    
{
    for ( //  цикл :
          --end // инициализация: устанавливаем на последний элемент
          ;
          begin<end // условие: ждем пока не встретятся
          ;
          ++begin, --end // счетчик: идем навстречу 
        )
        std::swap (*begin, *end); // действие: меняем местами текущие начальный и конечный элементы
}



Цитата(Kinch @  13.1.2009,  20:19 Найти цитируемый пост)
написать код полность

код по полноте более, чем достаточен. 
подробнее писать принципиально не буду.  smile


Это сообщение отредактировал(а) mes - 13.1.2009, 21:59


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


Новичок



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

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



mes,  премнога благодарен
PM MAIL   Вверх
UnrealMan
Дата 13.1.2009, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Kinch @  13.1.2009,  17:15 Найти цитируемый пост)
Написать Функцию которая переводит заданный одномерный массив в зеркальное отображение и выводит его на экран.

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

template <class T>
void print_reversed_array(T *first, T *last)
{
    std::reverse(first, last);
    std::copy(first, last, std::ostream_iterator<T>(std::cout, "\n"));
}


Добавлено через 58 секунд
Цитата(mes @  13.1.2009,  21:49 Найти цитируемый пост)
--end // инициализация: устанавливаем на последний элемент

А если массив пустой? smile 
PM MAIL   Вверх
mes
Дата 14.1.2009, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(UnrealMan @  13.1.2009,  22:53 Найти цитируемый пост)
А если массив пустой? smile  

Хм.. Не понял намека.
То end станет меньше begin и цикл не выполнится.

Проблема будет в том случае, если переданный указатель будет ноль.
Но это в рамки задачи не входит.

aa.. или Вы для случая с итeраторами ?  
В этом случае да.. но дополнительные проверки делать не хотел, чтоб не путать логику.
Опять же это ,имхо, не входит в рамки задачи. 

Это сообщение отредактировал(а) mes - 14.1.2009, 00:29


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


Опытный
**


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

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



Цитата(mes @  14.1.2009,  00:22 Найти цитируемый пост)
То end станет меньше begin

По стандарту это undefined behavior.
PM MAIL   Вверх
jonie
Дата 14.1.2009, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



UnrealMan ну эт у тебя "написано до нас")
никто не спорит, что можно написать и так:
Код

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <functional>

template <typename T>
struct swapper :  public std::binary_function<T**, T, void>
{
    typedef typename first_argument_type first_argument_type;
    typedef typename second_argument_type second_argument_type;
    typedef typename result_type result_type;

    result_type operator()(const first_argument_type& v1, /*const*/ second_argument_type& v2) const
    {
        v2 = **v1;
        (*v1)--;
    }
};

template <typename T,
          const size_t size>
void mirror(T (&array)[size], T (&result)[size])
{
    T* parray = &array[0]+size-1;
    std::for_each(result, 
        &result[0]+size,
        std::bind1st(swapper<T>(), &parray)
        );
}

template <
typename _E, typename _Tr, template <typename, typename> class O,
typename T, const size_t size>
O<_E,_Tr>& operator << (O<_E,_Tr>& os, T (&arr)[size])
{
    std::copy(arr, &arr[0]+size, std::ostream_iterator<T>(os, " "));
    return (os);
}

int _tmain(int argc, _TCHAR* argv[])
{
    int a[3] = {1,2,3};
    int b[3];

    std::cout<<"a { "<<a<<"} \n";
    mirror(a,b);
    std::cout<<"b { "<<b<<"}";

    return 0;
}



но нахрена так усложнять процесс.. если достаточно:
Код

void mirrorA(int* a, int*b, size_t s){
    for (int i=0;i<s;++i)
    {
        b[s-i-1] = a[i];
    }
}

конечно, первое неимоверно "круто", но удобно имхо только если это "черный ящик"....



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
mes
Дата 14.1.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(UnrealMan @  13.1.2009,  23:35 Найти цитируемый пост)
По стандарту это undefined behavior. 

При арифметике указателей ??  smile 

ну ладно..подправляю :

Код

void mirror (int * begin, int * end) 
{
   if (end<=begin) return;
   for (--end; begin<end; ++begin, --end)
     std::swap (*begin, *end);
}



Это сообщение отредактировал(а) mes - 14.1.2009, 10:47


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


Explorer
****


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

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



Цитата(mes @  14.1.2009,  11:36 Найти цитируемый пост)
ну ладно..подправляю :

зря правил, нет там UB для голых указателей


--------------------
Мой блог
PM MAIL WWW   Вверх
baldina
Дата 14.1.2009, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(UnrealMan @ 13.1.2009,  23:53)
Цитата(mes @  13.1.2009,  21:49 Найти цитируемый пост)
--end // инициализация: устанавливаем на последний элемент

А если массив пустой? smile

в общем случае (итераторы) правильно было бы использовать для сравнения не "меньше", а "не равно". и с точки зрения --end и с точки зрения требований к итераторам в данном алгоритме
Код

template <typename BidirectIt>
void mirror (BidirectIt first, BidirectIt last)
{
  while (first != last && first != --last)
  {
     std::swap (*first, *last);
     ++first;
  }
}

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


Опытный
**


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

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



Цитата(vinter @  14.1.2009,  10:56 Найти цитируемый пост)
зря правил, нет там UB для голых указателей 

Откуда такая уверенность? Ты прочитал в стандарте все правила, касающиеся префиксного декремента указателей?

Цитата(jonie @  14.1.2009,  10:12 Найти цитируемый пост)
конечно, первое неимоверно "круто", 

Я что-то не понял, в чём там заключается неимоверная крутизна и о чём вообще этот твой пост smile

Цитата(baldina @  14.1.2009,  10:59 Найти цитируемый пост)
 while (first != last && first != --last)

Два сравнения в цикле - это излишество.

Это сообщение отредактировал(а) UnrealMan - 14.1.2009, 12:07
PM MAIL   Вверх
baldina
Дата 14.1.2009, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
Два сравнения в цикле - это излишество.


есть альтернативные предложения? хотелось бы увидеть...
пожалуйста, с учетом, что first и last это bidirectional iterator

Добавлено через 2 минуты и 42 секунды
для обычных указателей все гораздо проще

Код

template <typename RandIt>
void mirror (RandIt first, RandIt last)
{
  while (first < last)
     std::swap (*first++, *--last);
}


Добавлено через 7 минут и 8 секунд
Цитата

По стандарту это undefined behavior. 


Что именно "это"?
PM MAIL   Вверх
mes
Дата 14.1.2009, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(baldina @  14.1.2009,  11:45 Найти цитируемый пост)
для обычных указателей все гораздо проще
...     std::swap (*first++, *--last);

либо -- не там, либо один лишний swap smile (условие гораздо дешевле, даже просто для логики, чем swap)



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


Опытный
**


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

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



Цитата(baldina @  14.1.2009,  12:45 Найти цитируемый пост)
first и last это bidirectional iterator 

Итераторы произвольного доступа являются двунаправленными, но это не мешает использовать для них оператор <.

Цитата(baldina @  14.1.2009,  12:45 Найти цитируемый пост)
есть альтернативные предложения?

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

Цитата(baldina @  14.1.2009,  10:59 Найти цитируемый пост)
в общем случае (итераторы) правильно было бы использовать для сравнения не "меньше", а "не равно".


Цитата(baldina @  14.1.2009,  12:45 Найти цитируемый пост)
хотелось бы увидеть...

Посмотри любую современную реализацию std::reverse в STL от VC++, GCC  или в STLport. Наверняка там не будет использоваться единый алгоритм для всех двунаправленных итераторов.

Цитата(baldina @  14.1.2009,  12:45 Найти цитируемый пост)
Что именно "это"? 

Если в функцию в качестве параметра end передаётся указатель на конец массива, одновременно являющийся его началом (такой массив может быть создан посредством new T[0]), а потом к end пытаются применить декремент, то такая попытка влечёт undefined behavior.

Это сообщение отредактировал(а) UnrealMan - 14.1.2009, 13:55
PM MAIL   Вверх
jonie
Дата 14.1.2009, 13:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Я что-то не понял, в чём там заключается неимоверная крутизна и о чём вообще этот твой пост smile

UnrealMan я про то, что чет вы тут сейчас накрутите сложностей, которые автор топика не поймет... смысл тогда от них сомнителен.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
UnrealMan
Дата 14.1.2009, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(jonie @  14.1.2009,  13:33 Найти цитируемый пост)
я про то, что чет вы тут сейчас накрутите сложностей

Каких сложностей? Я привёл простейшую реализацию функции, описанной в первом посте темы.

Это сообщение отредактировал(а) UnrealMan - 14.1.2009, 13:46
PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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