![]() |
getallenstelsels in visual basic.net
hoe kan ik met visual basic.NET een programma schrijven dat een getal uit bijvoorbeeld het decimale getallenstelsel omrekent naar het hexadecimale stelsel?
|
(volgends mij is dit een maak-mijn-huiswerk vraag.
Maar we willen je altijd helpen met de dingen die je al hebt :) ) Dus zeg ik je het volgende:
|
Maak je maar geen zorgen, ik wil juist NIET dat jullie m'n huiswerk gaan maken. Het punt is dat ik wel snap hoe je met pen/papier naar bijv. hexadecimaal kunt omrekenen, en het hele principe erachter begrijp. Ik snap echter niet hoe je dit dus in een script kunt zetten. Specifieker: hoe vertel ik de computer dat bijvoorbeeld 130 gedeeld door 13 geen 10 is (in bijvoorbeeld een 13 tallig stelsel), maar A..?
|
kent VB standaard geen base() functie oid ?
Anyhow, decimaal naar binair (pseudocode, althans, dat probeer ik) Code:
if number > 255 of gebruik de logische AND, although ik niet weet hoe VB die intepreteerd: Code:
(...) |
en via google kwam ik dit tegen:
Code:
Public Function DecimalToBinary(DecimalNum As Long) As String |
Citaat:
Dat is de uitgebreide uitleg, zo stapsgewijs ga je natuurlijk geen code schrijven, maar het idee is duidelijk. |
.NET?
Dan kan het toch gewoon met: Code:
Convert.ToByte(getal,10) |
Dat weet ik dus niet...die methode ken ik verder niet iig.
Kun je eens voordoen hoe dat volgens jouw methode komt uit te zien als je het getal 131 van decimaal naar 13 tallig stelsel wilt omrekenen? De uitkomst moet dan A1 zijn... |
Citaat:
ffs dude, ik denk dat we je genoeg handvatten hebben aangereikt waarmee je verder kan, ik bedoel, probeer zelf eerst de formule te maken (of berekening), schrijf die uit, probeer die dan in VB te gooien, ga debuggen en komt d'r iets raars uit, post 't dan hier |
Citaat:
En qua code-shortening; Code:
for number in 128 64 32 16 8 4 2 1 |
Citaat:
|
Citaat:
Zelf schrijf ik al lang geen Basic meer, dus zal ik maar geen moeite doen om in psuedocode te werken, maar je gaat hier volgens mij gewoon enerzijds met wat wiskunde te maken krijgen en anderzijds met stringbewerkingen (omdat een computer alles binair opslaat, en de programma's die binaire gegevens natuurlijk omzetten naar decimale notatie, wat in feite een string is). Mijn idee is als volgt: 1. je maakt een functie die een de mogelijke tekens teruggeeft in de volgorde van hun waarde, voor het tientallig stelsel heb je dan "0123456789", voor het 16-delig zou dat "0123456789abcde" zijn, bijvoorbeeld. Dit is nodig omdat je anders vast voor elk stelsel nogal sprongen gaat moeten maken in je berekeningen. Wat ik persoonlijk zou doen is in die functie een constante opslaan en dan als je als argument bv. 13 meegeeft, dat hij van die constante string '0123 .... xyz' (lijkt me het meest logische) de eerste 13 tekens als resultaat teruggeeft. 2. verder heb je nog twee functies nodig, eentje om om te zetten van getal naar getal in andere notatie (string eigenlijk) en omgekeerd (string in bepaald getalstelsel naar getal in computernotatie/integer dus). Die functies zijn niet zo heel moeilijk te schrijven, lijkt me, gewoon wat over nadenken en je komt er wel. Toch hier nog enkele tips: Vergeet niet dat elke getalspositie een andere waarde vertegenwoordigt, in het tientalligstelsel, bijvoorbeeld: 132465 = 100000 + 30000 + 2000 + 400 + 60 + 5 en niet 1 + 3 + 2 + 4 + 6 + 5. In het binair krijg je 10101 = 10000 + 0000 + 100 + 00 + 1 Wiskundig valt dit nog mooier te schrijven, dat is wat jij moet doen. Berekening laat je best steeds gewoon door de computer uitwerken, dus gewoon steeds naar integer omzetten, bewerkingen laten uitvoeren en terugrekenen naar je getalstelsel, anders zit je met vreselijk ingewikkelde stringbewerkingen, lijkt me, als het zelfs niet zo goed als onmogelijk is om een generisch oplossing voor alle getalstelsels te maken). |
Citaat:
|
ik zou zeggen pas gewoon de definities van de (hexa)decimale stelsels toe.
12510=1×10²+2×101+5×100 Dit wiskunde implementeren is natuurlijk veel 'leuker' dan een bestaande functie gebruiken ;) |
maar bij dat laatste heb je het probleem van een eindig stelsel, zoals jij het defineert. Wat ik meer bedoel is een algemene code die 155 kan uitrekenen, maar bijvoorbeeld ook 3465425344235243523625262546347 (decimaal) eventjes omzet naar het 13tallige stelsel. Dus dat je van te voren niet weet hoe groot het getal is dat je d'r in stopt...de methode mag dus niet eindigen, voordat er niets meer overblijft.
Ik zat zelf meer aan een loop te denken: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim getal As Integer = txtbx10tal1.Text nieuwGetal(getal) txtbx13tal1.Text = (nieuwGetal(getal)) End Sub Private Function nieuwGetal(ByVal getal As Integer) As Integer Do Dim x as integer x= getal mod 13 nieuwGetal = getal / 13 If nieuwgetal < 13 then return nieuwGetal loop |
dan is alleen nog de vraag hoe ik 1 2 3 4 5 6 7 8 9 omzet in 1 2 3 4 5 6 7 8 9 A B C D
|
Citaat:
Maar bon, soit. Verder, ik zou niet denken in functie van getallen, de computer telt enkel binair en toont dat decimaal. Je interger kan nooit "AAA" zijn als weergave, hoewel dat ook een getal kan voorstellen in de wiskunde, werk met stringbewerkingen, kijk die eens na. Stel je hebt een getalstring "ABCDE" (hexadecimaal, voor de eenvoud), hoe bepaal je dan de grootteorde van die A? (simpeler: begin van achteren te redenen: E, D , C, ...) Wat is "B" in het hexadecimaal stelsel? Ja, het "B"-de teken (hex), dat is dus het 11e teken (dec) (als je nul als 0e teken ziet, wat volgens mij het simpelste is, zeker bij een dergelijke implementatie). Wat is dan een "B" op de 2e locatie waard? B(hex) x "16"(dec). En op de derde plaats? B(hex) x 16^2 (dec). En ga zo maar door. Dit is vrij makkelijk te implementeren. In jouw implementatie zie ik trouwens slechts een vast gegeven; die "13", dat stoort me. Probeer de methode die ik hierboven al aangeef eens: een functie om een getalstring in getalstelsel X om te zetten naar een voor de computer werkbaar getal (integer) en een functie omgekeer: een integer naar een getalstring in stelsel Y (en X en Y zijn daarin parameters, of dat nu 1 of 13 of 27 of 666 is, dat maakt voor de implementatie zelf weinig uit: dat is programmeren, een algemene oplossing vinden voor een probleem). |
ja oke, ik snap inderdaad de omrekening. Dan vraag ik me alleen dus af: HOE koppel ik zoiets aan een string? met CStr?
|
Citaat:
Code:
// functie om standaard tekens (volgorde) te bepalen, zodat na 9 een a volgt enzovoorts) Met behulp van volgende code, zou je bijvoorbeeld een getal van binair naar hexadecimaal dan omzetten: Code:
var bingetal, hexgetal: string; Code:
var bingetal, hexgetal:string; Wat er dus gebeurt is dat het binair getal in stringformaat eerst naar een getal in computerformaat (binair, maar meestal weergegeven in het decimaal) en dan ga je dat getal omrekenen naar een hexadecimaal getal. Ik hoop dat je een beetje de werkwijze begrijpt, je moet zelf een beetje proberen, de bovenstaande code is geschreven op een half uurtje, gok ik, en is zeker niet machinaal getest (maar wel manueel eens geevalueerd). Voor de specifieke implementatie in Basic, moet je daar in de help maar eens rondkijken of op sites naar stringbewerkingen voor Basic zoeken, want daar komt het meestal wel op neer. |
Citaat:
|
allereerst: iedereen die iets zinnigs postte: bedankt!
ten tweede: dit is de code die ik er van geproduceerd heb. Volgens mij klopt hij. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim intTemp, intInput, intStelsel As Integer Dim strOutput As String = "" Dim arrConversie() As String = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C"} intInput = CInt(txtbx10tal1.Text) intStelsel = 13 convertRoutine: intTemp = intInput - Int(intInput / intStelsel) * intStelsel If intInput = 0 Then GoTo prgEinde intInput = (intInput - intTemp) / intStelsel strOutput = arrConversie(intTemp) + strOutput GoTo convertRoutine prgEinde: txtbx13tal1.Text = (CStr(strOutput)) End Sub End Class |
Mijn kennis Basic zit zoals ik gezegd heb te ver om de juistheid te controleren, ik kan je enkel de volgende tip geven: gebruik niet te veel goto/gosub in Basic, als je nadien je code moet aanpassen, ga je het hier best moeilijk mee krijgen om up te daten. Daarom zijn er structuren als WHILE en UNTIL (hoe de juiste syntaxis in Basic is, dat kan je wel opzoeken, ze verschillen normaal niet al te veel van Object Pascal, maar mijn Basic zit echt te ver om je te kunnen zeggen of het exact hetzelfde is (enkel dat de FOR-lus net wat anders is, kan ik zeggen).
|
Citaat:
VB kent (geloof ik) 'do { } while (bool)' of 'while (bool) do { }'. in C heb je ook geen goto's nodig. dus hoeft dat in VB ook niet, daar wordt je code alleen maar vervelend van. |
onderstaande code heb ik ff aangepast, zoals ik t zou doen. ik heb t echter niet getest (en weet niet zeker of alles wel VB is).
Citaat:
een en ander is wellicht ook slordige code, maar het gaat om het idee. nu heb je een functie die je kunt gebruiken om elke willekeurige string om te toveren in een ander stelsel. (even ervan uitgaande dat jouw code verder goed werkt, ik heb alleen de vorm wat aangepast). al dit soort zooi kun je het beste in een module zetten, die je dan bij al je projecten kunt gebruiken. dat scheelt werk, en is 'good coding practice'. |
Citaat:
|
Citaat:
|
Alle tijden zijn GMT +1. Het is nu 11:43. |
Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.