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

AprendizZ

Recolha de indice num array bidimencionável.

Mensagens Recomendadas

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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

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.