Carlos Rocha Posted October 19, 2012 at 09:40 PM Report #479813 Posted October 19, 2012 at 09:40 PM 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!
HappyHippyHippo Posted October 19, 2012 at 09:45 PM Report #479814 Posted October 19, 2012 at 09:45 PM 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 IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
thoga31 Posted October 19, 2012 at 09:48 PM Report #479815 Posted October 19, 2012 at 09:48 PM 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!
Carlos Rocha Posted October 19, 2012 at 10:00 PM Author Report #479817 Posted October 19, 2012 at 10:00 PM 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);
thoga31 Posted October 19, 2012 at 10:11 PM Report #479821 Posted October 19, 2012 at 10:11 PM (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 October 19, 2012 at 10:11 PM by thoga31 Knowledge is free!
Carlos Rocha Posted October 19, 2012 at 10:26 PM Author Report #479832 Posted October 19, 2012 at 10:26 PM 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;
thoga31 Posted October 19, 2012 at 10:34 PM Report #479838 Posted October 19, 2012 at 10:34 PM 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!
Carlos Rocha Posted October 20, 2012 at 04:45 PM Author Report #479870 Posted October 20, 2012 at 04:45 PM (edited) Obrigado! Edited October 21, 2012 at 10:09 AM by carcleo
Carlos Rocha Posted October 21, 2012 at 07:36 PM Author Report #479941 Posted October 21, 2012 at 07:36 PM 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?
thoga31 Posted October 21, 2012 at 08:29 PM Report #479944 Posted October 21, 2012 at 08:29 PM 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!
Carlos Rocha Posted October 21, 2012 at 08:52 PM Author Report #479947 Posted October 21, 2012 at 08:52 PM Esse é o erro: http://www.irajovemmuriae.com.br/aa.jpg
thoga31 Posted October 21, 2012 at 09:03 PM Report #479949 Posted October 21, 2012 at 09:03 PM (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 October 21, 2012 at 09:12 PM by thoga31 Knowledge is free!
Carlos Rocha Posted October 22, 2012 at 12:11 AM Author Report #479971 Posted October 22, 2012 at 12:11 AM 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;
Carlos Rocha Posted October 22, 2012 at 01:21 AM Author Report #479974 Posted October 22, 2012 at 01:21 AM 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
thoga31 Posted October 22, 2012 at 06:43 PM Report #480022 Posted October 22, 2012 at 06:43 PM 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!
Carlos Rocha Posted October 23, 2012 at 06:03 PM Author Report #480129 Posted October 23, 2012 at 06:03 PM 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!
thoga31 Posted October 23, 2012 at 07:44 PM Report #480142 Posted October 23, 2012 at 07:44 PM 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!
Carlos Rocha Posted October 23, 2012 at 08:24 PM Author Report #480150 Posted October 23, 2012 at 08:24 PM 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?
thoga31 Posted October 23, 2012 at 08:46 PM Report #480154 Posted October 23, 2012 at 08:46 PM 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!
Carlos Rocha Posted October 23, 2012 at 09:19 PM Author Report #480161 Posted October 23, 2012 at 09:19 PM 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?'
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now