|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Revilo
Anmeldungsdatum: 26.12.2022 Beiträge: 78
|
Verfasst am: 07.05.2023, 02:18 Titel: |
|
|
Hallo Leute,
vielen Dank für eure aufmunternden Worte.
Bei diesem Verständnis, macht das Lernen wieder Spaß.
Bei der Gestaltung von Zellen/Variablen mit selbstdefiniertem Datentyp tue ich mich allerdings
immer noch sehr schwer, gerade was die Indizierung betrifft.
Das habe ich noch immer nicht so richtig verstanden.
Vielleicht wird mein Problem anschaulicher, wenn ich es mal anhand eines konkreten Beispiels darlege.
Also:
Ich möchte eine Variable namens „Zelle“ mit einem selbst definierten Datentyp versehen.
Dafür würde ich den Type-Befahl verwenden, etwa wie folgt:
Type ZellType
Nr as integer Nummer der Zelle
z as integer Zeile der Zelle (lasse ihre Notwendigkeit erst mal offen)
s as integer Spalte der Zelle (lasse ihreNotwendigkeit erst mal offen)
w as integer gegebener bzw. im Programmablauf ermittelter Wert der Zelle
...t as integer Turm auf dieser Zelle
Hier liegt mein Problem:
Als Analogie möge ein Aufgang in einem 9 - stöckigem Haus dienen.
Nr ist die Nummer des Aufgangs, von denen es insgesamt 81 gibt.
w soll bedeuten, daß in diesem Turm die Wohung in der w.-ten Etage
bereits bewohnt ist.
Alle anderen Etagen (außer w) sind von diesem Mieter also nicht bewohnt.
Müssen somit für Ihn ausgeschlossen werden.
Daher muß dort also –w gelten, weil er dort eben nicht wohnt.
t muß also mind. 9 Einträge ermöglichen (einen tatsächlichen und acht
unmögliche), die aber alle gleichzeitig verwaltet werden müssen.
Schließlich kann man einem weiteren Interessenten ja keine bereits belegte
Wohnung zuweisen.
Ist in diesem Aufgang nur noch eine einzige Wohnung frei,
muß ein Interessent eben genau diese nehmen.
Sind alle Wohnungen belegt, kann es in diesem Aufgang keinen weiteren
„Mieter“ mehr geben.
End Type
Dim shared Zelle(---------------------------------) as ZellType.
Was muß für (------------------------------------) als Indizes geschrieben werden, damit das ganze wunschgemäß und sauber funktioniert?
Hallo nemored,
das war die Anfrage, die eigentlich bei dir ankommen sollte. Gott weiß, warum es nicht funktionierte. Offenbar ist dieser ganze digitale Kram doch nicht so sicher und störungsfrei, wie es den Nutzern „weißgemacht“ wird.
Gruß Revilo |
|
Nach oben |
|
|
Revilo
Anmeldungsdatum: 26.12.2022 Beiträge: 78
|
Verfasst am: 07.05.2023, 02:27 Titel: |
|
|
Hallo Leute,
hier noch mal eine Nachfrage zum Handling.
Wofür steht ganz unten die Schaltfläche "Los"? Welchen Zweck hat sie?
Gruß Revilo |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1230 Wohnort: Ruhrpott
|
Verfasst am: 07.05.2023, 08:46 Titel: |
|
|
Das bezieht sich auf die Einstellung daneben "Beiträge der letzten Zeit anzeigen:". Wenn du dort etwas anderes ausgewählt hast als die Standardvorgabe, kannst du mit dem "Los" die Ansicht aktualisieren.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4638 Wohnort: ~/
|
Verfasst am: 07.05.2023, 09:36 Titel: |
|
|
Zitat: | Dim shared Zelle(---------------------------------) as ZellType.
Was muß für (------------------------------------) als Indizes geschrieben werden, damit das ganze wunschgemäß und sauber funktioniert? |
So wie du das Problem darstellst, würde ich es mit einem Zelle(9, 9, 10) umsetzen.
Zelle(zeile, spalte, mieter)
zeile und spalte: die Position der Wohnung, jeweils ein Wert von 1 bis 9
mieter: ein Wert von 1 bis 9 für den Mieter, oder 10 für die tatsächliche Belegung.
z. B. wenn die Wohnung in Zeile 3, Spalte 7 von Mieter 4 belegt ist, ist Zelle(3, 7, 10) = 4. Sie kann dann nicht von den Mietern 1, 2, 3 belegt sein, deshalb ist Zelle(3, 7, 1)=-1, Zelle(3, 7, 2)=-1, Zelle(3, 7, 3)=-1.
Zelle(3, 7, 4) = 1, weil der Mieter 4 ja sicher dort wohnt.
Ob in Zelle 8, Wohnung 2 der Mieter 7 wohnt oder nicht, weiß ich noch nicht, deswegen ist Zelle(8, 2, 7) = 0.
So ähnlich vielleicht. Allerdings scheint mir das Verfahren recht kompliziert. Und noch als Anmerkung: Standardmäßig wird von Index 0 ab gerechnet, weshalb mit Zelle(9, 9, 10) an sich zu viele Felder reserviert werden. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Revilo
Anmeldungsdatum: 26.12.2022 Beiträge: 78
|
Verfasst am: 08.05.2023, 23:38 Titel: |
|
|
Hallo nemored,
vielen Dank für deine schnelle Antwort.
Meine ultimative Zielstellung ist es, ein Sudoku zu lösen.
Normalerweise genieße ich den Reiz des Knobelns und mache es von Hand, mit Stift und Papier.
Meine Herausforderung ist es, dies meinem „Robby“ beizubringen.
Damit er mir auf Anfrage die Lösung liefern kann, aber eben auch nur auf persönlicher Anfrage.
Ein klassisches Sudoku besteht bekanntlich aus 81 Zellen.
Jede Zelle steht in einer von 9 mögl. Zeilen (1 - 9).
Jede Zelle steht in einer von 9 mögl. Spalten (1 - 9).
Jede Zelle gehört einem bestimmtem 3x3-Block an, je nach dem, wo sie konkret steht.
Es muß also auch 9 mögl. Blöcke geben. In einem davon steht du jeweilige Zelle.
Jede Zelle kann nur einen festen, gegebenen oder im Programmablauf ermittelten positiven Wert w
annehmen. Diese Werte w können ebenfalls nur zwischen 1 und 9 liegen.
Wenn ein fester Wert w in irgend einer Zelle(i, j) eingetragen wurde, heißt das automatisch:
In der Zeile i darf es kein weiteres w mehr geben.
In der Spalte j darf es auch kein weiteres w mehr geben.
In den Zellen des Blocks in dem Zelle(i, j) steht, darf es ebenfalls kein weiteres w mehr geben.
Das heißt also:
Bei jedem Eintrag eines festen, gesicherten, positven Wertes w in eine beliebige Zelle(i, j)
muß dieser Wert w für alle relevanten Zellen ausgeschlossen werden, die mit i, j ,oder dem Block um (i, j) zu tun haben.
Gelöst wäre das Sudoku also letztlich erst, wenn jede Zelle ihren eigenen, individuellen, positiven
Wert w hat.
Wie du mir nahelegtest, könnte man das also über ein entsprechend mehrdimensioniertes Feld lösen. Etwa nach dem Motto:
Dim Shared Zelle(Index1, Index2, Index3, Index4 ....) as integer. Leuchtet mir völlig ein.
Hier mögen z.B. Index1 für die Zeile, Index2 für die Spalte, Index3 für den Wert und Index4 für den
Block stehen.
Was ist aber, wenn ich bei der Indizierung andere Prämissen setzen möchte, je nach dem, was mir als wichtiger erscheint?
Etwa so: Index1 für den Wert, Index2 für die Spalte, Index3 für den Block und Index4 für die Zeile?
Dann könnte ich eine Zelle vom Syntax her genauso definieren
Dim Shared Zelle(Index1, Index2, Index3, Index4 ....) as integer.
Offenbar gibt es also einen allgemeinen Definitions-Syntax, aber mit mehreren möglichen
Index-Zuordnungen. Wie unterscheide ich sauber zwischen ihnen?
Jede beliebige Index-Zuordnung stellt bei generell gleichem Definitions-Syntax schließlich jedes mal einen anderen Sachverhalt dar. Im ersten Fall wird mit dem ersten Index die Zeile angesprochen, im zweiten Fall der jeweilige Wert. Das ist ja wohl kaum dasselbe.
Genau deswegen hielt ich einen selbstdefinierten Datentyp der Variablen „Zelle“ für zweckmäßig, wenn nicht sogar für zwingend notwendig oder denke ich dabei immer noch zu kompliziert bzw. umständlich?
Mit netten Grüßen Revilo |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4638 Wohnort: ~/
|
Verfasst am: 09.05.2023, 09:07 Titel: |
|
|
Welcher Index wofür steht, musst du für dich selbst festlegen und merken (bzw. ggf. im Quelltext als Kommentar notieren). Allerdings weiß ich nicht, woher die vielen Dimensionen kommen sollen.
Das klassische Sudoku hat genau 81 Felder von denen jedes eine von 9 Zahlen beinhalten kann. Daher reicht ein Feld mit 9x9x9 Einträgen vollkommen aus (oder 9x9x10, wenn man den letztendlich eindeutig berechneten Wert gesondert speichern will). Zu überlegen wäre, sich auf ein 9x9-Feld zu beschränken und die Belegungsinformationen in die TYPE-Daten zu schreiben - z. B. über diese Struktur:
Code: | TYPE Eintrag
wert AS INTEGER ' tatsaechlicher Wert, oder 0
moeglichkeit(9) AS INTEGER ' speichert, ob ein bestimmter Wert (noch) moeglich ist
END TYPE
DIM zelle(9, 9) AS Eintrag |
(Ich bin mir allerdings nicht mehr ganz sicher, was in QBasic möglich ist und was nicht.)
Eine gesonderte Dimension für den Block einzuführen ergibt da keinen Sinn.
Wenn ich z. B. zelle(5,3) ansehe. liegt diese immer in Zeile 5, immer in Spalte 3 und immer in Block 4 (zumindest in meiner Nummerierung; aber auf jeden Fall ist die Nummer fest). Wenn ein Eintrag in zelle(5,3) vorgenommen wird, muss dies mit den Zellen (5,1)...(5,9) abgeglichen werden (wegen der Zeile), außerdem mit den Zellen (1,3)...(9,3) (wegen der Spalten) und dann noch mit den Zellen (4,1), (4,2), (4,3), (5,1), (5,2), (6,1), (6,2) und (6,3) (wegen des Blocks). Der Zelle noch einmal gesondert mitzuteilen, wo sie sich befindet, halte ich für überflüssig. Kann man natürlich trotzdem machen; aber eine zusätzliche Dimension für den Block brauchst du dafür nicht. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Revilo
Anmeldungsdatum: 26.12.2022 Beiträge: 78
|
Verfasst am: 10.05.2023, 17:39 Titel: |
|
|
Hallo nemored,
vielen Dank für deine Antwort. Ich konnte vieles von dir lernen.
Zum Syntax mit „Type“ (eigener Datentyp):
'------------------------------------------------------
Du schreibst in dem übermittelten Code „Type Eintrag“, was ja offenbar ausreicht.
Ich hätte in dieser Zeile geschrieben: „Type EintragType“ , weil ich bisher glaubte, es würde so
zum korrekten Syntax gehören. (So steht es zumindest in der Fachliteratur).
Aber ist ja offenbar nicht so.
Besonders interessant fand ich, daß innerhalb eines Type-Befehls offenbar doch eine Indizierung umsetzbar ist. Sh. Zeile: „moeglichkeit(9) as integer“, eben für 9 verschiedene Einträge.
Das ist praktisch genau die „Etage“, die ich in meinem bildlichen Vergleich meinte.
Das war eines meiner „Sorgenkinder“.
Wie unterscheidest du hier zwischen „ noch moeglich“ und „nicht mehr moeglich“?
Ich würde das etwa so machen:
Steht in der „Etage (x)“ , also bei moeglichkeit(x) einer Zelle(i, j) eine 0, so ist der Wert „X“ dort noch möglich, weil eben noch nicht vergeben.
Ist in der „Etage(x)“ besagter Zelle(i, j) der Wert „X“ nicht mehr möglich, weil schon irgendwo in der Zeile i oder Spalte j ermittelt, steht statt der „0“ eben ein „minus X“, also < 0.
Zur Indizierung einer Zelle:
'---------------------------------
Ich habe dabei einfach zu kompliziert gedacht. Kein Wunder, wenn einem ein Problem dann auch als kompliziert erscheint. Du hast völlig Recht. Drei Indizes reichen allemal aus.
Also entweder:
Dim shared Zelle(1 to 9, 1 to 9, 1 to 9) as integer.
Oder mit nur 2 Indizes:
Dim shared Zelle(1 to 9, 1 to 9) as Eintrag.
Hierzu habe ich nochmal eine kleine Nachfrage:
Angenommen ich möchte die Zelle(2, 3) dahingehend überprüfen, ob dort noch eine 7 möglich ist.
Das würde ich etwa wie folgt machen:
IF Zelle(2, 3).moeglichkeit(7) = 0 then[/b]
print „Ja , 7 ist noch möglich“
ELSE 'also für < 0
print „Nein, 7 ist nicht mehr möglich“
END IF
Wäre das vom Syntax her erst mal korrekt, oder ist mir trotzdem noch ein Fehler unterlaufen?
Bei einem eventuellen Fehler bräuchte ich gar nicht erst zu versuchen, ob Qbasic damit klarkommt.
Also hinsichtlich des Syntaxes muß ich absolut sicher sein, daß er fachlich „sauber“ ist.
Und dann wird sich ja zeigen, ob Qbasic „meckert“ oder nicht.
Mit nettem Gruß |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4638 Wohnort: ~/
|
Verfasst am: 10.05.2023, 20:01 Titel: |
|
|
Revilo hat Folgendes geschrieben: | Du schreibst in dem übermittelten Code „Type Eintrag“, was ja offenbar ausreicht.
Ich hätte in dieser Zeile geschrieben: „Type EintragType“ , weil ich bisher glaubte, es würde so
zum korrekten Syntax gehören. (So steht es zumindest in der Fachliteratur).
Aber ist ja offenbar nicht so. |
Wie das UDT benannt wird, ist dir überlassen (solange es kein bereits reserviertes Schlüsselwort ist). Es ist aber durchaus sinnvoll, die Bezeichnung so zu wählen, dass an anderen Stellen im Quelltext sofort erkennbar ist, dass es sich um einen Datentyp handelt. Von daher ist "EintragType" nicht so dumm. Ich persönlich verwende für eigene Datentypen ein vorangestelltes großes T, also in diesem Fall "TEintrag", wollte aber nicht mit dieser Bezeichnung Verwirrung stiften.
Revilo hat Folgendes geschrieben: | Wie unterscheidest du hier zwischen „ noch moeglich“ und „nicht mehr moeglich“? |
Meine Idee ist sehr ähnlich wie deine. Standardmäßig werden die Werte zunächst mit 0 belegt, daher ist der Wert 0 für "noch möglich" sinnvoll. Für "nicht mehr möglich>" hätte ich ganz einfach die -1 gesetzt.
Revilo hat Folgendes geschrieben: | Angenommen ich möchte die Zelle(2, 3) dahingehend überprüfen, ob dort noch eine 7 möglich ist.
Das würde ich etwa wie folgt machen:
IF Zelle(2, 3).moeglichkeit(7) = 0 then
print „Ja , 7 ist noch möglich“
ELSE 'also für < 0
print „Nein, 7 ist nicht mehr möglich“
END IF
Wäre das vom Syntax her erst mal korrekt, oder ist mir trotzdem noch ein Fehler unterlaufen? |
Die Anführungszeichen sind verrutscht (immer obere Anführungszeichen; aber das war wahrscheinlich eine automatische Ersetzung der Textverarbeitung), sonst stimmt die Syntax. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Revilo
Anmeldungsdatum: 26.12.2022 Beiträge: 78
|
Verfasst am: 11.05.2023, 21:44 Titel: |
|
|
Hallo nemored,
ich habe den von dir vorgeschlagenen Syntax:
TYPE Eintrag
wert as integer
moeglichkeit(9) as integer
END TYPE
mal ausprobiert.
Leider „meckert“ Qbasic dabei.
Das „as“ wird farblich hervorgehoben, und dann erscheint die
Fehlermeldung:
Erwartet: Ende-der-Anweisung. (Mit bei Aufruf der Hilfe kaum wirklich
helfenden Hinweisen).
So funktioniert es offenbar also nicht. Erfolgsmäßig bin ich also immer
noch bei „Null“.
Hast du irgend eine Idee, wie man das trotzdem „stricken“ kann, damit Qbasic es akzeptiert?
Gruß Revilo |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4638 Wohnort: ~/
|
Verfasst am: 11.05.2023, 22:13 Titel: |
|
|
Wahrscheinlich so herum:
Code: | TYPE Eintrag
as integer wert
as integer moeglichkeit(9)
END TYPE |
Ich bin, wie gesagt, in QBasic nicht mehr so fit - in FreeBASIC funktionieren beide Varianten. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Revilo
Anmeldungsdatum: 26.12.2022 Beiträge: 78
|
Verfasst am: 12.05.2023, 01:12 Titel: |
|
|
Hallo nemored,
da ich FreeBasic nicht installiert habe muß ich mich leider auf QBasic beschränken.
Deinen neuen Vorschlag werde ich auf jeden Fall ausprobieren, um zu sehen, wie Qbasic damit umgeht.
Das gehört zwar jetzt nicht unbedingt zum Thema, aber du solltest es zumindest wissen.
Offenbar gibt es in diesem Forum zwei verschiedene Wege, mit dir in Kontakt zu treten. Dieser, wo es offenbar funktioniert, aber auch einen anderen. In Ihm lautete deine zuletzt gesendete Antwort:
"Nein, nichts angekommen". Das nenne ich mal "Zugang 1".
Meine darauf erfolgten Mails landeten aber hier, also quasi im funktionierenden "Zugang 2", obwohl sie eigentlich für den "Zugang 1" als Antwort auf dein "Nein , nichts angekommen" gedacht waren.
Zum Glück, wie sich inzwischen herausgestellt hat.
Irgendwie muß ich bei "Zugang 1" also etwas anders gemacht haben
als bei "Zugang 2". Es muß also ein irgendwie unterschiedliches "Handling" gegeben haben. Aber ich habe keine Ahnung, worin sich beide unterscheiden. Mal kommt meine Mail bei dir an, mal landet sie quasi in einer "Sackgasse".
Solange mir dieser Unterschied nicht klar ist, kann ich mir nie sicher sein, ob meine Mail (auch diese) wirklich ankommt, und wenn ja, wo.
Momentan kommt mir das Ganze noch sehr schleierhaft vor.
Fast wie ein Roulett-Spiel oder ein Münzwurf.
Mit netten Grüßen |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4638 Wohnort: ~/
|
Verfasst am: 12.05.2023, 14:21 Titel: |
|
|
Dazu kann ich jetzt leider nichts sagen, weil ich nicht weiß, woran es gescheitert ist. Es gibt einmal das "normale" Forum - wenn du über "Antwort erstellen" eine Nachricht schreibst, kann sie jeder lesen. Dann gibt es noch die private Nachricht (PN). Diese ist dann nur für den Angeschriebenen lesbar. Die PN vom Ende letzten Jahres ist bei mir angekommen, neuere allerdings nicht.
Wenn du eine PN geschrieben hast, die nicht angekommen ist, vermute ich erst einmal, dass du vergessen hast, sie abzusenden (das ist schon öfters mal wem passiert). Wenn du übrigens zu deinen Nachrichten gehst, hast du dort die Bereiche "Posteingang" (das, was andere dir geschickt haben), "Gesendete Nachrichten" (Nachrichten, die du verschickt hast und die der Adressat bereits gelesen hat), "Postausgang" (Nachrichten, du du verschickt hast, die aber noch nicht gelesen wurden) und "Archiv" (bisher habe ich hier noch keine Notwendigkeit gesehen, Nachrichten zu archivieren). Im Postausgang könntest du beispielsweise kontrollieren, ob deine Nachricht wirklich verschickt wurde. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|