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

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

Войти
Регистрация
Восстановить пароль
 
so1o
33 / 33 / 2
Регистрация: 16.11.2009
Сообщений: 199
#1

Поменять элементы матрицы в направлении против часовой стрелки - C++

16.11.2009, 20:40. Просмотров 818. Ответов 7
Метки нет (Все метки)

всем здраствуйте, мне надо составить программу чтобы меняла элементы матрицы в направлении против часовой стрелки, а центр остается неизменным, матрица 3 порядка, я сделал программу только в упрощенном ввиде , только по теме надо использовать массивы, помогите чуть чуть, а попытаюсь сам сообразить
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 <conio.h>
#include <stdio.h>
int main(void)
{
 int a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8;
 int x;
 clrscr();
 printf("x=");
 scanf("%d",&x);
 clrscr();
 printf("before\na11 a12 a13\na21 a22 a23\na31 a32 a33");
 if(x%h==0)
 {printf("\nnow\na11 a12 a13\na21 a22 a23\na31 a32 a33");}
 else if(x%g==0)
 {printf("\nnow\na21 a11 a12\na31 a22 a13\na32 a33 a23");}
 else if(x%f==0)
 {printf("\nnow\na31 a21 a11\na32 a22 a12\na33 a23 a13");}
 else if(x%e==0)
 {printf("\nnow\na32 a31 a21\na33 a22 a11\na23 a13 a12");}
 else if(x%d==0)
 {printf("\nnow\na33 a32 a31\na23 a22 a21\na13 a12 a11");}
 else if(x%c==0)
 {printf("\nnow\na23 a33 a32\na13 a22 a31\na12 a11 a21");}
 else if(x%b==0)
 {printf("\nnow\na13 a23 a33\na12 a22 a32\na11 a21 a31");}
 else if(x%a==0)
 {printf("\nnow\na12 a13 a23\na11 a22 a33\na21 a31 a32");}
 getch();
 return 0;
 }
только за эту кодировку, препод поставит мне кол... так что помогите плзз.!!
заранее благодарен
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2009, 20:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поменять элементы матрицы в направлении против часовой стрелки (C++):

Как повернуть элементы матрицы на 90 градусов против часовой стрелки? - C++
ЗАДАНИЕ: Дана матрица. Повернуть все её элементы вокруг центра на 90 градусов против часовой стрелки. #include &lt;iostream&gt; #include...

Необходимо повернуть все элементы матрицы, кроме диагональных, против часовой стрелки на 90 градусов - C++
Здравствуйте! Необходимо повернуть все элементы матрицы, кроме диагональных, против часовой стрелки на 90 градусов. Например: Было: ...

Поворот матрицы против часовой стрелки - C++
Здравствуйте! Я собрал программу для решения этой задачи, но программа всё равно не работает. // Программа_№5.cpp: определяет точку...

Заполнение матрицы против часовой стрелки - C++
Заполнить матрицу 9х9 числами, начиная с единицы: вниз - вправо - вверх - влево. Помогите, пожалуйста. Срочно надо...

Записать текст матрицы от ее центра по спирали против часовой стрелки - C++
Задача записать текст квадратной матрицы размера n(n-нечетное) от центра матрицы по спирали против часовой стрелки. Например матрица n i...

Повернуть матрицу против часовой стрелки - C++
Повернуть матрицу против часовой стрелки. Я написал программу, но она не запускается. Где-то я опять ошибся. :-( // Программа_№5.cpp:...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
16.11.2009, 21:01 #2
нет не правильно все .
C++
1
2
3
4
5
6
7
int m[4][4];
for(i=0;i<4;i++)
for(j=0;j<4;j++)
cin>>m[i][j];
for(i=0;i<4;i++)
for(j=0;j<4;j++)
cout<<m[i][j];
0
so1o
33 / 33 / 2
Регистрация: 16.11.2009
Сообщений: 199
16.11.2009, 21:17  [ТС] #3
можете пжлста уточнить что вы сделали?
дело в том что надо вводить число, и при этом элементы матрицы сдвигается против час стрелки, на столько же единиц сколько и ввели, т.е. например:
a11 a12 a13
a21 a22 a23
a31 a32 a33
например ввели единицу
ответ должен быть
a12 a13 a23
a11 a22 a33
a21 a31 a32
ваша программа так работает ?!
0
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
17.11.2009, 08:18 #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
#include <conio.h>
#include <stdio.h>
int main()
{
    int mas[3][3]={11,12,13,21,22,23,31,32,33};
 int x, temp, i, j;
 printf("Itog: \n");
 for(i=0; i<3; i++)
 {
     for(j=0; j<3; j++)
         printf("%d  ", mas[i][j]);
     printf("\n");
 }
 //clrscr();
 printf("x=");
 scanf("%d",&x);
 //clrscr();
while(x>7)
x-=8;
for(i=0; i<x; i++)
{
    temp=mas[0][0];
    for(j=0; j<2; j++)
        mas[0][j]=mas[0][j+1];
    for(j=0; j<2; j++)
        mas[j][2]=mas[j+1][2];
    for(j=0; j<2; j++)
        mas[2][2-j]=mas[2][1-j];
        mas[2][0]=mas[1][0];
        mas[1][0]=temp;
}
 printf("Itog: \n");
 for(i=0; i<3; i++)
 {
     for(j=0; j<3; j++)
         printf("%d  ", mas[i][j]);
     printf("\n");
 }
 
 getch();
 return 0;
 }
1
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
17.11.2009, 14:16 #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
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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
 
int main()
{
 
    printf("Enter size matrix: ");
    int n, cnt=0, temp, next_temp, next_i=0, next_j=0, sign_i=1, sign_j=0;
    int cycle=0;
    scanf("%d", &n);
 
    int**   matrix = (int**) malloc(n*sizeof(int));
    for (int i=0; i<n; i++)
    {
        matrix[i] = (int*)malloc(n*sizeof(int));
        for (int j=0; j<n; j++)
            matrix[i][j] = ++cnt;       
    }
    printf("\nMatrix before overturn:");
    for (int i=0; i<n; i++)
    {
        printf("\n");
        for (int j=0; j<n; j++)
            printf(" %3i",matrix[i][j]);        
    }
 
    // сдвигаем
    for (cycle=0; cycle<n/2; cycle++)
    {
        next_i=cycle; next_j=cycle;
        next_temp=matrix[next_i][next_j];
        for (int i=0; i<4*(n-1-2*cycle); i++)
        {       
            temp=next_temp;
            next_i-=sign_i; next_j-=sign_j;
            if(next_i<cycle)        {   next_i=cycle;   sign_i=0; sign_j=-1;    ++next_j;   /*printf("1 ");*/}
            if(next_j>=n-cycle) {   next_j=n-1-cycle; sign_i=-1; sign_j=0; ++next_i;/*printf("2 ");*/}
            if(next_i>=n-cycle) {   next_i=n-1-cycle; sign_i=0; sign_j=1; --next_j; /*printf("3 ");*/}
            if(next_j<cycle)        {   next_j=cycle;   sign_i=1; sign_j=0; --next_i; /*printf("4 ");*/}
            next_temp=matrix[next_i][next_j];
            matrix[next_i][next_j]=temp;
            //printf("(%i,%i): %i\n",next_i,next_j, matrix[next_i][next_j]);        
        }
    }   
 
    printf("\nMatrix after overturn:");
    for (int i=0; i<n; i++)
    {
        printf("\n");
        for (int j=0; j<n; j++)
            printf(" %3i",matrix[i][j]);        
    }
 
    getch();
    return 0;
}
1
so1o
33 / 33 / 2
Регистрация: 16.11.2009
Сообщений: 199
18.11.2009, 03:07  [ТС] #6
Цитата Сообщение от valeriikozlov Посмотреть сообщение
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
#include <conio.h>
#include <stdio.h>
int main()
{
    int mas[3][3]={11,12,13,21,22,23,31,32,33};
 int x, temp, i, j;
 printf("Itog: \n");
 for(i=0; i<3; i++)
 {
     for(j=0; j<3; j++)
         printf("%d  ", mas[i][j]);
     printf("\n");
 }
 //clrscr();
 printf("x=");
 scanf("%d",&x);
 //clrscr();
while(x>7)
x-=8;
for(i=0; i<x; i++)
{
    temp=mas[0][0];
    for(j=0; j<2; j++)
        mas[0][j]=mas[0][j+1];
    for(j=0; j<2; j++)
        mas[j][2]=mas[j+1][2];
    for(j=0; j<2; j++)
        mas[2][2-j]=mas[2][1-j];
        mas[2][0]=mas[1][0];
        mas[1][0]=temp;
}
 printf("Itog: \n");
 for(i=0; i<3; i++)
 {
     for(j=0; j<3; j++)
         printf("%d  ", mas[i][j]);
     printf("\n");
 }
 
 getch();
 return 0;
 }
пожалуйста если не сложно, могли бы вы объяснить все что находится после "while"
спасибо!
0
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
18.11.2009, 06:34 #7
C
1
2
while(x>7)
x-=8;
В этих строках мы уменьшаем количество обменов (учитывая что полный оборот равен 8). Например если сделать девять обменов или один, то результат будет один и тот же. Поэтому вычитаем из x количество обменов равных полному кругу.

В строках ниже сам обмен:
C
1
2
3
4
5
6
7
8
9
10
11
12
for(i=0; i<x; i++)// цикл повторяем x раз
{
        temp=mas[0][0];// переменной temp присваиваем значение элемента массива [0][0]
        for(j=0; j<2; j++)                     // В этой строке и строке ниже присваиваем [0][0] значение 
                mas[0][j]=mas[0][j+1];     // [0][1], а [0][1] присваиваем [0][2]
        for(j=0; j<2; j++)                     //В этой строке и строке ниже присваиваем [0][2] значение 
                mas[j][2]=mas[j+1][2];    // [1][2], а [1][2] присваиваем значение [2][2]
        for(j=0; j<2; j++)                    // В этой строке и строке ниже присваиваем [2][2] значение
                mas[2][2-j]=mas[2][1-j]; // [2][1], а [2][1] присваиваем значение [2][0]
                mas[2][0]=mas[1][0];     // В этой строке [2][0] присваиваем значение [1][0]
                mas[1][0]=temp;           // [1][0] присваиваем значение temp
}
Начиная со строки 32 вывод на экран полученного массива. Думаю затруднений там не возникнет.
1
so1o
33 / 33 / 2
Регистрация: 16.11.2009
Сообщений: 199
18.11.2009, 15:13  [ТС] #8
Цитата Сообщение от valeriikozlov Посмотреть сообщение
C
1
2
while(x>7)
x-=8;
В этих строках мы уменьшаем количество обменов (учитывая что полный оборот равен 8). Например если сделать девять обменов или один, то результат будет один и тот же. Поэтому вычитаем из x количество обменов равных полному кругу.

В строках ниже сам обмен:
C
1
2
3
4
5
6
7
8
9
10
11
12
for(i=0; i<x; i++)// цикл повторяем x раз
{
        temp=mas[0][0];// переменной temp присваиваем значение элемента массива [0][0]
        for(j=0; j<2; j++)                     // В этой строке и строке ниже присваиваем [0][0] значение 
                mas[0][j]=mas[0][j+1];     // [0][1], а [0][1] присваиваем [0][2]
        for(j=0; j<2; j++)                     //В этой строке и строке ниже присваиваем [0][2] значение 
                mas[j][2]=mas[j+1][2];    // [1][2], а [1][2] присваиваем значение [2][2]
        for(j=0; j<2; j++)                    // В этой строке и строке ниже присваиваем [2][2] значение
                mas[2][2-j]=mas[2][1-j]; // [2][1], а [2][1] присваиваем значение [2][0]
                mas[2][0]=mas[1][0];     // В этой строке [2][0] присваиваем значение [1][0]
                mas[1][0]=temp;           // [1][0] присваиваем значение temp
}
Начиная со строки 32 вывод на экран полученного массива. Думаю затруднений там не возникнет.
аа все понятно, только вот один вопрос,
разве но этому коду мы матрицу не заставляем ли двигаться по часовой стрелки?? или я совсем туп?...

Добавлено через 1 минуту
аа все я разобрался, спасибо вам большое!!!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.11.2009, 15:13
Привет! Вот еще темы с ответами:

Заполнить матрицу с середины против часовой стрелки - C++
Нужно заполнить квадратную матрицу(то есть размер nXn) нужно заполнить по спирали, начиная с центра и продолжая идти против часовой...

Повернуть массив на 90˚ против часовой стрелки - C++
Здравствуйте. Помогите пожалуйста решить задание по c++. Нужно повернуть массив на 90˚ против часовой стрелки.

Проблема с выводом массива спиралью против часовой стрелки - C++
Здравствуйте, недавно была задача, создать массив 10х10 рандомных чисел и вывести спиралью против часовой стрелки. В паскале задачу я...

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.11.2009, 15:13
Ответ Создать тему
Опции темы

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