P0wer Skrevet 19. september 2005 Del Skrevet 19. september 2005 (endret) Jeg har akkurat begynnt å jobbe med Visual Basic 6.0 Jeg tengte jeg skulle prøve å lage en kalkulator med Cos, Sin og Tan. Det fikk jeg til, men jeg fikk ikke til å regne ut det inverse av Cos og Sin, bare av Tan med formelen Atn(X) Altså jeg lurer på hva koden for Cos^-1 og Sin^-1 er? (^=opphøyd i) Jeg har prøvd noen koder, men da krasjet programmet hvis jeg tok Sin^-1(1) For eksempel vil jeg at svaret av Cos^-1(0,5)=60grader. Er det bare å gange med pi og dele på 180 for å gjøre om radianer til grader? Kodene mine: Private Sub Command1_Click() Dim Tall1, Tall2, Sum, pi Tall1 = Text1.Text Tall2 = Text2.Text pi = 3.14159265358979 If Option1.Value = True Then Sum = Tall1 * Tall2 If Option2.Value = True Then Sum = Tall1 / Tall2 If Option3.Value = True Then Sum = Tall1 - Tall2 If Option6.Value = True Then Sum = Tall1 + Tall2 If Option7.Value = True Then Sum = Cos(Tall1 * pi / 180) If Option8.Value = True Then Sum = Sin(Tall1 * pi / 180) If Option9.Value = True Then Sum = Tan(Tall1 * pi / 180) If Option10.Value = True Then Sum = Cos(Tall1 * pi / 180) If Option11.Value = True Then Sum = Sin(Tall1 * pi / 180) If Option15.Value = True Then Sum = Atn(Tall1) * 180 / pi De siste linjene som er understreket skal jeg bytte ut me de nye formlene!! (er det forresten nøye å skrive As xxx etter variabelnamnet i Dim-kommandoen? Hva skjer hvis det ikke står noe, som i koden min?) Endret 19. september 2005 av P0wer Lenke til kommentar
aadnk Skrevet 19. september 2005 Del Skrevet 19. september 2005 (endret) Er det bare å gange med pi og dele på 180 for å gjøre om radianer til grader? Sannsynligvis, skjønt jeg bruker helst følgende konstanter for å forenkle omregningen: Public Const PI = 3.14159265358979Public Const Radian = PI / 180 Se på følgende liste. Koden du benytter nå, er ikke for den omvendte sinus og cosinus: Secant: Sec(X) = 1 / Cos(X)Cosecant: Cosec(X) = 1 / Sin(X) Cotangent: Cotan(X) = 1 / Tan(X) Inverse Sine: Arcsin(X) = Atn(X / Sqr(-X * X + 1)) Inverse Cosine: Arccos(X) = Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1) Inverse Secant: Arcsec(X) = Atn(X / Sqr(X * X - 1)) + Sgn((X) - 1) * (2 * Atn(1)) Inverse Cosecant: Arccosec(X) = Atn(X / Sqr(X * X - 1)) + (Sgn(X) - 1) * (2 * Atn(1)) Inverse Cotangent: Arccotan(X) = Atn(X) + 2 * Atn(1) Hyperbolic Sine: HSin(X) = (Exp(X) - Exp(-X)) / 2 Hyperbolic Cosine: HCos(X) = (Exp(X) + Exp(-X)) / 2 Hyperbolic Tangent: HTan(X) = (Exp(X) - Exp(-X)) / (Exp(X) + Exp(-X)) Hyperbolic Secant: HSec(X) = 2 / (Exp(X) + Exp(-X)) Hyperbolic Cosecant: HCosec(X) = 2 / (Exp(X) - Exp(-X)) Hyperbolic Cotangent: HCotan(X) = (Exp(X) + Exp(-X)) / (Exp(X) - Exp(-X)) Inverse Hyperbolic Sine: HArcsin(X) = Log(X + Sqr(X * X + 1)) Inverse Hyperbolic Cosine: HArccos(X) = Log(X + Sqr(X * X - 1)) Inverse Hyperbolic Tangent: HArctan(X) = Log((1 + X) / (1 - X)) / 2 Inverse Hyperbolic Secant: HArcsec(X) = Log((Sqr(-X * X + 1) + 1) / X) Inverse Hyperbolic Cosecant: HArccosec(X) = Log((Sgn(X) * Sqr(X * X + 1) + 1) / X) Inverse Hyperbolic Cotangent: HArccotan(X) = Log((X + 1) / (X - 1)) / 2 Logarithm to base N: LogN(X) = Log(X) / Log(N) I tillegg er det inndata som skal omgjøres til grader, ikke utdata, om jeg tar feil (jf. siste linje i koden din). For øvrig vil jeg anbefale å heller gange med Radian-kontanten ovenfor enn å utføre omregningen direkte i koden. (er det forresten nøye å skrive As xxx etter variabelnamnet i Dim-kommandoen?Hva skjer hvis det ikke står noe, som i koden min?) Ja, det er temmelig vesentlig. Variant er mye tregere og opptar mer minne enn de egnede datatypene, og du får dessuten mye mindre kontroll over sluttproduktet av mang en utregning. Med Variant må du selv forsikre deg om at tallet er uten desimaler, mens du med Long, eksempelvis, får dette konvertert automatisk. Endret 19. september 2005 av aadnk Lenke til kommentar
GeirGrusom Skrevet 20. september 2005 Del Skrevet 20. september 2005 Alt av variabler av typen Variant (altså de du deklarerer uten datatype) tar 16 byte pluss datamangden, så en long, som skulle tatt 4 byte, tar plutselig 20 byte. Lenke til kommentar
P0wer Skrevet 21. september 2005 Forfatter Del Skrevet 21. september 2005 (endret) Jeg har byttet ut kodene med disse: Private Sub Command1_Click() Dim Tall1, Tall2, Sum Dim pi, RadGra, GraRad Tall1 = Text1.Text Tall2 = Text2.Text 'pi kan også skrivest som 4 * Atn(1) pi = 3.14159265358979 RadGra = (pi / 180) GraRad = (180 / pi) 'cos-1 If Option17.Value = True Then Sum = (-Atn(Tall1 / Sqr(-Tall1 * Tall1 + 1)) + (pi) / 2) * GraRad 'sin-1 If Option16.Value = True Then Sum = Atn(Tall1 / Sqr(-Tall1 * Tall1 + 1)) * GraRad 'tan-1 If Option15.Value = True Then Sum = Atn(Tall1) * GraRad 'Kvadratroten kan også srivest som Sqr(Tall1) If Option10.Value = True Then Sum = Tall1 ^ (1 / 2) 'Kubikkrot If Option18.Value = True Then Sum = Tall1 ^ (1 / 3) Kalkulatoren greier ikke å regne ut at Sin^-1(1)=90. Det kommer bare en feilmelding og programmet krasjer, hva er galt? Er det mulig å få flere siffere i pi? Jeg limte inn pi fra windowskalkulatoren, men ca 15 siffer bak kommaet forsvant! Bilr det mer nøyaktig hvis jeg bruker 4 * Atn(1) ? Hva betyr Public Const ? Ikke skriv vanskelige svar, dette er det første programmet jeg noen sinne har laget !! Endret 21. september 2005 av P0wer Lenke til kommentar
P0wer Skrevet 21. september 2005 Forfatter Del Skrevet 21. september 2005 (endret) Fant forresten enda et par feiler : sin 360 = -0,646217020866535 skulle ha vært sin 360 = 0 tan 90 = 618987100438218,0 skulle ha vært tan 90 = Matematisk feil Endret 21. september 2005 av P0wer Lenke til kommentar
GeirGrusom Skrevet 21. september 2005 Del Skrevet 21. september 2005 Fortsatt må du deklarere datatypene Dim Tall1 As Decimal, Tall2 As Decimal, Sum As Decimal Dim pi As Decimal, RadGra As Decimal, GraRad As Decimal Grunnen til at du burde bruke decimal, er fordi decimal er enten 80 bit, eller 128 bit Og fortell at alt av konstanter, som f.eks. 1 skal være flyttall, altså 1.0 Er det mulig å få flere siffere i pi? dontgetit.gifJeg limte inn pi fra windowskalkulatoren, men ca 15 siffer bak kommaet forsvant! mad.gif Bilr det mer nøyaktig hvis jeg bruker 4 * Atn(1) ? De forsvinner fordi calc.exe ikke bruker hverken Single eller Double precision floating point, altså noe mer presist, kan være at den er 80 bit eller mer. Grunnen til at jeg sier 80 bit så mye, er fordi prosessorens FPU (floating Point Unit) regner med enten 32 bit (single), 64 bit (double) eller 80 bit (som sjeldent blir brukt) public betyr at den er mulig å få tak i fra utenfor modulen, formen eller klassen den er deklarert i. Hva betyr Public Const ? Du bruker const når det er noe du kanskje vil at VB skal regne ut under kompilering (altså når du trykker F5, eller lager .exe fil av det) eller at verdien kanskje vil endres, uten at du må gå igjennom alle steder der du har skrevet 3.14 og bytte det ut. Lenke til kommentar
P0wer Skrevet 21. september 2005 Forfatter Del Skrevet 21. september 2005 Visual Basic godtar ikke "As Decimal"! Jeg har versjon 6 fra 1998 tror jeg Lenke til kommentar
GeirGrusom Skrevet 21. september 2005 Del Skrevet 21. september 2005 Ah, stemmer, det heter Decimal i .NET, i VB6 heter det Currency, dumme meg. Lenke til kommentar
P0wer Skrevet 21. september 2005 Forfatter Del Skrevet 21. september 2005 Takk skal du ha Lenke til kommentar
aadnk Skrevet 21. september 2005 Del Skrevet 21. september 2005 sin 360 = -0,646217020866535skulle ha vært sin 360 = 0 tan 90 = 618987100438218,0 skulle ha vært tan 90 = Matematisk feil Dette er grunnet unøyaktigheter knyttet til konverteringen av grader til radian, men forskjellen er ikke så stor som du presenterer det her. Verdien jeg fikk på sinusfunksjonen var -6,46217020866535E-15 - et temmelig lavt nummer. Hva tangens-funksjonen angår, må du nok fikse det der selv. Bruk en IF-setning til å teste om inndata er gyldig eller ei, før du bruker Tan-funksjonen. Lenke til kommentar
P0wer Skrevet 21. september 2005 Forfatter Del Skrevet 21. september 2005 Hva gjør jeg for å fikse de matematiske problemene sin 360 = -0,646217020866535 skulle ha vært sin 360 = 0 OSV... Lenke til kommentar
P0wer Skrevet 21. september 2005 Forfatter Del Skrevet 21. september 2005 Jeg får: -6,46217020866535E-1 Jeg tror det har med å gjøre at tekstboksen ikke viser flere tall, selv om den er mer enn brei nok! Den kutter sikkert det siste tallet. Lenke til kommentar
aadnk Skrevet 21. september 2005 Del Skrevet 21. september 2005 Som jeg sa i mitt tidligere innlegg, bruk en IF-setning: ' Sjekk om inndata ikke er lik 360If lngDegrees = 360 Then ' I så fall kan resultatet kun være null txtResult = 0 Else ' Kalkuler sinus txtResult = Sin(lngDegrees * Radian) End If Lenke til kommentar
P0wer Skrevet 25. september 2005 Forfatter Del Skrevet 25. september 2005 Jeg tengte å legge til en funksjon til, nemlig å regne om desimaltall til binærtall, og omvendt. Noen som vet en enkel formel for dette? For å få det til å virke i Visual Basic mener jeg? Lenke til kommentar
aadnk Skrevet 25. september 2005 Del Skrevet 25. september 2005 Jeg tengte å legge til en funksjon til, nemlig å regne om desimaltall til binærtall, og omvendt. Hva med følgende: Public Function BinaryToDecimal(sBinary As String) As Long Dim Tell As Long ' Summer alle karakterer i strengen For Tell = 1 To Len(sBinary) ' Dersom dette er en sann-karakter, ... If Mid(sBinary, Tell, 1) = "1" Then ' ... summer BinaryToDecimal = BinaryToDecimal + 2 ^ (Len(sBinary) - Tell) End If Next End Function Public Function DecimalToBinary(ByVal lngValue As Long, ByVal lngMax As Long) As String Dim Tell As Long ' Først må vi allokere utdata DecimalToBinary = String(lngMax, "0") For Tell = lngMax - 1 To 0 Step -1 ' Sjekk om vi kan sette bit'en til sann uten å overstige grensen If lngValue - (2 ^ Tell) >= 0 Then ' Sett verdi Mid(DecimalToBinary, lngMax - Tell, 1) = "1" ' Forminsk den gjeldende verdi lngValue = lngValue - (2 ^ Tell) End If Next End Function lngMax-variabelen er den maksimale lengden på binær-utdata. Med den kan du spesifisere hvorvidt du ønsker å motta binær-representasjon av en Byte (8), Integer (16) eller Long. Lenke til kommentar
P0wer Skrevet 3. oktober 2005 Forfatter Del Skrevet 3. oktober 2005 Kan jeg på noen måte slette det jeg har "skrevet ut" med Print-funksjonen uten å restarte programmet? Slik at jeg kan "Printe" på nytt uten at teksten forsvinner utenfor rammen i pogrammet? Lenke til kommentar
Richard87 Skrevet 3. oktober 2005 Del Skrevet 3. oktober 2005 ja, bruk Me.Cls for og fjerne ALL teksten i vinduet.. Lenke til kommentar
P0wer Skrevet 5. oktober 2005 Forfatter Del Skrevet 5. oktober 2005 (endret) Hvordan i all verden skal jeg bruke desimal-binær-funksjonen??: Public Function DecimalToBinary(ByVal lngValue As Long, ByVal lngMax As Long) As String Dim Tell As Long ' Først må vi allokere utdata DecimalToBinary = String(lngMax, "0") For Tell = lngMax - 1 To 0 Step -1 ' Sjekk om vi kan sette bit'en til sann uten å overstige grensen If lngValue - (2 ^ Tell) >= 0 Then ' Sett verdi Mid(DecimalToBinary, lngMax - Tell, 1) = "1" ' Forminsk den gjeldende verdi lngValue = lngValue - (2 ^ Tell) End If Next End Function Jeg skal ha et tekstfelt, Text1.text, for å skrive desimaltall i, en label, Label1.Caption, til å vise binærtallet og en knapp, Command1.Command, for å starte utregningen. Kan du forklare hvordan For ... Next - loopen i koden "virker"? Jeg er nybegynner! Endret 5. oktober 2005 av P0wer Lenke til kommentar
aadnk Skrevet 6. oktober 2005 Del Skrevet 6. oktober 2005 Du skal simpelthen legge inn koden jeg gav deg i formen. Etter det, kan du gjøre følgende: Private Sub Command1_Click() ' Konverter desimaltall til binær Label1.Caption = DecimalToBinary(Val(Text1.Text), 16) End Sub Lenke til kommentar
P0wer Skrevet 8. oktober 2005 Forfatter Del Skrevet 8. oktober 2005 Hvordan skal jeg få til å gjøre slik at når jeg klikker i skrivefeltet i en tekstboks så blir all teksten automatisk merket? Hilken kommando? Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå