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


Автор: Wowa 16.2.2005, 20:22
Условия задачи таковы:
Дан массив со 100 элементами, который наполнен числами от 0 до 99 в обратном порядке.
Задача сделать алгоритм/написать программу, которая перевернет этот массив.

вот мои труды:

Код

#include <iostream>
#include <string>

using namespace std;


void insert(int* a) {

for (int i=99; i>=0; i--) {
 a[99-i]=i;
}

}

void sort(int* a) {
int tmp;
for (int i=0; i<=49; i++) {
 tmp=a[i];
 a[i]=a[99-i];
 a[99-i]=tmp;
}

}

void print(int* a) {

for (int i=0; i<=99; i++) {
 cout <<a[i]<<endl;

}

}

int main() {
int array[100];
//int* a = &array[99];

insert (array);
cout <<"До сортировки"<<endl;
print (array);
cout<<endl;

sort (array);
cout <<"После сортировки"<<endl;
print (array);


system("PAUSE");
return 0;
}


Программа работает. Но может быть посоветуете также другие пути реализации этого же алгоритма?
Добавлено @ 20:23
Особенно интересует введение в методе sort переменной tmp. Можно без нее обойтись?

Автор: srd 16.2.2005, 20:34
Цитата(Admin @ 17.2.2005, 03:22)
Особенно интересует введение в методе sort переменной tmp. Можно без нее обойтись?

А зачем? Но раз хочется, то
Код

void sort(int* a) {
   for (int i=0; i<=49; i++) {
        a[i] ^= a[99-i];
        a[99-i] ^= a[i];
        a[i] ^= a[99-i];
   }

}


Автор: Wowa 16.2.2005, 20:37
ой, а что это за шапка? smile что она делает?
Добавлено @ 20:38
Еще посоветуйте. Может как-то под другому указатели на массив передавать? Или без указателей делать?
Как бы вы сделали?

Автор: bel_nikita 16.2.2005, 20:59
это не шапка - это XOR smile

Цитата
Еще посоветуйте. Может как-то под другому указатели на массив передавать? Или без указателей делать?
Как бы вы сделали?

Естественно с указателями smile

Автор: Да гость я... 12.3.2005, 08:39
Есть ещё одно решение, к-рое не требует переменной tmp. Но, предупреждаю сразу - решение очень частное и применимо только к условиям данной задачи:

Код

void sort(int* a) 
{
   for (int i=0; i < 100; i++) 
        a[i] = i;
}

Автор: chaos 12.3.2005, 13:58
вот еще один пример с использованием стандартных шаблонов(STL)
Код

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

int main(int argc, char* argv[])
{
  //описываем массив
  int mas[100];

  //заполняем числами от 99 до 0  
  for (int n=100; n>=1; mas[100-n]=n---1);

  //выводим на экран  
  for (n=0; n<100; n++) cout << mas[n] << "\t";

  //переворачиваем массив  
  std::reverse<int*>(mas, mas+100);    

  //выводим на экран
  for (n=0; n<100; n++) cout << mas[n] << "\t";

  return 0;
}

Автор: chipset 12.3.2005, 15:17
Вариант без ксора.
Код

void sort(int* a) {
    for (int i=0; i<=49; i++) {
         a[i] =  a[i] - a[99-i];
         a[99-i] =  a[99-i] + a[i];
         a[i] =  a[99-i] - a[i];
    }
}

Автор: Да гость я... 12.3.2005, 19:58
Цитата
Но может быть посоветуете также другие пути реализации этого же алгоритма?


Вот пример ещё одной реализации, к-рая доступна только языкам, поддерживающим арифметику указателей (известные мне это - такие как С/С++ и Object Pascal, ещё какие?)

Код

template<class T>
void reverse(T* a, size_t nSize) 
{
 T *p1= a;
 T *p2= a + nSize - 1;

 while(p1 < p2)
 {
  T tmp= *p1;
  *p1++= *p2;
  *p2-- = tmp;
 }
}


Для class T должны быть определены оператор присваивания и конструктор копирования.
That's it

Автор: Fantasist 13.3.2005, 21:56
Цитата
- решение очень частное и применимо только к условиям данной задачи:


smile


Цитата(Admin @ 16.2.2005, 17:37)
Как бы вы сделали?



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

Автор: chipset 14.3.2005, 05:02
Цитата(Admin @ 16.2.2005, 09:37)
Как бы вы сделали?

Я бы сделал так как сделал я, в силу своей бейсиковской молодости.. smile

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