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, dij = dji e dii=0). 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 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 i e j chamamos de dij. 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, percorrer j de i+1 até 5.
Assim garantimos j>i e visitamos cada par (i,j) 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 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: dij = dji, 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!

Exercícios relacionados