0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 38
1

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

05.10.2013, 17:02. Показов 772. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Мне нужно осуществить циклический сдвиг, чтобы максимальный элемент стоял последним. Вроде бы все делаю, но почему-то не получается. Помогите, пожалуйста, найти ошибку.
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;
         
         }
     }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.10.2013, 17:02
Ответы с готовыми решениями:

циклический сдвиг
написать программу на СИ (обычном ,НЕ Си++), используя символьные массивы : Если число...

Циклический сдвиг
Здравствуйте помогите пожалуйста мне надо все нечетные строки матрицы сдвинуть циклически на К...

Циклический сдвиг
Ребята, в чем может быть проблема? Надо организовать ф-цию циклического сдвига вправо. ТО бишь...

Циклический сдвиг.
Нужно написать вот такую прогу, где нужно сдвинуть число а на n бит влево.

11
150 / 137 / 35
Регистрация: 29.07.2012
Сообщений: 709
05.10.2013, 17:20 2
Можно просто через 2 цикла. Первый вы находите максимальный элемент массива, а второй просто зарание сохраните значение последнего елемента и поменяйте его местами.
0
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 38
05.10.2013, 17:24  [ТС] 3
Цитата Сообщение от Bend3r Посмотреть сообщение
Можно просто через 2 цикла. Первый вы находите максимальный элемент массива, а второй просто зарание сохраните значение последнего елемента и поменяйте его местами.
Но мне же надо не просто поменять местами максимальный элемент и последний. Нужно сдвигать все элементы так, чтобы максимальный стал последним. Или Вы что-то другое имели в виду?
0
150 / 137 / 35
Регистрация: 29.07.2012
Сообщений: 709
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;
}
Вот и все
0
120 / 120 / 47
Регистрация: 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");
}
0
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, не работает. Компилятор ошибки по компиляции не выдает, но при работе появляется окно "прекращена работа программы".
0
150 / 137 / 35
Регистрация: 29.07.2012
Сообщений: 709
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, и передвигайте полностью ваш массив, ну а в конце просто поменяйте местами последний елемент с значением максимум.
0
120 / 120 / 47
Регистрация: 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");
}
0
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 38
05.10.2013, 19:05  [ТС] 9
scenotaph, а можете, пожалуйста, объяснить свой алгоритм сдвига? А том немного непонятно((
0
120 / 120 / 47
Регистрация: 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 это количество элементов(шагов), на которые нужно сдвинуть максимальный элемент, чтобы он оказался в конце массива
1
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 38
05.10.2013, 19:47  [ТС] 11
scenotaph, спасибо!
0
127 / 131 / 11
Регистрация: 25.12.2011
Сообщений: 443
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));
0
05.10.2013, 20:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.10.2013, 20:16
Помогаю со студенческими работами здесь

Циклический сдвиг массива
Здравствуйте,стоит задача сдвинуть массив вправо на один и влево на один. Сдвинуть массив вправо у...

Циклический сдвиг матрицы
Всем доброго дня. Программа располагает двумерный массив в динамичной памяти и сдвигает его на Т...

Циклический сдвиг массива
Напишите программу, которая вводит с клавиатуры непустой массив целых чисел, циклический сдвигает...

Циклический сдвиг числа
Здравствуйте, нужна помощь с циклическим сдвигом, данно: Число: 44225 Нужно произвести...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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