Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2009, 09:45   #1
Dmitrич
 
Регистрация: 01.06.2009
Сообщений: 6
По умолчанию поиск мин., удаление эл-ов массива

Здравствуйте, помогите,пожалуйста, с кодом к задаче я примерно догадываюсь где ошибся но не знаю как исправить...
Суть задачи:Соседи. Из элементов массива А(2n) получить массивы В(n) и С(n) следующим образом. Выбрать в массиве А два наиболее близких по значению элемента; меньший из них поместить в массив В, а больший — в массив С. Продолжить выбор из оставшихся элементов до полного заполнения массивов В и С
Код:
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>


int main () {
clrscr();
randomize ();
//определим массивы
int *a;
int *b;
int *c;
//счетчики
int i,j;
// размерность массивов
int n,z;
//временные переменные
int min,temp;
// переменные для хранения индексов
int ind_1,ind_2;
cout<<"Vvedite razmernost' a"<<endl;
cin>>n;
z=n/2;
a=new int [n];
b= new int [z];
c=new int [z];

// введем массив
for (i=0;i<n;i++)
{
 a[i]=rand()%100;
 printf("\n%d",a[i]);
}
printf("\n\n massivi b i c\n\n ");
int k=1;
// цикл с предусловием.. суть в том что мы пробегаем по массиву и ищем 2 элемента
// разница кот. по модулю минимальна пишем их в массивы b и c  и
//  удаляем эту пару элементов из массива а,сдвигая его
while (k!=z)
{
min=100;
for (i=0;i<z;i++)
 {
 for (j=i+1;j<n-k;j++)
  {
  temp=abs(a[i]-a[j]);
  if (min>temp)
   {
   min=temp;
   ind_1=i;
   ind_2=j;
   }
  }
 }
 // на выходе получили индексы элементов теперь закнием в b и c
if (a[ind_1]>a[ind_2])
 {
 b[k]=a[ind_2];
 c[k]=a[ind_1];
 }
 else
 {
 b[k]=a[ind_1];
 c[k]=a[ind_2];
 }
// сдвинем массив (скорее всего косяк тут. возможно неправильная правая граница сдвига)
 for(j=ind_1;j<n-k;j++)
 a[j]=a[j+1];
 for (j=ind_2;j<n-k;j++)
 a[j]=a[j+1];

 k++;

}
//выводим b и с
for (i=0;i<z;i++)
printf("%d\t%d\n",b[i],c[i]);
// печать того что осталось в массиве а (ну так.. для пробы)
for (i=0;i<n-k+1;i++)
printf("\n%d",a[i]);
getch ();
delete []a;
delete []b;
delete []c;
return 0;
}
Ошибка вроде в последних элементах.. как я понимаю из-за косяка со сдвигом массива. Напрягает появление посторонних цифр.
Среда разработки Borland c++ for DOS

Последний раз редактировалось Dmitrич; 01.06.2009 в 09:51.
Dmitrич вне форума Ответить с цитированием
Старый 01.06.2009, 13:23   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Подправил.
Код:
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int main () {
srand(time(NULL));
//определим массивы
int *a;
int *b;
int *c;
//счетчики
int i,j;
// размерность массивов
int n,z;
//временные переменные
int min,temp;
// переменные для хранения индексов
int ind_1,ind_2;
cout<<"Vvedite razmernost' a"<<endl;
cin>>n;

z=n/2;
a=new int [n];
b= new int [z];
c=new int [z];

// введем массив
for (i=0;i<n;i++)
{
 a[i]=rand()%100;
 printf("\n%d",a[i]);
}
printf("\n\n massivi b i c\n\n ");
int k=0;
// цикл с предусловием.. суть в том что мы пробегаем по массиву и ищем 2 элемента
// разница кот. по модулю минимальна пишем их в массивы b и c  и
//  удаляем эту пару элементов из массива а,сдвигая его
while (n>1)
{
min=100;
for (i=0;i<n-1;i++)
 {
 for (j=i+1;j<n;j++)
  {
  temp=abs(a[i]-a[j]);
  if (min>temp)
   {
   min=temp;
   ind_1=i;
   ind_2=j;
   }
  }
 }
 // на выходе получили индексы элементов теперь закнием в b и c
if (a[ind_1]>a[ind_2])
 {
 b[k]=a[ind_2];
 c[k]=a[ind_1];
 }
 else
 {
 b[k]=a[ind_1];
 c[k]=a[ind_2];
 }
 ++k;
// сдвинем массив (скорее всего косяк тут. возможно неправильная правая граница сдвига)
 --n;
 for(j=ind_1;j<n;j++)
 a[j]=a[j+1];
 --n;
 for (j=ind_2;j<n;j++)
 a[j]=a[j+1];
}
//выводим b и с
for (i=0;i<z;i++)
 printf("%d\t%d\n",b[i],c[i]);

getch ();
delete []a;
delete []b;
delete []c;
return 0;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 01.06.2009, 13:31   #3
Dmitrич
 
Регистрация: 01.06.2009
Сообщений: 6
По умолчанию

Спасибо,очень помогли.
Dmitrич вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
удаление одинаковых элементов из массива sauron99 Общие вопросы Delphi 6 15.04.2009 21:27
Удаление динамического массива Сергей089 Общие вопросы C/C++ 3 08.03.2009 13:13
Удаление элемента из массива Ozerich PHP 10 14.02.2009 02:21
Удаление элемента динамического массива Dogmat Помощь студентам 6 13.07.2008 14:33
Удаление элемента массива chiffa Общие вопросы Delphi 1 03.01.2008 19:24