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

Циклический сдвиг. Очень нужно - C++

Восстановить пароль Регистрация
 
Gina
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 38
05.10.2013, 17:02     Циклический сдвиг. Очень нужно #1
Здравствуйте! Мне нужно осуществить циклический сдвиг, чтобы максимальный элемент стоял последним. Вроде бы все делаю, но почему-то не получается. Помогите, пожалуйста, найти ошибку.
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
39
40
float sdvig(float *arr, int n)
{
         float max=*arr;
         float temp;
         int i, j, m=0, p=0, sd=0;
         for(i=1;i<n;i++)
         {
              if(*(arr+i)>max) {max=*(arr+i); m=i;}
         }
         cout<<"\nMax = "<<max;
         cout<<"\nIndex = "<<m;
       p=n%2;
       cout<<"\np = "<<p;
       if(p==0) sd=(n-1)-m;
       if(p==1) sd=(n-1)-m+1;
       cout<<"\nsd = "<<sd;
       for(j=0;j<sd-1;j++)
       {
                  if(m<(n/2))
                  {
                        temp=*arr;
                    for(i=0;i<n-2;i++)
                    {
                       *(arr+i)=*(arr+(i+1));
                  }
                  *(arr+(n-1))=temp;
         
                    }
                    if(m>=(n/2)) 
                    {
                        temp=*(arr+n);
                   for(i=n-1;i>0;i--)
                   {
                   *(arr+i)=*(arr+(i-1));
                 }
                 *arr=temp;
         
         }
     }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.10.2013, 17:02     Циклический сдвиг. Очень нужно
Посмотрите здесь:

Циклический сдвиг массива C++
C++ Циклический сдвиг.
Циклический сдвиг вправо C++
Циклический сдвиг C++
C++ циклический сдвиг
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bend3r
 Аватар для Bend3r
142 / 129 / 17
Регистрация: 29.07.2012
Сообщений: 681
05.10.2013, 17:20     Циклический сдвиг. Очень нужно #2
Можно просто через 2 цикла. Первый вы находите максимальный элемент массива, а второй просто зарание сохраните значение последнего елемента и поменяйте его местами.
Gina
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 38
05.10.2013, 17:24  [ТС]     Циклический сдвиг. Очень нужно #3
Цитата Сообщение от Bend3r Посмотреть сообщение
Можно просто через 2 цикла. Первый вы находите максимальный элемент массива, а второй просто зарание сохраните значение последнего елемента и поменяйте его местами.
Но мне же надо не просто поменять местами максимальный элемент и последний. Нужно сдвигать все элементы так, чтобы максимальный стал последним. Или Вы что-то другое имели в виду?
Bend3r
 Аватар для Bend3r
142 / 129 / 17
Регистрация: 29.07.2012
Сообщений: 681
05.10.2013, 17:30     Циклический сдвиг. Очень нужно #4
Цитата Сообщение от Gina Посмотреть сообщение
Но мне же надо не просто поменять местами максимальный элемент и последний. Нужно сдвигать все элементы так, чтобы максимальный стал последним. Или Вы что-то другое имели в виду?
Я вас не правильно понял. Ну тогда смотрите. Первым делом находите максимум. Запоминаете индекс.
Далее делайте 2 цикл вот пример:
C++
1
2
3
4
5
6
7
for (int i = индекс_максимума; i < кол-во_чисел_в_массиве; i++)
for (int j = i+1; j < кол-во_чисел_в_массиве; j++)
{
      int tmp = massiv[i];
      massiv[i] = massiv[j];
      massiv[j] = tmp;
}
Вот и все
scenotaph
120 / 120 / 15
Регистрация: 29.03.2013
Сообщений: 237
05.10.2013, 17:37     Циклический сдвиг. Очень нужно #5
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 <iostream>
#include <conio.h>
#include <time.h>
using namespace std;
 
void main() {
    srand(time(NULL));
    int mas[10];
    int max;
    int i_max;
    setlocale(0,"");
    i_max = 0;
    max = 0;
    for (int i = 0; i < 10; i++) {
        mas[i] = -10 + rand() % 20;
        cout <<mas[i]<<" ";
        if (mas[i] > max) {
            max = mas[i];
            i_max = i;
        }
    }
    cout<<endl;
    int temp;
    for (int i = i_max; i<9; i++) { // если вы хотите максимум "перетаскивать поэлементно" в конец
        temp = mas[i];
        mas[i] = mas[i+1];
        mas[i+1] = temp;
    }
    for (int i = 0; i<10; i++) {
        cout<<mas[i]<<" ";
    }
system("pause");
}
Gina
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 38
05.10.2013, 17:48  [ТС]     Циклический сдвиг. Очень нужно #6
Bend3r, сделала все, как Вы сказали. Но циклический сдвиг не осуществляется.
Например, ввожу я последовательно 6 чисел: 1 6 2 3 4 5. Вместо того, чтобы вывести: 2 3 4 5 1 6, программа выводит: 1 5 4 3 2 6.

Добавлено через 8 минут
scenotaph, не работает. Компилятор ошибки по компиляции не выдает, но при работе появляется окно "прекращена работа программы".
Bend3r
 Аватар для Bend3r
142 / 129 / 17
Регистрация: 29.07.2012
Сообщений: 681
05.10.2013, 17:52     Циклический сдвиг. Очень нужно #7
Скиньте ваш код.
Цитата Сообщение от Gina Посмотреть сообщение
Например, ввожу я последовательно 6 чисел: 1 6 2 3 4 5. Вместо того, чтобы вывести: 2 3 4 5 1 6, программа выводит: 1 5 4 3 2 6.
Сразу бы написали так, ну тогда значение i в первом цикле, укажите 1, и передвигайте полностью ваш массив, ну а в конце просто поменяйте местами последний елемент с значением максимум.
scenotaph
120 / 120 / 15
Регистрация: 29.03.2013
Сообщений: 237
05.10.2013, 18:00     Циклический сдвиг. Очень нужно #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
34
35
36
37
38
#include <iostream>
#include <conio.h>
#include <time.h>
using namespace std;
 
void main() {
    srand(time(NULL));
    int mas[10];
    int max;
    int i_max;
    setlocale(0,"");
    i_max = 0;
    max = 0;
    for (int i = 0; i < 10; i++) {
        mas[i] = -10 + rand() % 20;
        cout <<mas[i]<<" ";
        if (mas[i] > max) {
            max = mas[i];
            i_max = i;
        }
    }
    cout<<endl;
    int count = 9 - i_max;
    int temp;
    int temp_1;
for (int i = 0; i<count ; i++) {    
        temp = mas[9];
    for (int j = 9; j>0; j--) {
        mas[j] = mas[j-1];      
    }
    mas[0] = temp;  
}
for (int i = 0; i<10; i++) {
    cout << mas[i] << " ";
}
        
system("pause");
}
Gina
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 38
05.10.2013, 19:05  [ТС]     Циклический сдвиг. Очень нужно #9
scenotaph, а можете, пожалуйста, объяснить свой алгоритм сдвига? А том немного непонятно((
scenotaph
120 / 120 / 15
Регистрация: 29.03.2013
Сообщений: 237
05.10.2013, 19:13     Циклический сдвиг. Очень нужно #10
Gina,
C++
1
2
3
4
5
6
7
for (int i = 0; i<count ; i++) {    
        temp = mas[9];
    for (int j = 9; j>0; j--) {
        mas[j] = mas[j-1];      
    }
    mas[0] = temp;  
}
Пишете последний элемент массива во временную переменную, сдвигаете все элементы вправо, и на место первого элемента пишете значение последнего. (mas[0] = temp)
И повторяем эту процедуру N - I_max раз, где N это количество элементов массива, а I_max индекс максимального элемента. То есть, N - I_max это количество элементов(шагов), на которые нужно сдвинуть максимальный элемент, чтобы он оказался в конце массива
Gina
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 38
05.10.2013, 19:47  [ТС]     Циклический сдвиг. Очень нужно #11
scenotaph, спасибо!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.10.2013, 20:16     Циклический сдвиг. Очень нужно
Еще ссылки по теме:

Циклический сдвиг C++
C++ Циклический сдвиг
Циклический сдвиг битов C++

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

Или воспользуйтесь поиском по форуму:
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 438
05.10.2013, 20:16     Циклический сдвиг. Очень нужно #12
Цитата Сообщение от scenotaph Посмотреть сообщение
И повторяем эту процедуру N - I_max раз, где N это количество элементов массива, а I_max индекс максимального элемента.
Что-то как-то сложно. Можно же проще:
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
#include <vector>
#include <algorithm>
#include <iostream>
 
using namespace std;
 
void print(const string& s, vector<int> & v) {
    cout << s << ": ";
    for (auto i : v)
        cout << i << ", ";
    cout << endl;
}
 
void rotate_max(vector<int> && v) {
    print("Original", v);
    auto max = max_element(begin(v), end(v));
    auto mid = (next(max) == end(v)) ? begin(v) : next(max);
    rotate(begin(v), mid, end(v));
    print("Rotated", v);
    cout << endl;
}
 
int main() {
    rotate_max({ 1, 2, 5, 4, 3, 2 });
    rotate_max({ 5, 4, 3, 2, 1, 2 });
    rotate_max({ 4, 3, 2, 1, 2, 5 });
}
Original: 1, 2, 5, 4, 3, 2,
Rotated: 4, 3, 2, 1, 2, 5,

Original: 5, 4, 3, 2, 1, 2,
Rotated: 4, 3, 2, 1, 2, 5,

Original: 4, 3, 2, 1, 2, 5,
Rotated: 4, 3, 2, 1, 2, 5,
Добавлено через 5 минут
Даже еще проще:
C++
1
2
    auto max = max_element(begin(v), end(v));
    rotate(begin(v), next(max), end(v));
Yandex
Объявления
05.10.2013, 20:16     Циклический сдвиг. Очень нужно
Ответ Создать тему
Опции темы

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