Jump to content
Fórum Script Brasil
  • 0

[resolvido] Ajuda Com Matriz


Guest Visitante

Question

Guest Visitante

Olá pessoal!

Não me inscrevi no fórum ainda mas pretendo, assim que possível ingressar a comunidade.

Estou com uma dúvida sobre como realizar a remoção de um elemento na matriz. Deixem-me explicar melhor.

Estou programando um cálculo de regressão linear em Delphi. Resolvi então, criar uma matriz de no máximo 50 colunas e 2 linhas.

As linhas receberão o valor de f(x) e x em suas respectivas coluna. Existe também o valor limite (número de pontos) que limita quantos valores

você irá inserir nas colunas.

Exemplo: se você digitar que terá 3 pontos, terá 3 valores para f(x) e 3 valores para x.

Existe então um botão para adicionar o valor do ponto atual em uma tabela (StringGrid). Porém, gostaria de criar um botão de remoção do último valor digitado.

Como poderia fazer que, ao clicar no botão remover, o programa entendesse onde está o último valor (linha e coluna) e assim pudesse apagá-lo, voltando assim à célula excluída para inserir um novo valor ?

Não sei se ficou muito claro mas agradeço a ajuda!

Abraços!

Link to comment
Share on other sites

9 answers to this question

Recommended Posts

  • 0
Olá pessoal!

Não me inscrevi no fórum ainda mas pretendo, assim que possível ingressar a comunidade.

Estou com uma dúvida sobre como realizar a remoção de um elemento na matriz. Deixem-me explicar melhor.

Estou programando um cálculo de regressão linear em Delphi. Resolvi então, criar uma matriz de no máximo 50 colunas e 2 linhas.

As linhas receberão o valor de f(x) e x em suas respectivas coluna. Existe também o valor limite (número de pontos) que limita quantos valores

você irá inserir nas colunas.

Exemplo: se você digitar que terá 3 pontos, terá 3 valores para f(x) e 3 valores para x.

Existe então um botão para adicionar o valor do ponto atual em uma tabela (StringGrid). Porém, gostaria de criar um botão de remoção do último valor digitado.

Como poderia fazer que, ao clicar no botão remover, o programa entendesse onde está o último valor (linha e coluna) e assim pudesse apagá-lo, voltando assim à célula excluída para inserir um novo valor ?

Não sei se ficou muito claro mas agradeço a ajuda!

Abraços!

bom dia companheiro.....sou novo no delphi mas entendo um pouco de matemática.

pelo que entendí você tem uma função f(x)= alguma coisa, onde você vai lançar os valore de 'x' para obter os de 'y' ( f(x) )....correto?

eu faria o sequinte......os elementos da matrix terão um contador 'i' que será a linha.

ex: matriz[i,x] e matriz[i,f(x)] onde i vai variar de 1 até 50 (max) ou o número de pontos que você desejar.

como você tem um contador i fica fácil deletar o último elemento....é só verificar em que valor de i se encontra e limpar esse elemento da matriz.

não sei se ajudou companheiro.

Link to comment
Share on other sites

  • 0

Olá amigo!

Eu postei a dúvida acima!

Obrigado por discutir o problema comigo ;D

Na verdade meu problema é o seguinte: criei uma matriz[50,4], onde o valor máximo de colunas é 50, podendo variar, de acordo com o número de pontos digitados (n). A linha 0 (inicial) é onde estão os rótulos de cada linha, por exemplo: na posição (0,0) está f(x) = y, na posição (0,1) está x, em (0,2) está a e em (0,3) b.

A regressão linear trata-se de encontrar os valores de a e b, através de cálculos que envolvem y e x. A resposta será dada em uma label que receberá o valor no formato f(x) = ax + b ou f(x) = ax - b (dependendo do valor de b ).

Supondo então, que o usuário deseja inserir 10 pontos (variável n). Então teremos 10 pontos para adicionar em y e 10 pontos para adicionar em x.

As linhas de a e b estarão estáticas pois somente receberão os valores dos cálculos posteriores.

Então aí vem a dúvida: se eu digitar o oitavo ponto da linha de x erroneamente, como faria para saber onde foi que parou a matriz e ainda por apagá-lo e assim inserir um novo valor ? Lembrando que o oitavo ponto foi usado somente como ilustração, podendo variar nas linhas 0 e 1 (respectivamente y e x) e no número de colunas digitado pelo usuário (n).

Agradeço a colaboração e as dicas. Vou pensar em usar um contador. Talvez possa ser útil para este tipo de problema. Caso alguém tenha mais alguma solução, ficarei grato em receber dicas ;D

Abraços ;)

Edited by Xistyle
Link to comment
Share on other sites

  • 0
Na verdade meu problema é o seguinte: criei uma matriz[50,4], onde o valor máximo de colunas é 50, podendo variar, de acordo com o número de pontos digitados (n). A linha 0 (inicial) é onde estão os rótulos de cada linha, por exemplo: na posição (0,0) está f(x) = y, na posição (0,1) está x, em (0,2) está a e em (0,3) b.
Xistyle, o fato de ser indicado o número de pontos "n" a serem entrados, não viabilizaria que você modificasse o tamanho de sua matriz dinamicamente?

Tipo, se o cara informa 10, então você a define com 10 colunas, se define 15, então você a redimensiona para 15. Este procedimento no StringGrid é realizado manipulando as propriedades RowCount (nº de linhas) e ColCount (nº de colunas).

É por aí sua dúvida?

Link to comment
Share on other sites

  • 0

Obrigado por ajudar Micheus ^_^

Bom tentarei explicar sem complicar muito.

Existe uma tabela de duas linhas e colunas que podem possuir até 50 valores. Para a coluna, será atribuido uma variável n que definirá o número de colunas total. Ou seja, se o usuário digitar 10 para n, teremos então 10 colunas.

Na linha 1 (usarei esta terminologia, sabendo que a inicial seria zero) serão digitados os valores para f(x) = y.

Na linha 2 serão digitados os valores para x.

Visualizando então: se você digitar um valor de n = 10 terá que digitar 20 valores então (10 para y e 10 para x).

O problema é, caso você digite o último valor para x errado, terá que limpar toda a tabela e digitar novamente os valores.

Gostaria então de criar um botão que localizaria a posição da matriz e pudesse apagar a anterior.

Utilizando então com o exemplo acima: se você errou o valor da posição 9,2 (coluna,linha) então sua matriz teria que reconhecer que estava ali, apagar este valor digitado erroneamente e focar para esta posição novamente, possibilitando que você insira um novo valor na posição 9,2.

Bom espero que esteja mais claro agora. É meio complicado mas de grande uso.

Obrigado mais uma vez por colaborarem com o tópico.

Abraços B)

Link to comment
Share on other sites

  • 0

Xistyle, acho que você poderia utilizar variáveis para guardar a posição Col,Lin e atualizá-la no evento OnSetEditText. Este evento ocorre após o usuário atualizar o conteúdo da célula do StringGrid. Daí, ao clicar no botão, você atribuiria estes valores às propriedades Row e Col para reposicionar na última célula digitada. Para acessar e apagar o conteúdo da célula seria através da propriedade Cells[Col, Row].

Acho que era isso. :unsure:

Link to comment
Share on other sites

  • 0

Solução interessante Micheus.

Pois o problema todo gira em torno de descobrir a posição da coluna,linha digitada erroneamente.

Obrigado pela dica ;D

Agora basta eu saber como fazer isso ^_^

PS: caso não postem mais sobre como fazer isso, peço que, por gentileza, alterem o nome do tópico como Resolvido para que outros com a mesma dúvida possam consultar este assunto.

Caso algum algoritmo ou código seja postado, o edit do título poderia ser feito depois ;D

Edited by Xistyle
Link to comment
Share on other sites

  • 0
Solução interessante Micheus.

Pois o problema todo gira em torno de descobrir a posição da coluna,linha digitada erroneamente.

Obrigado pela dica ;D

Agora basta eu saber como fazer isso ^_^

Desculpe a demora num retorno. A idéia seria basicamente a seguinte:

type
  TForm1 = class(TForm)
    ...
  private
    OldCol,
    OldRow :Integer;
    ...
  end;
...
implementation
...
// após a edição de uma célula, salvamos a posição (será a da última célula editada)
procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Longint; const Value: string)
begin
  OldCol := ACol;
  OldRow := ARow;
end;

// move o foco para a última célula editada
procedure TForm1.BtnUltimaCelulaEditada(Sender :TObject);
begin
  StringGrid1.Col := OldCol;  // posiciona na última coluna editada
  StringGrid1.Row := OldRow;  // posiciona na última linha editada
  StringGrid1.EditorMode := True;   // Coloca grid em modo de edição
end;

É conveniente que você inicialize as variáveis (no momento mais conveniente - talvez a cada vez que o cara definir uma nova função), por ex. com -1 e antes de mover o foco, você testa este valor para saber se é válido ou não.

Link to comment
Share on other sites

  • 0

Obrigado pela ajuda Micheus!

Agradeço seu tempo por ter me ajudado!

Pesquisei um pouco mais sobre algoritmos para esta função que queria e também achei coisas interessantes.

Como o tópico fui eu quem criou (como Visitante), peço que, se possível, possam editar o nome do tópico com resolvido, para organizar melhor o fórum e para que outros que tenham a mesma dúvida possam se apoiar nesta!

Abraços ;D

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.1k
    • Total Posts
      651.9k
×
×
  • Create New...