Из заданной матрицы, найти в каждом столбце максимальный элемент, и из максимального элемента вычесть значения в своих столбцах - C (СИ)
Формулировка задачи:
Помогите доделать программу
Задание:из заданной матрицы, найти в каждом столбце максимальный элемент, и из максимального элемента вычесть значения в своих столбцах.
Пример
Была матрица:
2 -3 4 -10 1
-3 1 5 7 -2
0 0 0 -10 10
Максимальный элемент в 1 столбце:2
Максимальный элемент в 2 столбце:1
Максимальный элемент в 3 столбце:5
Максимальный элемент в 4 столбце:7
Максимальный элемент в 5 столбце:10
Должно получиться
1.r11 = 2 - 2 = 0; r21 = 2 - (-3) = 5; r31 = 2 - 0 = 2;
2.r12 = 1 - (-3) = 4; r22 = 1 - 1 = 0; r32 = 1 - 0 = 1;
3.r13 = 5 - 4 = 1; r23 = 5 - 5 = 0; r33 = 5 - 0 = 5;
4.r14 = 7 - (-10) = 17; r24 = 7 - 7 = 0; r34 = 7 - (-10) = 17;
5.r15 = 10 - 1 = 9; r25 = 10 - (-2) = 12; r35 = 10 - 10 = 0;
Результаты
Ai П1 П2 П3 П4 П5
A1 0 4 1 17 9
A2 5 0 0 0 12
A3 2 1 5 17 0
Сама программа
Я нашел максимальные элементы в каждом столбце, а дальше не знаю как сделать
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int n=3;
const int m=5;
int VivodMassiva(int mas[n][m]);
int main()
{
int mas[n][m],C[n],i,j,t,max,k=0,menu;
printf ("1-Vvesti massiv s klaviaturi \n2-Iz Faila\n");
scanf ("%d",&menu);
/*---------Ввод матрицы с клавиатуры-------------------------------------------*/
if(menu==1)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
printf ("M[%d][%d]:",i,j);
scanf ("%d",&(mas[i][j]));
}
}
}
/*-----------------------------------------------------------------------------*/
/*---------Ввод матрицы из файла-----------------------------------------------*/
if(menu==2)
{
FILE *file;
if((file=fopen("1.txt","r"))==NULL)
{
printf("no file\n");
system("PAUSE");
return 1;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
fscanf (file,"%d",&mas[i][j]);
}
}
fclose(file);
}
/*-----------------------------------------------------------------------------*/
for(i=1;i<=m;i++)
{
max=0;
for(j=1;j<=n;j++)
{
for(t=1; t<=n;t++)
if(mas[j][i]>max)
{
max=mas[j][i];
}
}
k++;C[k]=max;
printf("Max element %d stolbca=%d ",i,max);
printf("\n");
}
/*-----------------------------------------------------------------------------*/
/*------------Вывод матрицы----------------------------------------------------*/
VivodMassiva(mas);
printf ("\n");
for(i=1;i<=k;i++)
printf ("%d ",C[i]);
printf ("\n");
/*-----------------------------------------------------------------------------*/
system("PAUSE");
return 0;
}
int VivodMassiva(int mas[n][m])
{ int i;
int j;
for(i=1;i<=n;i++)
{
printf("\n ");
for(j=1;j<=m;j++)
{
printf ("%d \t",mas[i][j]);
}
}
return 0;
}Решение задачи: «Из заданной матрицы, найти в каждом столбце максимальный элемент, и из максимального элемента вычесть значения в своих столбцах»
textual
Листинг программы
void doTask(int **matrix, int n, int m){
for (int i = 0; i < n; ++i){
int maxInRow = matrix[i][0];
for (int j = 1; j < m; ++j){
if(matrix[i][j] > maxInRow){
maxInRow = matrix[i][j];
}
}
for (int k = 0; k < m; ++k){
matrix[i][k] -= maxInRow;
}
matrix[i][m] = maxInRow;
}
}
Объяснение кода листинга программы
- Входные данные:
int **matrix- двумерный массив, представляющий собой квадратную матрицу целых чисел, гдеn- количество строк, аm- количество столбцов.int n- количество строк в матрице.int m- количество столбцов в матрице.
- Создается цикл, который проходит по каждой строке матрицы:
- Внутри цикла создается переменная
maxInRow, которая инициализируется значением первого элемента текущей строки. - Создается вложенный цикл, который проходит по каждому элементу в текущей строке, начиная со второго элемента. Если значение текущего элемента больше значения
maxInRow, то значениеmaxInRowобновляется. - После завершения вложенного цикла, создается еще один цикл, который проходит по каждому столбцу текущей строки. Значение
maxInRowвычитается из каждого элемента текущей строки. - После завершения внешнего цикла, функция завершается.
- Значение
maxInRowзаписывается в последний столбец текущей строки. Это гарантирует, что в каждом столбце будет максимальное значение из всех элементов этого столбца.