Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/55: Рейтинг темы: голосов - 55, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 18.01.2018
Сообщений: 1
1

Функция: циклический сдвиг на n позиций вправо элементов целочисленного массива

18.01.2018, 19:13. Показов 10839. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Описать функцию, осуществляющую циклический сдвиг на n позиций вправо элементов целочисленного массива, содержащего m элементов(n<m)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.01.2018, 19:13
Ответы с готовыми решениями:

Осуществить циклический сдвиг элементов массива вправо на k позиций
Помогите решить пожалуйста задачи на си... Не могу получить зачет поймите люди!! Дан массив...

Осуществить циклический сдвиг элементов массива вправо на k позиций
Дан массив размера N. Осуществить циклический сдвиг элементов массива вправо на k позиций, где k –...

Осуществить циклический сдвиг элементов массива вправо на несколько позиций
есть задача &quot;Дан массив A. Осуществить циклический сдвиг элементов массива вправо на k позиций, где...

Осуществить циклический сдвиг элементов двусвязного списка на k позиций вправо
Осуществить циклический сдвиг элементов двусвязного списка на k позиций вправо.

5
150 / 132 / 53
Регистрация: 03.01.2017
Сообщений: 472
19.01.2018, 09:20 2
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
#include <cstdlib>
#include <stdio.h>
 
int main()
{
    int i, j, n, m;
    
    printf("m = "); scanf("%d", &m);
    int mas[m], mas2[m];
    printf("Mas:\n");
    for(i = 0; i < m; i++)
    {
        mas[i] = i; printf(" %d",mas[i]); mas2[i] = 0;
    }
    printf("\nRight ( < %d): ", m); scanf("%d", &n);
    for(i = 0; i < m; i++) if(i+n < m) mas2[i+n] = mas[i]; else mas2[i+n-m] = mas[i];
    printf("Mas:\n");
    for(i = 0; i < m; i++) printf(" %d",mas2[i]);
    printf("\n");   
    system("Pause");
    return 0;
}
/*
m = 10
Mas:
 0 1 2 3 4 5 6 7 8 9
Right ( < 10): 7
Mas:
 3 4 5 6 7 8 9 0 1 2
*/
0
36 / 35 / 17
Регистрация: 15.06.2017
Сообщений: 184
19.01.2018, 09:39 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void RotArray(int *arr,int arr_len, int step)
{
        int i, j;
 
         for(i=0; i<step; i++)
        {
            j=arr_len-1;
            arr[j-1]=arr[j]
            arr[j]=arr[0];
            j--;
               while(j) {
                
                   arr[j-1]=arr[j];    
              
              j--;
            }
        }   
 
 
}
Это крутит влево, как вправо - Вам для размышлений
0
41 / 41 / 15
Регистрация: 29.12.2016
Сообщений: 291
19.01.2018, 16:39 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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <stdio.h>
/* ************************************************************************
 * Необходимор реализовать функцию rotate, которая сдвигает содержимое
 * массива влево на заданное число позиций (циклический сдвиг).
 *
 * На вход функция принимает массив, его размер и величину сдвига. Например,
 * если на вход функции подан массив:
 *  int a[] = { 1, 2, 3, 4, 5 };
 * и требуется циклически сдвинуть его влево на 2 позиции, то на выходе мы
 * получим числа в таком порядке: 3, 4, 5, 1, 2.
 *
 * Обратите внимание, что величина сдвига может быть нулевой, а может быть
 * и больше размера массива, все эти случаи нужно учесть.
 *
 * Основная часть программы уже готова, необходимо реализовать только
 * функцию.
 * ***********************************************************************/
void rotate (int * a, unsigned size, int shift);        //сдвигаем массив
void prtarr (int a[], unsigned size);                       //выводим на экран
 
int main (void)
{
    int MAX = 5;                                        //размер массива
    int m[MAX];                                         //массив
    int i;
    int shift = -1;                                 //величина сдвига
    while (shift < 0)                                   //получаем размер сдвига
    {
        printf("Введите величину сдвига: ");
        scanf("%i", &shift);
        getchar();
    }
    for(i=0; i<MAX; i++){ m[i] = i+1; }         //заполняем массив
    prtarr(m, MAX);                                 //выводим на экран
    printf("\n");
    rotate(m, MAX, shift);                          //сдвигаем массив
    return 0;
}
//-------------------------------------------------------------------------
void prtarr (int a[], unsigned size)
{
    int i;
    int d = size-1;
    for(i=0; i<size; i++)
    {
        printf("%i", a[i]);
        if (i < d) printf(" ");
    }
    printf("\n");
}
//-------------------------------------------------------------------------
void rotate (int * a, unsigned size, int shift)
{
    int i, j, tmp;
 
    if(shift == 0) { return; }
    if(shift > size) { shift %= size; }
    if(shift > 0 && shift <= size)
    {
        for(i = 0; i < shift; i++)
        {
                tmp = a[0];
            for(j = 0; j < size - 1; j++)
            {
                a[j] = a[j + 1];
                a[j + 1] = tmp;
            }
        }
        prtarr(a, size);
    }
    return;
}
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
11.04.2019, 14:10 5
а как же классический алгоритм rotate-rotate-rotate?
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
41
42
43
44
45
#include <stdio.h>
 
void rotate(int * a, int shift);        //сдвигаем массив
void prtarr(int * a);                       //выводим на экран
int main(void)
{
    #define MAX  5                                       //размер массива
    int m[MAX];                                         //массив
    int i;
    int shift = -1;                                 //величина сдвига
    for (i = 0; i < MAX; i++) { m[i] = i + 1; }         //заполняем массив
    prtarr(m);                                 //выводим на экран
    while (shift < 0|| shift>MAX)                                   //получаем размер сдвига
    {
        printf("Введите величину сдвига: ");
        scanf("%i", &shift);
        getchar();
    }
    printf("\n");
    rotate(m, shift);                          //сдвигаем массив
    prtarr(m);                                 //выводим на экран
    return 0;
}
//-------------------------------------------------------------------------
void prtarr(int * a)
{
    int i;
    for (i = 0; i < MAX; i++)
    {
        printf("%i", a[i]);
    }
    printf("\n");
}
//-------------------------------------------------------------------------
void rotate(int * a, int shift)
{
    int i;
    for (i = 0; i < shift-i-1; i++)
        a[i] ^= a[shift - i-1] ^= a[i] ^= a[shift - i-1];
    for (i = 0; i < MAX-shift-i-1; i++)
        a[shift+i] ^= a[MAX-i-1] ^= a[shift + i] ^= a[MAX - i-1];
    for (i = 0; i < MAX - i-1; i++)
        a[i] ^= a[MAX - i-1] ^= a[i] ^= a[MAX - i-1];
    return;
}
0
из племени тумба-юбма
2467 / 1790 / 417
Регистрация: 29.11.2015
Сообщений: 8,690
Записей в блоге: 15
23.11.2020, 21:39 6
для коллекции
Кликните здесь для просмотра всего текста
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>
#include <stdlib.h>
#define SWAP(x,y) x=x+y, y=x-y, x=x-y
 
int right_shift(int n, int s) // сдвиг вправо на s позиций
{
    char str[11];
    sprintf(str, "%d", n);
    for(int j=0; j<s; j++)
        for(int i=strlen(str)-1; i>0; i--)
            SWAP(str[i], str[i-1]);
    return atoi(str);
}
 
//int left_shift(int n, int s) // сдвиг влево на s позиций
//{
//  char str[11];
//  sprintf(str, "%d", n);
//  for(int j=0; j<s; j++)
//      for(int i=0; i<strlen(str)-1; i++)
//          SWAP(str[i], str[i+1]);
//  return atoi(str);
//}
 
int main(void)
{
    int shift, n = 12345;
    scanf("%d", &shift);
    printf("%d\n", right_shift(n,shift));
    return 0;
}
0
23.11.2020, 21:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.11.2020, 21:39
Помогаю со студенческими работами здесь

Циклический сдвиг элементов массива на k позиций
Задан массив из n элементов и число k. Осуществить циклический сдвиг элементов массива на k...

Осуществить сдвиг элементов массива вправо на k позиций
Дан массив A. заполнить массив В элементами массива A, которые удовлетворяют двойному неравенству:...

Циклический сдвиг элементов массива влево на 8 позиций
Здравствуйте!!! Помогите пожалуйста решить задачу! Си... Надо осуществить циклический сдвиг...

Осуществить циклический сдвиг элементов массива влево на M позиций
Дан массив N. Осуществить циклический сдвиг элементов массива влево на M позиций. Новый массив...


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

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