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
;
© 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.
(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
© 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
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>
#include <stdlib.h>
#include <string.h>
#include <math.h>
typedef struct {
char name[50];
double x, y;
} City;
char name[50];
double x, y;
} City;
int main() {
int N;
printf(“Digite o número de cidades: “);
scanf(”%d”, &N);
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);
}
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;
}