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


Автор: alexeikom 7.12.2008, 23:44
Всем привет,
Вопрос у меня такой. Мне дан массив, я должен найти в нем одинаковые элементы, 
и соответственно их ликвидировать. Теперь мне нужно сократить размер массива (так как он уже без дублей).
Как мне это сделать? а то в размере массива надо обязательно указывать константу.
Помогите плиз...прога на си(программку я сделал, только вот с новым размером массива застрял).

Заранее благодарен.

Автор: Dmi3ev 8.12.2008, 00:01
работайте через указатели, в чем проблема?

Автор: Remiznik 8.12.2008, 00:03
перепиши в другой масив с меньшим размером !! иначе думаю не получиться ) 

Автор: Dmi3ev 8.12.2008, 00:06
Код

int *p;
p=(int *) malloc (100*(sizeof(int)));

как пример выделение памяти для 100 целых чисел

Добавлено @ 00:10
Цитата

перепиши в другой масив с меньшим размером !! иначе думаю не получиться )  

Remiznik, хорошо, а как задать размер этого массива??? Заранее ведь неизвестно, сколько будет дублей )))

Автор: alexeikom 8.12.2008, 00:10
Цитата

работайте через указатели, в чем проблема?

А можно плиз пример, а то я в танке... smile 
Цитата

перепиши в другой масив с меньшим размером !! иначе думаю не получиться ) 


Вот в этом и проблема. Как его создать, когда его размер зависит от результата. Тоесть у меня был массив из 20 элементов. 4 ушло. Надо создать массив из 16. Так вот эти 16 мне заранее не известны (так-как это зависит от числа дублированных элементов массива).

Автор: Remiznik 8.12.2008, 00:20
Цитата(alexeikom @ 8.12.2008,  00:10)
Вот в этом и проблема. Как его создать, когда его размер зависит от результата. Тоесть у меня был массив из 20 элементов. 4 ушло. Надо создать массив из 16. Так вот эти 16 мне заранее не известны (так-как это зависит от числа дублированных элементов массива).

вот тут и используешь указатели ... когда получиш значение сколько осталось элементов создаёшь новый масив такоко размера и переписываешь туда значения!

Автор: Dmi3ev 8.12.2008, 00:21
Код

int n;
cout<<"Enter n: ";
cin>>n;
int *p=new int [n];

а можно вот так, а обращаться потом вот так:
Код

for (int i=0; i<n; i++)
*(p+i)=1;

должно быть ясно, а вообще можно и почитать немного.


Автор: alexeikom 8.12.2008, 00:22
http://forum.vingrad.ru/topic-189118.html
самые первый пример с так называемым динамическим массивом, когда его размер задается не-константой. Такое возможно?

Добавлено через 9 минут и 33 секунды
Вообщем я так понял без указателей никак?

Автор: Dmi3ev 8.12.2008, 00:32
Цитата

Последняя версия стандарта языка Си позволяет создавать автоматические динамические массивы

Тебе же говорят тут русским языком. Ты попробовал? не получилось? => Надо действовать так, как дальше в статье говорится или как я посоветовал, что одно и тоже))

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

Вообщем я так понял без указателей никак?

мне на ум это пришло срузу))) динамический массив - значит указатели. Это очень удобно, хотя немного мудренно кажется по началу, я Вас прекрасно понимаю))) Но надо не бояться использовать их в таких ситуациях.

Автор: alexeikom 8.12.2008, 00:49
Цитата

мне на ум это пришло срузу))) динамический массив - значит указатели. Это очень удобно, хотя немного мудренно кажется по началу, я Вас прекрасно понимаю))) Но надо не бояться использовать их в таких ситуациях.

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

Большое спасибо за помощь! smile  

Автор: Rickert 8.12.2008, 06:24
Если вы в институте ещё не проходили указатели, а вас попросили написать такую программу, ты вы неверно поняли задание. наверное оно звучало примерно так: "Найти в массиве все одинаковые значения и вывести на экран массив уже без них, т.е. с одной копией каждого числа." В таком случае у вас нет необходимости работать с дин. массивами, всё что вам нужно - это создать два одинаковых по размеру массива, первый - изначальный, а второй - который будет содержать все элементы в одном экземпляре. Очевидно, что второй массив юудет либо равен, либо меньше по размеру первого.

Автор: bsa 8.12.2008, 12:57
А зачем вообще менять размер массива? Кто и где это сказал? Надо лишь переставить элементы так, чтобы массив был непрерывным. А это делается примерно так:
Код
const int size = 100;
int array[size];
int i, j;
//...
//где-то заполняем массив
//...
for(i = 1, j = 1; i < size; ++i) {
   int k;
   if (i != j) // если были дубликаты, то копируем
      array[j] = array[i];
   //ищем дубликаты
   for(k = 0; k < i; ++k)
      if (array[k]) == array[i])
         break;
   if (k == i) //если дубликаты не найдены увеличиваем j
     ++j;
}

Автор: REZiaMIX 8.12.2008, 13:05
Странно , обычно везде кричат , буст , стл. Почему до сих пор никто не предложил использовать контейнеры stl ??? erase - и нету элемента.
Да и удаление дубликатов обойдется в пару строк. Если конечно не стоит четкая задача использовать массивы.

Автор: Dmi3ev 8.12.2008, 16:47
REZiaMIX, я, допустим, не знаю, есть ли все эти прелести в си, поэтому и не предлагал использовать контейнеры vector, list и тд

Автор: bsa 9.12.2008, 11:54
а я уверен, что их там нет  smile 

REZiaMIX, читай внимательно первый пост - там русским языком написано, каким языком человек пользуется.

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