Para um vetor A de 50 números inteiros, escrever um programa em C que determine o maior e o segundo maior elemento desse vetor. Assumir que todos os elementos são distintos.
Passo 1
O enunciado pede: dado um vetor
de
números inteiros, escrever um programa em C que determine o maior e o segundo maior elemento desse vetor. Informações dadas que devemos usar: o vetor tem exatamente
elementos e todos os elementos são distintos (ou seja, não há empates entre valores). O que precisamos entregar exatamente: os dois maiores elementos do vetor — primeiro o maior (maior valor) e depois o segundo maior (o segundo maior valor). Não é pedido o índice, apenas os valores.
Passo 2
Escolha do método (explicação básica, sem jargões complicados): vamos fazer uma única passada pelo vetor mantendo duas variáveis que guardam os dois maiores valores encontrados até agora — chamarei de
(maior) e
(segundo maior). Esse método é simples, rápido (complexidade linear
com
) e fácil de implementar na prova sem necessidade de memória extra além do próprio vetor.
Passo 3
Por que esse método funciona (a ideia, passo a passo conceitual):
- Começamos definindo
e usando os dois primeiros elementos do vetor, comparando-os para saber qual é maior e qual é menor entre os dois. - Depois percorremos o restante do vetor (dos índices
até , no caso de elementos). Para cada elemento atual : - Se
, então vira o novo e o antigo passa a ser . - Caso contrário, se
, então vira o novo .
- Se
- Como os elementos são distintos, não precisamos nos preocupar com empates (igualdade). Esse esquema garante que, ao final,
e serão de fato o maior e o segundo maior valores do vetor.
Passo 4
Detalhe importante sobre inicialização (muito comum errar na prova): ao inicializar
e
com os dois primeiros elementos do vetor fazemos:
- comparar
e ; - se
então e ; - caso contrário
e .
Isso evita problemas quando todos os números são negativos — pois não precisamos usar valores artificiais como “menos infinito”. Inicializar com os primeiros elementos é a forma mais segura e direta quando sabemos que o vetor tem pelo menoselementos (aqui tem , então está ok).
Passo 5
Explicando linha a linha (conceitos que você pode explicar na prova se pedirem):
- Vetor/array: um bloco de memória com índices de
a para elementos. A leitura é feita com um laço for que incrementa o índice. - Laço/loop: percorre todos os elementos; aqui usaremos um for que começa em
depois de inicializar usando os dois primeiros elementos. - Comparações e atribuições simples: usamos operadores
para comparar inteiros e =para atribuir valores a variáveis. - Impressão: usamos
printfpara mostrar os resultados.
Passo 6
Exemplo pequeno para treinar a ideia (mental): suponha vetor
(só para entender):
- Inicialização com
e : fica , . - Olhando
: não é maior que nem que → nada muda. - Olhando
: → , . - Olhando
: ? não. ? não. Fim. Resultado , .
Esse exemplo confirma a lógica.
Passo 7
Resumo do algoritmo pronto para implementar na prova:
- Ler
inteiros para o vetor . - Inicializar
e comparando e . - Para
de até : aplicar as comparações descritas no Passo 4. - Ao final, imprimir
e .
Resposta
#include <stdio.h>
int main(void) {
int A[50];
int i;
/* Ler 50 inteiros */
for (i = 0; i < 50; i++) {
if (scanf("%d", &A[i]) != 1) return 1; /* leitura simples, termina em caso de erro */
}
/* Inicializar max1 e max2 com os dois primeiros elementos, ordenando-os */
int max1, max2;
if (A[0] > A[1]) {
max1 = A[0];
max2 = A[1];
} else {
max1 = A[1];
max2 = A[0];
}
/* Percorrer o restante do vetor e atualizar max1 e max2 */
for (i = 2; i < 50; i++) {
if (A[i] > max1) {
max2 = max1;
max1 = A[i];
} else if (A[i] > max2) {
max2 = A[i];
}
}
/* Imprimir resultados */
printf("Maior: %d\n", max1);
printf("Segundo maior: %d\n", max2);
return 0;
}