Изменение знака элементов матрицы на противоположный - C (СИ)
Формулировка задачи:
Доброго дня!
По условию задачи необходимо в каждом столбце двумерного массива целых чисел сменить знак любого максимального по модулю элемента на противоположный.
Задачу вроде как сделал.
Но не дает покоя такой вопрос: как проделать данную процедуру со всеми максимальными элементами столбца, если их долее одного?
Потому что в данном виде программы меняется знак только у одного элемента столбца
Помогите разобраться.
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
int main()
{
system ("chcp 1251");
system ("cls");
int a[10][10],n,m,i,j,x,y;
printf("введите количество строк от 1 до 10\n");
scanf("%d",&n);
while(n<1||n>10)
{printf("введено неверное значение, пробуй еще\n");
scanf("%d",&n);
}
printf("введите количество элементов строки (столбцов) от 1 до 10\n");
scanf("%d",&m);
while(m<1||m>10)
{printf("введено неверное значение, пробуй еще\n");
scanf("%d",&m);
}
srand(time(0));
for(i=0;i<n;i++)
{ for(j=0;j<m;j++)
{
a[i][j]=rand()%21-10;
}
}
for(i=0;i<n;i++)
{ for(j=0;j<m;j++)
{printf("%4d",a[i][j]);
}
printf("\n");
}
printf("смена знака любого максимального по модулю элемента столбца на противоположный\n");
int max,i_max,j_max;
for(j=0;j<m;j++)
{max=a[0][j];
i_max=0;
j_max=j;
for(i=0;i<n;i++)
{if (abs(a[i][j])>abs(max))
{max=a[i][j];
i_max=i;
j_max=j;
}
}
y=-a[i_max][j_max];
x=a[i_max][j_max];
a[i_max][j_max]=y;
y=x;
}
printf("\преобразованная матрица\n");
for(i=0;i<n;i++)
{ for(j=0;j<m;j++)
{printf("%4d",a[i][j]);
}
printf("\n");
}
return 0;
}Решение задачи: «Изменение знака элементов матрицы на противоположный»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#define ROWS 4
#define COLUMNS 5
int main(void) {
int i, j, matrix[ROWS][COLUMNS] = {
{ 3, -4, 8, -1, 5 },
{ -2, -5, 4, 3, -5 },
{ -3, 2, -8, -3, 4 },
{ 2, 5, -4, 2, 5 },
};
printf("Before:\n");
for ( i = 0; i < ROWS; ++i ) {
for ( j = 0; j < COLUMNS; ++j )
printf("%2d ", matrix[i][j]);
printf("\n");
}
for ( j = 0; j < COLUMNS; ++j ) {
int absmax = abs(matrix[0][j]);
for ( i = 1; i < ROWS; ++i ) {
int current = abs(matrix[i][j]);
if ( current > absmax )
absmax = current;
}
for ( i = 0; i < ROWS; ++i )
if ( abs(matrix[i][j]) == absmax )
matrix[i][j] *= -1;
}
printf("After:\n");
for ( i = 0; i < ROWS; ++i ) {
for ( j = 0; j < COLUMNS; ++j )
printf("%2d ", matrix[i][j]);
printf("\n");
}
return 0;
}
Объяснение кода листинга программы
В этом коде определен размер матрицы 4x5 и создана сама матрица. Значения матрицы представлены в виде списков с элементами в круглых скобках. Далее матрица выводится на экран. Затем код ищет максимальное абсолютное значение в каждой колонке матрицы, запоминая его. Затем он проходит по всем строкам в этой колонке и меняет знак тех элементов, абсолютное значение которых равно максимальному. В конце кода матрица снова выводится на экран.