С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
happin3ss
0 / 0 / 0
Регистрация: 02.07.2013
Сообщений: 6
#1

Сдвиг элементов в столбце на две позиции вниз по кругу - C++

04.02.2014, 17:23. Просмотров 663. Ответов 9
Метки нет (Все метки)

Добрый день уважаемые программисты.
Начал изучать С++ очень и очень недавно. И вот возникла такая проблема. Написал программу, которая сдвигает элементы в каждом столбце матрицы на две позиции вниз по кругу, если количество элементов расположенных между первыми минимумом или максимумом в этих столбцах больше 1 (в противном случае в соответствующих столбцах все остается без изменений). Вроде все замечательно, все считает верно, но есть один недостаток: выводится матрица повернутой на 90 градусов (столбцы являются строками, строки - столбцами). Сделано это потому, что я не знаю как написать код для сдвига сверху вниз (уж поймите правильно - новичок), и вышел из этой ситуации таким образом (сдвиг происходит как-бы строки, которая является столбцом, вправо).
Вот сам код:
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
#include "windows.h"
#include "stdio.h"
#include "math.h"
 
#define MaxNumber 65535
#define N 4//Кол-во строк N
#define M 5//Кол-во элементов M
#define EditNumber 2//Насколько смещаем массив в право(EditNumber>0)
 
void RotateRigth(int *oldmass, int L, int k){
    int *newmass=(int *)malloc(L*sizeof(int));
    int *mass=(int*)oldmass;
    while(k!=0){
        for (int i=0;i<L;i++) {
            if(i-1<0) newmass[i]=mass[L-1];
            else newmass[i]=mass[i-1];
        }
        for(int i=0; i<L;i++){
            mass[i]=newmass[i];
        }
        k--;
    }
    free(newmass);
}
 
 
 
int main(){
    /*Создание и инициализация матрицы*/
    int mass[N][M]={{3,4,2,0,5},{7,2,6,3,4},{8,6,5,10,12},{8,12,9,15,21}};
 
        printf ("Old Matrix:\n\n")
for(int n=0; n<N;n++){
        for(int m=0; m<M;m++){
            printf("%d ",mass[n][m]);
        }
        printf("\n");
}
    
 
      for(int n=0; n<N;n++){
        /*Находим id ячейки, где лежат макс и мин значения*/
        int max[2]={0,(-1*MaxNumber)};//max[0] - id ячейки; max[1] - максимальное число число(но в данный момент оно минимальное)
        int min[2]={0,MaxNumber};
        for(int m=0; m<M;m++){
            if(mass[n][m]<min[1]){
                min[1]=mass[n][m];
                min[0]=m;
            }
            if(mass[n][m]>max[1]){
                max[1]=mass[n][m];
                max[0]=m;
            }   
        }
        /*Сдвигаем если нужно наш массив*/
        if((int)fabs((float)(max[0]-min[0]))-1>1)//находим модуль разности и вычитам 1, если больше 1 смещаем массив направо на значение EditNumber
            RotateRigth(&*mass[n],M,EditNumber);
    }
    /*Выводим матрицу*/
    printf ("\nNew Matrix:\n\n");
    for(int n=0; n<N;n++){
        for(int m=0; m<M;m++){
            printf("%d ",mass[n][m]);
        }
        printf("\n");
    }
    system("pause");
    return 0;
}
Надеюсь, вы сможете помочь мне с кодом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2014, 17:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сдвиг элементов в столбце на две позиции вниз по кругу (C++):

Циклический сдвиг элементов матрицы по кругу на число T - C++
Доброго времени суток. Искал, искал так и не нашел что-нибудь по сдвигу двумерного массива. Нужен циклический сдвиг по кругу на число T;...

Осуществить циклический сдвиг элементов в матрице на k элементов вправо или вниз - C++
Осуществить циклический сдвиг элементов в мат-це на k элементов вправо или вниз (в зависимости от введенного режима). Число k может быть...

Циклический сдвиг элементов массива по диагонали влево вниз - C++
Квадратный массив N×N по диагонали влево вверх. //--------------------------------------------------------------------------- ...

Дано одномерный массив Х, размером 15 элементов. Провести циклический сдвиг элементов в массиве вправо на 2 позиции - C++
Дано одномерный массив Х, размером 15 элементов. Провести циклический сдвиг элементов в массиве вправо на 2 позиции.

Сдвиг двумерного массива вниз на одну позицию - C++
Есть задача:сдвинуть элементы двумерного массива вниз на одну позицию,а последнюю строку переместить на первую.Делал,но при...

Сдвиг стоки вниз и Удаление столбцов Матрицы - C++
Добрый день! Возник вопрос! Как правильно сдвигать строчку в матрице? (своего рода сортировка) Мне нужно указанную строку переместить...

9
mf909
96 / 12 / 3
Регистрация: 10.01.2014
Сообщений: 30
04.02.2014, 17:41 #2
Сдвиг элементов массива делается при помощи взятия остатка от целочисленного деления.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
 
int main()
{
    int arr[] = {1,2,3,4,5};
    int newarr[5];
    int L = 2; //величина сдвига
    for(int i=0; i<5; i++) {
        newarr[i] = arr[(i+L)%5];
    }
    for(int i=0; i<5; i++) {
        cout << newarr[i] << ' ';
    }
    
}
1
happin3ss
0 / 0 / 0
Регистрация: 02.07.2013
Сообщений: 6
04.02.2014, 18:22  [ТС] #3
Так, как я понял тут мы вводим нашу матрицу:
C++
1
int arr[] = {1,2,3,4,5};
Вот тут я не очень понял, что здесь делается, в плане, почему 5:
C++
1
int newarr[5];
А вот далее совсем не понял
Здесь видимо происходит заполнение ячеек матрицы:
C++
1
newarr[i] = arr[(i+L)%5];
Cout'ом никогда не пользовался, как я понимаю это функция вывода?
C++
1
cout << newarr[i] << ' ';
Да, и если вдруг понадобится, то ответом для моей матрицы:
3 7 8 8
4 2 6 12
2 6 5 9
0 3 10 15
5 4 12 21
Будет:
3 7 8 15
4 2 6 21
2 6 5 8
0 3 10 12
5 4 12 9
0
mf909
96 / 12 / 3
Регистрация: 10.01.2014
Сообщений: 30
04.02.2014, 18:58 #4
Цитата Сообщение от happin3ss Посмотреть сообщение
Вот тут я не очень понял, что здесь делается, в плане, почему 5
Это размер массива. Мы берем остаток от деления на размер массива.
Цитата Сообщение от happin3ss Посмотреть сообщение
Здесь видимо происходит заполнение ячеек матрицы
Совершенно верно. Попробуйте проделать это деление по модулю на листе бумаги и посмотрите на остатки от деления.
Цитата Сообщение от happin3ss Посмотреть сообщение
Cout'ом никогда не пользовался, как я понимаю это функция вывода?
Да, в C++. Подключается с помощью
#include <iostream>
0
happin3ss
0 / 0 / 0
Регистрация: 02.07.2013
Сообщений: 6
04.02.2014, 19:32  [ТС] #5
Тоесть, если я правильно понимаю, у меня заместо:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void RotateRigth(int *oldmass, int L, int k){
    int *newmass=(int *)malloc(L*sizeof(int));
    int *mass=(int*)oldmass;
    while(k!=0){
        for (int i=0;i<L;i++) {
            if(i-1<0) newmass[i]=mass[L-1];
            else newmass[i]=mass[i-1];
        }
        for(int i=0; i<L;i++){
            mass[i]=newmass[i];
        }
        k--;
    }
    free(newmass);
}
будет:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
    int arr[] = {{3,7,8,8},{4,2,6,12},{2,6,5,9},{0,3,10,15},{5,4,12,21}};
    int newarr[5];
    int L = 2;
    for(int i=0; i<5; i++) {
        newarr[i] = arr[(i+L)%5];
    }
    for(int i=0; i<5; i++) {
        cout << newarr[i] << ' ';
    }
 
}
Если да, то как мне сделать вызов сдвига вот тут:
C++
1
2
if((int)fabs((float)(max[0]-min[0]))-1>1)
RotateRigth(&*mass[n],M,EditNumber);
Да, и у меня будет другое число, а не 5?
0
mf909
96 / 12 / 3
Регистрация: 10.01.2014
Сообщений: 30
04.02.2014, 19:43 #6
Нет, свой код я привел просто как иллюстрацию. Для понимания принципа. Вы сами должны заменить 5 на размер обрабатываемого массива, L на величину сдвига и т.д. А я просто отметил, что для смещения элементов массива не обязательно заводить лишний вспомогательный массив размером с величину смещения.
0
happin3ss
0 / 0 / 0
Регистрация: 02.07.2013
Сообщений: 6
07.02.2014, 00:05  [ТС] #7
Все еще нуждаюсь в помощи, товарищи.
0
castorsky
1968 / 1070 / 79
Регистрация: 29.11.2013
Сообщений: 3,312
07.02.2014, 04:27 #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
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <iomanip>
 
using namespace std;
 
class matr {
public:
    matr() : m(5), n(5)
    {
        rows = new int* [n];
        column = new int [m * n];
        unsigned counter = 0;
 
        for (unsigned i = 0; i < n; i++)
            rows[i] = column + i * n;
 
        for (unsigned i = 0; i < n * m; i++)
            column[i] = rand() % (n * m);
    }
 
    void dump ()
    {
        for (unsigned i = 0; i < n; i++)
        {
            for (unsigned j =0; j < m; j++)
                cout << setw(3) << rows[i][j];
            cout << endl;
        }
        cout << endl;
    }
 
    void rotate (int n)
    {
        for (unsigned j = 0; j < m; j++)
            if (this->true_foo(j))
                this->make_shift(j, n);
    }
 
    bool true_foo (unsigned col)
    {
        int min = this->rows [0][col];
        int max = this->rows [0][col];
        int maxstor, minstor;
 
        for (unsigned i = 0; i < n; i++)
        {
            if (min > this->rows[i][col])
            {
                min = this->rows[i][col];
                minstor = i;
            }
 
            if (max < this->rows[i][col])
            {
                max = this->rows[i][col];
                maxstor = i;
            }
        }
 
        return (maxstor - minstor > 2 or maxstor - minstor < -2);
    }
 
    void make_shift (unsigned j, unsigned shift)
    {
        if (shift == n)
            return;
 
        if (shift > n or shift < -n)
            shift %= n;
 
        if (shift < 0)
            shift += n;
 
        int t[n];
 
        for (unsigned i = 0; i < n; i++)
            t[(i + shift) % n] = this->rows[i][j];
        for (unsigned i = 0; i < n; i++)
            this->rows[i][j] = t[i];
    }
 
    ~matr()
    {
        delete [] column;
        delete [] rows;
    }
 
private:
    const unsigned n, m;
    int **rows;
    int *column;
};
 
int main ()
{
    srand(time(0));
 
    matr a;
    a.dump();
    a.rotate(2);
    a.dump();
    return 0;
}
1
happin3ss
0 / 0 / 0
Регистрация: 02.07.2013
Сообщений: 6
08.02.2014, 22:29  [ТС] #9
Выдает ошибку (прикрепил скрин)
И, прошу прощения, для меня в этом варианте программы практически все непонятно
0
Миниатюры
Сдвиг элементов в столбце на две позиции вниз по кругу  
castorsky
1968 / 1070 / 79
Регистрация: 29.11.2013
Сообщений: 3,312
08.02.2014, 23:17 #10
Выдает ошибку (прикрепил скрин)
Исходный код программы корректный. Попробуйте заменить оператор 'or' на классический '||', попробуйте еще взять в скобки математические операции с переменными. Хотя по сути это ни коим образом не должно влиять на компиляцию.
И, прошу прощения, для меня в этом варианте программы практически все непонятно
Создаем узкоспециализированный класс. Его единственной задачей является создать матрицу и циклически сдвинуть столбцы при описанном выше условии (если между первыми минимумом и максимумом столбца больше одного элемента). Класс имеет конструктор по умолчанию -- инициализирует константы, выделяет память под элементы матрицы, и заполняет ее случайными числами, и деструктор -- освобождает выделенную память. Есть методы:
-- dump, распечатать имеющуюся матрицу на стандартный вывод;
-- rotate, собственно основная задача программы. Проверрить надо ли сдвигать столбец, и если да, то сдвинуть.
-- true_func, проверяет подпадает ли столбец матрицы под условие для циклического сдвига
-- make_shift, собственно осуществление сдвига столбцов матрицы.
0
08.02.2014, 23:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2014, 23:17
Привет! Вот еще темы с ответами:

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

Квадратный массив N×N по диагонали влево вниз (циклический сдвиг) - C++
Эта программа выполняет циклический сдвиг по диагонали влево вверх, а надо по диагонали влево вниз. Код: #include&lt;iostream.h&gt; ...

Осуществите циклический сдвиг компонент заданного вектора A(N) вправо на две позиции - Turbo Pascal
Осуществите циклический сдвиг компонент заданного вектора A(N) вправо на две позиции, то есть получите вектор A = (aN-1 , aN , a1 , a2 ,...

Осуществить циклический сдвиг компонент заданного вектора вправо на две позиции - C#
Осуществить циклический сдвиг компонент заданного вектора A(N) вправо на две позиции, то есть получить вектор A = (aN -1 , aN , a1 , a2 ,...


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

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

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