cs_H4MZA
Messages postés18Date d'inscriptionvendredi 9 juin 2006StatutMembreDernière intervention25 août 2008
-
7 juin 2007 à 11:21
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDerniè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
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 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;
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 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 ?
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 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 !
++
Vous n’avez pas trouvé la réponse que vous recherchez ?
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 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...