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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
лизи
0 / 0 / 0
Регистрация: 14.11.2011
Сообщений: 104
#1

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

26.11.2011, 22:38. Просмотров 1180. Ответов 7
Метки нет (Все метки)

сдвинуть все элементы массива влево так что бы на первой позиции оказался минимальный элемент
при этом использовать дополнительные массивы нельзя
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2011, 22:38     сдвиг массива
Посмотрите здесь:

Циклический сдвиг массива без использования вспомогательного массива - C++
Ребят, помогите пожадуйста написать лабу...Времени ктастрофически не хватает, буду очень признателен Написать функцию, которая...

Побитовый сдвиг массива - C++
Есть двумерный массив int massiv;Нужно сдвинуть первый элемент массива в конец, а все остальные соответственно вперед. В цикле это...

Битовый сдвиг массива - C++
Помогите разобраться с сдвигом влево (выравниванием до начала байта) данных. Задача заключается в том что есть некий массив, в котором...

Сдвиг элементов массива - C++
Помогите, срочно пожалуйста, проболел из-за весны много, а на завтра сдать нужно Осуществить сдвиг элементов массива Y (m) в направлении...

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

Сдвиг массива символов - C++
class G { public: char name; char maker; int num; int price; }; G A,B,C; G D; void third(){ int i;

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dekio
Фрилансер
Эксперт С++
5837 / 1218 / 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
Эксперт С++
9460 / 5473 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
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
914 / 739 / 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++
задача: Осуществить циклический сдвиг элементов квадратной матрицы размерности MxN вправо на k элементов таким образом: элементы 1-й...

Сдвиг элементов массива в лево. - C++
У меня логическая ошибка в этом алгоритме. Я не могу найти ее. Как работает эта часть программы? t=A; for(i=n;i&gt;0;i--) { A=t; ...

Сдвиг одномерного массива на k позиций - C++
Дан массив целых чисел длиной n. Осуществить циклический сдвиг вправо на k позиций. Последние k элементов поставить на первое место. ...


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

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

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