Jump to content

Recommended Posts

Posted

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

Posted

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!

Posted (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 by thoga31

Knowledge is free!

Posted (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 by carcleo
Posted (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ã:

bb.jpg

Edited by carcleo
Posted

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.
Posted (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 by thoga31

Knowledge is free!

Posted

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?

Posted (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 by thoga31

Knowledge is free!

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.