Консультация № 173773
27.10.2009, 21:31
0.00 руб.
0 11 2
здравствуйте, помогите пожалуйста, чуток додумать программу не могу:
надо составить массив А из 2n, затем из него создать два массива В и С по n элементов. Составлять так: выбираются два близкие по значению числа, меньшее в массив В большее в массив А
(выдает только два самых близких числа, не знаю как дальше )

Приложение:
#include <iostream.h>
#include <limits.h>
#include <stdlib.h>
int const n=4;
void main()
{
int i,j,i1,i2,k,A[2*n],B[n],C[n],m,l;
cout<<"Enter "<<n*2<<" elements..."<<endl<<endl;
for(i=0;i<2*n;i++)
cin>>A[i];
for(i=0;i<2*n;i++)cout<<A[i]<<" ";

for(i=0,k=INT_MAX;i<2*n;i++)
{for(j=0;j<2*n;j++ )
if(k>abs(A[i]-A[j])&&i!=j)
{k=abs(A[i]-A[j]);
i1=i;
i2=j;}
for(m=0;m<n;m++)
{if(A[i1]<A[i2])
{B[m]=A[i1];
C[m]=A[i2];}
else
{B[m]=A[i2];
C[m]=A[i1];}
}

}
for(m=0;m<n;m++)
cout<<endl<<"B["<<m<<"]="<<B[m]<<" ";
cout<<endl<<endl;
for(l=0;l<n;l++)
cout<<"C["<<l<<"]="<<C[l]<<" "<<endl;
cin>>i;
}

Обсуждение

Неизвестный
27.10.2009, 22:38
общий
это ответ
Здравствуйте, Ишмаков Рустем Ильшатович.
Иначе говоря, требуется неявно отсортировать массив и поместить четные (нумерация с 0) элементы в массив B, а нечетные — в массив C. Программа в приложении. Пример прогона:

Enter 8 elements...

A[0] = ? 2
A[1] = ? 6
A[2] = ? 8
A[3] = ? 1
A[4] = ? 3
A[5] = ? 7
A[6] = ? 5
A[7] = ? 4
2 6 8 1 3 7 5 4
B[0]=1
B[1]=3
B[2]=5
B[3]=7

C[0]=2
C[1]=4
C[2]=6
C[3]=8

Успехов!

Приложение:
#include <iostream.h>

int const n=4;
void main()
{
int i,a[2*n],b[n],c[n];

cout << "Enter " << n*2 << " elements..." << endl << endl;
for( i=0; i<2*n; i++ ) {
cout << "A[" << i << "] = ? ";
cin >> a[i];
}

for( i=0; i<2*n; i++ ) cout << a[i] << " ";

bool flag = true;
int* pb = b;
int* pc = c;
for( i=0; i<2*n; i++ ) {
int min = a[i];
int imin = i;
for( int j=i+1; j<2*n; j++ )
if( a[j] < min ) {
min = a[j];
imin = j;
}
// если бы мы сортировали массив:
// a[imin] = a[i];
// a[i] = min;

// а так, достаточно будет:
a[imin] = a[i];

if( flag ) *pb++ = min;
else *pc++ = min;
flag = !flag;
}
for( i=0; i<n; i++ )
cout << endl << "B[" << i << "]=" << b[i] << " ";
cout << endl << endl;
for( i=0; i<n; i++ )
cout << "C[" << i <<"]=" << c[i] << " " << endl;

cin >> i; // просто пауза
}
давно
Профессор
230118
3054
28.10.2009, 11:55
общий
amnick:
По-моему, автору вопроса требовалось совсем не это. Речь не идет о четности-нечетности.
давно
Профессор
230118
3054
28.10.2009, 12:22
общий
Ишмаков Рустем Ильшатович:
На самом деле правильнее использовать не массивы, а векторы. Тогда из них можно будет исключить элементы, кроме того, это более безопасно. Согласны? Я тогда вставлю ответ.
Последняя строчка не нужна
cin>>i;
Если хотите, чтобы консоль не закрывалась, в VS используйте Start Without Debugging. Или если так уже необходимо, getchar. Он принимает любой символ, например ентер.
давно
Профессор
230118
3054
28.10.2009, 13:10
общий
это ответ
Здравствуйте, Ишмаков Рустем Ильшатович.
Программа написана при условии, что если есть числа одинаковой близости, то какие брать, неважно.
После того, как найдены близкие элементы, они удаляются из вектора. Ваш массив при этом остается, если он нужен. После этого ищется близкое значение уже среди оставшихся. Когда остаются 2 элемента, они сразу же идут в два массива.
Программа оптимизирована по скорости, поэтому в векторе сначала обменивается член с последним, потом стирается последний. Дело в том, что из вектора удалять долго, а последний элемент удаляется быстро.


#include <iostream>
#include <limits.h>
#include <stdlib.h>

#include <vector>

int const n=4;

using namespace std;

void main()
{
int i,j,i1,i2,k,A[2*n],B[n],C[n],m,l;

vector<int> a;
m=0;

cout<<"Enter "<<n*2<<" elements..."<<endl<<endl;
for(i=0;i<2*n;i++)
cin>>A[i];

for(i=0;i<2*n;i++)
{
cout<<A[i]<<" ";
a.push_back(A[i]);
}

for(i=0;i<2*n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
while(m<n-1)
{
for(i=0,k=INT_MAX;i<2*n-2*m;i++)
{
for(j=i+1;j<2*n-2*m;j++ )
if(k>abs(a[i]-a[j])&&i!=j)
{
k=abs(a[i]-a[j]);
i1=i;
i2=j;
}
}
if(a[i1]<a[i2])
{
B[m]=a[i1];
C[m]=a[i2];
}
else
{
B[m]=a[i2];
C[m]=a[i1];
}
swap(a[i1],a[2*n-1-2*m]);
a.pop_back();
swap(a[i2],a[2*n-2*m-2]);
a.pop_back();
m++;
}
B[n-1]=min(a[0],a[1]);
C[n-1]=max(a[0],a[1]);
for(m=0;m<n;m++)
cout<<endl<<"B["<<m<<"]="<<B[m]<<" ";
cout<<endl<<endl;
for(l=0;l<n;l++)
cout<<"C["<<l<<"]="<<C[l]<<" "<<endl;
cin>>i;
}
Неизвестный
28.10.2009, 20:03
общий
Спасибо, Гаряка Асмик Александровна! Но с массивами мне как то будет попроще... Недавно посоветовали переместить полученные близкие по значению числа в конец массива, и продолжать цикл, но - 1 элемент(они так как бы как раз и исключаются из него). Я пока попробую все же массивами. Но вам очень благодарен)
Неизвестный
28.10.2009, 20:06
общий
только почему то в вашем коде выдает две ошибки с максимумом и минимумом: 'min' : undeclared identifier
Неизвестный
28.10.2009, 20:24
общий
Цитата: Асмик Гаряка
По-моему, автору вопроса требовалось совсем не это. Речь не идет о четности-нечетности.


Четность-нечетность — это просто переформулировка задания. Смысл остается тем же самым — меньшее в массив В, большее в массив C. Обеспечивается это, в моем варианте, переключением с использованием флага. Начальное содержимое массива А разрушается, ну так и не сказано, что массив А требуется сохранить неизменным.
давно
Профессор
230118
3054
28.10.2009, 20:48
общий
Ишмаков Рустем Ильшатович:
ну так и я перемещаю в конец. А использовать стд - это показатель профессионализма. И это несложно освоить. К вектору обращаются точно так, как к массиву. То есть можно всего лишь изменить декларацию на vector<int> А;
и работать точно так же.

Мin и мах у меня компилируются, добавление #include <algorithm> в начало должно помочь.
давно
Профессор
230118
3054
28.10.2009, 20:51
общий
Внешний цикл for(i=0,k=INT_MAX;i<2*n-2*m;i++) - его верхняя граница как раз показывает, что массив уменьшился, так как найденные числа перемещены в конец и удалены. Функция swap меняет местами 2 элемента.
Неизвестный
01.11.2009, 21:21
общий
столкнулся с новой проблемой)
взял числа{1,12,2,14,23,26,22,56} в ответе 14 выдается два раза, он случайно заменяется там в цикле, сделал условие вот такое:

if((i1!=2*n-1-2*m||i1!=2*n-2-2*m)&&(i2!=2*n-1-2*m||i2!=2*n-2-2*m))
{d=A[2*n-1-2*m];
A[2*n-1-2*m]=A[i1];
A[i1]=d;

a=A[2*n-2-2*m];
A[2*n-2-2*m]=A[i2];
A[i2]=a;}

но чегот не помогает...
Неизвестный
02.11.2009, 14:08
общий
Цитата: 309519
взял числа{1,12,2,14,23,26,22,56} в ответе 14 выдается два раза

С моей программой получается:

Enter 8 elements...

A[0] = ? 1
A[1] = ? 12
A[2] = ? 2
A[3] = ? 14
A[4] = ? 23
A[5] = ? 26
A[6] = ? 22
A[7] = ? 56
1 12 2 14 23 26 22 56
B[0]=1
B[1]=12
B[2]=22
B[3]=26

C[0]=2
C[1]=14
C[2]=23
C[3]=56

безо всяких дополнительных мозгодробительных условий.
Форма ответа