Fonction MaCle " AIDE MOI :p "

Résolu
Signaler
Messages postés
18
Date d'inscription
vendredi 9 juin 2006
Statut
Membre
Dernière intervention
25 août 2008
-
Messages postés
1727
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
6 novembre 2021
-
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

Messages postés
436
Date d'inscription
vendredi 7 novembre 2003
Statut
Membre
Dernière intervention
8 octobre 2008
5
Bonjour,
chf8 = Val(Mid(numero, 1, 1))

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

Dom
Messages postés
1727
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
6 novembre 2021
8
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 ?
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
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 ?
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
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 !

++
Messages postés
1727
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
6 novembre 2021
8
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 +