Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zahlen zusammenfassen, nicht addieren (https://www.delphipraxis.net/106498-zahlen-zusammenfassen-nicht-addieren.html)

-remit- 11. Jan 2008 20:25


Zahlen zusammenfassen, nicht addieren
 
Hallo,

ich habe vergeblich 1 Stunde gesucht, wusste auch nicht so recht unter welchem Suchbegiff. Ich habe folgendes Problem:

Eine Integer-Var sollen zwei andere Integer-Vars zugewiesen werden, nicht addidativ, sondern zusammengefasst. Beispiel:

x:=2+3
x:=23 und nicht 5

ich hoffe es ist möglich ohne einen langen Quelltext zu schreiben, ein Art "+" , das nur zusammenfasst und nicht addiert wäre fein.

Danke im Voraus!

Dax 11. Jan 2008 20:30

Re: Zahlen zusammenfassen, nicht addieren
 
Deklariere x als String und füge deine Integer auch als Strings wieder hinten an. Wie man Integer (Int) int Strings (Str) umwandelt, dürfte ja geläufig sein ;)

calculon 11. Jan 2008 20:31

Re: Zahlen zusammenfassen, nicht addieren
 
Dafür musst du die integer Variablen vorher in strings verwandeln und dann wieder zurück:
Delphi-Quellcode:
var
  str: string;
  a, b, c: integer;
begin
  a := 2; b := 3;
  str := inttostr(a) + inttostr(b);
  c := strtoint(str);
end;

-remit- 11. Jan 2008 20:33

Re: Zahlen zusammenfassen, nicht addieren
 
Danke für eure schnellen Antworten, gibt es wirklich nur den Weg über Strings oder wären die anderen zu lang bzw zu kompliziert?

3_of_8 11. Jan 2008 20:36

Re: Zahlen zusammenfassen, nicht addieren
 
Delphi-Quellcode:
x:=trunc(intpower(10, trunc(log10(b))+1)*a+b);
Möglicherweise geht das auch schneller, ich wüsste aber nicht, wie.

@calculon: Das würde ich als Umweg bezeichnen.

Nikolas 11. Jan 2008 20:37

Re: Zahlen zusammenfassen, nicht addieren
 
Was willst du denn damit machen, dass es dir so auf Geschwindigkeit ankommt?

calculon 11. Jan 2008 20:43

Re: Zahlen zusammenfassen, nicht addieren
 
Wenn's nur zur Ausgabe ist, dann -> Konsolenanwendung
Delphi-Quellcode:
writeln(a,b);
Zitat:

Zitat von 3_of_8
@calculon: Das würde ich als Umweg bezeichnen.

Ja, ich sehe gerade du hast es algorithmisch gemacht. Ohne deinen Algo. getestet zu haben, glaub' ich dir einfach mal. Ich wüsste nicht wie ich das ohne inttostr und strtoint gemacht hätte...

Gruß

Calculon
--

-remit- 11. Jan 2008 20:43

Re: Zahlen zusammenfassen, nicht addieren
 
Ich möchte die einzahligen Werte eines Array so zusammenfassen. Sollte also kein allzugroßer Umweg sein.

DeddyH 11. Jan 2008 20:44

Re: Zahlen zusammenfassen, nicht addieren
 
Vielleicht ist es so verständlicher:
Delphi-Quellcode:
function zusammenfassen(const arr: array of integer): integer;
var i: integer;
begin
  Result := 0;
  for i := Low(arr) to High(arr) do
    Result := Result * 10 + arr[i];
end;

3_of_8 11. Jan 2008 20:44

Re: Zahlen zusammenfassen, nicht addieren
 
Achja, ich hab mal schnell eine Funktion geschrieben, die ohne Gleitkommaberechnungen auskommt:

Delphi-Quellcode:
function ConcatNumbers(const a, b: Cardinal): Cardinal;
var I, tmp: Integer;
begin
  I:=0;
  tmp:=1;
  while tmp<=b do
    tmp:=tmp*10;
  Result:=a*tmp+b;
end;

Laufzeit: T(a, b)=5+lg b=O(log b) falls es interessiert. ;)

@DeddyH: Wenn ich das richtig sehe, funktioniert deine Funktion nur für Werte zwischen 0 und 9.

Dax 11. Jan 2008 20:46

Re: Zahlen zusammenfassen, nicht addieren
 
Oha.. Ich dacht hier gehts um Ausgabe.. :oops:

DeddyH 11. Jan 2008 20:47

Re: Zahlen zusammenfassen, nicht addieren
 
Zitat:

Zitat von 3_of_8
@DeddyH: Wenn ich das richtig sehe, funktioniert deine Funktion nur für Werte zwischen 0 und 9.

Richtig, so hab ich es auch verstanden.

-remit- 11. Jan 2008 20:48

Re: Zahlen zusammenfassen, nicht addieren
 
Danke für die 4 -5 Möglichkeiten! Ich werde alle Vorschläge durchgehen ;) Damit werde ich erstmal genug zu tun haben...

PS: ja es handelt sich nur um Zahlen im Bereich von 0-9

Dax 11. Jan 2008 20:51

Re: Zahlen zusammenfassen, nicht addieren
 
Delphi-Quellcode:
function ConcatNumbers(const a, b: Cardinal): Cardinal;
var tmp: Cardinal;
begin
  tmp:=10;
  while tmp<=b do
    tmp:=tmp*10;
  Result:=a*tmp+b;
end;
So ist es korrekt. T(1, 0) sollte 10 liefern, nicht 1. Ob es so viel bringen würde, tmp durch Result zu ersetzen, weiß ich momentan nicht.

Zitat:

Zitat von 3_of_8
Laufzeit: T(a, b)=5+lg b=O(log b) falls es interessiert. ;)

Wenn man mit sonst nix spielen kann.. :P

3_of_8 11. Jan 2008 21:02

Re: Zahlen zusammenfassen, nicht addieren
 
Zitat:

Zitat von DeddyH
Zitat:

Zitat von 3_of_8
@DeddyH: Wenn ich das richtig sehe, funktioniert deine Funktion nur für Werte zwischen 0 und 9.

Richtig, so hab ich es auch verstanden.

So wurde es aber nicht gesagt. In diesem Fall ist DeddyHs Version unwesentlich schneller, aber vor allem einfacher.

@Dax: Touché ;)

-remit- 11. Jan 2008 21:03

Re: Zahlen zusammenfassen, nicht addieren
 
Zitat:

Ich möchte die einzahligen Werte eines Array so zusammenfassen.
:wink:

Sein Quelltext funktioniert auch mit zweistelligen Zahlen.

DeddyH 11. Jan 2008 21:22

Re: Zahlen zusammenfassen, nicht addieren
 
Zitat:

Zitat von -remit-
Sein Quelltext funktioniert auch mit zweistelligen Zahlen.

Das kommt darauf an, was Du als Rückgabewert erwartest. Wenn Dein Array z.B. 12 und 13 enthält, käme bei der "Stringlösung" 1213 heraus, bei meiner aber 133.

3_of_8 11. Jan 2008 21:25

Re: Zahlen zusammenfassen, nicht addieren
 
Zitat:

Zitat von -remit-
Sein Quelltext funktioniert auch mit zweistelligen Zahlen.

Einzahlig? Wohl eher mit einer Ziffer.

Lannes 12. Jan 2008 00:39

Re: Zahlen zusammenfassen, nicht addieren
 
Hallo,

wenn die zwei Werte im Bereich des Typs Word(0..65535) bleiben:
Delphi-Quellcode:
var x, i, ii : Integer;
//...schreiben
x := MakeLong(12,13);
//...Auslesen
i := LoWord(x);
ii := HiWord(x);

inherited 12. Jan 2008 00:48

Re: Zahlen zusammenfassen, nicht addieren
 
Lannes: das hat leider nicht den gewünschten effekt. Aus 12 und 13 sollte 1213 herauskommen, nicht wie bei dir 3085

Lannes 12. Jan 2008 00:57

Re: Zahlen zusammenfassen, nicht addieren
 
Hallo,

dachte es geht darum zwei Werte in einem Integer zu speichern :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz