Форум программистов, компьютерный форум CyberForum.ru

Поменять начало и конец - C++

Восстановить пароль Регистрация
 
 
ffynjy
0 / 0 / 0
Регистрация: 14.01.2014
Сообщений: 22
21.01.2014, 19:43     Поменять начало и конец #1
дан массив из m+n элементов. начало массива это a[0]..a[m], конец массива это a[m+1]..a[m+n]. написать функцию, котороая меняет начало и конец местами
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ev_Hyper
 Аватар для Ev_Hyper
1808 / 1629 / 435
Регистрация: 15.12.2013
Сообщений: 5,791
21.01.2014, 20:20     Поменять начало и конец #2
Выбор m как происходит?
ffynjy
0 / 0 / 0
Регистрация: 14.01.2014
Сообщений: 22
21.01.2014, 20:32  [ТС]     Поменять начало и конец #3
Ev_Hyper, m и n самому вводить
Ev_Hyper
 Аватар для Ev_Hyper
1808 / 1629 / 435
Регистрация: 15.12.2013
Сообщений: 5,791
21.01.2014, 20:35     Поменять начало и конец #4
Элементы массива задаются программно или пользователи их вводит?

Правильно ли я вас понял, есть массив

>>m?
3
>>n?
6

2 3 4 0 9 7 6 3 -2 3

В итоге:
9 7 6 3 -2 3 2 3 4 0
ffynjy
0 / 0 / 0
Регистрация: 14.01.2014
Сообщений: 22
21.01.2014, 20:42  [ТС]     Поменять начало и конец #5
Ev_Hyper, массив задается программно
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
Правильно ли я вас понял, есть массив
>>m?
3
>>n?
6
2 3 4 0 9 7 6 3 -2 3
В итоге:
9 7 6 3 -2 3 2 3 4 0
да
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
21.01.2014, 20:48     Поменять начало и конец #6
Цитата Сообщение от ffynjy Посмотреть сообщение
дан массив из m+n элементов. начало массива это a[0]..a[m], конец массива это a[m+1]..a[m+n].
ты старательно описал массив m+n+1
посмотри тему про циклический сдвиг массива, это как раз твой вариант
Функция сдвига массива
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
21.01.2014, 20:49     Поменять начало и конец #7
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
#include <iostream>
 
void reverse(int *a, const int size)
{
    for (int i=0; i < size/2; i++)
    {
        int tmp = a[i];
        a[i] = a[size - 1 - i];
        a[size - 1 - i] = tmp;
    }
}
 
int main()
{
    int m, n;
    std::cin >> m >> n;
    int* a = new int[m*n];
    std::cout << "Before:\n";
    for (int i=0; i < m*n; i++)
    {
        a[i] = i+1;
        std::cout << a[i] << " ";
    }
 
    swap(a, m*n);
    std::cout << "\nAfter:\n";
    for (int i=0; i < m*n; i++)
        std::cout << a[i] << " ";
 
    delete[] a;
    std::cout << std::endl;
}
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
21.01.2014, 20:53     Поменять начало и конец #8
Цитата Сообщение от MrGluck Посмотреть сообщение
swap
я бы назвал reverse
все таки разворачиваешь массив а не переставляешь элементы
MrGluck
21.01.2014, 20:55
  #9

Не по теме:

Переименовал, изначально от функции другого хотел (то, что фактически внутри цикла описано), потом заленился и написал лишь одну функцию.

ValeryS
21.01.2014, 21:04
  #10

Не по теме:

Цитата Сообщение от MrGluck Посмотреть сообщение
Переименовал,
ага
Цитата Сообщение от MrGluck Посмотреть сообщение
void reverse(int *a, const int size)
Цитата Сообщение от MrGluck Посмотреть сообщение
swap(a, m*n);
напиши заново
я так понял редактировать уже не можешь

ffynjy
0 / 0 / 0
Регистрация: 14.01.2014
Сообщений: 22
21.01.2014, 21:14  [ТС]     Поменять начало и конец #11
Цитата Сообщение от MrGluck Посмотреть сообщение
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
#include <iostream>
 
void reverse(int *a, const int size)
{
    for (int i=0; i < size/2; i++)
    {
        int tmp = a[i];
        a[i] = a[size - 1 - i];
        a[size - 1 - i] = tmp;
    }
}
 
int main()
{
    int m, n;
    std::cin >> m >> n;
    int* a = new int[m*n];
    std::cout << "Before:\n";
    for (int i=0; i < m*n; i++)
    {
        a[i] = i+1;
        std::cout << a[i] << " ";
    }
 
    swap(a, m*n);
    std::cout << "\nAfter:\n";
    for (int i=0; i < m*n; i++)
        std::cout << a[i] << " ";
 
    delete[] a;
    std::cout << std::endl;
}
Твоя программа не меняет конец с началом местами,а просто переворачивает массив
(то есть 1,2,3,4 заменяется 4,3,2,1)
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
21.01.2014, 21:25     Поменять начало и конец #12
Цитата Сообщение от ffynjy Посмотреть сообщение
Твоя программа не меняет конец с началом местами,а просто переворачивает массив
(то есть 1,2,3,4 заменяется 4,3,2,1)
так выражайтесь четче - поменять конечный элемент с начальным.
И пусть тогда мой код будет для вас примером, ибо меняя местами все элементы в массиве, поменять лишь два из них - частный случай и делается гораздо легче.
ffynjy
0 / 0 / 0
Регистрация: 14.01.2014
Сообщений: 22
21.01.2014, 21:39  [ТС]     Поменять начало и конец #13
MrGluck, например m=3 и n=2 массив получается 1,2,3,4,5 и далее надо поменять элементы до m c элементами от m+1 до n, то есть должно получится 4,5,1,2,3
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
21.01.2014, 21:48     Поменять начало и конец #14
Цитата Сообщение от ffynjy Посмотреть сообщение
например m=3 и n=2 массив получается 1,2,3,4,5 и далее надо поменять элементы до m c элементами от m+1 до n, то есть должно получится 4,5,1,2,3
это и есть циклический сдвиг
ссылку смотрел которую я в 6 посте скинул?
ffynjy
0 / 0 / 0
Регистрация: 14.01.2014
Сообщений: 22
21.01.2014, 23:11  [ТС]     Поменять начало и конец #15
ValeryS,
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
37
38
#include "stdafx.h"
#include <iostream>
using namespace std;
 
void swap(int *a, const int size, int m)
{
int k = 0;
while (k <= m)
{
for (int i = 0; i < size; i++)
{
int tmp = a[i];
a[i] = a[size - 1 ];
a[size - 1] = tmp;
}
k++;
}
}
 
int main()
{
int m, n;
cin » m » n;
int* a = new int[m+n];
cout « "Before:\n";
for (int i = 0; i < m+n; i++)
{
a[i] = i + 1;
cout « a[i] « " ";
}
 
swap(a, m+n,m);
cout « "\nAfter:\n";
for (int i = 0; i < m+n; i++)
cout « a[i] « " ";
 
delete[] a;
cout « endl;
программа вроде работает, может попроще как-то можно?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
21.01.2014, 23:18     Поменять начало и конец #16
Цитата Сообщение от ffynjy Посмотреть сообщение
программа вроде работает, может попроще как-то можно?
попроще нет
у тебя как раз самая простая реализация
сдвигаешь массив m раз
эффективней да
смотри тему которую я тебе указал
ffynjy
0 / 0 / 0
Регистрация: 14.01.2014
Сообщений: 22
21.01.2014, 23:25  [ТС]     Поменять начало и конец #17
ValeryS, только у меня при одинаковых значениях m и n не правильно работает, как можно исправить?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
21.01.2014, 23:36     Поменять начало и конец #18
Цитата Сообщение от ffynjy Посмотреть сообщение
while (k <= m)
вот у тебя ошибка
даже при m равном 0 у тебя один сдвиг произойдет
а не должен
C++
1
while (k < m)
ffynjy
0 / 0 / 0
Регистрация: 14.01.2014
Сообщений: 22
21.01.2014, 23:40  [ТС]     Поменять начало и конец #19
ValeryS, спасибо, но теперь ошибка при m>n
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.01.2014, 23:49     Поменять начало и конец
Еще ссылки по теме:

C++ как добавить элементы в конец, начало, середину list?
Добавление числа в начало и конец C++
C++ Список, в который можно добавить числа в начало и в конец

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
21.01.2014, 23:49     Поменять начало и конец #20
и циклический сдвиг на один элемент по другому можно написать
Цитата Сообщение от ffynjy Посмотреть сообщение
for (int i = 0; i < size; i++)
{
int tmp = a[i];
a[i] = a[size - 1 ];
a[size - 1] = tmp;
}
C++
1
2
3
4
int tmp=a[size-1];// сохраняем последний элемент
for(int i=0;i<size-1;i++) 
 a[i+1]=a[i];// в цикле переносим значения в следующий элемент
a[0]=tmp;// в первый запихиваем значения последнего
Добавлено через 5 минут
Цитата Сообщение от ffynjy Посмотреть сообщение
ValeryS, спасибо, но теперь ошибка при m>n
а так и будет
представь что тебе нужно сдвинуть массив из двух элементов на 20
здесь нужно предусмотреть
если m<n то сдвиг влево иначе сдвиг вправо на m-n
Yandex
Объявления
21.01.2014, 23:49     Поменять начало и конец
Ответ Создать тему
Опции темы

Текущее время: 02:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru