Carlos Rocha Posted October 14, 2012 at 07:09 PM Report #479135 Posted October 14, 2012 at 07:09 PM Pessoal. Como faço para, dado um numero inteiro qualquer passado por referencia em uma procedure, criar n matrizes tantas quantos for esse numero n? Exemplo: program cria_matrizes; var matriz: array[0..10;0..10] of integer; n:integer; //fazer um procedimento que criará 'n' matrizes tantas quantas forem o 'n' passado por parametro. procedure cria_matrizes(var n:integer, var faixa:integer); var i:integer; begin randonize; for i:=0 to n do begin a ideia aqui é criar n matrizes quadradas com seus indices recebendo valores aleatorios ente 0 e faxa. 'matriz'+i:=faixa*random(); end; end; BEGIN n:=10; cria_matrizes(n); END. Me ajudem com a lógica? Na verdade o exercício é esse: Suponha as declarações: Const Max = 4; Valores = 3; TotalDeImagens = 20; Type Dim = 1..Max; Imagem = array[Dim, Dim] of Integer; ArqImagem = File of Imagem; Var Imagens: ArqImagem; Foto, Casada: Imagem; Percentual: real; Begin randomize; cria(Imagens, TotalDeImagens, Valores); mostra(Imagens); define(Foto, Valores); encontraMaisSimilar(Imagens, Foto, Casada, Percentual); visualiza(Foto); visualiza(Casada); writeln(output, 'A taxa de células de igual valor foi: ', Percentual); readln(input); End. Complete o programa em Pascal, elaborando os procedimentos: cria, mostra, define, encontraMaisSimilar e visualiza, conforme especificado a seguir: (a) cria(alfa, qtd, faixa) - constrói arquivo de matrizes quadradas alfa, cujo nome deve ser escolhido pelo usuário, e com qtd matrizes, onde cada célula de cada matriz deve ser gerada aleatoriamente na faixa especificada. (b) mostra(alfa) - escreve organizadamente no vídeo todo o conteúdo do arquivo alfa, pulando uma linha após cada matriz mostrada. (c) define(img, vls) - permite ao usuário o preenchimento das células de img com valores escolhidos na faixa vls. (d) encontraMaisSimilar(Imgs, Ft, Csd, Perc) - visita todas as imagens no arquivo Imgs e contabiliza quantas células são iguais, em cada posição da matriz Ft, retornando em Csd e em Perc a matriz que mais células de igual valor a Ft[ i ][j] e qual é o percentual de igualdade da matriz Csd com Ft, respectivamente. (e) visualiza(Img) - mostra organizadamente na tela a matriz Img. Desde ja agradeço. Carlos
thoga31 Posted October 14, 2012 at 07:28 PM Report #479140 Posted October 14, 2012 at 07:28 PM Que confusão... é por estas e por outras que muitos consideram a programação um terror aquando da sua aprendizagem nas escolas e universidades... mas adiante. Não crias n matrizes na memória em runtime. Simplesmente geras uma matriz aleatoriamente e gravas no ficheiro, voltas a gerar outra matriz e adicionas ao ficheiro, e assim sucessivamente, n vezes. Depois disto poderás fechar o ficheiro. Knowledge is free!
Carlos Rocha Posted October 14, 2012 at 09:48 PM Author Report #479173 Posted October 14, 2012 at 09:48 PM Mas, e com relação aos nomes das matrizes e suas declaraçoes? Como fica? Tipo: matriz1, matriz2...........Não tem como saber quantas serão!
thoga31 Posted October 14, 2012 at 10:19 PM Report #479177 Posted October 14, 2012 at 10:19 PM (edited) De facto denota-se na tua confusão a confusão do próprio exercício em si... Compreensível. Então vamos lá explicar isto melhor... Tu tens de criar n matrizes num ficheiro. Não tens de dar um nome a cada uma delas, o ficheiro é que terá um! Para criar as n matrizes não precisas de as declarar! Basta 1! Imagina esta matriz como uma forma de sapato: para fazer vários sapatos iguais utilizas a mesma forma, e os acessórios opcionais acrescentam-se depois. Neste caso, tens uma matriz-base 4x4 onde lhes colocas os valores aleatórios. Gravas no ficheiro. Voltas a gerar novos valores na mesma matriz 4x4. Acrescentas o seu resultado ao ficheiro. Isto n vezes. Esquece o nome de cada matriz: não há. O que tem nome é o ficheiro, e deve ser o utilizador a escolhê-lo! Edited October 14, 2012 at 10:20 PM by thoga31 Knowledge is free!
Carlos Rocha Posted October 15, 2012 at 11:39 AM Author Report #479211 Posted October 15, 2012 at 11:39 AM (edited) Seria mais ou menors isso? program Questao3; uses crt, sysutils; Const Max = 4; Valores = 3; TotalDeImagens = 20; Type Dim = 1..Max; Imagem = array[Dim, Dim] of Integer; ArqImagem = File of Imagem; Var Imagens: ArqImagem; Foto, Casada: Imagem; Percentual: real; nome: string; procedure cria(var alfa:ArqImagem; qtd:integer; faixa:integer); var j, i, ia: integer; matriz: Imagem; begin randomize; // Inicia random writeLn('qtd: ',qtd); writeLn('Max: ',Max); for ia:=1 to qtd do begin reset (alfa); for i:=1 to Max do begin for j:=1 to Max do begin matriz[i][j]:=random(faixa); write(alfa,matriz[i][j]); // tipos incompativeis? Porque? //writeLn('matriz[',i,'][',j,']:',matriz[i][j]); end; end;; writeLn; close (alfa); end; readkey; end; Begin randomize; writeLn('Escolha um nome para o nosso arquivo: '); read(nome); assign(Imagens, nome+'.txt'); rewrite (Imagens); cria(Imagens, TotalDeImagens, Valores); { mostra(Imagens); define(Foto, Valores); encontraMaisSimilar(Imagens, Foto, Casada, Percentual); visualiza(Foto); visualiza(Casada); writeln(output, 'A taxa de células de igual valor foi: ', Percentual); readln(input); } End. Mas ainda esta dando erro. E outra coisa: Ao gravar pela segunda vez a nova matriz no arquivo, a matriz anterior não seria apagada? O professor à distancia quer que exiba as 'n'' matrizes criada. Edited October 15, 2012 at 05:33 PM by carcleo
Carlos Rocha Posted October 15, 2012 at 07:14 PM Author Report #479247 Posted October 15, 2012 at 07:14 PM (edited) Fiz uma alteração que deu certo. o problema é que, na hora de exibir o arquivo da tipos incompativeis. Veja; program Questao3; uses crt, sysutils; Const Max = 4; Valores = 3; TotalDeImagens = 20; Type Dim = 1..Max; Imagem = array[Dim, Dim] of Integer; ArqImagem = File of Imagem; Var Imagens: ArqImagem; Foto, Casada: Imagem; Percentual: real; nome: string; procedure cria(var alfa:ArqImagem; qtd:integer; faixa:integer); //Esta dando erro nessa linha. Acho que é jeito de declarar var j, i, ia: integer; matriz: Imagem; begin writeLn('qtd: ',qtd); writeLn('Max: ',Max); randomize; for ia:=1 to qtd do begin reset (alfa); for i:=1 to Max do begin for j:=1 to Max do begin matriz[i][j]:=random(faixa); write(alfa,matriz); end; end;; writeLn; close (alfa); end; end; procedure mostra(var alfa:ArqImagem); var linha: integer; begin reset(alfa); while not eof(alfa) do begin read(alfa, linha); write(linha); end; close(alfa); end; Begin writeLn('Escolha um nome para o nosso arquivo: '); read(nome); assign(Imagens, nome+'.txt'); rewrite (Imagens); cria(Imagens, TotalDeImagens, Valores); mostra(Imagens); { define(Foto, Valores); encontraMaisSimilar(Imagens, Foto, Casada, Percentual); visualiza(Foto); visualiza(Casada); writeln(output, 'A taxa de células de igual valor foi: ', Percentual); readln(input); } End. Veja o que saiu no ecrã: Edited October 15, 2012 at 08:00 PM by carcleo
thoga31 Posted October 15, 2012 at 08:03 PM Report #479252 Posted October 15, 2012 at 08:03 PM O ficheiro tem gravado em si uma série de matrizes do tipo Imagem. Tu, no procedimento mostrar, estás a lê-las com uma variável linha do tipo Integer! Knowledge is free!
Carlos Rocha Posted October 15, 2012 at 11:15 PM Author Report #479291 Posted October 15, 2012 at 11:15 PM Foi mau. Obrigado. Mas agora surgiu outro problema: Preciso gravar 20 vezes não a mesma matriz mas, cada vez gerar valores diferentes para cada matriz. Porem, da forma que estou fazendo, esta gravando e lendo 20 vezes a mesma matriz do arquivo. Como concertar? program Questao3; uses crt, sysutils; Const Max = 4; Valores = 3; TotalDeImagens = 20; Type Dim = 1..Max; Imagem = array[Dim, Dim] of Integer; ArqImagem = File of Imagem; Var Imagens: ArqImagem; Foto, Casada: Imagem; Percentual: real; nome: string; procedure cria(var alfa:ArqImagem; qtd:integer; faixa:integer); var j, i, ia: integer; matriz: Imagem; begin writeLn('qtd: ',qtd); writeLn('Max: ',Max); randomize; reset (alfa); for ia:=1 to qtd do begin for i:=1 to Max do begin for j:=1 to Max do begin matriz[i][j]:=random(faixa); end; end; end; write(alfa,matriz); close (alfa); writeLn; end; procedure mostra(var alfa:ArqImagem; qtd:integer); var linha: Imagem; i,j, ia:integer; begin reset(alfa); read(alfa, linha); for ia:=1 to qtd do begin for i:=1 to Max do begin for j:=1 to Max do begin write(linha[i,j]); end; end; writeLn; end; close(alfa); end; Begin writeLn('Escolha um nome para o nosso arquivo: '); read(nome); assign(Imagens, nome+'.txt'); rewrite (Imagens); cria(Imagens, TotalDeImagens, Valores); mostra(Imagens, TotalDeImagens); readkey; { define(Foto, Valores); encontraMaisSimilar(Imagens, Foto, Casada, Percentual); visualiza(Foto); visualiza(Casada); writeln(output, 'A taxa de células de igual valor foi: ', Percentual); readln(input); } End.
thoga31 Posted October 16, 2012 at 08:06 PM Report #479396 Posted October 16, 2012 at 08:06 PM (edited) Se começares a indentar melhor, verás melhor os teus erros. Ora vê bem: for ia:=1 to qtd do begin for i:=1 to Max do begin for j:=1 to Max do begin matriz[i][j]:=random(faixa); end; end; end; write(alfa,matriz); close (alfa); writeLn; Tu geras 20 vezes matrizes diferentes de forma aleatória, aí está certo. Mas tu mandas gravar depois do ciclo. Nada mais fica gravado no ficheiro se não a última matriz gerada... Uma dica de optimização: em vez de uma tonelada de begin-end, bastar-te-á, neste ciclo, isto: for ia:=1 to qtd do for i:=1 to Max do for j:=1 to Max do matriz[i][j]:=random(faixa); Edited October 16, 2012 at 08:08 PM by thoga31 Knowledge is free!
Carlos Rocha Posted October 17, 2012 at 12:46 PM Author Report #479481 Posted October 17, 2012 at 12:46 PM O erro eu ví mas a soilução ainda não. Pelo que entendi, deveria que ter algo como for ia:=1 to qtd do begin for i:=1 to Max do for j:=1 to Max do matriz[i][j]:=random(faixa); matriz[ia]:=matriz[i]; end; for i:=1 ro qtd do write(alfa,matriz[i]); close (alfa); Seria isso?
thoga31 Posted October 17, 2012 at 03:06 PM Report #479518 Posted October 17, 2012 at 03:06 PM (edited) Não! Pah, lê o código que fazes e tenta manter alguma lógica... for ia:=1 to qtd do begin for i:=1 to Max do for j:=1 to Max do matriz[i][j]:=random(faixa); matriz[ia]:=matriz[i]; end; Repara, tu tens 1 variável, e tens de a utilizar para gravar num ficheiro qtd matrizes diferentes. Estás à espera que na mesma variável matriz encaixes umas 20 matrizes diferentes? Isto não faz sentido: matriz[ia] := matriz[i]; Tens uma array bidimensional, achas que é assim que encafuas numa variável o equivalente a qtd variáveis? E isto também não faz sentido: for i:=1 ro qtd do write(alfa,matriz[i]); matriz não é a i-nésima matriz gerada! Sendo um array bidimensional nem sequer faz sentido isto! Quanto muito seria considerada uma linha do array em certas linguagens funcionais, mas não faz sentido em Pascal. @carcleo, retira os macaquinhos da cabeça de que vais meter cada matriz numa variável e depois, num processo à parte, as colocas no ficheiro. Desta vez tens de fazer tudo ao mesmo tempo, num só ciclo! Pensa bem: 1 variável, 20 matrizes a gerar. Crias uma matriz, grava-la LOGO no ficheiro, geras outra matriz, grava-a outra vez no ficheiro, etc etc, num só ciclo! A lógica disto é: FAZER "qtd" VEZES: Gerar matriz nº "i" Gravar matriz nº "i" no ficheiro FIM_FAZER Fechar ficheiro Edited October 17, 2012 at 03:07 PM by thoga31 Knowledge is free!
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