Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Arrays vertauschen (https://www.delphipraxis.net/146823-arrays-vertauschen.html)

jonsen2.0.0.9 27. Jan 2010 13:17


Arrays vertauschen
 
Schreibe eine procedure vertausche( i, j:integer), welche den Inhalt der zwei Arrayelemente i und j eines Arrays zahl vertauscht.

gegeben sei dazu:
a) ein global deklariertes Array zahl.

zahl:Array[1..100] of integer;

dies ist eine aufgabe die ich in der schule bekommen habe.

leider weiss ich und der rest der klasse nicht genug um diese zu lösen.

hoffe ihr habt eine lösung oder tipps für mich.

MFG
Jonsen

himitsu 27. Jan 2010 13:21

Re: Arrays vertauschen
 
Vertauschen:

- man nehme eine temporäre Variable vom Typ der zu tauschenden Felder
> also var temp: Integer;
- man "kopiere" den Inhalt einen Feldes in diese temporäre Variable
- nun ist das eine Feld frei und kann mit dem Inhal des anderen feldes gefüllt werden
- und nun muß nur noch der zwischengespeicherte Inhalt in das 2. Feld rein

mkinzler 27. Jan 2010 20:39

Re: Arrays vertauschen
 
Nennt man auch Deieckstausch.

blink182 27. Jan 2010 21:55

Re: Arrays vertauschen
 
man kanns auch eleganter lösen ;)
Delphi-Quellcode:
a[i]= a[i] xor a[j];
a[j]= a[i] xor a[j];
a[i]= a[i] xor a[j];
kurze erklärung:

a=5
b=7

a=101
b=111

a= a xor b = 101 xor 111 = 010
b= a xor b = 010 xor 111 = 101
a= a xor b = 010 xor 101 = 111

blink

MStoll 27. Jan 2010 22:44

Re: Arrays vertauschen
 
@blink182:

man mag damit Speicher sparen, ok. Aber es ist a) schwerer zu lesen und b) langsamer als die Standard-Variante, da letztere vom Compiler gut optimiert werden kann.

Von daher bringt es für den TE wohl nichts, da er - wie man an der Fragestellung sieht - sicherlich andere, eher elementare Probleme hat, als sich mit solchen mathematischen Tricks zu befassen.

himitsu 27. Jan 2010 22:49

Re: Arrays vertauschen
 
Zitat:

Zitat von MStoll
langsamer als die Standard-Variante, da letztere vom Compiler gut optimiert werden kann.

Jupp

Dreieck: 3 Lese- und 3 Schreiboperationen ... optimiert je 2 Lese-/Schreiboperationen

XOR: 6-mal Lesen, 3-mal Verknüpfen und 3-mal Schreiben ... läßt sich im Vergleich nur unwesendlich optimieren und wenn, dann wird's nur nochunübersichtlicher




Also maximal dann geeignet, wenn man viele zusamenhängende Daten tauschen muß und dazu noch Zeit, aber ungenügend Speicher hat.

Aber ein von der Logik her, isses schon irgendwie OK.

gammatester 27. Jan 2010 22:56

Re: Arrays vertauschen
 
Zitat:

Zitat von blink182
man kanns auch eleganter lösen ;)
Delphi-Quellcode:
a[i]= a[i] xor a[j];
a[j]= a[i] xor a[j];
a[i]= a[i] xor a[j];
kurze erklärung:

a=5
b=7

a=101
b=111

a= a xor b = 101 xor 111 = 010
b= a xor b = 010 xor 111 = 101
a= a xor b = 010 xor 101 = 111

blink

Zusätzlich zu dem was MStoll bereits geschrieben hat:

a und b als nicht arrays zu nehmen ist doch wohl auch nicht sehr sinnreich. Weiter: nimm mal ein arrays
a[0]=3 und a[1]=4. Dann vertausche mit Deinem xorcode die Elemente a[0] und a[0]. Augen reiben, wundern, Erklärung suchen.

blink182 28. Jan 2010 12:01

Re: Arrays vertauschen
 
Okay vllt nicht sehr rechenzeit optimiert, dafür weniger speicherplatz

ja das macht wenig Sinn... Muss man halt checken, dass j<>i ist.
Aber selbe zahlen kann man ja trotzdem vertauschen ;-)

11 xor 11 = 00
00 xor 11 = 11
00 xor 11 = 11

aber okay, der dreieckstausch ist da sinnvoller. Ist auch das was man normal macht

mkinzler 28. Jan 2010 13:18

Re: Arrays vertauschen
 
Zitat:

Okay vllt nicht sehr rechenzeit optimiert, dafür weniger speicherplatz
Was bei modernen Rechner ein absolutes Problem ist :mrgreen:

Sherlock 28. Jan 2010 14:46

Re: Arrays vertauschen
 
Jetzt habt Ihr Jonsen erschreckt...

Sherlock


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:28 Uhr.
Seite 1 von 2  1 2      

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