Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

JoaoNascimento

Função para ver a posição do vector mais proxima

Mensagens Recomendadas

JoaoNascimento

Bom dia, tenho um vector com alguns registos, e ao inserir um valor ao caso tenho de saber qual é a posição mais proxima dessa....

Devo mensinar que o calculo da distancia é feito da seguinte maneira...

d=sqrt(((x2-x1)^2)+((y2-y1)^2))

Tenho o seguinte codigo:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define N 5 //VARIAVEL GLOBAL

/*--------------------------------------------------------------------
  |PROCEDIMENTO aletario()                                           |
  |VARIAVEIS: x ->longitude; y->latitude; *al->vector; aux->auxiliar |
  --------------------------------------------------------------------*/
void aleatorio()//RESPONSAVEL POR CARREGAR UM VECTOR COM NUMEROS ALEATORIOS 
{
int x=0,y=0, *al, aux, min; //DECLARAÇÃO DAS VARIAVEIS

al=(int *)malloc(N*sizeof(int)); //ALOCAÇÃO DINAMICA DE MEMORIA PARA O VECTOR
srand(time(NULL));//LIMPA A FUNÇÃO RAND() PARA QUE A CADA COMPILAÇÃO SEJAM USADOS SEMPRE VALORES DIFERENTES
x=rand()%9999;//x VAI TER UM VALOR ALEATORIO ATE 9999
y=rand()%9999;//Y VAI TER UM VALOR ALEATORIO ATE 9999
printf("x: %d\n",x);//IMPRIME NO ECRÃ O VALOR DE x
printf("y: %d\n",y);//IMPRIME NO ECRÃ O VALOR DE y

aux=(x*10000)+y;//aux É IGUAL A x0000+y (x=1234 E y=5678 ENTAO aux=12345678

al[0]=aux;//POSIÇÃO 0 DO VECTOR TEM O VALOR DE aux

printf("Coordenadas: %d\n",al[0]);//APRESENTA NO ECRÃ O VALOR DO VECTOR NA POSIÇÃO 0, NESTE CASO O VALOR DO AUXILIAR

}

/*--------------------------------------------------------------------
  |PROCEDIMENTO COD_X_Y()                                            |
  |VARIAVEIS: c ->coordenada;  x ->longitude; y->latitude            |
  --------------------------------------------------------------------*/

void cod_x_y()/*RESPONSAVEL POR RECEBER UM NUMERO INTEIRO CORRESPONDENTE ÁS COORDENADAS DE UMA ESTAÇÃO DE SERVIÇO E APRESENTAR
                O VALOR DE X E Y*/
{
int c, x, y;//DECLARAÇÃO DE VARIAVEIS

printf("Insira a coordenada para verificar a latitude() e a longitude(): ");//IMPRIME NO ECRÃ O SEGUINTE BLOCO DE TEXTO
scanf("%d",&c);//RECEBE PARA A VARIAVEL c A COORDENADA DA ESTAÇÃO DE SERVIÇO

if (c>99999999 || c<0)//VALIDA SE A COORDENADA TEM MAIS DE 8 DIGITOS
{
	while (c>99999999 || c<0)//REPETE O SEGUINTE BLOCO DE CODIGO (LN 51-53)
	{
		printf("\nA coordenada inserida e invalida:\n ");
		printf("Volte a inserir a coordenada correspondente:\n ");
		scanf("%d",&c);
	}
}
//DEPOIS DE VERIFICAR SE O NUMERO TEM MAIS DE 8 DIGITOS ENTÃO FAZ:
	x=c/10000;//x=QUOCIENTE DA DIVISÃO DE c EXEMPLO:c=12345678; x=1234
	y=c%10000;//y=RESTO DA DIVISÃO DE c EXEMPLO:c=1234567; x=5678

	printf("\nx: %d\n",x);//APRESENTA O VALOR DE X
	printf("y: %d\n",y);//APRESENTA O VALOR DE Y
	printf("x->longitude | y->latitude\n");
}

int loc(int *a, int num)
{
int x1, x2, y1, y2, c, d[N], i, min=999999999999999;

x1=*a/10000;
y1=*a%10000;

printf("Insira a coordenada da sua posicao actual: ");
scanf("%d",&c);

if (c>99999999 || c<0)//VALIDA SE A COORDENADA TEM MAIS DE 8 DIGITOS
{
	while (c>99999999 || c<0)//REPETE O SEGUINTE BLOCO DE CODIGO (LN 79-81)
	{
		printf("\nA coordenada inserida e invalida:\n ");
		printf("Volte a inserir a coordenada correspondente:\n ");
		scanf("%d",&c);
	}
}
else
{
	x2=c/10000;
	y2=c%10000;	
}
//min=d[0];
for (i=0; i<N; i++)
{
	d[i]=sqrt(((x2-x1)^2)+((y2-y1)^2));
	if (d[i]<min)
	{
		min=a[i];
	}
	else
		min=min;
}

return min;
}

/*----------------------------------------------------------------------------------------------------
  |MAIN()																					         |
  |VARIAVEIS: i ->CONTADOR DE INTERIOS; COD[N]->VECTOR COM N ELEMENTOS (VARIAVEL GLOBAL) min->minimo |
  ----------------------------------------------------------------------------------------------------*/

int main()//RESPONSAVEL POR ARMAZENAR NO VECTOR AS COORDENADAS DAS ESTAÇÕES DE SERVIÇO E CHAMAR OS PROCEDIMENTOS
{
int i, cod[N], min;//DECLARAÇÃO DE VARIAVEIS

for (i=0; i<N; i++)//ESTRUTURA DE REPETIÇÃO RESPONSAVEL POR ARMAZENAR AS COORDENADAS DAS ESTAÇÕES DE SERVIÇO
{
	printf("Introduza as coordenadas relativa a estação de serviço: ");//ESCREVE O ECRÃ
	scanf("%d",&cod[i]);//COLOCA NA POSIÇÃO DE MEMORIA DO VECTOR (DEPENDENTE DO i) O VALOR REGISTADO

	//ESTRUTURA DE DECISÃO PARA VALIDAR SE A COORDENADA TEM MAIS DE 8 DIGITOS
	if (cod[i]>99999999 || cod[i]<0)//RESPONSAVEL POR VERIFICAR SE VALOR DA POSIÇÃO i DO VECTOR FOR MENOR MAIOR QUE 99999999 (MAIOR VALOR POSSIVEL COM 8 INTEIROS)
	{
		while (cod[i]>99999999 || cod[i]<0)//REPETE O SEGUINTE BLOCO DE CODIGO (LN 84-86)
		{
			printf("\nA coordenada inserida e invalida:\n ");
			printf("Volte a inserir a coordenada correspondente:\n ");
			scanf("%d",&cod[i]);
		}
	}

	printf("\nJa inseriu %d coordenadas de %d\n", i+1, N);//MOSTRA QUANTOS REGISTOS JÁ FORAM INTRODUZIDOS PELO O UTILIZADOR
}
system("cls");//LIMPA O ECRÃ

//NO FIM DE SE REGISTAREM AS COORDENADAS DAS ESTAÇÕES DE SERVIÇO, A SEGUINTE INSTRUÇÃO DE REPETIÇÃO MSOTRA A COORDENADA DAS ESTAÇÕES DE SERVIÇO
for (i=0; i<N; i++)
{
	printf("%d estacao de serviço: %d\n",i+1, cod[i]);
}
system("pause");//REALIZA UMA PAUSA ONDE O UTILIZADOR TEM DE PRIMIR QUALQUER TECLA PARA CONTINUAR A EXECUSÃO DO PROGRAMA
system("cls");//LIMPA O ECRÃ

cod_x_y();//CHAMA O PROCEDIMENTOS cod_x_y()
system("pause");//REALIZA UMA PAUSA ONDE O UTILIZADOR TEM DE PRIMIR QUALQUER TECLA PARA CONTINUAR A EXECUSÃO DO PROGRAMA
system("cls");//LIMPA O ECRÃ

aleatorio();//CHAMA O PROCEDIMENTOS aleatorio()
system("pause");//REALIZA UMA PAUSA ONDE O UTILIZADOR TEM DE PRIMIR QUALQUER TECLA PARA CONTINUAR A EXECUSÃO DO PROGRAMA
system("cls");//LIMPA O ECRÃ

min=loc(cod,N);//CHAMA O PROCEDIMENTOS loc() e envia o vector 
printf("A estacao mais proxima é: %d\n",min);
system("pause");//REALIZA UMA PAUSA ONDE O UTILIZADOR TEM DE PRIMIR QUALQUER TECLA PARA CONTINUAR A EXECUSÃO DO PROGRAMA
system("cls");//LIMPA O ECRÃ

return 0;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Crias uma função que percorre o array e que a cada posição calcula a diferença entre o valor inserido e o valor dessa posição. Se a diferença for menor do que uma variável que vai contêr o valor mais próximo significa que esse valor é mais próxima.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.