Форум: Форум C++Разное
Новые темы: 00
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: удаление дубликатов из массива
 
 автор: beginner-c++   (26.05.2007 в 13:23)   письмо автору
 
 

Добрый день!
Делаю программку удаления одинаковых элементов из отсортированного по возрастанию массива.
Блок сдвига элементов в массиве работает, когда его вставляю в прогу - она отказывается работать - виснет.
Никак не пойму в чем причина. Подскажите плиз.



#include <iostream.h>
#include <fstream.h>
#include <conio.h>
#include <stdio.h> 

  // удаление дубликатов в отсортированном по возрастанию массиве
int main()
{

const int size = 5; // количество элементов массива
int array[size]= {2,2,2,3,6};
int t=0;


for (int i=1; i<size-1; i++)
  {
    if (array[i]== array[i-1])       // если рядом стоящие элементы равны
      {
        do                           // сдвигать
          {                          // все
            t=i;                     // элементы
            array[t-1] = array[t];   // массива
            t++;                     // на 1
          }                          // элемент
        while(t<size);               // влево
        array[size-1]=0;  // записать ноль в конец массива
      }
  }

for(int i=0; i<size; i++)         // вывод на экран
  {
 cout << array[i] << ",";
  }
getchar();

  return 0;
}

  Ответить  
 
 автор: Фитч   (26.05.2007 в 13:39)   письмо автору
 
   для: beginner-c++   (26.05.2007 в 13:23)
 

1)Во-первых, надо вынести t = i из цикла do...while
2)Во-вторых, Ваш алгоритм оставит лишнюю двойку. На вякий случай поправил.
Получилось так:

#include <iostream>
#include <fstream>
#include <conio.h>
#include <stdio.h> 

int main()
{

const int size = 5;
int array[size]= {2,2,2,3,6};
int t=0;


for (int i=1; i<size-1; i++)
  {
    if (array[i]== array[i-1])   
      {
  t=i;
        do                      
          {                        
            array[t-1] = array[t];  
            t++;                     
          }                         
        while(t<size);          
        array[size-1]=0; 
i--;   // если я ошибся с пунктом 2, уберите эту строку
      }
  }

for(int i=0; i<size; i++)         // вывод на экран
  {
  std::cout << array[i] << ",";
  }
getchar();


  return 0;
}

  Ответить  
 
 автор: beginner-c++   (26.05.2007 в 14:05)   письмо автору
 
   для: Фитч   (26.05.2007 в 13:39)
 

Благодарю -не ожидал такого быстрого ответа.
Заработало - проверил на нескольких наборах элементов.
Виснет на одном наборе - 2,2,2,2,6 - это когда присутствует строка c i--.
Без i-- оставляет лишнюю 2 при наборе - 2,2,2,2,6.

  Ответить  
 
 автор: Фитч   (26.05.2007 в 14:32)   письмо автору
 
   для: beginner-c++   (26.05.2007 в 14:05)
 

Дело в том, что ставя нули в конце, Вы создаете последовательность из одинаковых эл-тов.
Вот мое решение проблемы:

#include <iostream>
#include <fstream>
#include <conio.h>
#include <stdio.h> 

int main()
{
const int nSize = 5;
int anArray[nSize] = { 2 , 2, 2, 2, 7 };
int t = 0, i = 0;
int nNewSize = 5;

while(i < nSize - 1)
{
if(anArray[i] == 0)
{
break;
}
else
{
if(anArray[i] == anArray[i + 1])
{
t = i;
do
{
anArray[t] = anArray[t+1];
t++;
}
while(t < nSize - 1);
anArray[nSize-1] = 0;
}
else
{
i++;
}
}
for(int j=0; j<nSize;j++)
{
std::cout << anArray[j] << ",";
}
std::cout << std::endl;
}

return 0;
}

  Ответить  
 
 автор: beginner-c++   (26.05.2007 в 14:50)   письмо автору
 
   для: Фитч   (26.05.2007 в 14:32)
 

Да про нули я как-то совсем упустил - уже мозги плавятся от жары.
Спасибо огромное!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования