Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
AprendizZ

Recolha de indice num array bidimencionável.

Recommended Posts

AprendizZ

Tenho o seguinte código para encontrar os valores maximos de uma matriz, dando o coordenada do ponto inicial e o raio.

#include <stdio.h>

#define MAX_ROWS 1025
#define MAX_COLUMNS 1025
int rats[MAX_ROWS][MAX_COLUMNS];
int n_rows; /* ruas */
int n_columns; /* avenidas */
int n_ninhos;
int potencias[1025];
int n_power, n_rua, n_ave;

void read_rats (FILE *f)
{
int i, x, y, z;
n_power = 0;
fscanf(f, "%d%d", &n_rows, &n_columns);
fscanf(f, "%d", &n_ninhos);
for(i = 0; i < n_ninhos; i++)
{
	fscanf(f, "%d%d%d", &y, &x, &z);
	rats[x][y] = z;
}
while (fscanf(f, "%d", &potencias[n_power]) != EOF)
{
	n_power++;
}
}

int rats_near (int x, int z, int r)
{
int i,j;
int e = 0;
for(i = x-r; i <= x+r; i++)
{
	for(j = z-r; j <= z+r; j++)
		e += rats[i][j];
}
return e;
}

void find_target (int r)
{
int i,j;
int result = 0;
for(i = 0; i < n_rows; i++)

	for(j = 0; j < n_columns; j++)
		if (rats_near(i,j,r) > result)
		{
			result = rats_near(i,j,r);
			n_rua = i;
			n_ave = j;
		}
}

void test_find_target (void)
{
int j,x,z;
read_rats(stdin);
for(j = 0; j < n_power; j++)
{
	x = potencias[j];
	find_target(x);
	z = rats_near(n_rua,n_ave,x);
	printf("%d %d %d\n", n_rua, n_ave, z);
}
}

int main (void)
{
test_find_target();
return 0;
}

Existe alguma forma de eu obter as coordenadas do ponto que pretendo (na função find_target) sem recorrer a variaveis globais? Já inventei várias vezes mas não foi solução.

Obrigado.

Share this post


Link to post
Share on other sites
AprendizZ

A base é uma matriz n por m construída por diferentes valores, aleatórios, entre 0 e 9.

O que se pretende é encontrar o valor máximo da soma entre o valor de um desses pontos

(de coordenada x y) e os valores de todos os pontos adjacentes a este ponto central.

Para tal tenho uma função que vai recolher de um ficheiro linear as coordenadas e os valores,

construindo assim a matriz (read_rats).

Tenho outra função que soma os valores do ponto central e os valores dos pontos circundantes,

ou adjacentes (rats_near).

Depois tenho outra função (find_target) que encontra a soma mais alta e me diz, através de duas

variáveis globais, n_rua e n_ave, as coordenadas do ponto central que consegue fazer a soma

mais alta.

Ora a minha pergunta é: como tenho de informar estas últimas coordenadas no resultado final do

programa, não conseguirei fazer isto sem recorrer a variáveis globais? É que tentei usar return

na função find_target, mas só consigo que ele me retorne uma das coordenadas.

Share this post


Link to post
Share on other sites
Localhost

Tens de usar ponteiros.

Passas para a função os endereços de duas variáveis que vão conter as coordenadas e recebes com dois ponteiros, depois é só trabalhares nesses ponteiros.

edit: Se tiveres dúvidas e quiseres um exemplo, avisa.  ;)


here since 2009

Share this post


Link to post
Share on other sites
Localhost

Se nunca leste sobre ponteiros torna-se dificil para ti perceber mas a ideia geral é a seguinte.

void func(int *pK, int *pJ) {
  *pK = 10; // Atribuir a K
  *pJ = 20; // Atribuir a J
}

int main(void) {
  int K = 50;
  int J = 30;
  func(&K, &J); // Passar endereço das variáveis
  return 0;
}


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
Sign in to follow this  

×

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.