[VB.NET] Functie als in_array

Pagina: 1
Acties:
  • 676 views sinds 30-01-2008

  • tjmv
  • Registratie: Juli 2004
  • Laatst online: 20-01 15:53
Ik ben eerstejaars HBO-student en we moeten programma schrijven dat getallen omzet in een ander stelsel, maar dat doet er nu niet toe. Het probleem is dat ik de input wil controleren dmv een array. Echter, ik kan geen functie vinden die hetzelfde doet als de functie in_array van PHP. En ja, ik heb een tijdje gezocht mvb google/msn.

Het is natuurlijk wel mogelijk om met if-statements te werken, maar dat is een beetje omslachtig als het bijvoorbeeld een ander stelsel moet worden.
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
If (value.Substring(n, 1) = "A") Or (value.Substring(n, 1) = "a") Then
   tmpValue = "10"
ElseIf (value.Substring(n, 1) = "B") Or (value.Substring(n, 1) = "b") Then
   tmpValue = "11"
ElseIf (value.Substring(n, 1) = "C") Or (value.Substring(n, 1) = "c") Then
   tmpValue = "12"
ElseIf IsNumeric(value.Substring(n, 1)) Then
   tmpValue = value.Substring(n, 1)
Else
   tmpValue = "0"
   err = True
End If
.. waarbij de input iets is als "643CB1". Het bovenstaande stukje gebruik ik nu om de input te controleren (en de waarde te berekenen), maar ik leer het liever meteen goed aan. Hierbij is dus een waarde mogelijk van 0-9 en A-C.


De array ziet er trouwens zo uit:
Visual Basic .NET:
1
Private allowedChars() As String = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C"}
Iemand hier een oplossing voor, of hang ik vast aan de if-statement?

offtopic:
En nog iets wat er niets mee te maken heeft, maar misschien wel handig is voor later gebruik: hoe converteer je hoofdletters naar kleine letters en andersom?

  • Daspeed
  • Registratie: Maart 2001
  • Laatst online: 14:44
Array.IndexOf ?

Maaruh, misschien kun je beter toelichten wat je probleem eigenlijk is want of wat je nu wilt doen een mooie oplossing is weet ik ook niet.

Voor hoofdletters enzo kun je de standaard methoden van het string object gebruiken. MSDN is je vriend.

[ Voor 25% gewijzigd door Daspeed op 19-09-2006 14:21 ]


  • whoami
  • Registratie: December 2000
  • Nu online
Manual werk: even kijken naar de methods van de string class en de char class: ToUpper(), ToLower()

Ivm je 'in array' vraag: waarom geen loopje schrijven die je string overloopt, en kijkt of ieder character wel in de array zit. (Desnoods ook die array met een loopje overlopen; of je toegelaten waardes in een hashtable zetten, en dan mbhv Contains() checken).

https://fgheysels.github.io/


  • Flard
  • Registratie: Februari 2001
  • Laatst online: 10:05
je zou met een List kunnen werken, die heeft een Contains() functie of de IndexOf gebruiken
Ook heb je natuurlijk vrij snel een InArray geschreven ;)

(Pseudo-code, ik ben C# gewend ;) )
code:
1
2
3
4
5
Function InArray(Value As String) As Boolean
For i = 0 To allowedChars.Length
  If (allowedChars[i] == Value)
    Return True
Next i


I.P.V. return True kun je dan ook return i doen, en dan weet je meteen de index in het array, en dus ook je nummer in het tientallig stelsel ;) .

(string naar kleine letters: string.ToLower(), string naar hoofdletters: string.ToUpper())

  • CyBoB
  • Registratie: Januari 2001
  • Laatst online: 24-12-2025

CyBoB

.::BURB::.

of als deze set niet heel anders wordt met random getallen kan je ook gewoon de ascii waardes vergelijken:

code:
1
2
3
4
5
Loop door input string
    int c = (int)myChar;
       //  0   -   9          a    -    c         A     -      C
    if(c >= 48 && c <= 57 || c >= 97 && c <= 99 || c >= 65 && c <= 67)
        //correcte input


als je echt alleen input wil valideren kan het natuurlijk altijd met een regex!

[ Voor 14% gewijzigd door CyBoB op 19-09-2006 14:32 ]


  • tjmv
  • Registratie: Juli 2004
  • Laatst online: 20-01 15:53
Maaruh, misschien kun je beter toelichten wat je probleem eigenlijk is want of wat je nu wilt doen een mooie oplossing is weet ik ook niet.
De 13-tallige waarde uit een inputbox moet worden omgezet in een decimale waarde, dus als het C is moet er 12 uitkomen, als het 1B is, moet er 24 uitkomen, etc. Het gaat me echter niet om de berekening, maar om de waarden die zijn toegestaan. Zo zijn de cijfers 0 t/m 9 en de letters A t/m C dus toegestaan in het 13-tallig stelsel. Een letter met de waarde van D t/m Z moet echter een error geven.

De hierboven gegeven beschrijving is wat ik heb, maar ik wil dus dat alle waarden uit de array zijn toegestaan, dus als ik daar nog een D bijzet, dat de D ook toegestaan is. Duidelijk?

  • tjmv
  • Registratie: Juli 2004
  • Laatst online: 20-01 15:53
Met de funcite van Flard kom ik al een heel eind, echter als de waarde (bijvoorbeeld D) niet in de array zit, krijg ik een foutmelding/ crasht het programma.

code:
1
2
3
4
5
6
7
8
9
Private Function InArray(ByVal Value As String) As Integer
        Dim i As Integer

        For i = 0 To allowedChars.Length
            If allowedChars(i) = Value Then
                Return i
            End If
        Next
    End Function


En als ik [code]allowedChars.IndexOf("A")[/code] gebruik, geeft visual studio een foutmelding: [quote]Overload resolution failed because no accessible 'IndexOf' accepts this number of arguments.[/quote] Misschien omdat de array van het type string is?

offtopic:
edit: ik zie dat ik nu twee posts onder elkaar heb, niet de bedoeling, maar ach ja..


edit:

Inmiddels een oplossing gevonden mbv bovenstaande posts:

code:
1
2
3
4
5
6
7
8
iIndex = Array.IndexOf(allowedChars, value.Substring(n, 1))

If iIndex >= 0 Then
  tmpValue = iIndex
Else
  tmpValue = 0
  err = True
End If

[ Voor 19% gewijzigd door tjmv op 19-09-2006 17:15 ]


  • whoami
  • Registratie: December 2000
  • Nu online
Misschien omdat de array van het type string is?
Kijk eens in de help naar de informatie over IndexOf.
"" zijn strings, '' zijn characters.

Over die foutmelding / crash: gebruik de tools die je IDE je biedt: stap eens regel voor regel door je programma, en zie waar het fout gaat. Breakpoints en watches gebruiken.

Dit is dus gewoon je code debuggen, en dat moet je zelf kunnen. Dat is iig niet iets wat wij hier voor jou gaan doen.

https://fgheysels.github.io/


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Inmiddels is dit topic even open geweest voor Da Devil om zijn gevonden oplossing te posten. Thnx @Da Devil; oplossingen zijn altijd welkom ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1

Dit topic is gesloten.