Kleinste noch freie Zahl in Type herausfinden
Übersicht

![]() |
IguanBetreff: Kleinste noch freie Zahl in Type herausfinden |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo!
Ich habe in einem Type ein Field namens a\Nr, wo ich verschiedene Nummern reinspeichere. Diese Nummern sind nicht der Reihe nach, und es könnten auch Nummern dazwischen fehlen. Beispiel für eine mögliche Reihenfolge: a\Nr = 1 a\Nr = 4 a\Nr = 2 a\Nr = 5 a\Nr = 8 Ich bräuchte eine Funktion, die mir die kleinste noch freie Nummer herausgibt. in obigen Fall wäre das die 3. ich hoffe ihr versteht was ich meine, und könnt mir helfen ![]() ich habe schon verschiedenes probiert, aber irgendwie scheiterts bei mir schon beim Grundgedanken. Ich erwarte nicht, dass ihr mir eine fertige Funktion schreibt, aber ein Denkanstoss wäre echt super! vielen dank! Iguan |
||
Virus |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
zufällig habe ich vor ein paar minuten exakt das gleiche problem gehabt
versuchs wie bei dem bubblesortverfahren und vergleiche die Instanzen untereinander, wenn die eine Nummer kleiner is als die andere, dann ist Kleinste = Diese |
||
www.legacy.de |
![]() |
Iguan |
![]() Antworten mit Zitat ![]() |
---|---|---|
die kleinste zahl herausfinden ist kein problem für mich:
if Zahl < KleinsteZahl then KleinsteZahl = Zahl in meinem Falle brauche ich aber die kleinste noch freie Zahl... das bereitet mir probleme... |
||
![]() |
ChaosCoder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hmm, also ich denke mal, du musst die erstmal sortieren, wie Virus gesagt hat, dann einfach alle durchgehen, vom kleinsten zum größten und dann checken, ob die nummer-die nummer davor > 1 ist... am besten vorher gleich checken, ob es die eins gibt... sonst könnte man das mit einem array machen, aber nur, wenn du weißt, bis wohin die zahlen reichen können.... Naja, sonst hätt ich auch kein Plan, aber irgendjemand anderes fällt bestimmt noch was ein...
MfG ChAoS|DrAgOn |
||
Projekte: Geolaria | aNemy
Webseite: chaosspace.de |
![]() |
kreisman |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zuerst sortierst du deine Liste dann guckst du ob die kleinste Zahl 1 ist.Wenn
nein, dann hast du deine kleinste Freie zahl gefunden.Wenn ja dann addierst 1 zur kleinsten zahl.Dann überprüfst du ob das Ergebnis gleich der Zweiten zahl deiner soriterung ist.Ist dem so dann addierst du wieder 1 und überprüfst das mit der dritten zahl und das solange bis du eine Zahl gefunden hast die nicht in der sortierung ist. Ich hoffe mal das war Verständlich ^^ |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
in welchem Raum bewegen sich die Zahlen denn ?
Nur positiv ? und Bis wohin ? 100? 1000? |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Iguan |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich möchte keine grenze festlegen, deshalb benutze ich auch types...
ja, die zahlen sind nur positiv und > 0 |
||
![]() |
Christoph |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn man diese Zahlen hat:
2 5 8 4 3 Soll dann 1 ausgegeben werden, sprich die kleinste freie Zahl, oder die kleinste freie Zahl nach der kleinsten belegten Zahl (6)? |
||
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
Am einfachsten machst du es dir, wenn du beim erstellen eines Typeeintrag, prüfst, ob diese die neue kleinste Zahl bekommt. ![]() Ehm... ich versteh mich gerade selber nicht. ![]() Was ich damit umständlich zu sagen versuchte, war: Lass während des gesamten Programms eine Variable mitlaufen, die immer die kleinste Zahl parat hat. Diese Variable, nennen wir sie minVal, verändert sich ja nur dann, wenn Typeeinträge hinzukommen, oder gelöscht werden. ![]() |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
![]() |
Iguan |
![]() Antworten mit Zitat ![]() |
---|---|---|
in diesem falle die 1 ![]() beispiele: 3 4 8 7 1 --->2 1 7 6 9 10 2 --->3 5 6 3 4 1 2 9 17 --->7 |
||
![]() |
Christoph |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dann glaube ich ist das dein Lösungscode:
Code: [AUSKLAPPEN] global t
Type t Field w End Type ;Hier natürlich beliebige Zahlen eingeben r.t=New t:r\w=5 r.t=New t:r\w=6 r.t=New t:r\w=4 r.t=New t:r\w=2 r.t=New t:r\w=3 r.t=New t:r\w=2 i=0:Zahl=0 Repeat i=i+1 Ist_vorhanden=0 For r.t=Each t If r\w=i Then Ist_vorhanden=1 Next If Ist_vorhanden=0 Then Zahl=i Until Zahl>0 Print Zahl Hier ist die Funktion: Code: [AUSKLAPPEN] function Klein_und_frei()
i=0:Zahl=0 Repeat i=i+1 Ist_vorhanden=0 For r.t=Each t If r\w=i Then Ist_vorhanden=1 Next If Ist_vorhanden=0 Then Zahl=i Until Zahl>0 return Zahl end function |
||
![]() |
Iguan |
![]() Antworten mit Zitat ![]() |
---|---|---|
![]() Hi Christoph! Vielen dank!!! genau das brauchte ich! So simpel eigentlich... hätte ich eigentlich selber drauf kommen müssen ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das ist nicht sonderlich effizient.
Wenn du mit Types arbeitest, musst du wie oben erwähnt, mit Sortieren arbeiten. Dann kannst du fast direkt nachsehen ob eine Stelle nicht besetzt ist. Etwas kleinstes in einer Menge finden, ohne sortieren, wird mit "wenigen" Types funktionieren. nur da du "grenzenlos viele" willst, ist der ansatz definitiv nicht zu gebrauchen. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nur mal am Rande gefragt: Wozu braucht Ihr das ![]() |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
![]() |
Iguan |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das ist für einen kleinen Editor, wo man gegner hinsetzen kann... die geschwindigkeit spielt mir keine grosse rolle... soll lediglich den zweck erfüllen.
Ich gabs jetzt so gemacht: Code: [AUSKLAPPEN] i = 0
Zahl = 0 Repeat i = i + 1 Ist_vorhanden = 0 For Gegner = Each GegnerWerte If Gegner\Nr = i Then Ist_vorhanden = 1 Next If Ist_vorhanden = 0 Then Zahl = i Until Zahl > 0 nun, habe ich noch was kleinen vergessen zu erwähnen: wenn alle Nummern im Type der Reihe nach ohne Lücken belegt sind, sollte bei der Funktion automatisch die nächst höhere Nummer rauskommen. beispiel: 1 2 3 4 5 6 7 8 9 10 11 ---> 12 aber diese function tut das nicht, da nur alle Type-Instanzen überprüft werden. Wie mache ich das nun am besten? |
||
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hättest du die Funktionsweise des Codes verstanden, wüsstest du, dass DAS gar kein Problem darstellt. Er spukt problemlos die 12 aus.
Trotzdem ist der Code recht ineffizient. Ich überleg mir mal noch ein paar Minuten lang was besseres ... mal schauen. |
||
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2 |
![]() |
Iguan |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du hast recht! hmm... dann gibts bei mir wohl woanders ein Fehler... ok, danke nochmals allen!! | ||
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hier ist nochmal ein Ansatz. Du merkst dir einfach immer, wieviele Typeeinträge du hast.
Wird nun irgendein Typeeintrag gelöscht, so setzt du einfach den letzten Typeeintrag an die gelöschte Stelle. Angenommen du hast das A\w = 1 B\w = 2 C\w = 3 D\w = 4 E\w = 5 Anzahl = 5 Plötzlich wird C gelöscht: A\w = 1 B\w = 2 D\w = 4 E\w = 5 Anzahl = 5 Merke dir die Stelle, die gelöscht wurde (3). Und füge nun die letzte Stelle, die du mit Anzahl gemerkt hast (5), an die gelöschte Stelle ein. Danach noch Anzahl um 1 verringern: A\w = 1 B\w = 2 E\w = 3 D\w = 4 Anzahl = 4 So haben die Elemente immer durchgehend die Werte von 1..n. Es gibt keine Schleifen und dadurch bleibt die Laufzeit konstant gering. EDIT: Und schon hab ich eine Frage: Wie verschiebt man einen Listeneintrag. Konkret: Der letzte Listeneintrag soll ich die Mitte verschoben werden. Geht das nur mit Kopieren und löschen des letzten Eintrags? |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
![]() |
Christoph |
![]() Antworten mit Zitat ![]() |
---|---|---|
ql:insert
Schau dir den Befehl an. Irgendwie musst du herrausfinden wo dein Eintrag steht und wo die Mitte ist, dann kannst du ihn immer eins weiter schieben bis er in der Mitte ist. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group