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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Sasha1994
0 / 0 / 0
Регистрация: 07.09.2012
Сообщений: 15
#1

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

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

Условие задачи: Заполните случайным образом одномерный массив из 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2012, 23:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатели: сдвинуть элементы циклически на 1 позицию влево (C++):

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

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

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

Одномерный массив. Сдвинуть элементы циклически на n позиций влево - C++
Ввести одномерный статический массив из k чисел. Сдвинуть элементы массива циклически на n позиций влево. #include &lt;iostream&gt; ...

Сдвинуть циклически элементы одномерного массива на k позиций влево - C++
Тема и есть условие задачи... Сам же я застопорился на написании алгоритма сдвига :- #include &lt;iostream.h&gt; #include &lt;math.h&gt; int...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
wtf?
19 / 19 / 0
Регистрация: 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
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
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
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,847
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
Sasha1994
0 / 0 / 0
Регистрация: 07.09.2012
Сообщений: 15
04.10.2012, 23:13  [ТС] #5
не помогло, сейчас сделаю скрины
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
04.10.2012, 23:13 #6
удалил
0
Sasha1994
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");}
0
Миниатюры
Указатели: сдвинуть элементы циклически на 1 позицию влево  
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
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
Sasha1994
0 / 0 / 0
Регистрация: 07.09.2012
Сообщений: 15
04.10.2012, 23:28  [ТС] #9
Спасибо большое,все работает.
p.s. сори что долго отвечаю
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,847
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
BumerangSP
4286 / 1408 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
04.10.2012, 23:32 #11
Цитата Сообщение от John Prick Посмотреть сообщение
Вот окончательный вариант:
Так он вроде вправо сдвигает, а в условии влево надо.
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
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
DiffEreD
1430 / 767 / 95
Регистрация: 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
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
04.10.2012, 23:42 #14
yuron_477, это С++11 ?
0
BumerangSP
4286 / 1408 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
04.10.2012, 23:48 #15
John Prick, вот, это то) И ей еще бы универсальности. Чтоб не только с 8 элементами работала.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.10.2012, 23:48
Привет! Вот еще темы с ответами:

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

Сдвинуть элементы на одну позицию вправо\влево - C++
Ребята помогите пожалуйста с решением задачи на с++ : Сдвинуть элементы на одну позицию вправо\влево.

Сдвинуть элементы массива циклически на M влево, перевернуть нечетные строки и посчитать простые числа - C++
Доброго времени суток. Помогите составить программу. Заранее благодарен. Тут несколько условий, не обязательно одну большую делать, можно к...

Циклически сдвинуть все элементы матрицы влево в строках, которые начинаются с положительного элемента - C++
(((Там какая та задача из темы Массивов))) Для решения этой задачи: В матрице Z(4,5) сдвинуть все элементы влево (циклически) в тех...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.10.2012, 23:48
Ответ Создать тему
Опции темы

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