Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

STRING in RANDOM-Anweisung falsch?!?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
CadCam



Anmeldungsdatum: 02.01.2005
Beiträge: 2

BeitragVerfasst am: 02.01.2005, 22:56    Titel: STRING in RANDOM-Anweisung falsch?!? Antworten mit Zitat

Hallo,
ich habe ein Problem:
diese Aufgabe hier:

----------------------------------------------------------------------------
Eine Randomdatei KUNDEN.DAT mit einer unbekannten Anzahl von Datensätzen sei vorhanden. Jeder Datensatz enthält folgende Informationen:
Kundenname (maximal 30 Symbole lang)
Anzahl bisheriger Bestellungen (einfachlange ganze Zahl)
Summe der bisherigen Rechnungsbeträge (Gleitkommazahl)
a. Schreiben Sie ein QBasic-Programm, das für eine neue Bestellung den Kundennamen und den Rechnungsbetrag von der Tastatur eingibt, anschließend in der Datei KUNDEN.DAT den Kunden sucht und
– wenn der Kunde schon auf der Datei vorhanden ist, in seinem Datensatz die Anzahl der Bestellungen um 1 erhöht und die bisherige Summe der Rechnungsbeträge um den neuen Rechnungsbetrag erhöht,
– wenn der Kunde neu ist, auf dem Bildschirm die Ausgabe ” Neukunde! “ schreibt.
------------------------------------------------------------------------------

habe ich eigentlich schon fast gelöst:

CLS
TYPE kunden
kn AS STRING * 30
bes AS INTEGER
sum AS SINGLE
END TYPE
DIM kun AS kunden
OPEN "kunden.dat" FOR RANDOM AS 1 LEN = LEN(kun)
INPUT "Kundenname eingeben"; kname$
INPUT "Rechnungsbetrag eingeben"; betrag
a = 0
FOR i% = 1 TO LOF(1) / LEN(kun$)

GET 1, i%, kun
IF kname$ = kun.kn THEN
a = a + 1
kun.bes=kun.bes + 1
kun.sum=kun.sum+bestrag
PUT 1, i%, kun
PRINT USING "Name: & Best: ##### Summe: ######## a:"; kun.kn; kun.bes; kun.sum; a
NEXT i%

IF a = 0 THEN PRINT "Neukunde!!!"

CLOSE 1
END




ALLERDINGS:

habe ich erst nach langem mit dem Kopf durch die Mauer wollen durchgeknallt weinen rumprobieren rausgefunden, daß """ IF kname$ = kun.kn """
einen Syntax-Fehler hat.
Kann mir jemand bitte sagen, was ich da anders schreiben muß und wieso?

Schonmal tausend Dank im Voraus!!!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 02.01.2005, 23:31    Titel: Antworten mit Zitat

kun.kn ist immer dreißig zeichen lang, schreib RTRIM$(kun.kn) dann gehts weil die leerzeichen dann abgeschnitten werden.
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
CadCam



Anmeldungsdatum: 02.01.2005
Beiträge: 2

BeitragVerfasst am: 03.01.2005, 02:21    Titel: Antworten mit Zitat

Hi,
danke für die Antwort!
Also den Befehl RTRIM$ hatten wir eigentlich gar nicht behandelt.
Wir haben mal probiert, den string durch eine Zahl zu ersetzen und oh Wunder: es hat funktioniert............irgendwie total unverständlich!!!
Also konnten wir den Fehler dorthin einkreisen, daß die IF-Anweisung nicht funktioniert hat.
Stellt sich jetzt die Frage, wie schafft man es ohne das TRIM, mit strings bei randoms zu arbeiten?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 03.01.2005, 14:24    Titel: Es geht auch ganz einfach mit BINARY Antworten mit Zitat

Hallo.

Beispielprogramm für's Schreiben:

Code:
TYPE PERSON
 DERNAME AS STRING * 16
 ALTER AS INTEGER
 GROESSE AS INTEGER
END TYPE

DIM PERSONEN(2) AS PERSON

PERSONEN(0).DERNAME = "SEBASTIAN"
PERSONEN(0).ALTER = 14
PERSONEN(0).GROESSE = 198

PERSONEN(1).DERNAME = "COX"
PERSONEN(1).ALTER = 14
PERSONEN(1).GROESSE = 160

PERSONEN(2).DERNAME = "TEST"
PERSONEN(2).ALTER = 99
PERSONEN(2).GROESSE = 101

OPEN "PERSONEN.DAT" FOR BINARY AS #1
FOR i% = 0 TO 2
 PUT #1,, PERSONEN(i%)
NEXT i%
CLOSE #1

PRINT "Alles geschrieben..."


Beispielprogramm zum Auslesen:

Code:
TYPE PERSON
 DERNAME AS STRING * 16
 ALTER AS INTEGER
 GROESSE AS INTEGER
END TYPE

DIM PERSONEN(2) AS PERSON

OPEN "PERSONEN.DAT" FOR BINARY AS #1
FOR i% = 0 TO 2
 GET #1,, PERSONEN(i%)
 PRINT PERSONEN(i%).DERNAME
 PRINT PERSONEN(i%).ALTER
 PRINT PERSONEN(i%).GROESSE
 PRINT "========================"
NEXT i%
CLOSE #1


Das Umwandeln eines Strings in Zahlen ist meistens Blödsinn und für eine TYPE-Datenbank auch relativ ungeeignet.
In VB würde man dazu die Function StrConv verwenden, in QB müsste man manuell eine schreiben, die die Buchstaben eines Strings in ein Integerarray reinschiebt, welches man dann mit einer Schleife mit CHR$() wieder in einen String verwandeln würde.

Was ich allerdings komisch finde ist, dass es bei mir einwandfrei auch ohne RTRIM funktioniert...
Bei GET und PUT lässt man normalerweise die Zahl in der Mitte weg (Byteposition). Also nur GET #1,,BLA

Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 03.01.2005, 16:34    Titel: Antworten mit Zitat

das mit dem Random-Strings ist kein Problem. das problem entsteht dadurch, dass es in der Type-Anweisung heißt
Code:
kn AS STRING [b]*30[/b]
Dieses *30 definiert den String mit einer festen Länge von 30 Zeichen. wenn du jetzt schreibst
Code:
bla.kn="Hallo"
dann wird der String mit 25 Leerzeichen aufgefüllt damit er auch wirklich 30 Zeichen land ist. die musst du dann bei vergleichen mittels
Code:
RTRIM$(bla.kn)
wieder abschneiden. Das ist alles. Das hat mit dem Random nix zu zun sondern mit der String*30-Definition.
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Paul
aka ICC, HV-Freak


Anmeldungsdatum: 11.09.2004
Beiträge: 588
Wohnort: Uelzen

BeitragVerfasst am: 03.01.2005, 16:51    Titel: Antworten mit Zitat

Ein String mit konstanter Länge wird mit Nullbytes ausgefüllt, da bringt dir RTRIM$ oder LTRIM$ nix durchgeknallt

Code:

DIM abc AS STRING * 10
abc = "Test"
null = INSTR(abc, CHR$(0))
RealText$ = LEFT$(abc, null)


Müsste eigentlich gehen
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Charly2



Anmeldungsdatum: 28.11.2004
Beiträge: 29
Wohnort: Mittelfranken

BeitragVerfasst am: 03.01.2005, 18:24    Titel: Antworten mit Zitat

MisterD hat recht!
Strings mit fester Länge werden bei QBasic mit Leerzeichen aufgefüllt.
Daher muß man bei einem Vergleich die Leerzeichen mit Rtrim$ entfernen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 03.01.2005, 18:41    Titel: Nullbytes gibts bei SPACE$ Antworten mit Zitat

Hallo.

Nullbytes gibt es glaub ich bei SPACE$(x).

Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Paul
aka ICC, HV-Freak


Anmeldungsdatum: 11.09.2004
Beiträge: 588
Wohnort: Uelzen

BeitragVerfasst am: 03.01.2005, 18:45    Titel: Antworten mit Zitat

Nein, bei SPACE$ gibts wirklich Leerzeichen (Spaces halt mit den Augen rollen )

Ok ihr habt recht, aber bevor man irgendwas mit dem String macht, besteht er aus Nullbytes. lachen
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 03.01.2005, 18:48    Titel: Antworten mit Zitat

Shit, stimmt. Nullbytes gehen aber mit STRING$(1, CHR$(0))... durchgeknallt durchgeknallt durchgeknallt
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 03.01.2005, 19:15    Titel: Antworten mit Zitat

ich klär mal auf...
der 30-Zeichen-String besteht ganz zu anfang aus 30 Nullbytes. sobald ein Text gespeichert wird wird dieser dann mit Leerzeichen gefüllt.
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz