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:
  1. Inicializar *k com o primeiro elemento da matriz, ou seja, A[0][0], e definir *\text{Lin}=0, *\text{Col}=0.
  2. Percorrer todas as linhas i = 0 até n-1.
  3. Para cada linha, percorrer todas as colunas j = 0 até n-1.
  4. Se A[i][j] > *k, então atualizar
    *k = A[i][j],
    *\text{Lin} = i,
    *\text{Col} = j.
  5. 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 10

void maior(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:
  1. Ler n (com 1 \le n \le \text{Max}).
  2. Ler os n^2 elementos de A.
  3. Chamar maior(A, n, &k, &Lin, &Col).
  4. Exibir k, Lin e Col.
#include <stdio.h>
#define Max 10

void maior(int A[Max][Max], int n, int *k, int *Lin, int *Col);

int main() {
 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);

 return 0;
}

void maior(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.

Exercícios relacionados