Delphi combinaçoes - ninguem resolve e muito dificil

09/12/2003

0

tenho um txt no seguinte formato

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 16
1 2 3 4 5 6 7 8 9 10 11 12 13 14 17
1 2 3 4 5 6 7 8 9 10 11 12 13 14 18

são linhas contendo apenas 15 numeros por linhas.

gostaria de uma ajuda, quero ler este txt do seguinte modo, tenho uma combo com os seguintes itens
7p e 8i
8p e 7i
quando eu selecionar a 1 opção 7p e 8i quero que ele leia o txt e selecione apenas as linhas que existem 7 numeros pares e 8 impares e jogue esta linha em um memo.
Alguem pode me ajudar?

Snipes


Snipes

Snipes

Responder

Posts

09/12/2003

Tnaires

Olá snipes

Eu não sei como puxar essas linhas do arquivo, pois nunca trabalhei com arquivos texto no delphi. Mas o complicado mesmo é implementar essa busca por pares e ímpares.
Tente o seguinte código:
procedure ParesImpares (linha: string);
  var token: string;  // Conterá o número no formato string
       npares, nimpares, i: integer;  // Para armazenar a qtd de números
begin
  // Inicializando variáveis...
  npares := 0;
  nimpares := 0;
  token := ´´;
  for i := 1 to Length(linha) do
  begin
    if linha[i] <> ´ ´ then          // Se o caractere atual não for espaço...
      token := token + linha[i]  // Acrescente o caractere ao token
    else
    begin
      if StrToInt(token) mod 2 = 0 then  // Se for par...
        Inc(npares)                             // Incremente qtd de números pares
      else                                         // Se for ímpar...
        Inc(nimpares);                         // Incremente qtd de números ímpares
      token := ´´;                                // Reinicializar token
    end;
  end;
  // O if abaixo só adiciona a linha ao memo se a opção escolhida
  //    corresponder ao número de pares e ímpares correspondente.
  if ((npares = 8) and (nimpares = 7) and (opcao8p7i.Checked)) or
     ((npares = 7) and (nimpares = 8) and (opcao7p8i.Checked)) then
    Memo1.Lines.Add(linha);
end;
  

Supondo que a opção seja determinada por dois checkboxes de nomes respectivos opcao8p7i e opcao7p8i.
He he... Deve haver maneira mais simples... Sucesso...


Responder

09/12/2003

Deus

Acho que essa coisa de ´ninguém resolve´ é pq ninguém tentou com muita paciência, não? :) Pq não é difícil de jeito nenhum. Meu computador está quebrado, e estou usando o da minha irmã - sem Delphi - logo, este código que vou colocar aqui [b:a66262dc6c]não[/b:a66262dc6c] foi testado por mim, ou seja.. é possível, claro, que dê um erro de compilação ou que não faça a tarefa, mas acho difícil - e, se for o caso, o problema é mínimo. :) De qualquer forma:

fuction stRetornaLinhas(sArq: String; iPares, iImpares: Integer): TStringList;

  function stRetornaTexto(sArquivo: String): TStringList;
  var
    tfTexto: TextFile;
    stTexto: TStringList;
      stTmp: String;
  begin
    stTexto := TStringList.Create;

    try
      AssignFile(tfTexto, sArquivo);
      Reset(tfTexto);

      while not Eof(tfTexto) do
      begin
        ReadLn(tfTexto, stTmp);
        stTexto.Add(Trim(stTmp));
      end;
    except
    end;

    Result := stTexto;
  end;

var
               stTemp: String;
    stlTemp, stlTexto: TStringList;
  i, iiCount, ipCount: Integer;
begin
  stlTexto := TStringList.Create;
  stlTemp  := TStringList.Create;
  stlTemp  := sRetornaTexto(sArq);

  for i := 0 to Pred(stlTexto.Count) do
  begin
    iiCount := 0;
    ipCount := 0;

    stTemp := stlTexto.Strings[i];
    while (Pos(´ ´, stTemp) > 0) do
    begin
      if ((StrToInt(Trim(Copy(stTemp, 1, Pos(´ ´, stTemp))))) mod 2 = 0) then
        inc(ipCount)
      else
        inc(iiCount);

      Delete(stTemp, 1, Pos(´ ´, stTemp));
    end;

    if (iPares = ipCount) and (iImpares = iiCount) then
    begin
     stTemp := stlTemp.Strings[i];
     stlTexto.Add(stTemp);
    end;
  end;

  Result := stlTexto;
end;


Bem, se você quiser adicionar as linhas a um ComboBox, é só colocar o seguinte código no [i:a66262dc6c]OnClick[/i:a66262dc6c] do ComboBox:

Case ComboBox.ItemIndex of
  0: Memo1.Lines := RetornaLinhas(´C:\Teste.Txt´, 7, 8);
  1: Memo1.Lines := RetornaLinhas(´C:\Teste.Txt´, 8, 7);
end;


OK? Avise-me se funcionou, quero saber se meu compilador mental precisa de uns ajustes! ;) Abraços!


Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar