Ir ao conteúdo
  • Cadastre-se

Pascal matriz / gotoxy


Posts recomendados

Primeiro segue o que eu já  fiz 

PROGRAM MultMatriz;
USES CRT;
VAR
Fruta: ARRAY [1..10,1..10] OF String;
Valor: ARRAY [1..8,1..8] OF integer;

M,N,i, Soma: INTEGER;
BEGIN
  
  FOR M:= 3 TO 7 DO
  BEGIN
    FOR N:= 1 TO 1 DO
    WRITE ('Escreva o Nome da Fruta ', M,': ');
    READLN (Fruta[M,N]);
  END;
  CLRSCR;
  FOR M:= 3 TO 7 DO
  BEGIN
    FOR N:= 1 TO 1 DO
    WRITE ('Escreva o Valor da Fruta ', Fruta[M,N],': ');
    READLN (Valor[M,N]);
  END;
  
  CLRSCR;
  WriteLn('AMOSTRAGEM DA TABELA');
  gotoxy(3,2 );
  WriteLn('FRUTA');
  gotoxy(9,2 );
  WriteLn('VALOR');
  for i := 3 to 7 do
  begin
    gotoxy( 8, i );
    Writeln('|');
  end;
  
  FOR M:= 3 TO 7 DO
  BEGIN
  Gotoxy(3,M);
    FOR N:= 1 TO 6 DO
    BEGIN
    Gotoxy(3,N);
      Writeln ('',Fruta[M,N]);
    END;
  END;
  
  FOR M:= 3 TO 7 DO
  BEGIN
      Gotoxy(10,M);
    FOR N:= 1 TO 6 DO
    BEGIN  
		   Gotoxy(10,N);
      Writeln ('',Valor[M,N]);
    END;
  END;
  
  
  
End.

 

O programa até  Roda mas preciso fazer uma tabela com o Gotoxy que não esta todando.

 


  CLRSCR;
  WriteLn('AMOSTRAGEM DA TABELA');
  gotoxy(3,2 );
  WriteLn('FRUTA');
  gotoxy(9,2 );
  WriteLn('VALOR');
  for i := 3 to 7 do
  begin
    gotoxy( 8, i );
    Writeln('|');
  end;
  
  FOR M:= 3 TO 7 DO
  BEGIN
  Gotoxy(3,M);
    FOR N:= 1 TO 6 DO
    BEGIN
    Gotoxy(3,N);
      Writeln ('',Fruta[M,N]);
    END;
  END;
  
  FOR M:= 3 TO 7 DO
  BEGIN
      Gotoxy(10,M);
    FOR N:= 1 TO 6 DO
    BEGIN  
		   Gotoxy(10,N);
      Writeln ('',Valor[M,N]);
    END;
  END;
  

Para criar a tabela Pulando 2 linhas a unica forma que eu sei é  colocar o for do 3 ao 7 

 

Mas gostaria que o Writeln da primeira linha lesse a pergunta do  'M'  do 1 ao 4 

 


  
  FOR M:= 3 TO 7 DO
  BEGIN
    FOR N:= 1 TO 1 DO
    WRITE ('Escreva o Nome da Fruta ', M,': ');
    READLN (Fruta[M,N]);
  END;
 

queria que um Array fosse para o posicionamento e ou outro para o que foi digitado.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá @Augusto G rocha.

 

A primeira coisa que sugiro verificar é a estrutura dos dados. Como não tem enunciado, preciso de esclarecimentos:

Fruta: ARRAY [1..10,1..10] OF String;
Valor: ARRAY [1..8,1..8] OF integer;

Para que será usado o array Fruta e o array valor?

Por quê nessas matrizes uma vai de 1 a 10 para cada coordenada e o outro vai de 1 a 8?

Por quê cada uma tem duas coordenadas?

 

No aguardo.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Não entendi a correção entre "dividir uma matriz por 2" entre "Fruta e Valor". :D

 

Deve ser a questão 4, não?

 

Analisando ela, acho que se são 4 frutas, as matrizes deveriam ser de [1,4] ou [2,2] ou [4,1], ou seja, "ter quatros elementos cada".

Se são duas matriz, e cada posição (fruta) de uma matriz terá a uma posição (valor) correspondente na outra, faz mas sentido usar uma mesma ordem para as duas!, ou seja, "para posições iguais respectivamente nas matrizes, teremos dados para uma mesma fruta ". Ex.: Fruta que está na posição (1,2) terá o seu preço também na posição (1,2) da outra matriz.

 

No aguardo.

 

 

Link para o comentário
Compartilhar em outros sites

Meu problema é com a linha

 

WRITE ('Escreva o Nome da Fruta ', M,': ');

 

eu posso colocar [1..4] para que apacera 

 

Escreva o Nome da Fruta 1

---

 

Mas como eu quero usar o Gotoxy  para criar uma tabela que pule 2 linhas para baixo 

o M ou o N tem de estar em 3  (só  sei fazer assim)

 

na parte 

 

FOR M:= 3 TO 7 DO
  BEGIN
  Gotoxy(3,M);
    FOR N:= 1 TO 6 DO
    BEGIN
    Gotoxy(3,N);
      Writeln ('',Fruta[M,N]);
    END;
  END;

 

Se eu substituir M:= 1 to 4 do

 

ele vai colocar o texto dentro do outro texto em 

 

 WriteLn('AMOSTRAGEM DA TABELA');
  gotoxy(3,2 );
  WriteLn('FRUTA');
  gotoxy(9,2 );
  WriteLn('VALOR');
  for i := 3 to 7 do
  begin
    gotoxy( 8, i );
    Writeln('|');
  end;

 

O que eu quero saber é  como usar o Gotoxy no for do tipo conte de [1..4] a partir da linha 3. 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

Resumidamente:

- As coordenadas do array são independentes das coordenadas do GotoXY();

- Faz mais sentido organizar o array normalmente e calcular a posição desejada a partir da posição (no array)... no seu código, você meio que está ajustando o array para que tenha um valor bom para o GotoXY(), percebe a diferença? é as coordenas do GotoXY que devem se ajustar ao array...! (essa correção entre uma coisa e outra é da necessidade do problema, não um requisito do Pascal. Como a cada posição vou imprimir uma posição correspondente, poderia "calcular" onde cada um vai ser impresso de acordo com a tal posição no array)

 

 

Ex.:

  for Y:=1 to 4 do
    for X:=1 to 4 do
      begin
      GotoXY(X*10,Y*3); //X=coluna, Y=linha (ou seja, a cada 10 colunas e 3 linhas)
      writeln('a',X,Y); 
      end;

 

 

Outra forma de dar espaçamento é com o "comando de formatação"... acho que o exemplo abaixo será autoexplicativo:

 

  for Y:=1 to 4 do //para cada linha
    begin
    GotoXY(5,Y*4); //começa  na coluna 5, pulando de 4 em 4 linhas
    for X:=1 to 4 do //para cada coluna
      write('Blablabla':15); //<variavel>:xxx ou <texto>:xxx  =  Esse "xxx" é quantidade de caracteres reservados a esquerda (insere espaços até que a variavel ou texto ocupe X espaços
    end;
  writeln;
  readln;

 

 

No aguardo.

 

 

Link para o comentário
Compartilhar em outros sites

Obrigado, resolvi o problema, ai esta o código como eu precisava.

 

PROGRAM MultMatriz;
USES CRT;
VAR
Fruta: ARRAY [1..4,1..4] OF String;
Valor: ARRAY [1..4,1..4] OF integer;

M,N,i, Soma: INTEGER;
BEGIN
  
  FOR M:= 1 TO 4 DO
  BEGIN
    FOR N:= 1 TO 1 DO
    WRITE ('Escreva o Nome da Fruta ', M,': ');
    READLN (Fruta[M,N]);
  END;
  CLRSCR;
  FOR M:= 1 TO 4 DO
  BEGIN
    FOR N:= 1 TO 1 DO
    WRITE ('Escreva o Valor da Fruta ', Fruta[M,N],': ');
    READLN (Valor[M,N]);
  END;
  
  CLRSCR;
  WriteLn('AMOSTRAGEM DA TABELA');
  gotoxy(3,2 );
  WriteLn('FRUTA');
  gotoxy(11,2 );
  WriteLn('VALOR');
  for i := 1 to 5 do
  begin
    gotoxy( 9, i + 2 );
    Writeln('|');
  end;
  for i := 1 to 5 do
  begin
    gotoxy( 1, i + 2 );
    Writeln('|');
  end;
  for i := 1 to 5 do
  begin
    gotoxy( 20, i + 2 );
    Writeln('|');
  end;
  gotoxy(1,7);
  Writeln('---------------------
	');
  
  FOR M:= 1 TO 4 DO
  BEGIN
    FOR N:= 1 TO 1 DO
    BEGIN
      Gotoxy(3, M +2 );
      Writeln (Fruta[M,N]);
    END;
  END;
  
  FOR M:= 1 TO 4 DO
  BEGIN
    
    FOR N:= 1 TO 4 DO
    BEGIN
      Gotoxy(11,M + 2 );
      Writeln ('R$ ',Valor[M,N]);
    END;
  END;
  
  
  
End.

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Ola @Augusto G rocha.

 

 

1) Tamanho do array

 

4 horas atrás, Augusto G rocha disse:

VAR
Fruta: ARRAY [1..4,1..4] OF String;
Valor: ARRAY [1..4,1..4] OF integer;

 

Você declarou uma Matriz 4x4, ou seja, com 16 Frutas... mas ele pede uma com 4 Frutas.

Perceba que o primeiro 1..4 se refere a primeira coordenada. Numa matriz matemática seria o "i". O segundo 1..4, que vem depois da vírgula, representaria o "j". Como de 1..4 são 4 posições, teríamos 4 para o "i", 4 para o "j". (uma matriz quadrada de ordem 4).

 

Para o seu contexto, com um total de 4 posições, só existe 3 possibilidades: a Matriz será 4x1 ou 2x2 ou 1x4.

A declaração poderia ficar assim:

[1..4,1..1]
ou
[1..2,1..2]
ou
[1..1,1..4]

 

 

2) Uso do array

 

4 horas atrás, Augusto G rocha disse:

  FOR M:= 1 TO 4 DO
  BEGIN
    FOR N:= 1 TO 1 DO
    WRITE ('Escreva o Nome da Fruta ', M,': ');
    READLN (Fruta[M,N]);
  END;

 

Apesar de ter 16 posições, você está usando apenas 4... ou seja, teríamos um desperdício (de certo modo está relacionado ao item 1).

Outra coisa, existe um pequeno erro de lógica no trecho... veja, apesar ter ter o mesmo efeito, a estrutura do for está incompleta. Uma mais correto seria:
 

  FOR M:= 1 TO 4 DO
  BEGIN
    FOR N:= 1 TO 1 DO
    BEGIN
      WRITE ('Escreva o Nome da Fruta ', M,': ');
      READLN (Fruta[M,N]);
    END
  END;

Não entendeu a diferença?

Veja como ficaria o trecho do seu código com a identação correta:
 

  FOR M:= 1 TO 4 DO
  BEGIN
    FOR N:= 1 TO 1 DO
      WRITE ('Escreva o Nome da Fruta ', M,': '); //apenas essa linha está dentro do FOR
    READLN (Fruta[M,N]);
  END;

ATENÇÃO: A identação não influencia na execução, é apenas visual! Para o Pascal, esse código acima e o seu são idênticos.

 

 

3) Exibição dos resultados

 

  FOR M:= 1 TO 4 DO
  BEGIN
    
    FOR N:= 1 TO 4 DO
    BEGIN
      Gotoxy(11,M + 2 );
      Writeln ('R$ ',Valor[M,N]);
    END;
  END;

Aqui está exibindo coisa a mais... está como se fosse uma matriz 4x4... e o resultado não está saindo corretamente na tela.

 

 

 

4) Escolha da matrizes

Apesar das 3 possibilidades que sugeri serem matrizes, creio que faça mais sentido usar uma matriz 2x2... pois as 1x4 e 4x1 são "matrizes linha", ou seja, só uma coordenada varia.... em fim. sugiro que use uma matriz 2x2. Ex.:

VAR
  Fruta: ARRAY [1..2,1..2] OF String;
  Valor: ARRAY [1..2,1..2] OF Integer;

Obs.: numa matriz 4x1, só precisaria de um for... bastaria usar "READLN (Valor[M,1])"... (mas como disse: use uma matriz 2x2)

 

 

***

 

No aguardo.

 

 

Link para o comentário
Compartilhar em outros sites

Fiz as modificações que você  falou, mas coloquei o contador 4x1 pois a contagem não saia correta no 2x2. mas eu entendi o conceito. teria sido mais fácil usar um vetor para fazer isso, mas o objetivo do exercício era o uso de matrizes.

 

PROGRAM MultMatriz;
USES CRT;
VAR
Fruta: ARRAY [1..4,1..1] OF String;
Valor: ARRAY [1..4,1..1] OF integer;

M,N,i, Soma: INTEGER;

BEGIN
  //----------------------------------------------
  FOR M:= 1 TO 4 DO
  BEGIN
    FOR N:= 1 TO 1 DO
    begin
      WRITE ('Escreva o Nome da Fruta ', M,': ');
      READLN (Fruta[M,N]);
    end;
  end;
  //----------------------------------------------
  CLRSCR;
  FOR M:= 1 TO 4 DO
  BEGIN
    FOR N:= 1 TO 1 DO
    begin
      WRITE ('Escreva o Valor da Fruta ', Fruta[M,N],': ');
      READLN (Valor[M,N]);
    end;
  END;
  //----------------------------------------------
  CLRSCR;
  WriteLn('AMOSTRAGEM DA TABELA');
  
  gotoxy(3,2 );
  WriteLn('FRUTA');
  
  gotoxy(11,2 );
  WriteLn('VALOR');
  
  //----------------------------------------------
  for i := 1 to 5 do
  begin
    gotoxy( 9, i + 2 );
    Writeln('|');
  end;
  
  
  for i := 1 to 5 do
  begin
    gotoxy( 1, i + 2 );
    Writeln('|');
  end;
  
  for i := 1 to 5 do
  begin
    gotoxy( 20, i + 2 );
    Writeln('|');
  end;
  
  
  gotoxy(1,7);
  Writeln('---------------------
  ');
  //----------------------------------------------
  FOR M:= 1 TO 4 DO
  BEGIN
    FOR N:= 1 TO 1 DO
    BEGIN
      Gotoxy(3, M +2 );
      Writeln (Fruta[M,N]);
    END;
  END;
  
  FOR M:= 1 TO 4 DO
  BEGIN
    FOR N:= 1 TO 1 DO
    BEGIN
      Gotoxy(11,M + 2 );
      Writeln ('R$ ',Valor[M,N]);
    END;
  END;
  //----------------------------------------------
  
  
End.

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

1) Em relação ao seu código, 2 pontos:

1) dê mais espaço para fruta na hora de exibir;

2) use números em real para os valores.

 

2) Em relação ao tamanho da matriz

Continuo achando que você deve usar uma matriz 2x2. Essa dificuldade para ajustar o código é normal... e isso que é o interessante. Um objetivo da disciplina é justamente estimular o raciocínio. Outro ponto interessante é que o desenvolvimento para descobrir soluções é reaproveitado, e acredite, é usado no dia dia.

 

**

Minha sugestão:

- ajuste os pequenos detalhes do seu código e deixe "pronto";

- copie o código e tente fazer com uma matriz 2x2. Vá fazendo teste e tente ir corrigindo. Após posta aqui o que conseguiu fazer e onde está com dúvidas.

 

 

 

Observações: acho que você deveria evitar textos em MAIÚSCULO. É visualmente estranho e cansativo.

 

Abaixo seu código em minúsculo e com alguns ajustes de identação (meu padrão é um pouco diferente)

 

program MultMatriz;
uses
  CRT;
var
  fruta: array [1..4,1..1] of string;
  valor: array [1..4,1..1] of integer;
  m,n,i, soma: integer;
begin
//----------------------------------------------
for m:= 1 to 4 do
  begin
  for n:= 1 to 1 do
    begin
    write  ('Escreva o nome da fruta ',m,': ');
    readln(fruta[m,n]);
    end;
  end;
//----------------------------------------------
ClrScr;
for m:= 1 to 4 do
  begin
  for n:= 1 to 1 do
    begin
    write  ('escreva o valor da fruta ', fruta[m,n],': ');
    readln(valor[m,n]);
    end;
  end;
//----------------------------------------------
ClrScr;
writeln('Amostragem da tabela');
GotoXY(3,2);  writeln('Fruta');
GotoXY(11,2); writeln('valor');
//----------------------------------------------
for i := 1 to 5 do
  begin
  GotoXY(9,i+2); writeln('|');
  end;
for i := 1 to 5 do
  begin
  GotoXY(1,i+2); writeln('|');
  end;
for i := 1 to 5 do
  begin
  GotoXY(20,i+2); writeln('|');
  end;
GotoXY(1,7); writeln('---------------------');
//----------------------------------------------
for m:= 1 to 4 do
  begin
  for n:= 1 to 1 do
    begin
    GotoXY(3,m+2); writeln(fruta[m,n]);
    end;
  end;
for m:= 1 to 4 do
  begin
  for n:= 1 to 1 do
    begin
    GotoXY(16,m+2); writeln ('R$ ',valor[m,n]);
    end;
  end;
//----------------------------------------------
END.

 

Veja, existem basicamente 3 bases de identação:

1) como a sua, onde colocar o begin/end na mesma direção da instrução que corresponde;

2) como a "padrão", onde fica identado em relação a instrução, e o que está dentro do begin/end também fica identado;

3) como a "minha", onde idento o begin/end, mas não idento para o que está dentro. (ganho um dente de espaço e facilita quando precisa remover ou adicionar um begin/end)

 

VEJA: a principal sugestão aqui é evitar usar maiúscula, o padrão de identação cada um pode usar o seu, mas que fique claro que existe um e que está se seguindo, ou seja, coerente.

 

No aguardo.

 

 

adicionado 5 minutos depois

Ah! veja que alguns comandos subiram e ficaram no lado do GotoXY(), não é uma questão de padrão, é apenas uma sugestão para tentar ainda mais organizar o código. Tem lá as suas vantagens... especialmente em códigos maiores..

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...