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

сдвиг массива - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
лизи
 Аватар для лизи
0 / 0 / 0
Регистрация: 14.11.2011
Сообщений: 104
26.11.2011, 22:38     сдвиг массива #1
сдвинуть все элементы массива влево так что бы на первой позиции оказался минимальный элемент
при этом использовать дополнительные массивы нельзя
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5816 / 1214 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
26.11.2011, 22:50     сдвиг массива #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
 
int main()
{
    int tmp;
    std::vector <int> vec;
    std::cout<<"Enter vector:"<<std::endl;
    while(std::cin>>tmp)
        vec.push_back(tmp);
    std::cout<<"Input vector:"<<std::endl;
    std::copy(vec.begin(), vec.end(), std::ostream_iterator <int> (std::cout," "));
    std::rotate(vec.begin(), std::min_element(vec.begin(), vec.end()), vec.end());
    std::cout<<std::endl<<"Output vector:"<<std::endl;
    std::copy(vec.begin(), vec.end(), std::ostream_iterator <int> (std::cout," "));
    std::cout<<std::endl;
    system("pause");
    return 0;
}
лизи
 Аватар для лизи
0 / 0 / 0
Регистрация: 14.11.2011
Сообщений: 104
26.11.2011, 23:08  [ТС]     сдвиг массива #3
блин забыла уточнить
нужно на чистом си код
и из библиотек можно использовать токо stdio conio и math)
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
26.11.2011, 23:11     сдвиг массива #4
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
#include <stdio.h>
#include <string.h>
 
int * min_element(const int * arr, size_t count){
    return ( count < 2 ) ? (int*)arr : ( *arr > *(arr+count-1) ) ? min_element(arr+1, count-1) : min_element(arr, count-1);
}
 
void dump(const int * arr, size_t count){
    while ( count-- )
        printf("%d%c", *arr++, ( count ) ? ' ' : '\n');
}
 
#define SIZE 5
 
int main(void){
    int arr[SIZE] = { 3, 5, 1, 4, 2 };
    size_t diff;
    
    printf("Before:\n");
    dump(arr, SIZE);
    
    for ( diff = min_element(arr, SIZE) - arr; diff; --diff ){
        int t = *arr;
        memmove(arr, arr+1, sizeof(int)*(SIZE-1));
        *(arr+SIZE-1) = t;
    }
    
    printf("After:\n");
    dump(arr, SIZE);
    
    return 0;
}
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
27.11.2011, 00:08     сдвиг массива #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
#include <stdio.h>
 
int main(void)
{
  int arr[] = { 10, 30, 4, 50, 25, 70 };
  int tmp, i, j, size = sizeof(arr)/sizeof(arr[0]);
 
  for(j = i = 0; i < size; i++) {
      if(arr[i] < arr[j])
           j = i;
  }
 
  if(j > 0) {
       while(j--) {
           tmp = arr[0];
           for(i = 0; i < size - 1; arr[i] = arr[i + 1], i++);
           arr[size - 1] = tmp;
       }
  }
  for(i = 0; i < size; i++)
       printf("%d  ", arr[i]);
  getchar();
  return 0;
}
Сыроежка
Заблокирован
27.11.2011, 07:15     сдвиг массива #6
Цитата Сообщение от лизи Посмотреть сообщение
сдвинуть все элементы массива влево так что бы на первой позиции оказался минимальный элемент
при этом использовать дополнительные массивы нельзя
Очевидно, что ваша задача решается в два приема. Сначала вы находите минимальный элемент в массиве, а затем копируете все элементы, начиная с минимального элемента в начало массива.
Сразу же скажу, что копирование можно выполнить с помощью стандартной функции memcpy, которая объявлена в заголовочном файле <string.h>. Вопрос только упирается в то: разрешается ли вам использовать эту функцию, или требуется, чтобы вы самостоятельно выполнили копирование.

Давайте решать вашу задачу по порядку. Сначала напишем функцию, которая ищет минимальный элемент в массиве. Это функция будет возвращать индекс первого минимального элемента (в массиве может быть несколько минимальных элементов).

C++
1
2
3
4
5
6
7
8
9
10
11
12
unsigned int min_element( int a[], unsigned int n )
{
   unsigned int min = 0;
   unsigned int i;
 
   for ( i = 1; i < n; i++ )
   {
      if ( a[i] < a[min] ) min = i;
   }
 
   return ( min );
}
Итак, с помощью этой функции вы найдете индекс первого минимального элемента в массиве. Теперь вам надо скопировать элементы массива в его начало, начиная с минимума. Напишем соответствующую функцию

C++
1
2
3
4
5
6
void copy( int *dest, const int *source, unsigned int n )
{
   unsigned int i;
 
   for ( i = 0; i < n; i++ ) dest[i] = source[i];
}
Как пользоваться этими функциями. Допустим у вас есть целочисленный массив размерностью N: int a[N];

Тогда сначала ищем индекс минимального элемента:

C++
1
unsigned int min = min_element( a, N );
Затем осуществляем сдвиг элементов

C++
1
copy( a, &a[min], N - min );
Ву а ля, как говорят французы! Вам лишь осталось все это объединить вместе в одной программе.
лизи
 Аватар для лизи
0 / 0 / 0
Регистрация: 14.11.2011
Сообщений: 104
27.11.2011, 14:55  [ТС]     сдвиг массива #7
Сыроежка
немного не поняла что за копирование элементов массива в начало
я собиралась сдвигать массив влево вот так
C
1
2
3
4
 x=[0]
for(i=0;i<n-1; i++);
a[i]=a[i++];
a[n-1]=x
но я незнаю как сделать так что бы было первое значение было именно минимальным
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2011, 15:48     сдвиг массива
Еще ссылки по теме:

C++ Циклический сдвиг массива
C++ Удаление элемента из массива и сдвиг массива
Сдвиг элементов массива C++

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

Или воспользуйтесь поиском по форуму:
лизи
 Аватар для лизи
0 / 0 / 0
Регистрация: 14.11.2011
Сообщений: 104
17.12.2011, 15:48  [ТС]     сдвиг массива #8
больше не нужно
Yandex
Объявления
17.12.2011, 15:48     сдвиг массива
Ответ Создать тему
Опции темы

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