Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > реверс массива


Автор: kLASTER 3.3.2013, 19:01
Доброго времени суток!
Есть обычный массив, нужно сделать реверс значений, т.е. первому элементу присвоить последний, второму предпоследний и тд.
Нужен алгоритм, но не функция.
Что- то было такое в сортировках если память не изменяет!
Заранее спасибо!!!

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

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

Автор: NoviceF 3.3.2013, 20:01
а использование итераторов rbegin и rend не устраивает?

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

Автор: kLASTER 3.3.2013, 20:03
Я сначала сделал так:
Код

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

потом дошло, что начинаю присваивать вторую половину дважды!

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


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

Автор: NoviceF 3.3.2013, 20:12
если STL нельзя использовать - лучше сразу уточняй smile

Автор: kLASTER 3.3.2013, 20:18
точно, третью переменную для смены местами.

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

ПС Лана малому сказку пошел читать завтра попробую.

Автор: Alca 3.3.2013, 22:26
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;
  }
}

Автор: Laregro 15.3.2013, 17:40
#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;
}

Автор: noize 16.3.2013, 23:47
мой "топорный" вариант. Делал как задание из книги 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';
}

Автор: kolesnle 30.3.2013, 12:44
Код


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


Автор: fish9370 30.3.2013, 12:59
Код

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


Автор: kolesnle 30.3.2013, 13:21
С чего ты взял что ему нужно именно 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*

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


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

Автор: kolesnle 30.3.2013, 15:14
С intом все работает  smile Ой, не работвет

Автор: Objegog 7.9.2022, 05:33
Модератор: Сообщение скрыто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)