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

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

Восстановить пароль Регистрация
 
happin3ss
0 / 0 / 0
Регистрация: 02.07.2013
Сообщений: 6
04.02.2014, 17:23     Сдвиг элементов в столбце на две позиции вниз по кругу #1
Добрый день уважаемые программисты.
Начал изучать С++ очень и очень недавно. И вот возникла такая проблема. Написал программу, которая сдвигает элементы в каждом столбце матрицы на две позиции вниз по кругу, если количество элементов расположенных между первыми минимумом или максимумом в этих столбцах больше 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;
}
Надеюсь, вы сможете помочь мне с кодом.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2014, 17:23     Сдвиг элементов в столбце на две позиции вниз по кругу
Посмотрите здесь:

C++ Циклический сдвиг элементов массива по диагонали влево вниз
C++ двузначное число разделить на две позиции в массиве
C++ Осуществить циклический сдвиг элементов в мат-це на k элементов вправо или вниз (в зависимости от введенного режима). Число k может быть больше кол-ва
C++ Квадратный массив N×N по диагонали влево вниз (циклический сдвиг)
C++ Поменять знак элементов столбца матрицы.Вывести на экран сумму отрицательных элементов в столбце.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mf909
96 / 12 / 3
Регистрация: 10.01.2014
Сообщений: 29
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] << ' ';
    }
    
}
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
mf909
96 / 12 / 3
Регистрация: 10.01.2014
Сообщений: 29
04.02.2014, 18:58     Сдвиг элементов в столбце на две позиции вниз по кругу #4
Цитата Сообщение от happin3ss Посмотреть сообщение
Вот тут я не очень понял, что здесь делается, в плане, почему 5
Это размер массива. Мы берем остаток от деления на размер массива.
Цитата Сообщение от happin3ss Посмотреть сообщение
Здесь видимо происходит заполнение ячеек матрицы
Совершенно верно. Попробуйте проделать это деление по модулю на листе бумаги и посмотрите на остатки от деления.
Цитата Сообщение от happin3ss Посмотреть сообщение
Cout'ом никогда не пользовался, как я понимаю это функция вывода?
Да, в C++. Подключается с помощью
#include <iostream>
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?
mf909
96 / 12 / 3
Регистрация: 10.01.2014
Сообщений: 29
04.02.2014, 19:43     Сдвиг элементов в столбце на две позиции вниз по кругу #6
Нет, свой код я привел просто как иллюстрацию. Для понимания принципа. Вы сами должны заменить 5 на размер обрабатываемого массива, L на величину сдвига и т.д. А я просто отметил, что для смещения элементов массива не обязательно заводить лишний вспомогательный массив размером с величину смещения.
happin3ss
0 / 0 / 0
Регистрация: 02.07.2013
Сообщений: 6
07.02.2014, 00:05  [ТС]     Сдвиг элементов в столбце на две позиции вниз по кругу #7
Все еще нуждаюсь в помощи, товарищи.
castorsky
 Аватар для castorsky
1948 / 1038 / 78
Регистрация: 29.11.2013
Сообщений: 3,262
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;
}
happin3ss
0 / 0 / 0
Регистрация: 02.07.2013
Сообщений: 6
08.02.2014, 22:29  [ТС]     Сдвиг элементов в столбце на две позиции вниз по кругу #9
Выдает ошибку (прикрепил скрин)
И, прошу прощения, для меня в этом варианте программы практически все непонятно
Миниатюры
Сдвиг элементов в столбце на две позиции вниз по кругу  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2014, 23:17     Сдвиг элементов в столбце на две позиции вниз по кругу
Еще ссылки по теме:

C++ Дано одномерный массив Х, размером 15 элементов. Провести циклический сдвиг элементов в массиве вправо на 2 позиции
Элементы линейного массива сдвинуть циклически на две позиции влево C++
Сдвиг стоки вниз и Удаление столбцов Матрицы C++

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

Или воспользуйтесь поиском по форуму:
castorsky
 Аватар для castorsky
1948 / 1038 / 78
Регистрация: 29.11.2013
Сообщений: 3,262
08.02.2014, 23:17     Сдвиг элементов в столбце на две позиции вниз по кругу #10
Выдает ошибку (прикрепил скрин)
Исходный код программы корректный. Попробуйте заменить оператор 'or' на классический '||', попробуйте еще взять в скобки математические операции с переменными. Хотя по сути это ни коим образом не должно влиять на компиляцию.
И, прошу прощения, для меня в этом варианте программы практически все непонятно
Создаем узкоспециализированный класс. Его единственной задачей является создать матрицу и циклически сдвинуть столбцы при описанном выше условии (если между первыми минимумом и максимумом столбца больше одного элемента). Класс имеет конструктор по умолчанию -- инициализирует константы, выделяет память под элементы матрицы, и заполняет ее случайными числами, и деструктор -- освобождает выделенную память. Есть методы:
-- dump, распечатать имеющуюся матрицу на стандартный вывод;
-- rotate, собственно основная задача программы. Проверрить надо ли сдвигать столбец, и если да, то сдвинуть.
-- true_func, проверяет подпадает ли столбец матрицы под условие для циклического сдвига
-- make_shift, собственно осуществление сдвига столбцов матрицы.
Yandex
Объявления
08.02.2014, 23:17     Сдвиг элементов в столбце на две позиции вниз по кругу
Ответ Создать тему
Опции темы

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