Prím függvény (VBA)

Prím függvény (VBA)
2017-05-01T09:14:36+02:00
2017-05-04T14:51:42+02:00
2022-10-15T22:26:42+02:00
*deleted_76811819
Sziasztok!

Segítséget szeretnék kérni az Excel VBA-hoz. Levelezős hallgató vagyok az egyetemen, és nem sok segítséget adnak a tanuláshoz / vizsgához.

A feladat:
A Prim függvény segítségével határozza meg a 234-nél kisebb 12-edik prímszámot! A szubrutin csak az adott számot írja ki (adja meg) eredményként! (eredmény:173)

A gondom az, hogy nem tudom hogyan tudnám kiíratni vele a 12. számot!

Sub x()
    Const Mettol = 1
    Const Meddig = 234
    Dim i As Long, db As Long, st As String
    db = 0
    st = ""
    For i = Mettol To Meddig
    If Prim(i) Then
        db = db + 1
        st = st + " " & i
    End If
    Next
    pos = InStr(st, 12)   <<<<< ezt próbáltam, de nem jó természetesen.
    Debug.Print "Primek:"; st
    Debug.Print "Darabszám:"; db
    Debug.Print "A 12. helyen: "; pos
End Sub

A válasz:

Primek: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233
Darabszám: 51
A 12. helyen:  227 229 233.


Nyilván a 234-nél kisebb 12. prímszám a 173.

Tudnátok segíteni? Előre is köszönöm
Mutasd a teljes hozzászólást!

  • Hi, még életemben nem írtam vba subot, de szerintem a
    (ha már így írtad meg)

    for i = Meddig to mettol step -1

    irányában tapogatózz.
    esetleg valami break is kéne, amikor eléred a 12-t, de az a pos izé asszem jó lesz oda is.

    Vagy nem.
    Töltött káposztát csinálok. Kérsz?
    Mutasd a teljes hozzászólást!
  • Köszi a tippet, ezen kínlódok már egy órája. Közben megfőztem a carbonara spagettit, de azért kösz! :)
    Mutasd a teljes hozzászólást!
  • Mondjuk nem valami hatékony a subod, mert mi van, ha nem a 234-től a 12. prímet kell megcsinálni, hanem pl.
    a 12143488384389934 előttit.

    lenyomod a futtatást, elindulsz káposztát főzni, mire kész, a függvényed is kiszámolja.
    (na jó, ez csak vicc)

    szóval én egy 12-es ciklust választanék. helyette.

    valami olyant, hogy mittudomén:

    i = 125345234523452345
    eredmeny = 0
    ciklus 1-től 12-ig
       eredmeny = a ciklusmagod a vizsgálattal (lefelé menvén)

    oszt amikor lefutott, az eredmeny a megoldást tartalmazza.

    PS:
    életemben nem írtam vba függvényt, azt se tudom, hogyan kell lefuttatni.
    Mutasd a teljes hozzászólást!
  • sub x()
      print "173"
    end sub

    ez a leggyorsabb.
    :)))

    Nahh, jó étvágyat kívánok!
    Remélem nem tasakos, hanem rendesen tojássárgájával összemelegített, szalonnával, tésztalével és megbolondított spagetti az!

    A hibakezelésre is figyelni kell ám, mert mi van, ha például kitalálja valaki, hogy csak 12 szál spagettit kér és csak 11 maradt?
    Mutasd a teljes hozzászólást!
  • Ilyen típusú feladatok vannak a modulzáróban, szóval nagy valószínűséggel ilyenek lesznek majd a vizsgán. Feladat és megoldás van, levezetés nincsen.

    Most jó tippet adtál, lehet hogy hátultesztelőssel kell megcsinálni. Na jó, próbálkozom. Köszi
    Mutasd a teljes hozzászólást!
  • Amit hátultesztelőssel szeretnének megcsináltatni, azt elöltesztelőssel is meg lehet valósítani.
    Én egy ideig irkáltam hátultesztelős izéket is, de meguntam, hogy egyik így, a másik úgy, meg aztán állandóan görgetni lefelé, amikor elfelejted, hogy mi a rosseb is az alja...
    pffff.....

    A másik halálom a meg rekurzív volt.
    Egy kis gondolkodás, oszt utána minnyá' nem rekurzív az a szemét!

    Jó mulatást!
    Mutasd a teljes hozzászólást!
  • Húú de rég játszottam VBA-val. Szerintem ez kellene neked:

    Sub FindPrime(from As Long, pos As Long) Dim i As Long Dim curr As Long curr = 0 For i = from To 1 Step -1 If Prim(i) Then curr = curr + 1 If curr = pos Then Debug.Print "A " & pos & ". prim: " & i Exit Sub End If End If Next Debug.Print "Nem megoldhato" End Sub Sub test() FindPrime 234, 51 End Sub
    Mutasd a teljes hozzászólást!
  • Nyilván a 234-nél kisebb 12. prímszám a 173.

    Csak észrevételként ->

    A 0 nem prímszám (hiszen végtelen sok osztója van, minden n természetes szám osztja 0=0n miatt) és - emiatt - nem is felbonthatatlan. Az 1-et, bár „felbonthatatlannak” lenne tekinthető ama tág értelemben, miszerint nincs nem-triviális osztója, mégsem tekintjük prímszámnak

    Megj: Ha tévedek a matematikusoktól...
    Igaz a kód PHP-s, de átültethető VBA-ra is...

    <?php function isPrime($number) { $n = abs($number); $i = 2; while($i <= sqrt($n)) { if ($n % $i == 0) { return false; } $i++; } return true; } $to_num = 234; $to_count = 12; $count = 0; $end = false; $is_prim = 0; $is_prims = ''; for( $i=2;$i<$to_num;$i++ ) { if( isPrime($i) ) { $is_prims .= $i.', '; $count ++; if( $count == $to_count ) { $is_prim = $i; break; } } } echo 'Az első "<b>'.$to_count.'</b>" db prímszám "<b>'.$is_prims.'</b>" amely kisebb, mint "<b>'.$to_num.'</b>"'. '<br>A keresett: "<b>'.$is_prim.'"<b><br>'; ?>
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Szia!

    Ehhez hasonlóan kellene szerintem. Két lehetséges mód is van benne.
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Ezt hogy gondolod?

    Prímek:
    2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233
    Nyilván a 234-nél kisebb 12. prímszám a 173.

    A 173-at hogy vetted ki ebből a listából? ... mert ebben a 12. prímszám a 37
    Mutasd a teljes hozzászólást!
  • Visszafelé!

    majommarton javaslatát is figyelembe véve így kellene:

    For i = Meddig To Mettol Step -1 If Prim(i) Then db = db + 1 If db = 12 Then pos = i End If :: es itt nem kell mar az InPos() sor
    Mutasd a teljes hozzászólást!
  • A feladat:
    A Prim függvény segítségével határozza meg a 234-nél kisebb 12-edik prímszámot! A szubrutin csak az adott számot írja ki (adja meg) eredményként! (eredmény:173)

    A gondom az, hogy nem tudom hogyan tudnám kiíratni vele a 12. számot!

    Hol van ebben olyan, hogy visszafelé?
    Ráadásul az általa adott megoldásban sem visszafelé fut a ciklusa.
    ... és ...

    ...  234-nél kisebb 12-edik prímszámot!

    Ez egyértelműen és pontosan megadja a keresés irányát is: elölről a 12. prím. Tehát: 37!
    Szerintem!

    Analógia ... kérdem én: mi a hét 2. napja az utolsó "a" betűt is tartalmazó nap előtt?
    Na, ha nem kedd, akkor baj van! 
    Mutasd a teljes hozzászólást!
  • ... 234-nél kisebb 12-edik prímszámot!
    Ez egyértelműen és pontosan megadja a keresés irányát is. Tehát: 37!
    Szerintem!

    Természetesen, ha Te ismered a feladatot máshonnan, akkor rendben. Ha nem, akkor pont úgy csak okoskodsz, mint én vagy bárki más.
    De ha megmagyarázod, hogy előre haladva mi értelme a "234-nél kisebb" kitételnek, akkor fejet hajtok. Normál esetben feladatkiíróként azt kérném, hogy "határozza meg a 12-edik prímszámot". Mivel benne van, hogy melyik számnál kisebb, ennek csak akkor van (számomra) értelme, ha visszafelé haladunk. De mivel a feladatkiírás végén oda van írva, hogy 173 a kívánt eredmény, nem az a teendő, hogy bebizonyítsuk, hogy rossz a feladat.

    De azért mondok én is egy analógiát: melyik a száznál kisebb második páros szám?
    Mutasd a teljes hozzászólást!
  • Nem kell ismernem máshonnan a feladatot ... ez volt a kérdésben. Innen már csak logikusan lehet okoskodni.

    Az, hogy meg van határozva egy maximális felső határ - ami ráadásul NEM PRÍM -, még nem jelenti automatikusan azt is, hogy a 12. számot visszafelé kellene keresni. A kérdésben NINCS beleértett másik kérdés, ami a keresés irányát meghatározná!
    És - mint írtam is - a kérdező megoldása SEM utal erre a feltételre.

    Az sincs odaírva, hogy a 173 a kívánt eredmény. Csupán ki van írva egy eredmény, ami akár rossz is lehet!

    Tehát vagy elölről kell keresni a 12. prímszámot, vagy hiányos/félrevezető a kérdés megfogalmazása!


    Az analógiádra pedig egyértelműen 2-t válaszolok.
    Nem fogom "körülrajzolni" ... így logikus ... mondaná Mr. Spock.
    Mutasd a teljes hozzászólást!
  • Szerintem felesleges a "felhajtás"...
    El kell készíteni a ciklust egyszer 2-től 234-ig, majd 234-től 2-ig és mind két esetben a 12. prímszámot betenni egy változóba és a végén kiíratni...
    Megj: Természeresen mind a két esetben célszerű a megtalálás után kilépni a ciklusból -> ne fusson felelslegesen, főleg ha sokkal nagyobb a szám mint 234...
    Mutasd a teljes hozzászólást!
  • Ott van a feladat kiírásban (zárójelben) az elvárt megoldás. Körülrajzoljam?
    Mutasd a teljes hozzászólást!
  • Az lehet, hogy van ott egy szám zárójelben, de hol van az leírva, hogy AZ AZ ELVÁRT MEGOLDÁS?

    szabofe kompromisszumos megoldása a legjobb mindaddig, amíg a kérdező nem pontosít a feladaton.

    Kezdhetsz rajzolni!
    Mutasd a teljes hozzászólást!
  • Polyjoe már elmagyarázta részletesen, de azt sem értetted meg. A zárójeles részek azért vannak a feladatkiírásban, hogy kiegészítsék, egyértelműsítsék azt. Nem kell beleírni, hogy "visszafelé", mert nincs megszabva, hogy milyen irányba haladjon a megoldás. Haladhadsz "előre" is, vagy cikkcakkban, mintha nyilaznának rád, az eredmény az 173 kell legyen, mert beleírták a feladatba.
    Mutasd a teljes hozzászólást!
  • Köszönöm mindenkinek a segítséget!
    Mutasd a teljes hozzászólást!
  • Gondolom mindenki nevében szívesen De kérlek, áruld el a végeredményt, másold be a kódot!
    Mutasd a teljes hozzászólást!
  • Többen adtak meg olyan leírást, mely megoldja a feladatot.

    Vannak ehhez hasonló fincsi feladataim, ha szeretitek a kihívást :D
    Mutasd a teljes hozzászólást!
  • Többen adtak meg olyan leírást, mely megoldja a feladatot.

    Ha visszaolvasod a hozzászólásokat, még abban sem volt egyetértés, pontosan mi a feladat. Reméltem, hogy előbb-utóbb leírod.

    Vannak ehhez hasonló fincsi feladataim, ha szeretitek a kihívást :D

    Elvileg azért szólunk hozzá, hogy segítsünk, nem azért, mert unatkozunk. De azért látom, hogy vannak ráérősök, akik egy-egy érdekes feladatra szívesen ráugranak.
    Mutasd a teljes hozzászólást!
  • Sajnos nincs "Nem Hasznos" lehetőség egy-egy hozzászólás alatt...
    Mert ehhez az dukálna...
    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