Jump to content
  • 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

Recommended Posts

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;
}

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.