A distância entre várias cidades é dada pela tabela abaixo (em km):
1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|
00 | 15 | 30 | 05 | 12 | |
2 | 15 | 00 | 10 | 17 | 28 |
3 | 30 | 10 | 00 | 03 | 11 |
4 | 05 | 17 | 03 | 00 | 80 |
5 | 12 | 28 | 11 | 80 | 00 |
Elabore um programa que imprima a tabela sem repetições, isto é, se a distância entre as cidades 1 e 3 foi emitida, não é necessário emitir a distância entre 3 e 1 ;
Passo 1
Beleza, o enunciado diz que temos uma tabela 5×5 de distâncias simétricas entre cidades (ou seja,
e
). A missão é escrever um programa que imprime cada distância uma única vez, sem repetir pares invertidos (por exemplo, se já mostrei entre 1 e 3, não mostro mais entre 3 e 1).
Conteúdo: programação básica com matrizes e laços de repetição (loops). Vamos precisar saber criar um array 2D, entender índice de laços
Conteúdo: programação básica com matrizes e laços de repetição (loops). Vamos precisar saber criar um array 2D, entender índice de laços
for
e usar a propriedade de simetria pra evitar repetições.Passo 2
Primeiro a gente armazena a tabela num array bidimensional. Em notação LaTeX, a distância entre cidade
e
chamamos de
. No código, representamos isso como
d[i][j]
. Exemplo (em C):int d[6][6] = {
{0, 0, 0, 0, 0, 0},
{0, 0, 15, 30, 5, 12},
{0, 15, 0, 10, 17, 28},
{0, 30, 10, 0, 3, 11},
{0, 5, 17, 3, 0, 80},
{0, 12, 28, 11, 80, 0}
};
Note que usei dimensão 6×6 e só uso índices 1 a 5 pra simplificar.
Passo 3
Agora, pra não repetir pares, a ideia é:
- Percorrer todas as cidades com um laço
i
de 1 até 5. - Para cada
i
, percorrerj
dei+1
até 5.
Assim garantimos
e visitamos cada par
só uma vez.
Passo 4
Explicando o laço na prática:
for (int i = 1; i <= 5; i++) {
// Aqui i é a primeira cidade
for (int j = i + 1; j <= 5; j++) {
// j vai de i+1 até 5, então j sempre > i
printf("Distância entre %d e %d: %d km\n", i, j, d[i][j]);
}
}
– O
– Para cada
– A função
for (i = 1; i <= 5; i++)
faz i = 1,2,3,4,5.– Para cada
i
, o segundo for
faz j
começar em i+1
(por isso nunca teremos j<=i
).– A função
printf
imprime exatamente cada par uma vez.Passo 5
Teoria aplicada:
- Matriz simétrica:
, então não faz sentido imprimir ambas. - Laços aninhados (nested loops): o primeiro percorre linhas, o segundo colunas.
- Definindo o limite do segundo laço como
j = i+1
garantimos cobertura de todos os pares sem repetição.
Resposta
#include <stdio.h>
int main() {
int d[6][6] = {
{0, 0, 0, 0, 0, 0},
{0, 0, 15, 30, 5, 12},
{0, 15, 0, 10, 17, 28},
{0, 30, 10, 0, 3, 11},
{0, 5, 17, 3, 0, 80},
{0, 12, 28, 11, 80, 0}
};
for (int i = 1; i <= 5; i++) {
for (int j = i + 1; j <= 5; j++) {
printf("Distância entre %d e %d: %d km\n", i, j, d[i][j]);
}
}
return 0;
}
Esse programa imprime cada par de cidades uma única vez, do jeitinho que o enunciado pede!