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

Циклический сдвиг массива влево - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.75
crewww
30 / 1 / 1
Регистрация: 28.10.2010
Сообщений: 102
13.02.2012, 23:24     Циклический сдвиг массива влево #1
условие: задан массив целочисленный состоящий из 10 элементов
нужно сделать циклический сдвиг влево так чтобы первый максимум стал на первом месте то есть присвоить a[0] этот максимум
посмотрите насколько я прав и вообще правильно ли я понял условие
решение:
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>
 
using namespace std;
 
int main()
{const int n=10;
int a[n]={3,5,7,42,3,67,2,6,4,2};
int i,j,r,max,ind;
for (i=0;i<n;i++)
 
  max=a[0]; 
  ind=0;
   for (i=1;i<=n;i++)
    if(max<a[i])
      {
       max=a[i]; 
       ind=i;
      }
     for(i=0;i<ind;i++)
       {
        r=a[0];
         for (j=0;j<n-1;j++)
           a[j]=a[j+1];
           a[n-1]=r;
       }
 
 
for (i=0;i<n;i++) cout<<a[i]<<" ";
 
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ШКІПЕР
 Аватар для ШКІПЕР
93 / 93 / 7
Регистрация: 14.04.2010
Сообщений: 280
Записей в блоге: 9
Завершенные тесты: 1
13.02.2012, 23:36     Циклический сдвиг массива влево #2
Цитата Сообщение от crewww Посмотреть сообщение
посмотрите насколько я прав и вообще правильно ли я понял условие
В некоторых случаях Ваша программа работает и иногда даже работает правильно
Но!
http://10pix.ru/img1/2038/6827756.jpg (переделано под 5 елементов)
На скрине виден тест, когда все абсолютно неправильно. По идее максимум нужно просто вынести наперед. Даже не один - все максимумы. В тесте должно быть ответом: 5, 5, 1, 3, 4. А в действительности ?...
P.S. Возможно моя критика на счет всех максимумов неверна, так как в условии написано только "первый максимум" а о втором история умалчивает... Но даже при таком раскладе ответ, полученный на мой тест, неверный...
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
13.02.2012, 23:41     Циклический сдвиг массива влево #3
ШКІПЕР, а по-моему все верно. ТС написал, что первый максимум должен оказаться на первом месте. Первый максимум в массиве - {1,5,3,4,5}. Значит ответ {5,3,4,5,1}
ШКІПЕР
 Аватар для ШКІПЕР
93 / 93 / 7
Регистрация: 14.04.2010
Сообщений: 280
Записей в блоге: 9
Завершенные тесты: 1
13.02.2012, 23:44     Циклический сдвиг массива влево #4
Цитата Сообщение от I.M. Посмотреть сообщение
первый максимум должен оказаться на первом месте.
Цитата Сообщение от crewww Посмотреть сообщение
первый максимум стал на первом месте то есть присвоить a[0] этот максимум
Тогда почему первый элемент сохраняется ? Разве он не должен затереться ?
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
13.02.2012, 23:47     Циклический сдвиг массива влево #5
ШКІПЕР, ТС писал:
Цитата Сообщение от crewww Посмотреть сообщение
циклический сдвиг влево
Т.е. ничего не затирается, мы переносим элементы массива из его начала в конец. Поэтому в вашем примере число 1 переместилось на посл. место массива
ШКІПЕР
 Аватар для ШКІПЕР
93 / 93 / 7
Регистрация: 14.04.2010
Сообщений: 280
Записей в блоге: 9
Завершенные тесты: 1
13.02.2012, 23:52     Циклический сдвиг массива влево #6
Цитата Сообщение от crewww Посмотреть сообщение
циклический сдвиг влево
I.M., все - переубедил У меня больше нет замечений.
crewww
30 / 1 / 1
Регистрация: 28.10.2010
Сообщений: 102
13.02.2012, 23:53  [ТС]     Циклический сдвиг массива влево #7
в самом условии задачи дан пример такой
A={3,4,5,3,4,5)
на выходе имеем
A={5,3,4,5,3,4}
ШКІПЕР
 Аватар для ШКІПЕР
93 / 93 / 7
Регистрация: 14.04.2010
Сообщений: 280
Записей в блоге: 9
Завершенные тесты: 1
14.02.2012, 00:00     Циклический сдвиг массива влево #8
Цитата Сообщение от crewww Посмотреть сообщение
в самом условии задачи дан пример такой
A={3,4,5,3,4,5)
на выходе имеем
A={5,3,4,5,3,4}
Yeah! Случилось то, о чем так долго говорили коммунисты. Все неправы
Куда делась последняя 5-ка ? Стала на место максимума ? Тогда сдвиг какой-то не сдвиг.


Добавлено через 2 минуты
5, 1, 5, 3, 4 - вот что должно быть на мой тест...

Не по теме:

Вот он! Тест моей мечты!

crewww
30 / 1 / 1
Регистрация: 28.10.2010
Сообщений: 102
14.02.2012, 00:28  [ТС]     Циклический сдвиг массива влево #9
Цитата Сообщение от ШКІПЕР Посмотреть сообщение
Yeah! Случилось то, о чем так долго говорили коммунисты. Все неправы
Куда делась последняя 5-ка ? Стала на место максимума ? Тогда сдвиг какой-то не сдвиг.
вот и я когда пример то начал разбирать понял что вообще неправ

Добавлено через 27 минут
абсолютно рабочий код
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>
 
using namespace std;
 
int main()
{const int n=6;
int a[n];
int i,j,r,max,ind;
for (i=0;i<n;i++) cin>>a[i];
max=a[0]; ind=0;
for (i=0;i<n;i++)
 
  
  
   for (i=1;i<n;i++)
    if(max<a[i])
      {
       max=a[i]; 
       ind=i;
      }
     for(i=0;i<ind;i++)
       {
        r=a[0];
         for (j=0;j<n-1;j++)
           a[j]=a[j+1];
           a[n-1]=r;
       }
 
 
for (i=0;i<n;i++) cout<<a[i]<<" ";
 
    return 0;
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
14.02.2012, 00:34     Циклический сдвиг массива влево #10
Цитата Сообщение от ШКІПЕР Посмотреть сообщение
Куда делась последняя 5-ка ? Стала на место максимума ?
Переместилась на 2 позиции влево.

crewww, на первый взгляд, наверное жутковато...
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
#include <stdio.h>
#include <string.h>
 
#define SIZE(arr) ( sizeof(arr) / sizeof(*arr) )
 
int * first_max(const int * arr, const size_t size){
    return ( size < 2 ) ? (int*)arr : ( *arr < *(arr + size - 1) ) ? first_max(arr + 1, size - 1) : first_max(arr, size - 1);
}
 
void rotate_left(int * arr, const size_t size){
    int tmp = *arr;
    
    memmove(arr, arr + 1, sizeof(int) * (size - 1));
    arr[size - 1] = tmp;
}
 
void dump(const int * arr, size_t size){
    while ( size-- )
        printf("%d%c", *arr++, ( size ) ? ' ' : '\n');
}
 
int main(void){
    int arr[] = { 3, 4, 5, 3, 4, 5 };
    size_t steps;
    
    printf("Before: ");
    dump(arr, SIZE(arr));
    for ( steps = first_max(arr, SIZE(arr)) - arr; steps; --steps )
        rotate_left(arr, SIZE(arr));
    printf("After:  ");
    dump(arr, SIZE(arr));
    
    return 0;
}
crewww
30 / 1 / 1
Регистрация: 28.10.2010
Сообщений: 102
14.02.2012, 00:42  [ТС]     Циклический сдвиг массива влево #11
Цитата Сообщение от easybudda Посмотреть сообщение
Переместилась на 2 позиции влево.

crewww, на первый взгляд, наверное жутковато...
на первый взгляд - да жутковато...
что вы можете сказать насчет моего решение которое на пост повыше
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2012, 01:13     Циклический сдвиг массива влево
Еще ссылки по теме:

C++ Одномерный массив. Циклический сдвиг влево
C++ Осуществить циклический сдвиг элементов массива влево на одну позицию
Одномерные массивы (циклический сдвиг всех элементов массива на одну позицию влево) C++

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
14.02.2012, 01:13     Циклический сдвиг массива влево #12
Цитата Сообщение от crewww Посмотреть сообщение
что вы можете сказать насчет моего решение которое на пост повыше
Раз пять перечитал, так и не понял, как оно работает, но компилируется и результат правильный выдаёт...
Yandex
Объявления
14.02.2012, 01:13     Циклический сдвиг массива влево
Ответ Создать тему
Опции темы

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