Med kunstig intelligens skaber HP’s nye OmniBook X 14 en unik og skræddersyet brugeroplevelse målrettet dem, der ønsker høj ydeevne og intelligente funktioner
fx. jeg har et tal (random men som en string fordi brugeren selv kan taste det ind). Det tal kan se sådan her ud 38/012/0013/00001/0053 osv.
Så er det at jeg har brug for at vide hvor mange 0'er der er forand selve det tal hvis der er nogen. Men hvordan kan jeg det ? og hvordan kan jeg vide hvor mange der er af 0'er hvis der er noget ?
Du kalder "38/012/0013/00001/0053" for ét tal. Vil du bare vide hvor mange nuller der er foran hele den streng, eller foran de enkelte tal (her delt med '/')?...Og i så fald, kan man regne med at strengen altid er formateret sådan?
Denne funktion (som sikkert kan laves smartere, når jeg er mere vågen :)), finder antallet af nuller foran en given streng:
function NumLeadZero(str: String): integer; var i: integer; begin result:=0; for i:=0 to length(str) do if (Ord(str[i+1]) <> 48) then begin result:=i; exit; end; end;
Hvis du vil ha at NyStr skal ha' består KUN af det samme antal nuller, kan du f.eks. bruge følgende:
Hvis du kun skal finde de første nuller i en streng så:
function CountFirstZeroes(const str : string) : integer; var p : PChar; begin Result := 0; p := PChar(str); while (p^ <> #00) and (p^ = '0') do begin Inc(Result); Inc(p); end; end;
function NumLeadZeroASM(Const Value : String): integer; asm mov edx, $00 // Result := 0 test eax, eax //Er strengen tom ? jz @@Done //Så Exit mov ecx,[eax - $04] // Læs længden på vores streng, og gem den i ecx @@Again: cmp edx, ecx // Result < Length(Value) cmp byte ptr [eax + edx], $30 //Value[Result] = '0' jnz @@Done //Enten har vi fundet noget der ikke er et '0', eller enden er nået --> Hop til Done inc edx //Tæl vores tæller jmp @@Again //Loop @@Done: mov eax, edx //Retuner værdien af vores tæller end;
function NumLeadZero(Const Value : String): integer; begin Result := 0; while (Value[Result + 1] = #48) and (Result < Length(Value)) do Inc(Result); end;
@@Again: cmp edx, ecx // Result < Length(Value) cmp byte ptr [eax + edx], $30 //Value[Result] = '0' jnz @@Done //Enten har vi fundet noget der ikke er et '0', eller enden er nået --> Hop til Done inc edx //Tæl vores tæller
athlon-pascal >> Du har ret. 2x cmp i træk viker ikke. Nå men funktionen er også mest skrevet for sjov.
Og når nu doc404 begynte med at skrive en hurtigere funktion, så ville jeg lige skrive en i Assembler :-)
function NumLeadZeroASM(Const Value : String): integer; asm mov edx, $00 // Result := 0 test eax, eax //Er strengen tom ? jz @@Done //Så Exit mov ecx,[eax - $04] // Læs længden på vores streng, og gem den i ecx @@Again: cmp edx, ecx // Result = Length(Value) ? je @@Done //Hvis så hop til Done cmp byte ptr [eax + edx], $30 //Value[Result] = '0' jnz @@Done //Enten har vi fundet noget der ikke er et '0', eller enden er nået --> Hop til Done inc edx //Tæl vores tæller jmp @@Again //Loop @@Done: mov eax, edx //Retuner værdien af vores tæller end;
Jens -> "athlon-pascal >> Du har ret. 2x cmp i træk viker ikke. Nå men funktionen er også mest skrevet for sjov." Det var doc404 der kommenterede din Assembler-funktion, jeg forstår ikke Assembler :-)
Og lad os så lige få noget der virker:
function CounterZero(input:string):integer; var i :integer; begin result := 0; for i:= 1 to length(input) do if input[I] = '0' then inc(result); else Break; end;
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.