Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2022, 21:45   #1
slava_q9
Пользователь
 
Регистрация: 03.03.2022
Сообщений: 14
Восклицание Строку с номером k сделать столбцом с номером k и столбец с номером k сделать строкой с номером k

В матрице n*n элементов нужно транспонировать строку с номером k сделать столбцом с номером k и столбец с номером k сделать строкой с номером k (k- константа).

Ниже представлен алгоритм составления матрицы:

Код:
        X=new int*[n];
        Y=new int*[n];
        for(int i = 0 ; i < n; i++){
                X[i] = new int[n];
                Y[i] = new int[n];
            }
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
               X[i][j]=0;
            }
        }

        for (int i=0; i<n; i++)
        {X[i][i]=n;}

        for (int i=0; i<n-1; i++)
        {X[i+1][i]=n-1;}
slava_q9 вне форума Ответить с цитированием
Старый 25.11.2022, 02:28   #2
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

slava_q9, в этом конкретном случае, когда на главной диагонали n, под главной диагональю n - 1, а остальные элементы -- нули, можно так:
Код:
if (k - 1 >= 0) {
  X[k][k - 1] = 0;
  X[k - 1][k] = n - 1;
}
if (k + 1 < n) {
  X[k][k + 1] = n - 1;
  X[k + 1][k] = 0;
}
В общем случае, когда про содержимое матрицы ничего не известно, можно так:
Код:
for (int i = 0; i < n; i++) {
  swap(X[k][i], X[i][k]); // будет один лишний swap, когда i = k
}
Чтобы использовать стандартную функцию std::swap, надо в начале программы написать «#include <algorithm>» (в старых компиляторах) или «#include <utility>» (в новых компиляторах), и потом написать «using namespace std;».
Пётр Седов вне форума Ответить с цитированием
Старый 27.11.2022, 12:11   #3
slava_q9
Пользователь
 
Регистрация: 03.03.2022
Сообщений: 14
По умолчанию

Пётр Седов, выше представленный алгоритм не сработал(
slava_q9 вне форума Ответить с цитированием
Старый 27.11.2022, 12:40   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от Пётр Седов Посмотреть сообщение
и потом написать «using namespace std;».
И никогда не появляться на собеседованиях
p51x вне форума Ответить с цитированием
Старый 27.11.2022, 18:14   #5
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

slava_q9, какой вариант кода не работает -- первый (два if-а) или второй (цикл for)? И для каких значений n и k?

p51x, «using namespace std;» не надо писать в заголовочных файлах (за пределами функций), а вот в cpp файлах вполне можно. Разрешать ли такое -- решает главный программист на каждом конкретном проекте.
Пётр Седов вне форума Ответить с цитированием
Старый 27.11.2022, 18:45   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от Пётр Седов Посмотреть сообщение
а вот в cpp файлах вполне можно
И в них не надо. И там, и там оно делает одно и тоже.

Цитата:
Сообщение от Пётр Седов Посмотреть сообщение
Разрешать ли такое -- решает главный программист на каждом конкретном проекте.
Если он идиот и хочет проблем, то может и решает. В остальных случаях ответ однозначен.
p51x вне форума Ответить с цитированием
Старый 27.11.2022, 19:15   #7
slava_q9
Пользователь
 
Регистрация: 03.03.2022
Сообщений: 14
По умолчанию

Пётр Седов, в qt swap не сработал
а второй вариант кода представлен на картинке
Изображения
Тип файла: jpg 1.jpg (33.7 Кб, 4 просмотров)
slava_q9 вне форума Ответить с цитированием
Старый 30.11.2022, 03:39   #8
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

slava_q9, так у вас там две матрицы, X и Y. Тогда первый вариант:
Код:
int** X = new int*[n];
int** Y = new int*[n];
for (int i = 0; i < n; i++) {
  X[i] = new int[n];
  Y[i] = new int[n];
}
for (int i = 0; i < n; i++) {
  for (int j = 0; j < n; j++) {
    X[i][j] = 0;
  }
}
// на главной диагонали n
for (int i = 0; i < n; i++) {
  X[i][i] = n;
}
// под главной диагональю n - 1
for (int i = 0; i < n - 1; i++) {
  X[i + 1][i] = n - 1;
}

// копируем матрицу (Y <- X)
for (int i = 0; i < n; i++) {
  for (int j = 0; j < n; j++) {
    Y[i][j] = X[i][j];
  }
}

const int k = 3;
if (k - 1 >= 0) {
  Y[k][k - 1] = 0;
  Y[k - 1][k] = n - 1;
}
if (k + 1 < n) {
  Y[k][k + 1] = n - 1;
  Y[k + 1][k] = 0;
}

pushTable(ui->tableWidget_2, Y, n);
И второй вариант:
Код:
int** X = new int*[n];
int** Y = new int*[n];
for (int i = 0; i < n; i++) {
  X[i] = new int[n];
  Y[i] = new int[n];
}
for (int i = 0; i < n; i++) {
  for (int j = 0; j < n; j++) {
    X[i][j] = 0;
  }
}
// на главной диагонали n
for (int i = 0; i < n; i++) {
  X[i][i] = n;
}
// под главной диагональю n - 1
for (int i = 0; i < n - 1; i++) {
  X[i + 1][i] = n - 1;
}

// копируем матрицу (Y <- X)
for (int i = 0; i < n; i++) {
  for (int j = 0; j < n; j++) {
    Y[i][j] = X[i][j];
  }
}

const int k = 3;
for (int i = 0; i < n; i++) {
  // обмен Y[k][i] <-> Y[i][k]
  int t = Y[k][i];
  Y[k][i] = Y[i][k];
  Y[i][k] = t;
}

pushTable(ui->tableWidget_2, Y, n);
Цитата:
Сообщение от p51x Посмотреть сообщение
И в них не надо. И там, и там оно делает одно и тоже.
Разница в том, что «using namespace std;» в заголовочном файле (за пределами функций) навязывает этот using всем пользователям этого заголовочного файла, поэтому это считается плохой практикой. А вот «using namespace std;» в cpp файле -- это локальное решение, которое влияет только на этот cpp файл, поэтому это нормально.
Пётр Седов вне форума Ответить с цитированием
Старый 30.11.2022, 09:39   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от Пётр Седов Посмотреть сообщение
это локальное решение, которое влияет только на этот cpp файл, поэтому это нормально.
И это чудесным образом устраняет все проблемы этого using'a... Главное не появляйтесь на собеседованиях.
p51x вне форума Ответить с цитированием
Старый 04.12.2022, 01:25   #10
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
И это чудесным образом устраняет все проблемы этого using'a...
Какие есть серьёзные проблемы с использованием «using namespace std;» в cpp файлах? Можете конкретный пример привести?
Пётр Седов вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вставить в двумерный массив столбец после столбца с номером k VladimirML Помощь студентам 1 01.06.2015 16:52
Вывести все номера строк квадратной матрицы (int), которые поэлементно совпадают со столбцом с таким же номером dimefield Помощь студентам 8 16.04.2015 18:34
поменять местами столбец с максимальным элементом на главной диагонали со столбцом с заданным номером m. Visual C++ hunter08923 Помощь студентам 0 22.06.2011 00:14
Отсортировать столбец с номером n_sort целочисленной матрицы М(4,4) по возрастанию элементов с исполльзов yulia_93 Паскаль, Turbo Pascal, PascalABC.NET 0 15.05.2011 16:51
дана матрица порядка m на n. Вставить в данную матрицу столбец с номером K Aktor1992 Паскаль, Turbo Pascal, PascalABC.NET 1 13.04.2011 12:24