Ir ao conteúdo
  • Cadastre-se

Pascal/Delphi Matriz - Ponto de Sela


Posts recomendados

Olá pessoal, alguém poderia dar uma ajuda nesse exercicio? Preciso fazer um programa que carrega uma matriz 5x7 e mostrar o ponto de sela. Eu fiz esse código, porém sem resultado.

Program Pzim;
 var m: array [1..5, 1..7] of integer;
 i, j, menor, maior, linha, coluna: integer ;
Begin
for i:=1 to 5 do                       
 begin
  for j:= 1 to 7 do
	 begin
	  write ('Preencha a linha/coluna [',i,',',j,']:');
	  read (m[i,j]);
	  
	 end;
 end;
  
//Descobrir a coluna de menor valor 
 menor:= m[1,1];
  coluna:= 1;
   for j:= 1 to 7 do
    begin
     if m[i,j] < menor 
	    then begin
	    menor:= m[i,j];
	    coluna:= j;
	   end;
	  end;
	  writeln (menor);
	 
//descobrir a linha de maior valor	
maior:= m[1,coluna];
linha:= 1;
	for i:= 1 to 5 do
	  begin
		 for j:= 1 to 7 do 
	   begin
	   if m [i,coluna] > maior
	    then begin
	     maior:= m[i,coluna];
	     linha:= i;
	  end;
	end;
	end;
	writeln (maior);
	 
	 writeln ('Matriz resultante: ');
    for i:= 1 to 5 do
     begin
      for j:= 1 to 7 do
       begin
        write(m[i,j], '  ');
       end;
			 writeln;
			end;

 if maior = menor
  then
   writeln (' O ponto de sela está na posição [' ,linha, coluna,']')
    else 
	   writeln (' Não há ponto de sela ');
readkey;

  
End.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

1# Não use read(), use somente readln()

O read() pode trazer problema. Apenas sempre use readln().

 

 

 

2# Sempre mantenha o código identado

 

Exemplo:

{$CODEPAGE UTF8} //Uma forma de tentar conseguir imprimir palavras acentuadas
program Pzim;
uses
  CRT; //Não necessário no PZim
var
  m: array [1..5, 1..7] of integer;
  i, j,
  menor, maior,
  linha, coluna: integer;
begin
  for i:=1 to 5 do                       
  begin
    for j:= 1 to 7 do
    begin
      write ('Preencha a linha/coluna [',i,',',j,']:');
      readln(m[i,j]);	  
    end;
  end;
  
  //Descobrir a coluna de menor valor 
  menor := m[1,1];
  coluna := 1;
  for j:= 1 to 7 do
  begin
    if m[i,j] < menor then
    begin
      menor := m[i,j];
      coluna := j;
    end;
  end;
  writeln(menor);

  //Descobrir a linha de maior valor	
  maior := m[1,coluna];
  linha := 1;
  for i:= 1 to 5 do
  begin
    for j:= 1 to 7 do 
    begin
      if m [i,coluna] > maior then
      begin
        maior:= m[i,coluna];
        linha:= i;
      end;
    end;
  end;
  writeln (maior);

  writeln ('Matriz resultante: ');
  for i:= 1 to 5 do
  begin
    for j:= 1 to 7 do
    begin
      write(m[i,j], '  ');
    end;
    writeln;
  end;

  if maior = menor then
    writeln (' O ponto de sela está na posição [' ,linha, coluna,']')
  else 
    writeln (' Não há ponto de sela ');
  ReadKey;
end.

 

 

 

3# Defina uma matriz fixa

É muito chato ter que ficar preenchendo 35 valores a cada testes. Coloque para gerar valores aleatórios (pesquise no Google) ou defina valores fixos (pesquise no Google). Como é um pouco chato de achar, vai um exemplo:

var
  m: array [1..5, 1..7] of integer = (( 1, 2, 3, 4, 5, 6, 7),
                                      ( 8, 9,10,11,12,13,14),
                                      (15,16,17,18,19,20,21),
                                      (22,23,24,25,26,27,28),
                                      (29,30,31,32,33,34,35));
  i, j,
  menor, maior,
  linha, coluna: integer;
begin

  for i:=1 to 5 do                       
  begin
    for j:= 1 to 7 do
    begin
      write ('Preencha a linha/coluna [',i,',',j,']:');
      //readln(m[i,j]);
      writeln(m[i,j]);
    end;
  end;

 

Ali na declaração da matriz, insira os dados de uma matriz conhecida, ou seja: que já sabe qual é o tal valor de ponto de sela. Após, tente analisar o que está acontecendo com o código e corrija até sair a resposta certa para essa matriz (não precisa ficar mudando ela). Só mais a frente para para colocar para gerar valores aleatórios e compara o resultado do programa com o resultado real... no final, deixa gerando automático mesmo ou coloca para ler do usuário.

 

 

Qualquer dúvida é só perguntar... mas antes tente entender o que está ocorrendo. Faça testes. Tente ver o que está dando errado. Pesquise no Google... se persistir, descreve o que está ocorrendo e o que não conseguiu descobrir como contornar...

 

No aguardo

 

Link para o comentário
Compartilhar em outros sites

@Simon Viegas Boa noite, Simon. Então... eu procurei praticamente a tarde inteira hoje sobre esse assunto no google e não consegui resolver o exercicio. Testei uma matriz que era pra dar um ponto de sela:

1   2   3    4   5   6   7

2   3   4    5   6   7   8

13 14 15 10 15 14 13

4    5    6   7   8   9  10

5    6    7    8   9   10  11

O ponto de sela deveria estar na linha 3, coluna 4.

Vi algumas resoluções em C, estavam bem parecida com essa que eu fiz em pascal. Porém não consegui, tem alguma dica onde posso estar errando?

Link para o comentário
Compartilhar em outros sites

@Simon Viegas Esse é meu código, a minha dúvida é saber porque não está mostrando o ponto de sela, fiz refiz esse código e não vejo erro algum, sabe me dizer se é algum erro de lógica? 

Program Pzim;
 var m: array [1..5, 1..7] of integer;
 i, j, menor, maior, linha, coluna, cont: integer;
 
Begin
for i:=1 to 5 do                       
 begin
  for j:= 1 to 7 do
	 begin
	  write ('Preencha a linha/coluna [',i,',',j,']:');
	  readln (m[i,j]);
	 end;
 end;
  
//Descobrir a linha de menor valor 
 menor:= m[1,1];
  linha:= 1;
  for i:= 1 to 5 do 
  begin
   for j:= 1 to 7 do
    begin
     if m[i,j] < menor 
	    then begin
	    menor:= m[i,j];
	    linha:= i;
	   end;
	  end;
	end;
	  writeln (menor);
	 
//descobrir a coluna de maior valor	
maior:= m[1,1];
coluna:= 1;
	for i:= 1 to 7 do
	  begin
	   for j:= 1 to 5 do 
	   begin
	   if m[j,i] > maior
	    then begin
	     maior:= m[j,i];
	     coluna:= i;
	    end;
	   end;
	  end;
	writeln (maior);
	 
	 cont:= 0 ;
	 for i:= 1 to 5 do
	  begin
	   for j:=  1 to 7 do
	    begin
	     if menor = maior then
	     writeln ('Linha ', linha, ' coluna ', coluna,' numero ', menor);
	     cont := cont + 1;
	    end;
	  end;
	     
	     if cont = 0
	     then writeln ('não há ponto de sela');
readkey;

  
End.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP
1 hora atrás, Braga03 disse:

@Simon Viegas Esse é meu código, a minha dúvida é saber porque não está mostrando o ponto de sela, fiz refiz esse código e não vejo erro algum, sabe me dizer se é algum erro de lógica? 

 

Como sugerido na minha postagem anterior, utilize uma matriz fixa... é meio suspeito ter que ficar digitando 35 valores para cada teste. Por favor, faça isso!!! (Ou me diga que não quer fazer. Não precisa nem explicar o motivo.)

 

 

Sobre encontrar o ponto de sela:

  • o que é um ponto de sela?
  • o que é necessário fazer para encontrar o tal ponto de sela?

 

Primeiramente é necessário entender o problema! Isso é fundamental.

 

Então, vamos analisar o que tem no código:

 

Sobre:

1 hora atrás, Braga03 disse:

  //Descobrir a linha de menor valor 
  menor := m[1,1];
  linha := 1;
  for i:= 1 to 5 do 
  begin
    for j:= 1 to 7 do
    begin
      if m[i,j] < menor then
      begin
        menor := m[i,j];
        linha := i;
      end;
    end;
  end;
  writeln(menor);

 

O que significa "Descobrir a linha de menor valor"? No caso, o que seria "menor valor" para esse contexto? A frase me pareceu confusa.

 

Mas analisando o código, suponho que você está tentando descobrir o menor valor da matriz e a linha onde ela se encontra.

 

 

Sobre:

1 hora atrás, Braga03 disse:

  //descobrir a coluna de maior valor	
  maior := m[1,1];
  coluna:= 1;
  for i:= 1 to 7 do
  begin
    for j:= 1 to 5 do 
    begin
      if m[j,i] > maior then
        begin
        maior:= m[j,i];
        coluna:= i;
        end;
    end;
  end;
  writeln(maior);

 

O que significa "Descobrir a coluna de maior valor"? O que seria "maior valor" para esse contexto? A frase me pareceu confusa.

 

Mas analisando o código, suponho que você está tentando descobrir o maior valor da matriz e a coluna onde ela se encontra.

 

 

Então, é isso que você precisa? De qualquer forma, uma forma de analisar os valores encontrados é exibi-los na tela. Algo como:

  1. exiba a matriz na tela para ter uma referência melhor;
  2. exiba os valores encontrados em cada etapa, ex.:
        writeln('Menor :', menor);
        writeln('Linha :', linha);

    e

        writeln('Maior :', maior);
        writeln('Coluna:', coluna);
  3. Compara os valores apresentados com os valores da matriz.

Daí, você terá já uma referência que o problema não está em uma dessas etapas.

 

 

Sobre:

1 hora atrás, Braga03 disse:

    cont:= 0 ;
    for i:= 1 to 5 do
    begin
      for j:=  1 to 7 do
      begin
        if menor = maior then
        writeln ('Linha ', linha, ' coluna ', coluna,' numero ', menor);
        cont := cont + 1;
      end;
    end;

 

Analisando o código, você está comparando 35 vezes a mesma coisa!!! O valor de menor e maior são sempre iguai, logo sempre, OU vão ser 35 vezes iguais, OU vão ser 35 vezes diferentes.

 

 

 

CONCLUSÃO:

Primeiro entenda (mais ou menos) o que é um ponto de sela. Após vem o principal: saiba como encontrar um ponto de sela. Você precisa ter em mente um "algoritmo" (não confundir com "código") que consiga encontrar o tal ponto de cela.

 

Por exemplo: esqueça o Pascal... Imagine que é uma questão de uma prova, daquelas de papel mesmo... precisa responder no papel ou caneta.

 

Lá tem essa matriz:

     1  2  3  4  5  6  7
    
     2  3  4  5  6  7  8
    
    13 14 15 10 15 24 13
    
     4  5  6  7  8  9 10
    
     5  6  7  8  9 10 11


    Qual é a localização do ponto de cela?

     

    Você já disse:

    14 horas atrás, Braga03 disse:

    O ponto de sela deveria estar na linha 3, coluna 4.

     

    De onde tirou essa informação? Então: tomando que a resposta está certa, você precisa entender como foi feito para descobrir ela.

     

    Faça isso.. imagine que você não sabe a resposta acima!!! Escreva a matriz no papel e aplique uma lógica com o que você já entende o que seja um ponto de cela e o que já entende de como é feito para encontrar a resposta!! Dando tudo certo. Tente com outra matriz que você também já saiba a resposta e veja se dar certo.

     

    Adianto que verás que simplesmente "encontrar o menor e o maior valor da matriz" não será suficiente.

     

     

    RESUMINDO:

    Primeiro entenda o problema e entenda um fluxo para encontrar uma resposta para ela. Esqueça o Pascal por enquanto. Descreva como você fez para encontrar a resposta correta!! Caso tenha NÃO tenha conseguido entender como, posta aqui no tópico o que você entendeu que é para ser feito ou em que parte está com dúvidas. A sugestão é NÃO TENTAR REFAZER NO PASCAL, pois não fará sentido!! Perceba: se eventualmente ainda não entendeu o que é para ser feito, como seria capaz de transcrever para uma linguagem de programação?

     

    Consiga lá primeiro resolver no papel*... após, qualquer coisa, ajudamos a traduzir uma lógica para Pascal.

     

    No aguardo.

     

    • Curtir 1
    Link para o comentário
    Compartilhar em outros sites

    @Simon Viegas Olá Simon, então eu estava usando aquela matriz onde tem o ponto de sela no 10 como a matriz fixa para testar.

    Agora com a sua explicação acho que achei o erro, no caso eu tenho que procurar o menor elemento da linha e o maior da coluna, eu estava fazendo o menor elemento da matriz e o maior... Obrigado pela explicação, tentarei fazer novamente seguindo os passos!

    • Curtir 1
    Link para o comentário
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisa ser um usuário para fazer um comentário

    Criar uma conta

    Crie uma nova conta em nossa comunidade. É fácil!

    Crie uma nova conta

    Entrar

    Já tem uma conta? Faça o login.

    Entrar agora

    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...