Faça uma sub-rotina que recebe como entrada um inteiro n, uma matriz inteira A_{n \times n} e devolve três inteiros: k, Lin e Col. O inteiro k é um maior elemento de A e é igual a A[Lin][Col].
Obs.: Se o elemento máximo ocorrer mais de uma vez, indique em Lin e Col qualquer uma das possíveis posições.
Exemplo: se A=\left(\begin{array}{lll}3 & 7 & 1 \\\\ 1 & 2 & 8 \\\\ 5 & 3 & 4\end{array}\right) então \left\{\begin{array}{c}k=8 \\\ \text { Lin }=1 \\\ \text { Col }=2\end{array}\right.
Considere o seguinte protótipo para a sub-rotina maior:
# define Max 10
void maior(int A[Max][Max], int n, int *k, int *Lin, int *Col);
Fazer o programa principal para testar a sub-rotina.
Passo 1
O problema pede uma sub-rotina em C que, dada uma matriz quadrada A de ordem n, encontre o maior elemento dessa matriz e retorne também suas coordenadas de linha e coluna. O conteúdo principal aqui é varrer todos os elementos da matriz para manter atualizado o valor máximo encontrado e suas posições.
Passo 2
O algoritmo de busca do máximo funciona assim:
Inicializar *k com o primeiro elemento da matriz, ou seja, A[0][0], e definir *\text{Lin}=0, *\text{Col}=0.
Percorrer todas as linhas i = 0 até n-1.
Para cada linha, percorrer todas as colunas j = 0 até n-1.
Se A[i][j] > *k, então atualizar *k = A[i][j], *\text{Lin} = i, *\text{Col} = j.
Ao final, *k é o maior valor e *\text{Lin}, *\text{Col} são as coordenadas de uma ocorrência dele.
Passo 3
Implementamos a sub-rotina maior conforme o protótipo dado. Note que usamos ponteiros para retornar múltiplos valores:
#define Max 10voidmaior(int A[Max][Max], int n, int *k, int *Lin, int *Col) {
int i, j;
/* 1) Inicializa com o primeiro elemento */
*k = A[0][0];
*Lin \(=0\);
*Col \(=0\);
/* 2) Varre toda a matriz */for (i \(=0\); i < n; i\(++\)) {
for (j \(=0\); j < n; j\(++\)) {
if (A[i][j] > *k) {
*k = A[i][j];
*Lin = i;
*Col = j;
}
}
}
}
Passo 4
No programa principal, vamos:
Ler n (com 1 \le n \le \text{Max}).
Ler os n^2 elementos de A.
Chamar maior(A, n, &k, &Lin, &Col).
Exibir k, Lin e Col.
#include<stdio.h>#define Max 10voidmaior(int A[Max][Max], int n, int *k, int *Lin, int *Col);
intmain() {
int A[Max][Max];
int n, i, j;
int k, Lin, Col;
/* 1) Leitura de n */printf("Entre com a ordem n (<= %d): ", Max);
scanf("%d", &n);
/* 2) Leitura dos elementos da matriz */printf("Entre com os elementos de A (%dx%d):
", n, n);
for (i \(=0\); i < n; i\(++\)) {
for (j \(=0\); j < n; j\(++\)) {
printf("A[%d][%d] = ", i, j);
scanf("%d", &A[i][j]);
}
}
/* 3) Chama a sub-rotina para achar o maior elemento */
maior(A, n, &k, &Lin, &Col);
/* 4) Exibe resultado */printf("
Maior elemento k = %d
", k);
printf("Linha Lin = %d
", Lin);
printf("Coluna Col = %d
", Col);
return0;
}
voidmaior(int A[Max][Max], int n, int *k, int *Lin, int *Col) {
int i, j;
*k = A[0][0];
*Lin \(=0\);
*Col \(=0\);
for (i \(=0\); i < n; i\(++\)) {
for (j \(=0\); j < n; j\(++\)) {
if (A[i][j] > *k) {
*k = A[i][j];
*Lin = i;
*Col = j;
}
}
}
}
Resposta
O código acima implementa a sub-rotina maior e um programa principal que testa a rotina lendo uma matriz, encontrando o maior elemento e mostrando seu valor e posição.