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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> реверс массива 
:(
    Опции темы
kLASTER
Дата 3.3.2013, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток!
Есть обычный массив, нужно сделать реверс значений, т.е. первому элементу присвоить последний, второму предпоследний и тд.
Нужен алгоритм, но не функция.
Что- то было такое в сортировках если память не изменяет!
Заранее спасибо!!!
PM MAIL   Вверх
fish9370
Дата 3.3.2013, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



имеем два указателя один на начало второй на конец,
цикл, от 0 до размер массива деленный на два, указатель на начало увеличивается на единицу, указатель на конец уменьшается на единицу
тело цикла, обмен значений, на которые ссылаются указатели

мне кажется этот алгоритм ты мог бы придумать сам..


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


Опытный
**


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

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



а использование итераторов rbegin и rend не устраивает?

хехе.. что-то я под масивом сразу понял вектор.. smile

Это сообщение отредактировал(а) NoviceF - 3.3.2013, 20:02
PM MAIL   Вверх
kLASTER
Дата 3.3.2013, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я сначала сделал так:
Код

for(int i = 0; i < n; i++)
  {
    ar[i] = ar[j--];
  }

потом дошло, что начинаю присваивать вторую половину дважды!
PM MAIL   Вверх
fish9370
Дата 3.3.2013, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(kLASTER @  3.3.2013,  20:03 Найти цитируемый пост)
ar[i] = ar[j--];


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


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


Опытный
**


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

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



если STL нельзя использовать - лучше сразу уточняй smile
PM MAIL   Вверх
kLASTER
Дата 3.3.2013, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



точно, третью переменную для смены местами.

fish9370, спасибо что напомнил. Попробуем.

ПС Лана малому сказку пошел читать завтра попробую.
PM MAIL   Вверх
Alca
Дата 3.3.2013, 22:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



http://www.cplusplus.com/reference/algorithm/reverse/

Код

template <class BidirectionalIterator>
  void reverse (BidirectionalIterator first, BidirectionalIterator last)
{
  while ((first!=last)&&(first!=--last)) {
    std::iter_swap (first,last);
    ++first;
  }
}



--------------------
PM WWW ICQ Skype Jabber   Вверх
Laregro
Дата 15.3.2013, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



#include <iostream>
#include <cstring>
using namespace std;

int main()
{
char str[]="язык программирования С++";
char *start, *end;
int len;
char t;
cout<<"Исходная строка:"<<str<<"\n";
len=strlen(str);
start=str;
end=&str[len-1];
while(start<end)
{
t=*start;
*start=*end;
*end=t;
start++;
end--;
}
cout<<"строка после реверсирования:"<<str<<"\n";
return 0;
}
PM MAIL   Вверх
noize
Дата 16.3.2013, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


5.18.2
*


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

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



мой "топорный" вариант. Делал как задание из книги K&R

Код

/* функция reverse: переписывает строки в обратном порядке. Суть работы в следующем:
 т.к. мы знаем, что любая строка заканчивается символом '\0', можно на время удалить
 из строки данный символ и занять его место первым элементом массива. После этого можно
 осуществить последовательный перенос всех элементов. В последствии необходимо будет
 "сдвинуть" полученную строку влево */
void reverse(char s[])
{
    int n, i, c, j;
 
    c = n = 0;
    while(s[n] != '\0') {
        ++n;
    }
    if(s[n-1] == '\n') {
        c = s[n-1]; //c теперь содержит символ перехода на новую строку
        n = n - 2; //не будем подставлять в качестве первого символа переход на новую строку
    }
    /* выясняем, какое у нас число символов в строке: чётное или нечётное */
    if((n%2) == 0) {
        j = n/2;
    } else {
        j = n/2 + 1;
    }
    /* переносим крайние элементы в массиве */
    s[n+1] = s[0];
    s[0] = s[n];
    /* переносим остальные элементы */
    for(i = 0; i < j; ++i) {
        s[i] = s[n-i];
        s[n-i] = s[i+1];
    }
    /* нужно "сдвинуть" символы влево, начиная с середины */
    for(i = j; i < n + 1; ++i) {
        s[i] = s[i+1];
    }
    if(c == '\n') {
        n = n + 1;
        s[n] = '\n';
    }
    s[n+1] = '\0';
}

PM MAIL   Вверх
kolesnle
Дата 30.3.2013, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Упертый сишник
*


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

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



Код


void reverse(int* array, int number)
{
       int* begin = &array[0];
       int* end = &array[number-1];
       for (int i=0; i<number; i++)
            *(begin++) = *(end--);
}


PM MAIL   Вверх
fish9370
Дата 30.3.2013, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

void mirror(char *str) {
        char *end;
        for(end = (char *)str + strlen(str) - 1; end >= str;) {
                char c = *str;
                *str++ = *end;
                *end-- = c; 
        }
}



Это сообщение отредактировал(а) fish9370 - 30.3.2013, 13:08


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


Упертый сишник
*


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

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



С чего ты взял что ему нужно именно char*?

Добавлено через 6 минут и 2 секунды
Код

void reverse(char* array)
{
       int number= strlen(array);
       char* begin = &array[0];
       char* end = &array[number-2];
       for (int i=0; i<number; i++)
            *(begin++) = *(end--);
}

для char*
PM MAIL   Вверх
fish9370
Дата 30.3.2013, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(kolesnle @  30.3.2013,  13:21 Найти цитируемый пост)
*(begin++) = *(end--);


а ты с чего взял, что эта строка меняет две ячейки местами?  smile 


--------------------
undefined
PM MAIL WWW ICQ   Вверх
kolesnle
Дата 30.3.2013, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Упертый сишник
*


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

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



С intом все работает  smile Ой, не работвет

Это сообщение отредактировал(а) kolesnle - 30.3.2013, 15:19
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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