Ir para conteúdo
Fórum Script Brasil
  • 0

[resolvido] Ajuda Com Matriz


Guest Visitante

Pergunta

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 para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros 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 ;)

Editado por Xistyle
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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

Editado por Xistyle
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652,1k
×
×
  • Criar Novo...