Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
CadCam
Anmeldungsdatum: 02.01.2005 Beiträge: 2
|
Verfasst am: 02.01.2005, 22:56 Titel: STRING in RANDOM-Anweisung falsch?!? |
|
|
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 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 |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 02.01.2005, 23:31 Titel: |
|
|
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 |
|
 |
CadCam
Anmeldungsdatum: 02.01.2005 Beiträge: 2
|
Verfasst am: 03.01.2005, 02:21 Titel: |
|
|
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 |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 03.01.2005, 14:24 Titel: Es geht auch ganz einfach mit BINARY |
|
|
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 |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 03.01.2005, 16:34 Titel: |
|
|
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 dann wird der String mit 25 Leerzeichen aufgefüllt damit er auch wirklich 30 Zeichen land ist. die musst du dann bei vergleichen mittels 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 |
|
 |
Paul aka ICC, HV-Freak
Anmeldungsdatum: 11.09.2004 Beiträge: 588 Wohnort: Uelzen
|
Verfasst am: 03.01.2005, 16:51 Titel: |
|
|
Ein String mit konstanter Länge wird mit Nullbytes ausgefüllt, da bringt dir RTRIM$ oder LTRIM$ nix
Code: |
DIM abc AS STRING * 10
abc = "Test"
null = INSTR(abc, CHR$(0))
RealText$ = LEFT$(abc, null)
|
Müsste eigentlich gehen _________________
 |
|
Nach oben |
|
 |
Charly2
Anmeldungsdatum: 28.11.2004 Beiträge: 29 Wohnort: Mittelfranken
|
Verfasst am: 03.01.2005, 18:24 Titel: |
|
|
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 |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
Paul aka ICC, HV-Freak
Anmeldungsdatum: 11.09.2004 Beiträge: 588 Wohnort: Uelzen
|
Verfasst am: 03.01.2005, 18:45 Titel: |
|
|
Nein, bei SPACE$ gibts wirklich Leerzeichen (Spaces halt )
Ok ihr habt recht, aber bevor man irgendwas mit dem String macht, besteht er aus Nullbytes.  _________________
 |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 03.01.2005, 19:15 Titel: |
|
|
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 |
|
 |
|