Jump to content

Recommended Posts

Posted

Olá pessoal.

Estou fazendo uma funçao para retornar um array de 3 dimensoes.

Estou fazendo 1 for dentro do outro.

Porem, o primeiro for só executa uma vez de forma correta. Quando chega no segundo ciclo, ele roda duas vezes e começa de novo.

Me ajudem a achar o erro?

function define(qtd:integer):ImagemTri;
 var
   i,j, ia, contador :integer;
   foto:ImagemTri;
   faixa:Integer;
 begin
  contador:=1;
  for ia:=1 to qtd do
   begin
	 for i:=1 to Max do
	   begin
		 for j:=1 to Max do
		   begin
			 writeLn('Digite o valor (ate ',Max,') da posicao (',ia,',',i,',',j,') da imagem: ',contador);
			 read(faixa);
			 foto[ia][i][j]:=random(faixa);
			 inc(contador);
		   end;
		  inc(contador);
	   end;
	   inc(contador);
    end;
    define:=foto;
 end;

Essa função recebe o numero de vezes que a variavel ia vai rodar no loop for.,

Testei com 2 e deu o erro.

Obrigado a quem puder ajudar!

Posted

Pela milésima vez:

readln(faixa);

E, por curiosidade, para que serve a variável contador?

eu já nem me lembro de Pascal, mas podes dizer-me o valor de Max, e onde está definido ?

for i:=1 to Max do

Não acompanhaste os outros tópicos do @carcleo: Max é uma constante de valor 4. 😛

Knowledge is free!

Posted

Desculpe. aqui eu vcolquei read.

Mas no codigo esta readLn

program Questao3;
uses
 crt, sysutils;
Const
   Max = 4;
   Valores = 3;
   TotalDeImagens = 2;
Type
    Dim = 1..Max;
    Imagem = array[Dim, Dim] of Integer;
    ImagemTri = array[0..TotalDeImagens-1, Dim, Dim] of Integer;
    ArqImagem = File of Imagem;
Var
    Imagens: ArqImagem;
    Foto: ImagemTri;
    Casada: Imagem;
    Percentual: real;
    nome: string;
    resposta:integer;
 

Contador é pra contar quantas vezes o usuario interagirá.

Veja a saida

http://www.irajovemmuriae.com.br/aa.jpg

Chamada da funçao:

Foto:=define(TotalDeImagens);
Posted (edited)

Sabes qual o problema? É tu não teres noção das dimensões da array definida no tipo ImagemTri. Acabaste de colocar a fonte do teu problema:

const
  Max = 3;
  TotalDeImagens = 2;
type
  Dim = 1..Max;
  ImagemTri = array[0..TotalDeImagens-1, Dim, Dim] of Integer;

No ciclo, tu corres de ia:=1 to 2! (2 por causa da chamada da função)

Edited by thoga31

Knowledge is free!

Posted

Olha estou tendo problemas para enviar respostas e alterar posts. Esta falhando..

Obrigado e desculpa mais vez.

function define(qtd:integer):ImagemTri;
var
i,j, ia, contador :integer;
foto:ImagemTri;
faixa:Integer;
begin
contador:=1;
for ia:=1 to qtd do
begin
for i:=1 to Max do
begin
for j:=1 to Max do
begin
writeLn('Digite o valor (ate ',Max,') da posicao (',ia,',',i,',',j,') da imagem: ',contador);
readLn(faixa);
foto[ia][i][j]:=random(faixa);
inc(contador);
end;
end;
end;
define:=foto;
end;

Arrumando o contador

E

ImagemTri = array[0..TotalDeImagens-1, Dim, Dim] of Integer;

Alterado para

ImagemTri = array[1..TotalDeImagens, Dim, Dim] of Integer;
Posted

A solução não era alterar o tipo de dados, até porque, segundo me lembro, utiliza-lo para outros procedimentos que precisam que ele seja zero-indexed.

O segredo estava mesmo em alterar tão-somente o ciclo for!

for ia:=0 to qtd-1 do

Knowledge is free!

Posted

Me ajudem a descobrir como corrigir o erro que deu agora?

Tenho a procedure abaixo:

procedure encontraMaisSimilar(var alfa:ArqImagem; Foto:ImagemTri);
  var
 linha: Imagem;
 i, j, iguais, contador:integer;
 Percentual:real;
 matriz:array of array of integer;
  begin
 reset(alfa);
 contador:=1;
 iguais:=0;
 while not eof(alfa) do
  begin		  
   read(alfa, linha);
   for i:=1 to Max do
	begin
	 for j:=1 to Max do
	  begin
	   if linha[i,j] = Foto[contador,i,j] then
		 begin
		   inc(iguais);
		   Setlength(matriz, contador-1, iguais-1);
		   matriz[contador-1][iguais-1]:=linha[i,j]; //linha que dá erro.
		 end;
	  end;
	end;
	inc(contador);
  end;

Que recebe um arquivo de array de inteiros. Cada linha, um array de inteiros de mesma dimensão.

Como tenho 'n' linhas de arrays, entendi de fazer dento do while not eof (isso ja é uma dimensão incrementada com um contador a cada linha), dois laços for(duas dimensões que reprentam o array gravado em cada linha),

Daí, crio uma matriz tambem de duas dimensões, porem dinamica. Estou ciente que seusa indices começam de 0 e não de 1.

Essa matriz, só é incrementada nas linha(primeira dimensão), quando a variavel iguais (que compara valores) for tambem incrementada. E, nas colunas(segunda dimensão), quando a variavel contador(que roda linha por linha, ou seja, array gravado no arquvo por array) for incrementada.

Porem, na primeira vez que a matriz chamada matri recebe valor, ela já da erro. Mas o setlenth funciona.

Onde estará o erro?

Posted

Mas que erro dá? É na compilação? É na execução?

Tens de começar a explicar melhor os erros que te dão, isto não pode ser chegar aqui, mandar um canhão de linhas de código e dizer "dá erro aqui". Não somos bruxos...

Knowledge is free!

Posted (edited)

Cuidado com as tags para colocar imagens. É o url entre as tags [ img ][ /img ] (sem espaços). Não leva as tags "url".

Aí na imagem tens inc(iguais) após a atribuição, e no código do tópico tem-lo antes. Em que é que ficamos? E tens outras alterações no código...

E não entendo porque é que a segunda dimensão da matriz é definida com "iguais", nos moldes actuais do código.

Explica um pouco melhor qual o objectivo deste código todo...

Edited by thoga31

Knowledge is free!

Posted

O correto seria setlength [1][1] e depois ir incrementando.

Do jeito que estava fazendo estava saindo setlength [0][0] e ai, não tem jeito, a linha de baixa daria erro mesmo.

Corrigido:

procedure encontraMaisSimilar(var alfa:ArqImagem; Foto:ImagemTri);
  var
 linha: Imagem;
 i, j, iguais, contador:integer;
 Percentual:real;
 matriz:array of array of integer;
  begin
 reset(alfa);
 contador:=1;
 iguais:=0;
 while not eof(alfa) do
  begin			
   read(alfa, linha);
   for i:=1 to Max do
	begin
	 for j:=1 to Max do
	  begin
	   if linha[i,j] = Foto[contador,i,j] then
		 begin									
		   inc(iguais);
		   Setlength(matriz, contador, iguais);
		   matriz[contador-1][iguais-1]:=linha[i,j];
		 end;
	  end;
	end;
	inc(contador);
  end;
Posted

Na verdade, o que eu preciso fazer, e estou com dificuldades na lógica, é;

comparar: linha[i,j] com Foto[contador,i,j] e, se forem iguais, gravar um outro contador da seguinte forma:

2=2 => contador[2]=1; => linha=1;

3=3 => contador[3]=1; => linha=1;

1=1 => contador[1]=1; => linha=3;

2=2 => contador[2]=2; => linha=4;

3=3 => contador[3]=2; => linha=4;

........

Depois, verificar em qual linha se encontra o maior numero de coincidencias e dividir esse numero pelo numero total de comparações para achar a porcentagem

Posted

Há um limite para o valor de cada célula da matriz?

E, quando descobres um valor igual a outro já descoberto, actualizas o nº da linha ou queres gravar ambas? (exemplo, tu tens 1=1 e 2=2 ambas 2 vezes, e ambas em linhas diferentes - queres saber TODAS as linhas ou apenas a última?)

O que podes fazer é uma Array of Record:

const ValorMinimo = -100;  // não sei se há mínimo ou máximo, isto é só a título de exemplo...
     ValorMaximo = 100;

type TRegCompara = record  (* Registo para um dado valor *)
       quantos : integer;  // quantas repetições houve
       posicoes : array of integer;  // posições onde ocorreu (array dinâmica, mas há outros tipos melhores que decerto ainda não deste, e nem deves vir a dar)
    end;

var comparacoes : array [ValorMinimo..ValorMaximo] of TRegCompara;


(* COMPARAÇÃO E REGISTO: *)
if foto[i,j] = linha[i,j] then begin
   inc(comparacoes[foto[i,j]].quantas);
   // etc
end;

Knowledge is free!

Posted

Veja:

Estou correndo linha a linha (vetor por linha).

Daí, faço as comparaçoes e vejo o percentual de igualdades daquela matriz (no caso, a primeira).

Vejo quantas vezes cada igualdade entre as matrizes se repete e somo. Então, vejo por exemplo que o valor 2 repetiu mais nas matrizes na primeira linha.

Depois vejo que, na matriz da linha de baixo, é o 3 quem repete mais. Até acabarem as linhas.

Dái, verifica qual a matriz que houve o maior numero de repetiçoes e calculo esse o percentual numero de repetiçoes pelo numero de elementos no array em uma variavel.

E mostro a matriz que mais teve igualdade

Bom. como vou guardar os percentuais de igualdade em cada matriz?

Depois, observando o maior, como ei de obter a matriz cujo percentual foi maior uma vez que eu já passei por ela e ela não tem um nome por se tratar de gravação em arquivo e não em memoria?

No aguardo!

Posted

Eu entendi qual era o objectivo! Tu não entendeste foi a minha dúvida: precisas de saber todas as linhas em que um determinado número aparece no ficheiro? Estes números têm um mínimo e um máximo?

Quanto à forma de saber as percentagens, eu já te dei uma dica muito boa.

Knowledge is free!

Posted

não.

Sendo um array gravado por linha no arquivo. Então, basta pegar o array que estiver na linha que mais combinaçoes teve.

No caso, para cada linha(array). A cada combinaçao que se repete, a que se repetir mais será a campeã daquela linha(array).

E, a medida que forem passando as linhas, caso em algum linha uma determinada combinaçao sair mais vezes que as outras linhs,

peciso saber qual combinaçao é essa e qual array( linha) ela estava.

Entendeu?

Posted

Está aí uma confusão de linhas de ficheiros, linhas de arrays, arrays de linhas or whatever. Desculpa que te diga, o português não é, de todo, o teu forte.

Vamos por pontos... confirma-me a veracidade de cada um destes pontos:

1) Temos um ficheiro que tem gravado nele uma série de matrizes, matrizes estas que são bidimensionais (mais especificamente 4x4).

2) Para cada matriz queres saber qual o número que se repete mais vezes.

3) Para todo o ficheiro, e para um determinado número, queres saber qual a matriz que tem mais ocorrências desse mesmo número.

Foi algo deste género que eu consegui perceber.

Knowledge is free!

Posted

Bom. Sou Brasileiro. Então, falo portugues. Mas há sim diferenças regionais.

Ah! Detalhe: Sou torcedor do Clube de Regatas Vasco da Gama do Rio de Janeiro!

Vamos lá:

Tenho um loop que gera um numero predefinido de matrizes 4x4 em um arquivo.

Isso equivale a dizer que, se este numero predefinido for, por exemplo, 20. Então, teremos 20 matrizes gravadas no arquivo.

O arquivo é tipado:

type

Dim = 1..Max;

Imagem = array[Dim, Dim] of Integer;

ArqImagem = File of Imagem;

Então, em cada linha desse arquivo, eu gravo um array. Na verdade, tenho um for que gerará 'TotalDeImagens' arrays no arquivo. 1 por linha.

Isso tudo, por for, automatico.

Então. Após isso, o usuario entra criando uma array do typo Imagem.

Após isso, e é aqui que estamos, preciso comparar cada indice da array que o usuario criou com todas as arrays gravadas no arquivo.

Isso se dá pelo código abaixo:

procedure encontraMaisSimilar(var alfa:ArqImagem; Foto:Imagem);
 var
linha: Imagem;
i, j, iguais:integer;
Casada, Percentual:real;
 begin
reset(alfa);
iguais:=0;
while not eof(alfa) do
begin		  
	read(alfa, linha);
	for i:=1 to Max do
	begin
		for j:=1 to Max do
		begin
			if linha[i,j] = Foto[i,j] then {comparando célula i,j da matriz lida com a i,j de Foto}
			begin
				inc(iguais);
			end;
		end;
	end;
	Percentual:=iguais DIV (MAX*MAX);
end;
close(alfa);

if Percentual>0 then
   writeln('A taxa de células de igual valor foi: ', Percentual:2:2,'%')
else
   write('Nenhuma coincidencia houve entre as entradas');
 end;

Após isso, preciso saber, em cada comparaçao da array que o usuário criou com cada uma array gravado no arquivo, se há alguma igualade entre os valores dos indices. Se houver, caso alguma igualdade ocorra mais vezes, fazer um contador. E, ao final da comparaçao das matrizes, retornar a igualdade que mais se repetiu.

Acontece, quje a comparaçao da matriz criada pelo usuario tem que ser não, só com a primeira array gravada no arquivo, mas com todas as arrays.

E, após fazer a comparaçao com a primeira array do arquivo, e identificada qual combinaçao ocorre mais, passa-se à segunda array do arquvo e, caso na segunda array alguma combinaçao ocorra mais vezes que a maior ocorrencia da primeira array, então, tenho que guardar a segunda array e o o valor que mais repetiu nela. e assim por diante até a ''TotalDeImagens' arrays.

Entendeu?'

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
×
×
  • Create New...

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.