Изменение знака элементов матрицы на противоположный - 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 и создана сама матрица. Значения матрицы представлены в виде списков с элементами в круглых скобках. Далее матрица выводится на экран. Затем код ищет максимальное абсолютное значение в каждой колонке матрицы, запоминая его. Затем он проходит по всем строкам в этой колонке и меняет знак тех элементов, абсолютное значение которых равно максимальному. В конце кода матрица снова выводится на экран.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.308 из 5
Похожие ответы