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

Указатели: сдвинуть элементы циклически на 1 позицию влево - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Sasha1994
0 / 0 / 0
Регистрация: 07.09.2012
Сообщений: 15
04.10.2012, 23:00     Указатели: сдвинуть элементы циклически на 1 позицию влево #1
Условие задачи: Заполните случайным образом одномерный массив из n элементов и здвиньте элементы циклически на 1 позицию влево. (Например для n=8)

Мой код:

Вариант без указателей (работает нормально):

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
#include<stdio.h>
#include<conio.h>
#include <iostream>
 
using namespace std;
 
int main(){
int n,i;
 
cout<<"\n\tNachalnaya matriza";
 
cout<<"\n\t";
int mas[8];
 
for(i=0;i<8;i++)
  {
      mas[i]=rand()%100;
      cout<<mas[i];cout<<" ";
  }
 
 
cout<<"\n\n\tNoviy masiv\n\n\t";
 
for(i=0;i<7;i++)// oskl'ki mi zsunuli elementi masivu na 1 vlivo, znachit jogo rozmir zmenshivsya na 1  
  {
    mas[i]=mas[i+1];// drugij element stae pershim i tak dali
    cout<<mas[i];cout<<" ";
  }
 
cout<<"\n";
cout<<"\n\n\tnazhmit bud-yaku klavishu dlya vihodu z programi";
getch();
}
Вариант с указателем(не работает):

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
#include<iostream>
#include<conio.h>
#include<stdio.h>
using namespace std;
int main() {
 
int mas[8];
int* pMas;
int i,n;
pMas = &mas[0];
 
cout<<"\n\tNachalnaya matriza\n";
cout<<"\n\t";
 
for(i=0;i<8;i++)
  {
  pMas+=i;
  *pMas=rand()%100;
  cout<<*pMas;cout<<" ";
  }
 
cout<<"\n\n\tNoviy masiv\n\n\t";
 
for(i=1;i<8;i++)
  {
  pMas+=i;
  cout<<*pMas;cout<<" ";
  }
cout<<"\n";
system("pause");
}
В новой матрице числа совсем не такие, как в начяльной матрице
Что я делаю неправильно в варианте с указателем? Помогите пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2012, 23:00     Указатели: сдвинуть элементы циклически на 1 позицию влево
Посмотрите здесь:

Элементы массива циклически сдвинуть на k позиций влево C++
Сдвинуть все элементы последовательности циклически на k позиций влево C++
Сдвинуть циклически элементы одномерного массива на k позиций влево C++
Все элементы массива X(30) циклически сдвинуть на n позиций влево C++
Циклически сдвинуть массив на 1 элемент влево C++
Одномерный массив. Сдвинуть элементы циклически на n позиций влево C++
Элементы линейного массива сдвинуть циклически на две позиции влево C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
wtf?
19 / 19 / 0
Регистрация: 03.10.2010
Сообщений: 48
04.10.2012, 23:06     Указатели: сдвинуть элементы циклически на 1 позицию влево #2
попробуй заменить
C++
1
2
3
4
5
for(i=1;i<8;i++)
 {
     pMas+=i;
     cout<<*pMas;cout<<" ";
 }
на
C++
1
2
3
4
5
6
for(i=1;i<8;i++)
 {
      pMas = ( pMas + i );
      ++pMas;
      cout<<*pMas;cout<<" ";
 }
John Prick
755 / 688 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
04.10.2012, 23:10     Указатели: сдвинуть элементы циклически на 1 позицию влево #3
C++
1
2
3
4
5
for(i=1;i<8;i++)
 {
 pMas+=i;
 cout<<*pMas;cout<<" ";
 }
неправильно
Можно просто сделать вот так:
C++
1
2
3
4
5
for(i=1;i<8;i++)
 {
    cout<<*pMas;cout<<" ";
    ++pMas;
 }
Добавлено через 1 минуту
Просмотрел. В заполнении та же "шляпа". Замени pMas += i на ++pMas.
ValeryS
Модератор
6403 / 4869 / 447
Регистрация: 14.02.2011
Сообщений: 16,159
04.10.2012, 23:11     Указатели: сдвинуть элементы циклически на 1 позицию влево #4
Цитата Сообщение от Sasha1994 Посмотреть сообщение
здвиньте элементы циклически на 1 позицию влево.
Цитата Сообщение от Sasha1994 Посмотреть сообщение
for(i=0;i<7;i++)// oskl'ki mi zsunuli elementi masivu na 1 vlivo, znachit jogo rozmir zmenshivsya na 1
{
mas[i]=mas[i+1];// drugij element stae pershim i tak dali
cout<<mas[i];cout<<" ";
}
Циклически- это значит что самый левый должен стать самым правым( самый младший самым старшим)
посему твой код должен выглядеть так
C++
1
2
3
4
5
6
7
8
int tmp=mas[0];
for(i=0;i<7;i++)// oskl'ki mi zsunuli elementi masivu na 1 vlivo, znachit jogo rozmir zmenshivsya na 1 
 {
 mas[i]=mas[i+1];// drugij element stae pershim i tak dali
 cout<<mas[i];cout<<" ";
 }
mas[7]=tmp;
cout<<mas[7];cout<<" ";
Sasha1994
0 / 0 / 0
Регистрация: 07.09.2012
Сообщений: 15
04.10.2012, 23:13  [ТС]     Указатели: сдвинуть элементы циклически на 1 позицию влево #5
не помогло, сейчас сделаю скрины
John Prick
755 / 688 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
04.10.2012, 23:13     Указатели: сдвинуть элементы циклически на 1 позицию влево #6
удалил
Sasha1994
0 / 0 / 0
Регистрация: 07.09.2012
Сообщений: 15
04.10.2012, 23:23  [ТС]     Указатели: сдвинуть элементы циклически на 1 позицию влево #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
#include<iostream>
 #include<conio.h>
 #include<stdio.h>
 using namespace std;
 
 int main()
 {
    int mas[8];
    int* pMas = mas;
    int i,n;
 
    cout<<"\n\tNachalnaya matriza\n";
    cout<<"\n\t";
 
    for(i=0;i<8;i++)
    {
       *pMas=rand()%100;
       cout<<*pMas;cout<<" ";
       ++pMas;
     }
 
     cout<<"\n\n\tNoviy masiv\n\n\t";
     pMas = mas;
     for(i=1;i<8;i++)
     {
       cout<<*pMas;cout<<" ";
        ++pMas;
     }
     cout<<"\n";
     system("pause");}
Миниатюры
Указатели: сдвинуть элементы циклически на 1 позицию влево  
John Prick
755 / 688 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
04.10.2012, 23:26     Указатели: сдвинуть элементы циклически на 1 позицию влево #8
Указатель на масси можно использовать также, как и имя массива (так как по сути это одно и тоже).
Вот окончательный вариант:
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
#include<iostream>
using namespace std;
 
int main()
{
 
    int mas[8];
    int* pMas = mas;
    int i;
 
    cout<<"\n\tNachalnaya matriza\n";
    cout<<"\n\t";
    // Создаём массив
    for(i=0; i < 8; ++i)
    {
        pMas[i] = rand() % 100;
        cout << pMas[i] << " ";
    }
    // Циклически сдвигаем на 1
    cout<<"\n\n\tNoviy masiv\n\n\t";
    int last = pMas[7];
    for(i = 7; i > 0; --i)
        pMas[i] = pMas[i - 1];
    pMas[0] = last;
    for (i = 0; i < 8; ++i)
        cout << pMas[i] << " ";
 
    cout<<"\n";
    system("pause");
}
Sasha1994
0 / 0 / 0
Регистрация: 07.09.2012
Сообщений: 15
04.10.2012, 23:28  [ТС]     Указатели: сдвинуть элементы циклически на 1 позицию влево #9
Спасибо большое,все работает.
p.s. сори что долго отвечаю
ValeryS
Модератор
6403 / 4869 / 447
Регистрация: 14.02.2011
Сообщений: 16,159
04.10.2012, 23:30     Указатели: сдвинуть элементы циклически на 1 позицию влево #10
Цитата Сообщение от Sasha1994 Посмотреть сообщение
при коде
Цитата Сообщение от Sasha1994 Посмотреть сообщение
C++
1
2
3
4
5
6
pMas = mas;
 for(i=1;i<8;i++)
 {
 cout<<*pMas;cout<<" ";
 ++pMas;
 }
сам то понял почему?

C++
1
2
3
4
5
6
pMas = mas;
 for(i=1;i<8;i++)
 {
  ++pMas;
 cout<<*pMas;cout<<" ";
 }
хотя сдвигом здесь и не пахнет тем более циклическим
PS
теги кода ставь, а то читать неудобно(над окошком в котором пишешь есть кнопочки "С++" "С")
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
04.10.2012, 23:32     Указатели: сдвинуть элементы циклически на 1 позицию влево #11
Цитата Сообщение от John Prick Посмотреть сообщение
Вот окончательный вариант:
Так он вроде вправо сдвигает, а в условии влево надо.
John Prick
755 / 688 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
04.10.2012, 23:39     Указатели: сдвинуть элементы циклически на 1 позицию влево #12
Цитата Сообщение от BumerangSP Посмотреть сообщение
Так он вроде вправо сдвигает, а в условии влево надо.
7 раз сдвинуть вправо - получится 1 раз влево.
Если влево, то так:
C++
1
2
3
4
5
6
    // Циклически сдвигаем на 1 ВЛЕВО
    cout<<"\n\n\tNoviy masiv\n\n\t";
    int first = pMas[0];
    for(i = 0; i < 7; ++i) // индекс до 7, а не 8, иначе выйдем за границу массива
        pMas[i] = pMas[i + 1];
    pMas[7] = first;
DiffEreD
 Аватар для DiffEreD
1424 / 761 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
04.10.2012, 23:39     Указатели: сдвинуть элементы циклически на 1 позицию влево #13
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <array>
#include <algorithm>
#include <ctime>
#include <Windows.h>
 
const int n = 8;
using namespace std;
int main()
{
    SetConsoleCP (1251); SetConsoleOutputCP (1251); //для русификации текста
    srand(time(0));
    array<int, n> ar;
    generate(ar.begin(), ar.end(), [] {return rand()%100;});
    cout<<"Начальный массив:\n";
    for (const int& x : ar) cout<<x<<" ";
    rotate(ar.begin(), ar.begin() + 1, ar.end());
    cout<<"\nПосле сдвига влево:\n";
    for (const int& x : ar) cout<<x<<" ";
    cout<<endl;
    system("pause");
    return 0;
}
John Prick
755 / 688 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
04.10.2012, 23:42     Указатели: сдвинуть элементы циклически на 1 позицию влево #14
yuron_477, это С++11 ?
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
04.10.2012, 23:48     Указатели: сдвинуть элементы циклически на 1 позицию влево #15
John Prick, вот, это то) И ей еще бы универсальности. Чтоб не только с 8 элементами работала.
DiffEreD
 Аватар для DiffEreD
1424 / 761 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
04.10.2012, 23:49     Указатели: сдвинуть элементы циклически на 1 позицию влево #16
Цитата Сообщение от John Prick Посмотреть сообщение
это С++11 ?
array и новый цикл for да, rotate и generate - стандартные алгоритмы.
John Prick
755 / 688 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
04.10.2012, 23:55     Указатели: сдвинуть элементы циклически на 1 позицию влево #17
Цитата Сообщение от BumerangSP Посмотреть сообщение
И ей еще бы универсальности. Чтоб не только с 8 элементами работала.
Ну это уж сами. Не маленькие.

Добавлено через 2 минуты
yuron_477, а вот это разве есть в старом стандарте?
generate(ar.begin(), ar.end(), [] {return rand()%100;});
DiffEreD
 Аватар для DiffEreD
1424 / 761 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
04.10.2012, 23:59     Указатели: сдвинуть элементы циклически на 1 позицию влево #18
Я точно не знаю были ли лямбды в старом стандарте
Sasha1994
0 / 0 / 0
Регистрация: 07.09.2012
Сообщений: 15
05.10.2012, 00:09  [ТС]     Указатели: сдвинуть элементы циклически на 1 позицию влево #19
Цитата Сообщение от yuron_477 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <array>
#include <algorithm>
#include <ctime>
#include <Windows.h>
 
const int n = 8;
using namespace std;
int main()
{
    SetConsoleCP (1251); SetConsoleOutputCP (1251); //для русификации текста
    srand(time(0));
    array<int, n> ar;
    generate(ar.begin(), ar.end(), [] {return rand()%100;});
    cout<<"Начальный массив:\n";
    for (const int& x : ar) cout<<x<<" ";
    rotate(ar.begin(), ar.begin() + 1, ar.end());
    cout<<"\nПосле сдвига влево:\n";
    for (const int& x : ar) cout<<x<<" ";
    cout<<endl;
    system("pause");
    return 0;
}
у меня почему то не работает
Миниатюры
Указатели: сдвинуть элементы циклически на 1 позицию влево  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.10.2012, 00:15     Указатели: сдвинуть элементы циклически на 1 позицию влево
Еще ссылки по теме:

Все нечетные строки матрицы сдвинуть циклически на К элементов влево C++
C++ Сформировать массив десятичных цифр числа А. Элементы массива цифр сдвинуть циклически влево на 1 позицию
Сдвинуть элементы массива циклически на M влево, перевернуть нечетные строки и посчитать простые числа C++
Сдвинуть элементы на одну позицию вправо\влево C++
C++ Циклически сдвинуть все элементы матрицы влево в строках, которые начинаются с положительного элемента

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

Или воспользуйтесь поиском по форуму:
DiffEreD
 Аватар для DiffEreD
1424 / 761 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
05.10.2012, 00:15     Указатели: сдвинуть элементы циклически на 1 позицию влево #20
Ваш компилятор, видимо этого не поддерживает. Попробуйте заменить цикл вывода
C++
1
for (int i = 0; i<n; i++) cout<<ar[i]<<" ";
Yandex
Объявления
05.10.2012, 00:15     Указатели: сдвинуть элементы циклически на 1 позицию влево
Ответ Создать тему
Опции темы

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