Faça um programa que:
(a) Peça para o usuário entrar com o nome e a posição (coordenadas Xe Y ) de N cidades e as armazene em um vetor de estruturas ( N é informado pelo usuário);
(b) Crie uma matriz de distâncias entre cidades de tamanho N times N;
© Calcule as distância entre cada duas cidades e armazene na matriz;
(d) Exiba na tela a matriz de distâncias obtida;
(e) Quando o usuário digitar o número de duas cidades o programa deverá retornar a distância entre elas.

Passo 1

O exercício pede para criar um programa em C que leia nomes e coordenadas de N cidades, monte uma matriz de distâncias NxN e permita consultar a distância entre duas cidades dadas pelo usuário. Vamos precisar de estruturas para armazenar cada cidade, de alocação dinâmica para o vetor de cidades e para a matriz de distâncias, e da fórmula da distância euclidiana.

Passo 2

Definimos uma struct City com campos para o nome (string) e as coordenadas X e Y (double). Em seguida, lemos N do usuário e alocamos um vetor de N City usando malloc.

Passo 3

Fazemos um laço de 0 a N−1 para ler, para cada cidade, o nome (com scanf protegendo o tamanho) e as coordenadas X e Y.

Passo 4

Alocamos dinamicamente uma matriz de distâncias dist de tamanho N×N, ou seja, um vetor de ponteiros para vetores de double, cada um de comprimento N.

Passo 5

Para cada par (i,j), calculamos a distância euclidiana usando
dij = raiz(xi - xj)^2 + (yi - yj)^2
e armazenamos em dist[i][j].

Passo 6

Exibimos a matriz de distâncias formatada em linhas e colunas, com duas casas decimais.

Passo 7

Pedimos ao usuário dois índices de cidades (a e b), validamos se estão no intervalo [0,N−1] e imprimimos dist[a][b] exibindo também os nomes das cidades.

Passo 8

Por fim, liberamos toda a memória alocada com free para evitar vazamentos.

Passo 9

Segue abaixo uma implementação completa em C.

Resposta

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
typedef struct {
char name[50];
double x, y;
} City;
int main() {
int N;
printf(“Digite o número de cidades: “);
scanf(”%d”, &N);
City *cities = malloc(N * sizeof(City));  
for (int i = 0; i < N; i++) {  
    printf("\nCidade %d:\n", i);  
    printf("Nome: ");  
    scanf(" %49[^
]", cities[i].name);
printf(“Coordenadas X e Y: “);
scanf(”%lf %lf”, &cities[i].x, &cities[i].y);
}
double **dist = malloc(N * sizeof(double*));  
for (int i = 0; i < N; i++)  
    dist[i] = malloc(N * sizeof(double));  

for (int i = 0; i < N; i++) {  
    for (int j = 0; j < N; j++) {  
        double dx = cities[i].x - cities[j].x;  
        double dy = cities[i].y - cities[j].y;  
        dist[i][j] = sqrt(dx*dx + dy*dy);  
    }  
}  

printf("\nMatriz de distâncias:\n");  
for (int i = 0; i < N; i++) {  
    for (int j = 0; j < N; j++) {  
        printf("%8.2lf ", dist[i][j]);  
    }  
    printf("\n");  
}  

int a, b;  
printf("\nDigite dois índices de cidades para consultar distância: ");  
scanf("%d %d", &a, &b);  
if (a >= 0 && a < N && b >= 0 && b < N) {  
    printf("\nDistância entre %s e %s: %.2lf\n",  
           cities[a].name, cities[b].name, dist[a][b]);  
} else {  
    printf("\nÍndices inválidos.\n");  
}  

for (int i = 0; i < N; i++)  
    free(dist[i]);  
free(dist);  
free(cities);  

return 0;  
}

Exercícios relacionados