Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 07.09.2012
Сообщений: 15
1

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

04.10.2012, 23:00. Показов 2981. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Условие задачи: Заполните случайным образом одномерный массив из 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");
}
В новой матрице числа совсем не такие, как в начяльной матрице
Что я делаю неправильно в варианте с указателем? Помогите пожалуйста.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.10.2012, 23:00
Ответы с готовыми решениями:

Сформировать массив десятичных цифр числа А. Элементы массива цифр сдвинуть циклически влево на 1 позицию
дано целое десятичное число А. Сформировать массив десятичных цифр числа А. Элементы массива цифр...

Элементы массива циклически сдвинуть на k позиций влево
Помогите пожалуйста написать программу!!!понимаю что все должно быть оч легко, но... В С++: 1. Дан...

Сдвинуть циклически элементы одномерного массива на k позиций влево
Тема и есть условие задачи... Сам же я застопорился на написании алгоритма сдвига :- #include...

Сдвинуть все элементы последовательности циклически на k позиций влево
1. Дано целое число. Если число отрицательное, то необходимо вывести все четные числа, начиная со...

20
19 / 19 / 13
Регистрация: 03.10.2010
Сообщений: 48
04.10.2012, 23:06 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<<" ";
 }
0
2337 / 1824 / 753
Регистрация: 27.07.2012
Сообщений: 5,392
04.10.2012, 23:10 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.
0
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,701
04.10.2012, 23:11 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<<" ";
0
0 / 0 / 0
Регистрация: 07.09.2012
Сообщений: 15
04.10.2012, 23:13  [ТС] 5
не помогло, сейчас сделаю скрины
0
2337 / 1824 / 753
Регистрация: 27.07.2012
Сообщений: 5,392
04.10.2012, 23:13 6
удалил
0
0 / 0 / 0
Регистрация: 07.09.2012
Сообщений: 15
04.10.2012, 23:23  [ТС] 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 позицию влево  
0
2337 / 1824 / 753
Регистрация: 27.07.2012
Сообщений: 5,392
04.10.2012, 23:26 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");
}
1
0 / 0 / 0
Регистрация: 07.09.2012
Сообщений: 15
04.10.2012, 23:28  [ТС] 9
Спасибо большое,все работает.
p.s. сори что долго отвечаю
0
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,701
04.10.2012, 23:30 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
теги кода ставь, а то читать неудобно(над окошком в котором пишешь есть кнопочки "С++" "С")
0
4311 / 1422 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
04.10.2012, 23:32 11
Цитата Сообщение от John Prick Посмотреть сообщение
Вот окончательный вариант:
Так он вроде вправо сдвигает, а в условии влево надо.
0
2337 / 1824 / 753
Регистрация: 27.07.2012
Сообщений: 5,392
04.10.2012, 23:39 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;
0
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
04.10.2012, 23:39 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;
}
1
2337 / 1824 / 753
Регистрация: 27.07.2012
Сообщений: 5,392
04.10.2012, 23:42 14
yuron_477, это С++11 ?
0
4311 / 1422 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
04.10.2012, 23:48 15
John Prick, вот, это то) И ей еще бы универсальности. Чтоб не только с 8 элементами работала.
0
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
04.10.2012, 23:49 16
Цитата Сообщение от John Prick Посмотреть сообщение
это С++11 ?
array и новый цикл for да, rotate и generate - стандартные алгоритмы.
1
2337 / 1824 / 753
Регистрация: 27.07.2012
Сообщений: 5,392
04.10.2012, 23:55 17
Цитата Сообщение от BumerangSP Посмотреть сообщение
И ей еще бы универсальности. Чтоб не только с 8 элементами работала.
Ну это уж сами. Не маленькие.

Добавлено через 2 минуты
yuron_477, а вот это разве есть в старом стандарте?
generate(ar.begin(), ar.end(), [] {return rand()%100;});
0
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
04.10.2012, 23:59 18
Я точно не знаю были ли лямбды в старом стандарте
0
0 / 0 / 0
Регистрация: 07.09.2012
Сообщений: 15
05.10.2012, 00:09  [ТС] 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 позицию влево  
0
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
05.10.2012, 00:15 20
Ваш компилятор, видимо этого не поддерживает. Попробуйте заменить цикл вывода
C++
1
for (int i = 0; i<n; i++) cout<<ar[i]<<" ";
1
05.10.2012, 00:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.10.2012, 00:15
Помогаю со студенческими работами здесь

Одномерный массив. Сдвинуть элементы циклически на n позиций влево
Ввести одномерный статический массив из k чисел. Сдвинуть элементы массива циклически на n позиций...

Все элементы массива X(30) циклически сдвинуть на n позиций влево
Все элементы массива X(30) циклически сдвинуть на n позиций влево при помощи указателей

Элементы линейного массива сдвинуть циклически на две позиции влево
Дорогие форумчане помогите с переводом с pascal в C++ { of integer; i,j:integer; ...

Массив: Циклически сдвинуть элементы массива на одну позицию вправо...
Требуется циклически сдвинуть элементы массива на одну позицию вправо. Я не понимаю, как делать....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru