Kleinste noch freie Zahl in Type herausfinden

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Iguan

Betreff: Kleinste noch freie Zahl in Type herausfinden

BeitragSo, Jul 23, 2006 16:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Rolling Eyes
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

BeitragSo, Jul 23, 2006 16:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jul 23, 2006 16:48
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jul 23, 2006 17:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jul 23, 2006 17:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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 ^^

BladeRunner

Moderator

BeitragSo, Jul 23, 2006 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jul 23, 2006 18:00
Antworten mit Zitat
Benutzer-Profile anzeigen
ich möchte keine grenze festlegen, deshalb benutze ich auch types...
ja, die zahlen sind nur positiv und > 0

Christoph

BeitragSo, Jul 23, 2006 18:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jul 23, 2006 18:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Am einfachsten machst du es dir, wenn du beim erstellen eines Typeeintrag, prüfst, ob diese die neue kleinste Zahl bekommt. Confused
Ehm... ich versteh mich gerade selber nicht. Laughing


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. Idea
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Iguan

BeitragSo, Jul 23, 2006 18:17
Antworten mit Zitat
Benutzer-Profile anzeigen
in diesem falle die 1 Wink


beispiele:

3
4
8
7
1
--->2


1
7
6
9
10
2
--->3


5
6
3
4
1
2
9
17
--->7

Christoph

BeitragSo, Jul 23, 2006 18:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jul 23, 2006 19:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Idea
Hi Christoph! Vielen dank!!! genau das brauchte ich! So simpel eigentlich... hätte ich eigentlich selber drauf kommen müssen Confused
 

Dreamora

BeitragSo, Jul 23, 2006 19:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jul 23, 2006 19:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Nur mal am Rande gefragt: Wozu braucht Ihr das Question
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Iguan

BeitragSo, Jul 23, 2006 20:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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?

D2006

Administrator

BeitragSo, Jul 23, 2006 21:55
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jul 23, 2006 22:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast recht! hmm... dann gibts bei mir wohl woanders ein Fehler... ok, danke nochmals allen!!

SpionAtom

BeitragSo, Jul 23, 2006 22:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Jul 24, 2006 13:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group