[Basic] Probleempje met LEN-commando

Pagina: 1
Acties:

  • Laurenz
  • Registratie: Februari 2003
  • Laatst online: 22-05 17:35
Ik heb me ook maar eens aan wat simpel programmeren gewaagd.
Ik had wat tutorials doorgelezen, en nu heb ik iets in elkaar gezet.
Het is de bedoeling dat je gewoon simpel een naam, geboortedatum en E-mail adres kan invoeren, en later bekijken.

ff van te voren:
ik ben een vreselijke n00b, dus niet te hard lachen ok? ;)
Menu:
CLS
Print "Contact Administrator"
print
print
print "Main menu"
print
print "1) Add contact"
print "2) View contact"
print "3) End Program"
print
input "Choice: "; chc
Select case chc

case 1
Type people
nm as string*40
date as string*10
mail as string*30
end type
DIM person as people
Open data.dat for Random as # LEN = LEN (person)
Input "Record"; record
Input "Name: "; person.nm
Input "Date of Birth: "; person.date
Input "E-Mail: "; person.mail
Put data.dat, record, person
Print "Data succesfully added!"
Do while inkey$ = ""
Goto Menu

Case 2
Input "Record?"; record
Get data.dat, record, person
print "Name: "; person.nm
print "Date of Birth: "; person.date
print "E-mail: "; person.mail
do while inkey$ = ""
Goto Menu

Case 3
End

Case Else
Print "Not a valid option"
Do while inkey$=""
Goto Menu

End select
Als ik het programma probeer te runnen zeurt ie over een "Type Mismatch" in het vet gedrukte stukje.

Iemand een idee?
En zien jullie nog andere fouten (zijn dr vast een hoop),
of dingen die ik beter anders kan doen?

Alvast bedankt! _/-\o_

Ik heb btw de search gebruikt, maar ben niets nuttigs tegen gekomen..

Leave only footprints, take only memories


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Dit is gewoon een syntaxprobleem, en dus in een handleiding te vinden. Zoek eens op hoe de syntax van Open in elkaar zit (hint: filehandle)

Ohja, gebruik code-tags (zie de FAQ van GoT), dat maakt het voor ons leesbaarder ;)

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • MrC4u
  • Registratie: Maart 2002
  • Laatst online: 12-08 18:16
Ik zou die Type structure ook wat naar boven schuiven, anders werkt ie alleen bij Case = 1. En er zitten nog wat meer fouten in de cases :)

[ Voor 21% gewijzigd door MrC4u op 17-11-2003 01:01 ]

..: De 3 H's van Microsoft: Herhalen, Herstarten en Herinstalleren :..


  • Room42
  • Registratie: September 2001
  • Niet online
[Complete EDIT]
Het staat me bij dat je in de OPEN syntax geen functie kan gebruiken. Je moet de lengte dus eerst opslaan in een variabele.
Ook heb je geen FileNummer opgegeven (#1 bijvoorbeeld):

Lengte=LEN (person)
Open data.dat for Random as #1 LEN = Lengte

En bij PUT en GET moet je dan #1 gebruiken ipv data.dat.

Overigens is in CASE 2 het bestand niet open. Ook is het wel zo netjes je bestand weer te sluiten wanneer je klaar bent. Anders krijg je een fout als je voor de 2e keer keuze 1 kiest, omdat het bestand dan al open is.


PS: Nog een tipje: werk met tabs of spaties om je secties aan te geven. Dat biedt een veel beter overzicht en leesbaarheid. Bijvoorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
TYPE people
   nm as string*40
   date as string*10
   mail as string*30
END TYPE

SELECT case chc
   CASE 1
      Print "Some code"
      Print "Some code"
   CASE ELSE
      Print "Other code"
      Print "Other code"
END SELECT

[ Voor 76% gewijzigd door Room42 op 17-11-2003 01:16 ]

Koop al mijn ads!


  • Laurenz
  • Registratie: Februari 2003
  • Laatst online: 22-05 17:35
goed ik heb een beetje zitten kutten, en tips meegenomen..
Ook wat overbodige, niet-werkende regels eruit gesloopt (Goto enzo):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
CLS
PRINT "Contact Administrator"
PRINT
PRINT
PRINT "Main menu"
PRINT
PRINT "1) Add contact"
PRINT "2) View contact"
PRINT "3) End Program"
PRINT

TYPE people
    nm AS STRING * 40
    date AS STRING * 10
    mail AS STRING * 30
END TYPE

INPUT "Choice: "; chc
SELECT CASE chc
      
CASE 1
    DIM person AS people
    OPEN "data.dat" FOR RANDOM AS #1 LEN = LEN(person)
    INPUT "Record"; record
    INPUT "Name: "; person.nm
    INPUT "Date of Birth: "; person.date
    INPUT "E-Mail: "; person.mail
    PUT data.dat, record, person
    PRINT "Data succesfully added!"
END

CASE 2
    INPUT "Record?"; record
    GET data.dat, record, person
    PRINT "Name: "; person.nm
    PRINT "Date of Birth: "; person.date
    PRINT "E-mail: "; person.mail
END


CASE 3
    END

CASE ELSE
    PRINT "Not a valid option"
END

END SELECT


Nu is het zover dat het programma voor het eerst wil runnen >:)
Alleen als je dus Naam, Geboortedatum en Mailadres hebt ingevoerd stopt ie ermee met de melding "Bad Filename or number"
Wat doe ik verkeerd?

Edit: Foutje

[ Voor 12% gewijzigd door Laurenz op 17-11-2003 01:23 ]

Leave only footprints, take only memories


  • Room42
  • Registratie: September 2001
  • Niet online
Lees mijn reply ff :) Gebruik #1 ipv 'data.dat' bij PUT en GET.

Dit GOTO kun je ook vervangen met een DO - LOOP
Waar Menu stond zet je DO en waar de goto zet je LOOP.

[ Voor 56% gewijzigd door Room42 op 17-11-2003 01:28 ]

Koop al mijn ads!


  • Laurenz
  • Registratie: Februari 2003
  • Laatst online: 22-05 17:35
Edit:

Lama ff...dacht niet na..
-> gaat weer druk bezig :)
Alvast bedankt voor hulp!

[ Voor 95% gewijzigd door Laurenz op 17-11-2003 01:51 ]

Leave only footprints, take only memories


Verwijderd

Ik vind dit zelf wel lelijk gedaan met de input, hier kan je beter een inkey voor gebruiken, dus ipv deze code
code:
1
2
INPUT "Choice: "; chc
SELECT CASE chc


[edit]
Ja dit is wel getest, het kan netter maar het werkt :P

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DO
k$ = inkey$
if k$<>"" then exit do
loop

'deze onderste regels van de rem afhalen dan kan je zien welke asc de case is.
'print asc(k$)
'end

select case asc(k$)
  case 49
    print "je drukte op 1"
  end
  case 50
    print "je drukte op 2"
  end
  case else
    print "geen geldige optie"
  end
end select

Dit is niet netjes gedaan vind ik(via asc), maar het is netter dan input :P

[ Voor 50% gewijzigd door Verwijderd op 17-11-2003 09:19 ]


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Verwijderd schreef op 17 november 2003 @ 09:08:
Ik vind dit zelf wel lelijk gedaan met de input, hier kan je beter een inkey voor gebruiken, dus ipv deze code
code:
1
2
INPUT "Choice: "; chc
SELECT CASE chc


Zoiets maken
code:
1
2
3
4
do
k$ = inkey$
if k$<>"" then select case k$
loop


Het is btw niet getest, ben nou aan het testen maar hij geeft de melding dat er een loop staat zonder do, ik test even vedder ;)
Mja, logisch toch?
Laten we die code van jou eens fatsoenlijk opmaken :)

code:
1
2
3
4
DO
    k$ = INKEY$
    IF K$ <> "" THEN SELECT CASE k$
        LOOP


Die LOOP valt onder de SELECT CASE (god mag weten waarom je die gebruikt, als je geeneens CASEs hebt, maar je zal er je redenen wel voor hebben. In elk geval zou een END SELECT wel ten goede komen:

code:
1
2
3
4
5
6
7
DO
    k$ = INKEY$
    IF K$ <> "" THEN
        SELECT CASE k$
        END SELECT
    END IF
LOOP

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


Verwijderd

@ MUBA:
rofl, tja ik kon niet gaan testen, ben systeembeheerder en loop ook half om half een klas met leerlingen te helpen :+
nou is hij wel getest, nogsteeds niet netjes met die cases, ik zou zelf een functie geschreven hebben en dat aanroepen ;)

  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Mja, zo is het een mooie code die volgens mij ook zou moeten werken :)
ik snapte echt geen zak van wat je met je eerdere code nou probeerde te bereiken :D , maar eigenlijk doe je het op dezelfde manier zoals ik het ook altijd deed (BASIC in DOS ligt echt ver achter me).

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


Verwijderd

Ja oké basic ligt wel ver achter de mens van tegenwoordig, maar toch moet ik toegeven dat ik er weer me bezig ben, dit gezien het Lapmod project in CME. Voor mijn lapmod gebruik ik nog qbasic+compiler(bitmaps+stats laden). :)

Tegenwoordig houd ik me bezig met webdesign(php+javascript+html), veel leuker om te doen.

  • Laurenz
  • Registratie: Februari 2003
  • Laatst online: 22-05 17:35
Nja ik probeer Basic een beetje als begin :)

Anyway:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
TYPE people
    nm AS STRING * 40
    date AS STRING * 40
    mail AS STRING * 40
END TYPE

DO
    k$ = INKEY$
    IF k$ <> "" THEN SELECT CASE k$
    END SELECT
LOOP

PRINT ASC(k$)
END

SELECT CASE ASC(k$)
   
CASE 1


"End IF Without Block IF"
En "LOOP without DO"
Wat doe ik verkeerd?

Edit: fouten enzo

[ Voor 53% gewijzigd door Laurenz op 17-11-2003 12:13 ]

Leave only footprints, take only memories


  • MrC4u
  • Registratie: Maart 2002
  • Laatst online: 12-08 18:16
Ook dit is weer een Syntax probleem ;). Je hebt nu wel een Do...Loop lus, maar je hebt geen voorwaarde gegeven, wanneer hij met de lus moet ophouden.
O ja, als je wilt wachten op een toets, voordat ie verder gaat, gebruikte ik altijd de volgende code:
code:
1
While inkey$ = "": Wend

[ Voor 33% gewijzigd door MrC4u op 17-11-2003 12:20 ]

..: De 3 H's van Microsoft: Herhalen, Herstarten en Herinstalleren :..


  • Laurenz
  • Registratie: Februari 2003
  • Laatst online: 22-05 17:35
Mrc4U schreef op 17 november 2003 @ 12:18:
Ook dit is weer een Syntax probleem ;). Je hebt nu wel een Do...Loop lus, maar je hebt geen voorwaarde gegeven, wanneer hij met de lus moet ophouden.
O ja, als je wilt wachten op een toets, voordat ie verder gaat, gebruikte ik altijd de volgende code:
code:
1
While inkey$ = "": Wend
Ok, volgens mij is die DO...LOOP lus nu goed :)

Ik post maar ff de hele zooi, want begin dr een beetje van in de war te raken :|

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
CLS
PRINT "Main menu"
PRINT
PRINT "1) Add contact"
PRINT "2) View contact"
PRINT "3) End Program"
PRINT

TYPE people
    nm AS STRING * 40
    date AS STRING * 40
    mail AS STRING * 40
END TYPE

DO
    k$ = INKEY$
    IF k$ = "1,2,3,4" THEN EXIT DO
LOOP

SELECT CASE k$
   
CASE 1
    DIM person AS people
    Lengte = LEN(person)
    OPEN "data.dat" FOR RANDOM AS #1 LEN = Lengte
    INPUT "Record"; record
    INPUT "Name: "; person.nm
    INPUT "Date of Birth: "; person.date
    INPUT "E-Mail: "; person.mail
    PUT #1, record, person
    PRINT "Data succesfully added!"
    CLOSE
    WHILE INKEY$ = "": WEND
    END

CASE 2
    INPUT "Record?"; record
    OPEN "data.dat" FOR APPEND AS #1 = Lengte
    GET #1, record, person
    PRINT "Name: "; person.nm
    PRINT "Date of Birth: "; person.date
    PRINT "E-mail: "; person.mail
    CLOSE
END


CASE 3
END

CASE ELSE
    PRINT "Not a valid option"
END

END SELECT


Ik heb dat LOOP in de cases (zodat ie weer naar main menu terug gaat) eruit gehaald, want daar deed ie een beetje moeilijk over.
Dat probeer ik later nog wel een keer..

Dat print asc(k$) heb ik ook maar weg gehaald, werkte niet mee..
Nu is het probleem dat
code:
1
CASE 1
een type mismatch is |:(

Sorry voor de vele edits...zit te prutsen |:(

[ Voor 42% gewijzigd door Laurenz op 17-11-2003 12:44 ]

Leave only footprints, take only memories


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

K$ is een string. 1 is een integer. Dus ...

Misschien moet je gewoon maar een boek over programmeren lezen, NOFI, maar als je iedere syntaxvraag post, dan help je jezelf niet echt.

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • Laurenz
  • Registratie: Februari 2003
  • Laatst online: 22-05 17:35
Ik probeer te leren van waar ik nu mee bezig ben..
En zal ook zeker wel een boek hierover gaan lezen.
Alleen probeer ik nu gewoon na het doorlezen van een aantal tutorials (www.qbasic.com)
een van de exercises te doen die bij die tuts hoort.
Zodat het niet gebeurt ik een heel boek ga doorlezen, en er dan achterkom dat ik het toch niet zo leuk vind als ik dacht.

In principe zou het me vanaf nu zelf moeten kunnen lukken, als ik het op mijn manier zou doen. Maar KingOfDos geeft me het advies om een bepaald iets anders te doen (inkey gebruiken), dus dat probeer ik dan.
Alleen ik heb geen idee wat asc precies inhoudt, en daarom lukt het me dus niet met 1 post van hem.

Als ik met die cases verder zou gaan zoals ik het eerst deed zou het volgens mij gewoon allemaal moeten werken namelijk.
Maar dat wat KingOfDos zegt wil ik ook graag proberen.

Maar als dit niet gewenst is dan stop ik er wel mee hoor...

[ Voor 4% gewijzigd door Laurenz op 17-11-2003 12:58 ]

Leave only footprints, take only memories


Verwijderd

Alleen ik heb geen idee wat asc precies inhoudt, en daarom lukt het me dus niet met 1 post van hem.
QBasic help:
ASC retourneert de ASCII-code voor het eerste teken in een uitdrukking.
CHR$ retourneert het teken dat bij de opgegeven ASCII-code hoort.
Als je een string(waarde die alle letters+getallen kan bevatten, en natuurlijk leestekens) met 1 teken omzet naar een ASC(dus de enkele code van een letter/leesteken) dan kan je daarop vergelijken, probleer eens dit stukje script uit voor de grap:
code:
1
2
3
4
do
k$ = inkey$
loop while k$=""
print "De toets ["+k$+"] heeft de waarde ["+asc(k$)+"] als ASCII code"

Als je dit hebt dan kan je iig een case selecten omdat het als ascii(dus een getal is) naar die case gaat.

mij toevoegen aan msn mag natuurlijk ook ;)

  • Laurenz
  • Registratie: Februari 2003
  • Laatst online: 22-05 17:35
Om met het topic maar ff netjes af te sluiten zegmaar, post ik ff het eindresultaat :)
Met dank aan iedereen!

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
main:
CLS
COLOR 10
PRINT "Contact Administrator"
PRINT
COLOR 4
PRINT "By Mafkeez"
PRINT "*********@hotmail.com"
PRINT
COLOR 15
PRINT "Main menu"
PRINT
PRINT "1) Add contact"
PRINT "2) View contact"
PRINT "3) End Program"
PRINT

TYPE people
    nm AS STRING * 40
    date AS STRING * 40
    mail AS STRING * 40
END TYPE

DO
  k$ = INKEY$
    IF k$ = "1" THEN GOTO k1
    IF k$ = "2" THEN GOTO k2
    IF k$ = "3" THEN GOTO k3
LOOP

k1:
    DIM person AS people
    Lengte = LEN(person)
    OPEN "data.dat" FOR RANDOM AS #1 LEN = Lengte
    COLOR 15
    INPUT "Record"; record
    INPUT "Name: "; person.nm
    INPUT "Date of Birth: "; person.date
    INPUT "E-Mail: "; person.mail
    PUT #1, record, person
    PRINT
    PRINT "Data succesfully added!"
    CLOSE
    WHILE INKEY$ = "": WEND
    GOTO main
END

k2:
    INPUT "Record"; record
    OPEN "data.dat" FOR RANDOM AS #1 LEN = LEN(person)
    GET #1, record, person
    COLOR 15
    PRINT
    PRINT "Name: "; person.nm
    PRINT "Date of Birth: "; person.date
    PRINT "E-mail: "; person.mail
    CLOSE
    PRINT
    PRINT "Press enter to continue"
    WHILE INKEY$ = "": WEND
    GOTO main

k3:
    END


En nu ga ik idd een boek opzoeken over basic... :*)

Leave only footprints, take only memories

Pagina: 1