Másodfokú egyenlet megoldása VBA

Másodfokú egyenlet megoldása VBA
2006-02-01T12:02:57+01:00
2006-02-04T06:08:44+01:00
2022-10-29T02:41:57+02:00
hungry_mind
Egy programot kellene irnom VBA-ban, ami kiszámolja a másodfokú egyenlet megoldásait.

A gondom az az, hogy ilyen módon kell megadnom az egyenletet. pl.:

2X^2+3X=0

Tehát nem az a, b, c értékeket kérem be, és abból számolja ki az x1, x2 gyököt, hanem Egy inputbox van, és abba ilyen módon kell beirnom az egyenletet.

Ezt hogyan tudom lekezelni, hogy pontosan tudja, melyik karakter az a,b,c?

Bármilyen tippet, segítséget nagyon megköszönök.

a másodfokú egyenlet megoldóképlete:
ax^2 + bx + c = 0 alakról

x1 = -b + (b^2 - 4ac )/ 2a
x2 = -b - (b^2 - 4ac )/ 2a
Mutasd a teljes hozzászólást!
x = Replace(x, " ", "") ?????
Cseréli a szóközt semmire. Ha véletlenül lenne benne, akkor ne legyen.

x = Replace(x, "=0", "") ?????
Az "=0"-t dobja el a végéről.

For i = LBound(adat) To UBound(adat) ?????
Menjen végig az adat tömb összes elemén, a legkisebb indextől a legnagyobbig.



If InStr(adat(i), "^") > 0 Then
Instr megnézi, hogy az első adatban hol van a 2. Ha nincs, akkor a visszatérési érték 0, ha van, akkor a kezdőpont.
Tehát ha >0, akkor benne van a ^2

atarto = adat(i) ?????
Ebben a blokkban van ^ jel, tehát az lesz az aX^2 rész. Tehát elteszem egy változóba.

adat(i) = "" ?????
Kitörlöm a tömbből, mert ez a rész már nem érdekes az első és a 0. foknál.

If InStr(adat(i), "X") Then ?????
btarto = adat(i) ?????
Lásd a felsőt, csak most elég az X, hiszen az X^-et kitöröltem

a = Val(Replace(atarto, "X^2", "")) ?????
b = Val(Replace(btarto, "X", "")) ?????
c = Val(ctarto) ?????

az aX^2-ből az X^2-et lecserélem semmire, így csak a szám (a) marad. Ez karakteres, ezért val-al számmá alakítom.
b, c (szerintem) értelemszerű ebből.
Mutasd a teljes hozzászólást!

  • Végigmész a karaktereken.

    for i=1 to len(bekert)

    Vizsgálod egyenként (mid(bekert,i,1))
    Ha ez nem tizedes, vagy számjegy, akkor idáig tartott az "a". (Pesze lehet azt is, hogy amíg nem X)

    Utána mész tovább a karaktereken.
    Ha + vagy -, akkor utána jön a "b"
    Feldolgozod azt a részt ugyan úgy, mint az "a"-t.

    ----

    Bár lehet, hogy én azt csinálnám, hogy a + és a - jeleket lecserélném pl. "|" ra.

    Split-el szétvágnám.
    Amelyikben van "^" ott van az "a" (a feldolgozást ld. fent)
    Utána amelyik megmaradtban van "X", ott van a B
    és a maradékban van a "c"
    Majd ez alapján visszateheted az első, vagy 2. helyre a - értéket.
    Mutasd a teljes hozzászólást!
  • Bocsásd meg tudatlanságomat, de mit értesz azon, hogy split-tel szétvágod..?

    php-ben létezik a split fv, de VBA-ban...?

    Ne értsd félre, nem vonom kétségbe.

    Azt hogyan lehet megoldani, hogy vizsgálom, hogy a pl. 4-ik elem az X, és ami elötte van az az a ?

    Hiszem nemcsak egy szám lehet elötte, hanem mondjuk 342 is.?

    Azonkívül előrdulhat az egyenletben negativ szám is.

    Ha esetleg egy rövid kódrészletet irnál, a vizsgálatra az sokat segíteni...

    Köszönettel: hungry_mind
    Mutasd a teljes hozzászólást!
  • Én a helyedben feldarabolnám az +/- mentén
    ekkor 3 vagy 4 csoport lesz:
    opcionáliasan :
    1. csoport [-] //ha a negativ
    2. csoport ax^2
    3. csoport [+/-]bx
    4. csoport [+/-]c

    1. lépés
    Mivel az első csoport <=> létezik, ha az 1. karakter - => megvizsgálva a string 1. karakterét megjegyzed, hogy a negativ-e.
    Ha negativ, akkor az első karaktert levágod a string elejéről
    2. lépés
    Megkeresed, hogy melyik a 2. csoport
    Az amelyikben találsz ^2 kifejezést
    Ebből kibányászod az a értékét az alábbi algoritmus szerint:

    [BANYASZAS]
    - I. megkeresed az x karakter pozocoóját, legyen ez px
    - II. levágod a 2. csoport stringjéről px-től kezdődően az összes karaktert -> marad az x előtti, ami ugye maga az a
    -III. Konvertálsz
    [BANYASZAS VÉGE]

    Konvertálás után megvan az a abszolut értéke, ha előzőleg negativ volt->
    a*=-1

    3. lépés
    Megkeresed, hogy melyik a 3. csoport
    Az, amelyik nem a 2. (ezt már tudod), és találsz benne x-et
    A [BANYASZAS] algoritmussal szintén felbontod. -> megvan b
    4. lépés
    A maradék csoporton [BANYASZAS]->c

    Ezzel a problémát visszavezetted az általad említett paraméterbekéregetős módszerre

    Remélem segítettem!

    Üdv!
    Mutasd a teljes hozzászólást!
  • Van split a VBA-ban is

    Php-ban nem explode?
    ---

    De egyszuerűbb az első javaslatom az előjeleknél:
    Sub t2(x) Dim adat(5) As String x = Replace(x, " ", "") x = Replace(x, "=0", "") p = 0 ki = "" For i = 1 To Len(x) If Mid(x, i, 1) = "+" Or Mid(x, i, 1) = "-" Then p = p + 1 adat(p) = adat(p) & Mid(x, i, 1) Else adat(p) = adat(p) & Mid(x, i, 1) End If Next atarto = "" btarto = "" ctarto = "" For i = LBound(adat) To UBound(adat) If InStr(adat(i), "^") > 0 Then atarto = adat(i) adat(i) = "" End If Next For i = LBound(adat) To UBound(adat) If InStr(adat(i), "X") Then btarto = adat(i) adat(i) = "" End If Next For i = LBound(adat) To UBound(adat) If adat(i) <> "" And Left(adat(i), 1) <> "=" Then ctarto = adat(i) adat(i) = "" End If Next a = Val(Replace(atarto, "X^2", "")) b = Val(Replace(btarto, "X", "")) c = Val(ctarto) MsgBox a & vbCr & b & vbCr & c End Sub

    Teszt formák:
    2X^2+3X=0
    2X^2-3X=0
    2X^2+3X+4=0
    2X^2+4=0
    2X^2-3X=0
    2X^2-3X-4=0
    2X^2-4=0
    4+3X^3+2X=0
    -4+3X^3+2X=0
    -2*-5X-3X^2=0

    a,b,c ismeretében a többit rád bízom.
    Mutasd a teljes hozzászólást!
  • Köszönöm micu-nak és babo_-nak is a segítséget.

    Azt hiszem rágódnom kell rajta.......

    Melyik megoldás a 'bolondbiztos', és a számomra érthető...
    Mutasd a teljes hozzászólást!
  • "ekkor 3 vagy 4 csoport lesz:"

    vagy 1 vagy 2.

    A kérdezett formánál:
    2X^2+3X=0
    2 értékes csoport van
    És akkor a 2. értékes csoport 3X=0 értékét még nem vitattuk meg
    Mutasd a teljes hozzászólást!
  • Én az általam írt algoritmust megvalósítottam Java alatt, annyi különbséggel, hogy ott törteket is meg lehetett adni a/b alakban.
    Mutasd a teljes hozzászólást!
  • Egyenlőre még ott tartok, hogy a kódodat rágom....

    Nagyon sok az ismeretlen benne. Most azon vagyok hogy kiderítsem mi mit csinál....

    Ahová kérdőjelet raktam, ott vagy a fv-t nem ismerem még, vagy nem pontosan értem mit csinál.... De rágom...

    Sub t2(x)
    Dim adat(5) As String
    x = Replace(x, " ", "") ?????
    x = Replace(x, "=0", "") ?????
    p = 0
    ki = ""
    For i = 1 To Len(x)
    If Mid(x, i, 1) = "+" Or Mid(x, i, 1) = "-" Then
    p = p + 1
    adat(p) = adat(p) & Mid(x, i, 1)
    Else
    adat(p) = adat(p) & Mid(x, i, 1)
    End If
    Next

    atarto = ""
    btarto = ""
    ctarto = ""
    For i = LBound(adat) To UBound(adat) ?????
    If InStr(adat(i), "^") > 0 Then ?????
    atarto = adat(i) ?????
    adat(i) = "" ?????
    End If
    Next

    For i = LBound(adat) To UBound(adat)
    If InStr(adat(i), "X") Then ?????
    btarto = adat(i) ?????
    adat(i) = ""
    End If
    Next

    For i = LBound(adat) To UBound(adat)
    If adat(i) <> "" And Left(adat(i), 1) <> "=" Then
    ctarto = adat(i)
    adat(i) = ""
    End If
    Next
    a = Val(Replace(atarto, "X^2", "")) ?????
    b = Val(Replace(btarto, "X", "")) ?????
    c = Val(ctarto) ?????
    MsgBox a & vbCr & b & vbCr & c
    End Sub

    Teszt formák:
    2X^2+3X=0
    2X^2-3X=0
    2X^2+3X+4=0
    2X^2+4=0
    2X^2-3X=0
    2X^2-3X-4=0
    2X^2-4=0
    4+3X^3+2X=0
    -4+3X^3+2X=0
    -2*-5X-3X^2=0
    Mutasd a teljes hozzászólást!
  • Ennek őszintén örülök....


    Esetleg VBA-ra nem fordítanád le.....

    Sajna nem vagyok ilyen gyors, és még csak alapozok..... 1,5 hónapja ismerkedem a VBA-val...

    1-2 nap biztso kell amig a tiédet is átrágom.......

    Meg ezt a törtes dolgot is. Mivel nekem is bele kell vennem, ha bolondbiztos kell hogy legyen....
    Mutasd a teljes hozzászólást!
  • x = Replace(x, " ", "") ?????
    Cseréli a szóközt semmire. Ha véletlenül lenne benne, akkor ne legyen.

    x = Replace(x, "=0", "") ?????
    Az "=0"-t dobja el a végéről.

    For i = LBound(adat) To UBound(adat) ?????
    Menjen végig az adat tömb összes elemén, a legkisebb indextől a legnagyobbig.



    If InStr(adat(i), "^") > 0 Then
    Instr megnézi, hogy az első adatban hol van a 2. Ha nincs, akkor a visszatérési érték 0, ha van, akkor a kezdőpont.
    Tehát ha >0, akkor benne van a ^2

    atarto = adat(i) ?????
    Ebben a blokkban van ^ jel, tehát az lesz az aX^2 rész. Tehát elteszem egy változóba.

    adat(i) = "" ?????
    Kitörlöm a tömbből, mert ez a rész már nem érdekes az első és a 0. foknál.

    If InStr(adat(i), "X") Then ?????
    btarto = adat(i) ?????
    Lásd a felsőt, csak most elég az X, hiszen az X^-et kitöröltem

    a = Val(Replace(atarto, "X^2", "")) ?????
    b = Val(Replace(btarto, "X", "")) ?????
    c = Val(ctarto) ?????

    az aX^2-ből az X^2-et lecserélem semmire, így csak a szám (a) marad. Ez karakteres, ezért val-al számmá alakítom.
    b, c (szerintem) értelemszerű ebből.
    Mutasd a teljes hozzászólást!
  • Azt hiszem Micu megérdemled az 50 pontot.

    Köszönöm a megoldást: Hungry_Mind
    Mutasd a teljes hozzászólást!
  • Szívesen
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd