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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 69, средняя оценка - 4.68
b1ood
0 / 0 / 0
Регистрация: 26.03.2011
Сообщений: 3
#1

Переворот массива относительно главной диагонали (транспонирование) - C++

28.09.2011, 10:27. Просмотров 9604. Ответов 83
Метки нет (Все метки)

1) Нужно написать программу которая будет выводить массив

int m[M][N]={...};

Вывести массив на экран и затем переворот массива относительно главной диагонали (транспонирование).

2) Все тоже самое как в первом только значения N и М вводятся с клавиатуры.
3) Все тоже самое как в первом только теперь создать функцию
Void displayMatrix (int**m, int N, int M);

Пожалуйста помогите, в долгу не останусь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2011, 10:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Переворот массива относительно главной диагонали (транспонирование) (C++):

Отражение двумерного массива относительно главной диагонали - C++
Помогите пожалуйста, надо отразить заданный двумерный массив относительно главной диагонали.

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

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

Проверка на симметричность относительно главной диагонали - C++
Дан массив целых чисел размера n x n, элементами которого являются 0 и 1. Проверить, является ли массив симметричным относительно главной...

Функции: поменять элементы относительно главной диагонали - C++
Дан двухмерный массив, зделать в виде функции , и поменять элементы относительно главной диагонали. #include <iostream.h> const int...

Является ли матрица симетричной относительно главной диагонали? - C++
Мне надо сделать проверку являеться ли мой массив симетричный относительно главной диагонали.. но я незнаю как задать условие. ведь с моим...

83
-=ЮрА=-
Заблокирован
Автор FAQ
28.09.2011, 11:05 #2
b1ood, компилятор?(билдер, студия и т.д.)Язык Си или С++?

Добавлено через 10 минут
Вот на Си 1-й пункт
Добавлено через 11 минут
Упс не тот код вначале выложил (верней топики спутал) - теперь всё ок!
Код Си 1-й пункт
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
int main()
{
    unsigned long i,j,m;
    double ** arr,buf;
    do
    {
        srand(time(NULL));
        printf("Enter dimension of array : ");scanf("%u",&m);
 
        arr = new double *[m];
        for(i = 0; i < m; i++)
        {
            arr[i] = new double[m];
            for(j = 0; j < m; j++)
            {
                //Чтобы числа в массиве были не очень большими 
                //генерируем их в диапазоне 0 - 100
                printf("%.f ",(arr[i][j] = rand()%100));
            }
            printf("\r\n");
        }
        printf("\tTransponed array\r\n");
        //Транспонирование
        for(i = 0; i < m; i++)
        {
            for(j = 0; j < m; j++)
            {
                if(i < m/2)
                {
                    buf = arr[i][j];
                    arr[i][j] = arr[j][i];
                    arr[j][i] = buf;
                }
                printf("%.f ",arr[i][j]);
            }
            printf("\r\n");
        }
 
        printf("Y - new input\r\n");
    }
    while(toupper(getch()) == 'Y');
    return 0;
}

Enter dimension of array : 5
95 90 69 92 68
Продолжение вывода
89 26 20 21 59
80 41 13 37 42
18 83 40 78 30
52 4 20 15 0
Transponed array
95 89 80 18 52
89 26 41 83 4
69 20 13 37 42
92 21 40 78 30
68 59 20 15 0
Y - new input


Добавлено через 7 минут
Цитата Сообщение от b1ood Посмотреть сообщение
Все тоже самое как в первом только значения N и М вводятся с клавиатуры.
М == N иначе матрицу нельзя транспонировать!Мой 1-й пост объяединяет в себе 1-е и 2-е задание (вводим М - сгенерированными случайными числами заполняется массив МхМ), затем транспонируется...
Сейчас будет 3-й пункт

Добавлено через 4 минуты
Вот так выглядит 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
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
#include <stdio.h>//i/o
#include <stdlib.h> //srand
#include <conio.h> //getch()
#include <ctype.h> //toupper
#include <time.h>  //time()
 
void Transpon(int m, double **arr)
{
    double buf;
    for(int i = 0,j; i < m; i++)
    {
        for(j = 0; j < m; j++)
        {
            if(i < m/2)
            {
                buf = arr[i][j];
                arr[i][j] = arr[j][i];
                arr[j][i] = buf;
            }
        }
    }
}
 
int main()
{
    unsigned long i,j,m;
    double ** arr;
    do
    {
        srand(time(NULL));
        printf("Enter dimension of array : ");scanf("%u",&m);
 
        arr = new double *[m];
        for(i = 0; i < m; i++)
        {
            arr[i] = new double[m];
            for(j = 0; j < m; j++)
            {
                //Чтобы числа в массиве были не очень большими 
                //генерируем их в диапазоне 0 - 100
                printf("%.f ",(arr[i][j] = rand()%100));
            }
            printf("\r\n");
        }
        printf("\tTransponed array\r\n");
        //Транспонирование
        Transpon(m, arr);
        //Выводим массив на экран
        for(i = 0; i < m; i++,printf("\r\n"))
        for(j = 0; j < m; j++)
            printf("%.f ",(arr[i][j] = rand()%100));
        printf("Y - new input\r\n");
    }
    while(toupper(getch()) == 'Y');
    return 0;
}
1
bigredcat
366 / 313 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
28.09.2011, 11:06 #3
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
М == N иначе матрицу нельзя транспонировать
Т.е. вы разрешаете транспонировать только квадратные матрицы, а не квадратные запрещаете?
0
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
28.09.2011, 11:15 #4
-=ЮрА=-,
C
1
arr[i] = new double[m];
Язык точно си?

Добавлено через 2 минуты
C
1
for(int i = 0,j; i < m; i++)
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
28.09.2011, 11:16 #5
И очистка ресурсов не помешает.
0
Thinker
Эксперт С++
4226 / 2200 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
28.09.2011, 11:23 #6
Цитата Сообщение от bigredcat Посмотреть сообщение
Т.е. вы разрешаете транспонировать только квадратные матрицы, а не квадратные запрещаете?
Операция транспонирования определена для любых матриц.
0
-=ЮрА=-
Заблокирован
Автор FAQ
28.09.2011, 11:34 #7
Цитата Сообщение от nxnx Посмотреть сообщение
Язык точно си?
- ах да пербивал с другого топика там на плючах нужно было
C
1
2
3
4
5
6
7
8
9
10
11
12
arr = (double **)malloc(m*sizeof(float *));
        for(i = 0; i < m; i++)
        {
            arr[i] = (double *)malloc(n*sizeof(float));
            for(j = 0; j < n; j++)
            {
                //Чтобы числа в массиве были не очень большими 
                //генерируем их в диапазоне 0 - 100
                printf("%f ",(arr[i][j] = rand()%100));
            }
            printf("\r\n");
        }
Цитата Сообщение от Deviaphan Посмотреть сообщение
И очистка ресурсов не помешает.
На мой взгляд double **arr имеет константный по отношению к циклу адрес, т.е (double **)malloc всё время в одном месте кучи работать будет, так что очищать думаю целесообразно лишь перед выходом из маин и то можно этого не делать ОС тоже может порабоать за нас
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
28.09.2011, 11:36 #8
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
На мой взгляд double **arr имеет константный по отношению к циклу адрес
Ты точно malloc и realloc не путаешь?
0
-=ЮрА=-
Заблокирован
Автор FAQ
28.09.2011, 11:37 #9
Цитата Сообщение от Thinker Посмотреть сообщение
Т.е. вы разрешаете транспонировать только квадратные матрицы, а не квадратные запрещаете?
Операция транспонирования определена для любых матриц.
- да неужто где вы в прямоугольной матрице видели гдавную диагональ???Можно поменять строки со столбцами местами но это не поворот относительно гл диагонали (я именно это под транспонированием подразумеваю). Болле того смена столбцов со строками прямоугольной матрицы в математике лишена какой-либо логики, не мне вам об этом рассказывать...
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
28.09.2011, 11:37 #10
Там же потенциально бесконечный цикл в первом варианте.
0
-=ЮрА=-
Заблокирован
Автор FAQ
28.09.2011, 11:41 #11
Цитата Сообщение от Deviaphan Посмотреть сообщение
Ты точно malloc и realloc не путаешь?
- сейчас прогоню (я как раз о новом выделении памяти пишу не изменении существующего блока)

Добавлено через 2 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
сейчас прогоню (я как раз о новом выделении памяти пишу не изменении существующего блока)
- вот в подтверждение
Enter dimension of array
Num of Rows : 3
Num of Colums : 2
pointer to arr : 0xCDCDCDCD
9.000000 10.000000
50.000000 71.000000
39.000000 78.000000
Summ max elements in colums : 128.000000
Y - new input
Enter dimension of array
Num of Rows : 4
Num of Colums : 6
pointer to arr : 0xCDCDCDCD
22.000000 36.000000 71.000000 21.000000 30.000000 85.000000
91.000000 66.000000 41.000000 59.000000 36.000000 19.000000
62.000000 54.000000 9.000000 30.000000 43.000000 24.000000
19.000000 70.000000 25.000000 53.000000 62.000000 40.000000
Summ max elements in colums : 438.000000
Y - new input

Код на Си
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
int main()
{
    unsigned long i,j,m,n;
    float ** arr, sum;
    do
    {
        srand(time(NULL));
        printf("Enter dimension of array\r\n");
        printf("Num of Rows    : ");scanf("%u",&m);
        printf("Num of Colums : ");scanf("%u",&n);
 
        sum = 0;//ГЋГЎГ*óëÿåì ñóììó Г¬Г*ГЄГ± ýëåìåГ*òîâ
        arr = (float **)malloc(m*sizeof(float *));
        printf("pointer to arr : 0x%p\r\n",&arr[0][0]);
        for(i = 0; i < m; i++)
        {
            arr[i] = (float *)malloc(n*sizeof(float));
            for(j = 0; j < n; j++)
            {
                //×òîáû Г·ГЁГ±Г«Г* Гў Г¬Г*Г±Г±ГЁГўГҐ áûëè Г*ГҐ î÷åГ*Гј áîëüøèìè 
                //ГЈГҐГ*åðèðóåì ГЁГµ Гў äèГ*ГЇГ*çîГ*ГҐ 0 - 100
                printf("%f ",(arr[i][j] = rand()%100));
            }
            printf("\r\n");
        }
        for(j = 0; j < n; j++)
            sum += MaxColVal(m, j, arr);
        printf("Summ max elements in colums : %f\r\n",sum);
        printf("Y - new input\r\n");
    }
    while(toupper(getch()) == 'Y');
    return 0;
}
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
28.09.2011, 11:53 #12
Я просто в шоке! Во первых, что такой красивый адрес (0xCDCDCDCD), больше похожий на отладочный DEADBEEF и что malloc выделяет память по одному и тому же адресу.
Т.е., если бы хотелось хранить "историю", то код вида:
C++
1
2
3
4
5
6
float ** arrх[XXX];
...
arr[xxx] = (float **)malloc(m*sizeof(float *));
...
// А теперь после цикла заглянем в "историю"
arr[2] ...;
Был бы ошибочным.

Добавлено через 1 минуту
Кстати
0xCDCDCDCD is a debugging value that comes from the bowels of the C runtime library. When you allocate a block of memory in a debug build, it's initialized to this spurious value in the hope of catching bugs. 0xCDCDCDCD is non-NULL and is never a valid memory pointer.
Добавлено через 2 минуты

Не по теме:

Перепутал 0xDEADBEEF и 0xBAADF00D.



Добавлено через 2 минуты
А вообще класс!
C++
1
2
                arr = (float **)malloc(m*sizeof(float *));
                printf("pointer to arr : 0x%p\r\n",&arr[0][0]);
Адресс arr не равен адресу arr[0][0], это же не статический массив.)
0
-=ЮрА=-
Заблокирован
Автор FAQ
28.09.2011, 11:56 #13
Deviaphan, хорошо твоё видение динамического выделения памяти...
0
Deviaphan
28.09.2011, 12:02
  #14

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
хорошо твоё видение динамического выделения памяти...
Не-не-не, ты меня и по MFC, а теперь и просто в С уделал. Мне тебя учить нечему. Пойду повешусь пару раз, что ли...

0
bigredcat
366 / 313 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
28.09.2011, 12:03 #15
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- да неужто где вы в прямоугольной матрице видели гдавную диагональ???Можно поменять строки со столбцами местами но это не поворот относительно гл диагонали (я именно это под транспонированием подразумеваю). Болле того смена столбцов со строками прямоугольной матрицы в математике лишена какой-либо логики, не мне вам об этом рассказывать...
В данном случае вы в основном не правы.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.09.2011, 12:03
Привет! Вот еще темы с ответами:

Зеркально отразить матрицу относительно главной диагонали. - C++
Задана матрица A(n,n). Зеркально отразить ее относительно главной диагонали. В преобразованной матрице найти строки, элементы которой ...

Отобразить матрицу симметрично относительно главной диагонали - C++
По условию необходимо заполнить матрицу случайными числами. Отобразить матрицу симметрично относительно главной диагонали.....я знаю как её...

Определить является ли матрица симметричной относительно главной диагонали - C++
29. Дана матрица А(6,6).Определить является ли она симметричной относительно главной диагонали. Если да, то все элементы этой диагонали...

Является ли двумерный массив симметричным относительно главной диагонали - C++
Проверьте, является ли двумерный массив симметричным относительно главной диагонали. Главная диагональ — та, которая идёт из левого...


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

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

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