Fonction MaCle " AIDE MOI :p "

Résolu
cs_H4MZA Messages postés 18 Date d'inscription vendredi 9 juin 2006 Statut Membre Dernière intervention 25 août 2008 - 7 juin 2007 à 11:21
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 - 7 juin 2007 à 13:30
je c'est que je pose trop de question , mais je suis vraiment un type sympa lol et j'aime bcp mon cartier sur le net CODES-SOURCES alors ;
je veut traduire ce code vers DelPhI :
Function MaCle(numero)<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>

numero = Trim(numero)

numero = Format(numero, "00000000") // Quaque Personne a un User Numéro c le 8zero

 // je veut juste savoir comment faire sa

chf8 = Val(Mid(numero, 1, 1))

chf7 = Val(Mid(numero, 2, 1))

chf6 = Val(Mid(numero, 3, 1))

chf5 = Val(Mid(numero, 4, 1))

chf4 = Val(Mid(numero, 5, 1))

chf3 = Val(Mid(numero, 6, 1))

chf2 = Val(Mid(numero, 7, 1))

chf1 = Val(Mid(numero, 8, 1))

 // et pour le reste tkt jé étudier 1peu les mathématique

cle = (chf1 * 4) + (chf2 * 5) + (chf3 * 6) + (chf4 * 7) + (chf5 * 8) + (chf6 * 9) + (chf7 * 10) + (chf8 * 11)

 

If cle >= 100 Then

cle = cle - (Int(cle / 100)) * 100

End If

MaCle = cle

End Function

Merci
ScRiPtOmEn

5 réponses

dominique.stock Messages postés 436 Date d'inscription vendredi 7 novembre 2003 Statut Membre Dernière intervention 8 octobre 2008 7
7 juin 2007 à 11:49
Bonjour,
chf8 = Val(Mid(numero, 1, 1))

chf8:= strtoint(copy(numero,1,1));

Dom
3
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
7 juin 2007 à 12:03
Bonjour (je suis un type sympa qui dit bonjour).

Si j'ai bien compris, ça pourrait donner ça en delphi :

function GetKey(const S: string): Integer;
var
  i: Integer;
begin
  Result := 0;
  if (Length(S) <> 8) or (StrToIntDef(S, -1) = -1) then Exit;
  for i := 1 to 8 do
    Inc(Result, (StrToInt(S[i]) * i + 3));
end;

que tu peux tester ainsi avec 2 Edit et 1 Button :

procedure TForm1.Button1Click(Sender: TObject);
var
  Cle: Integer;
  Saisi: string;
begin
  Saisi := Edit1.Text;
  Cle := GetKey(Saisi);
  Edit2.Text := IntToStr(Cle);
end;

Simple et amusant à faire, non ?
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 2
7 juin 2007 à 12:16
Salut ! (je suis aussi un type sympa qui dit bonjour !)

Très bonne optimisation japee par rapport à la version originale de la fonction.
Mais ne faudrait-il pas faire Inc(Result, (StrToInt(S[i]) * (i + 3))) pour que le résultat obtenu corresponde à la fonction ?
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 2
7 juin 2007 à 12:29
Tiens, en poussant l'optimisation au maximum, j'arrive à ça :

<hr size="2" width="100%" />function GetKey(S: string): Integer;
const
  CNum: array['0'..'9'] of Integer = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
var
  I: Integer;
begin
  Result := 0;
  S := Trim(S);
  if Length(S) <> 8 then
  begin
    Result := -1;
    Exit;
  end;
  for I := 1 to 8 do
    if S[I] in ['0'..'9'] then
      Inc(Result, CNum[S[I]] * (I + 3))
    else
    begin
      Result := -1;
      Exit;
    end;
end;
<hr size="2" width="100%" />
C'est beaucoup plus rapide car il n'y a aucun appel à StrToInt. De plus, la valeur renvoyé en cas d'erreur de la chaine est -1 et non pas 0. Enfin, j'effectue un Trim sur la chaine comme la fonction originale !

++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
7 juin 2007 à 13:30
Salut Florenth,

Oui, bien vue l'erreur dans la priorité des opérations.
Résultat -1 je voulais faire, puis j'ai hésité, puis supprimé...
Donc je la refais, c'est trop laid :

function GetKey(const S: string): Integer;
var
  i: Integer;
begin
  Result := -1;
  if (Length(S) <> 8) or (StrToIntDef(S, -1) = -1) then Exit;
  Result := 0;
  for i := 1 to 8 do
    Inc(Result, (StrToInt(S[i]) * (i + 3)));
end;

(correction d'une erreur décelée par Florenth)

Ta version est plus aboutie, moi c'est celle que j'aurais validée...

A +
0
Rejoignez-nous