Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.65/65: Рейтинг темы: голосов - 65, средняя оценка - 4.65
4 / 4 / 1
Регистрация: 06.01.2012
Сообщений: 54
1

Как поменять порядок следования элементов в массиве на противоположный?

08.02.2012, 22:26. Просмотров 13093. Ответов 11
Метки нет (Все метки)


Есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <ctime>
using namespace std;
int kontrmas(int mass[],int size);
int main()
{
const int a=10;
int mas[a]={};
 
kontrmas(mas,a);
 
return 0;
}
int kontrmas(int mass[],int size)
{
 
    
//заполним массив
    srand(time(NULL));
    int i;
    for(i=0;i<size;i++)
    {
         mass[i]=rand()%200-100;
         cout<<"mass"<<mass[i]<<endl;
    }
    int d;
    for(int j=0;j<size;j++)
    {
        
        
        cout<<"mas"<<mass[j]<<endl;
    
    }
 
return 0;
}
В этом коде последний цикл не заполнен, так как с ним связан вопрос. В созданной функции есть массив, который заполняется случайными элементами в диапазоне от -100 до 100. Как в созданном массиве чисел поменять порядок их следования на противоположный? Уже что хочешь делаю, но в массиве меняется только первая половина чисел, а вторая половина зеркально отражает первую. Кто знает как поменять последовательность не прибегая к употреблению реверсов всяких, а самыми простыми методами. Сразу скажу, что вариант с переменной d обозначенной в коде и присвоении ей значения массива в таком виде:
C++
1
2
3
d=mass[j];
mass[j]=mass[size-1-j];
mass[size-1-j]=d;
...в этом виде я получаю все тот же зеркальный вариант массива... Если кто владеет хорошим приемом поделитесь, так как уже довольно долго думаю над задачей...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.02.2012, 22:26
Ответы с готовыми решениями:

Поменять порядок следования десятичных цифр числа на противоположный
Дано натуральное число n. Змінити порядок слідування цифр числа n на зворотній Поменять порядок...

При выполнении определенного условия поменять порядок следования символов строки на противоположный
Заданы 2 строки, состоящие из слов, разделенных пробелами. Если второе слово первой строки такое...

Поменять порядок следования элементов файла на противоположный
Приветствую всех. Помогите пожалусто срочно с задачкой: Описать процедуру InvertIntFile(Name),...

Изменить порядок следования элементов в одномерном массиве на противоположный
Помогите написать программу, пожалуйста! Дан одномерный массив, состоящий из n вещественных...

11
Эксперт C
25440 / 15833 / 3386
Регистрация: 24.12.2010
Сообщений: 34,636
09.02.2012, 00:14 2
lesha1980, Вынеси вывод из цикла. После цикла реверса - цикл вывода. А ты показываешь еще не сделанную работу

Добавлено через 56 минут
Прости, я ошибся. Дело не в этом. Цикл надо крутить не до size, а до половины его. А так ты обратно ставишь элементы на свои места.
Но все равно - вывод массива надо делать после работы с ним.
0
4 / 4 / 1
Регистрация: 06.01.2012
Сообщений: 54
09.02.2012, 16:06  [ТС] 3
Цитата Сообщение от Байт Посмотреть сообщение
lesha1980, Вынеси вывод из цикла. После цикла реверса - цикл вывода. А ты показываешь еще не сделанную работу

Добавлено через 56 минут
Прости, я ошибся. Дело не в этом. Цикл надо крутить не до size, а до половины его. А так ты обратно ставишь элементы на свои места.
Но все равно - вывод массива надо делать после работы с ним.
Ну правильно... цикл не доделан, как я и говорил, но выполнение цикла всего лишь до половины задачу не решает, так как выводит лишь первую половину массива. Если же к этой половине добавить еще один шаг, то появляется следующий элемент того же рода, что и в зеркальном виде. Вобщем возвращаюсь все к тому же результату. Хотя по идее в цикле должно присваиваться переменной d значение элемента массива, затем идет замена этого элемента массива на последний элемент по шагу, а затем этот последний элемент получает значение сохраненное в переменной d. Но так почему-то не происходит, т.е. - не выполняется последнее присваивание значения сохраненного в переменной d.
0
570 / 553 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
09.02.2012, 16:15 4
Вы не поняли, что вам написали. Байт имел в виду следующее
C++
1
2
3
4
5
6
for(int i=0,i_end = size/2;i<i_end;++i)
{
       int d = A[i];
       A[i] = A[size-1-i];
       A[size-1-i] = d;
}
1
4 / 4 / 1
Регистрация: 06.01.2012
Сообщений: 54
09.02.2012, 17:51  [ТС] 5
Цитата Сообщение от I.M. Посмотреть сообщение
Вы не поняли, что вам написали. Байт имел в виду следующее
C++
1
2
3
4
5
6
for(int i=0,i_end = size/2;i<i_end;++i)
{
       int d = A[i];
       A[i] = A[size-1-i];
       A[size-1-i] = d;
}
Я об этом же, но в таком вот виде:
C++
1
2
3
4
5
6
7
8
9
for(int j=0;j<size/2;j++)
    {
        d=mass[j];
        mass[j]=mass[size-1-j];
        mass[size-1-j]=d;
        
        cout<<"mas"<<mass[j]<<endl;
    
    }
Как в данном виде, так и в приведенном выше вами виде кода выдает один и тот же результат в виде половины элементов массива... Задание еще не решено. Я бы бросил его и спросил бы у преподавателя, но как-то не хочется бросать, если есть все же хорошее решение. У меня куча еще других заданий, а на это задание просто хочется увидеть это решение и понять в чем моя ошибка и почему не могу его решить. Вот и вся проблема... Ведь в принципе эта половина size/2 и тот вариант, что вами представлен с еще одной дополнительной управляющей переменной и префиксным вариантом инкримента в принципе одно и то же...
0
570 / 553 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
09.02.2012, 20:03 6
Да что же вы упорно делаете вывод в том же цикле, что и перестановку элементов. Перестановку надо делать до size/2, а вывод, естественно, до size. Вот так:
C++
1
2
3
4
5
6
7
8
9
10
for(int i=0,i_end = size/2;i<i_end;++i)
{
       int d = A[i];
       A[i] = A[size-1-i];
       A[size-1-i] = d;
}
for(int i=0;i<size;++i)
{
       std::cout << A[i] << std::endl;
}
2
4 / 4 / 1
Регистрация: 06.01.2012
Сообщений: 54
09.02.2012, 20:51  [ТС] 7
I.M.,
Да, работает отлично. А я словно в ступор стал с этим выводом и никак в толк не мог взять как это сделать. А выходит я просто останавливался на пол шаге, делая вывод в том же цикле. Большое спасибо за подсказанное решение. Это решение отличное.
0
0 / 0 / 0
Регистрация: 21.01.2015
Сообщений: 3
21.01.2015, 13:01 8
I.M.,
Добрый день! подскажите, почему в цикле нужно идти до середины.
Спасибо
0
Почетный модератор
Эксперт С++
5842 / 2851 / 390
Регистрация: 01.11.2011
Сообщений: 6,903
21.01.2015, 13:06 9
Цитата Сообщение от Igorjokia Посмотреть сообщение
подскажите, почему в цикле нужно идти до середины
Потому что массив зеркалируется относительно середины.
0
0 / 0 / 0
Регистрация: 07.08.2016
Сообщений: 2
08.08.2016, 00:00 10
C++
1
2
3
4
5
6
7
8
9
10
11
for (int i = 0; i < size; i++) {
 
        
        for (int j = 0; j < size - i; j++) {
 
              swap(Arr[j], Arr[size - j - 1]);
            
        }//for j
 
        
}//for
а если цикл содержит нечетное количество элементов?
0
Модератор
Эксперт С++
10413 / 8680 / 5250
Регистрация: 18.12.2011
Сообщений: 23,215
08.08.2016, 08:07 11
cooliofv, Обоснуйте, зачем Вы написали цикл в цикле?
Алгоритм поста 6 абсолютно корректный.
Если массив имеет нечетный размер, то средний элемент никуда не будет двигаться.
0
0 / 0 / 0
Регистрация: 07.08.2016
Сообщений: 2
08.08.2016, 21:03 12
хотел по аналогии сортировки методом пузырька как то провернуть.Только начал изучать программирование, искал варианты. Действительно, перестановка до половины массива работает и с нечетным количеством. Спасибо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.08.2016, 21:03

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Поменять порядок следования символов первой строки на противоположный
Заданы 2 строки, состоящие из слов, разделенных пробелами. Если второе слово первой строки такое...

Поменять порядок следования элементов в массиве на обратный
Дан целочисленный массив A(n). Поменять порядок следования элементов в массиве на обратный

Поменять порядок следования элементов в массиве на обратный
1) Дан действительный массив А(n) Поменять порядок следования элементов в массиве на обратный. 2)...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.