Поменять местами элементы массива

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
CkooTuHa
Сообщения: 4
Зарегистрирован: 17 дек 2013, 19:52

Есть задача:Найти макс. элемент одномерного массива, минимальный и поменять местами максимальный и минимальный элемент одномерного массива.
Так, вот. Как поменять их местами? Поможет кто-нибудь реализовать это?
Собственно сам код:
З.Ы. -

Код: Выделить всё

//---------------------------------------------------------------------------
#include <iostream>
#include <vcl.h>
#pragma hdrstop
#include <ctime>
using namespace std;
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
int num=0;
int max=0;
int min=0;
int i=0;
int t=0;
int chislo=0;
int a1, b1;
srand( time( 0 ) );
cout<<"Vvedite kol-vo elementov massiva: "<<endl;
cin>>num;
cout<<"Vvedite pervoe (menshee) chislo diapazona: "<<endl;
cin>>a1;
cout<<"Vvedite vtoroe (bolshee) chislo diapazona: "<<endl;
cin>>b1;
int *a = new int[num];
cout<<"Massiv:"<<endl;
for (int i; i<num; i++){
a[i]=a1 + rand() % b1;
cout<<a[i]<<", ";
}
max = a[0];
min = a[0];
for (int i; i<num; i++){
if (a[i]>max) max=a[i];
if (a[i]<min) min=a[i];
}
cout<<endl;
cout<<"Vyberite nomer  deistviya: "<<endl;
cout<<"1 - vyvesti max element massiva,"<<endl;
cout<<"2 - vyvesti min element massiva,"<<endl;
cout<<"3 действие "<<endl;
cin>>t;
if (t==1){
cout<<"MAX = "<<max<<endl;
}
if (t==2){
cout<<"MIN = "<<min<<endl;
}
if (t==3){
//(Тут действие)
}
cout<<endl;
delete [] a;
system ("pause");
        return 0;
}
//---------------------------------------------------------------------------
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Много замечаний.

1. Вопрос на засыпку - сколько целых чисел в диапазоне от A до B (границы включены). Немного подумав, можно выдать ответ. Это (B - A + 1). Правильность формулы несложно проверить на конкретных данных. Теперь дальше. Функция rand() возвращает случайное больше число. Чтобы получить число от нуля до N-1 нужно взять остаток от деления rand() на N. Отсюда следует, что случайное число от A до B можно получить по формуле (A + rand() % (B - A + 1)). У тебя же формула не такая.

2. Вот этот цикл будет работать непредсказуемо:

Код: Выделить всё

for (int i; i<num; i++)
Почему? Потому, что переменная i не инициализирована, а коль так (по причине того, что она создана на стеке), в ней будет некий мусор, который вряд ли будет равен нулю. Правильным будет инициализировать i нулём.

3. Та часть задания, которая не доделана. Чтобы поменять местами элементы массива нужно запомнить не их значения, как у тебя сейчас сделано, а их индексы. Индекс - это куда более информативное значение. Зная его, можно легко осуществить обмен, плюс значения самого элемента массива тоже никто не мешает получить, вызвав оператор []. Предположим, мы нашли индекс максимального элемента max_index и индекс минимального элемента min_index. Тогда обмен будет делаться очень просто:

Код: Выделить всё

int temp = a[max_index];
a[max_index] = a[min_index];
a[min_index] = temp;
Теперь осталось только подправить цикл выше, чтобы он искал не значения, а индексы. А также подправить вывод максимального и минимального значения элемента. Это оставляю на самостоятельную работу.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
CkooTuHa
Сообщения: 4
Зарегистрирован: 17 дек 2013, 19:52

Можешь показать в коде, как найти индексы?
не совсем понимаю, как это делать. :confused:
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Ну, вместо a сохранять в отдельную переменную i. Индекс - это ведь i.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить