Как поменять местами в матрице строку и столбец номера которых К, M - C (СИ)
Формулировка задачи:
Как поменять местами в матрице строку и столбец номера которых К, M
матрица квадратная
Решение задачи: «Как поменять местами в матрице строку и столбец номера которых К, M»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
int main()
{
unsigned N, i, k;
int *p, *q, *r, temp = 1;
puts("Enter matrix size > 1:");
while(1 != scanf("%u", &N) || N < 2){
fprintf(stderr, "Incorrect data entry!Try again.\n");
getchar();
}
p = malloc(N * N * sizeof*p);
if(!p){
fprintf(stderr, "Error allocate memory!");
exit(1);
}
for(i = 0, q = p; i < N * N; i++){
if(i && i % N == 0)
putchar('\n');
printf("%3d", *q++ = temp++);
}
putchar('\n');
printf("Enter number row and column >= 0 and < %u:\n", N);
while(1 != scanf("%u", &k) || (k >= N || k < 0)){
fprintf(stderr, "Incorrect data entry!Try again.\n");
getchar();
}
for(i = 0, q = p + k * N, r = p + k; i < N; i++){
temp = *q;
*q++ = *r;
*r = temp;
r += N;
}
for(i = 0, q = p; i < N * N; i++){
if(i && i % N == 0)
putchar('\n');
printf("%3d", *q++);
}
putchar('\n');
return 0;
}
Объяснение кода листинга программы
В этом коде:
- Объявлены переменные:
N- размер матрицы (целое число);i- счётчик для прохода по матрице (целое число);k- номер строки и столбца (целое число);p- указатель на начало матрицы (int*);q- указатель на текущую строку (int*);r- указатель на текущий столбец (int*);temp- временная переменная для обмена значениями (int).
- Выводится приглашение для ввода размера матрицы и после получения корректного ввода - выводится приглашение для ввода номера строки и столбца.
- Матрица заполняется последовательно слева направо, сверху вниз значениями от 1 до N*N.
- После получения номера строки и столбца, значения в этой строке и столбце меняются местами.
- Выводится приглашение для ввода матрицы и после получения ввода - выводится сама матрица.
- Программа завершается возвратом 0. Пояснение к коду:
- В цикле
forсi = 0иq = pперебираются все элементы матрицы, начиная с 0. - Если
i- это номер строки (делится на N без остатка), то выводится символ новой строки\n. - В
printfвыводится значение*qувеличенное на 1 (относительно начала матрицы) иqувеличивается наN(чтобы перейти к следующей строке). - В цикле
forсi = 0иq = p + k * Nперебираются все элементы выбранной строки и столбца. - Значение
tempустанавливается в*q(чтобы сохранить значение для обратного обмена). - Значение
*qзаменяется на значение*r(чтобы поменять местами со следующим элементом). - Значение
*rустанавливается вtemp(чтобы восстановить значение после обмена). rувеличивается наN(чтобы перейти к следующему столбцу).- В цикле
forсi = 0иq = pперебираются все элементы матрицы, начиная с 0. - Если
i- это номер строки (делится на N без остатка), то выводится символ новой строки\n. - В
printfвыводится значение*qувеличенное на 1 (относительно начала матрицы) иqувеличивается наN(чтобы перейти к следующей строке).