Jump to content
GSForum - Segélyvonal

Javascript példák, megoldások


durato

Recommended Posts

durato

El is kezdeném a sort, a fibonacci-számsorral. A Fibonacci-számsort úgy képezzük, hogy: 0+1=1 1+1=2 2+1=3 2+3=5 3+5=8 5+8=13 stb., tehát a sor következő eleme az előtte álló két elem összege.

 

Erre a megoldásom:

 

<script language="javascript">

function elso (a, b)
{
    c=a*1+b*1;
    alert (c);
    var a=b
    var b=c
    masodik (a, b)
}
</script>

<script language="javascript">
function masodik(a, b)
{
    c=a*1+b*1
    if (c<=10000)
    {
        alert (c)
        var a=b
        var b=c
        elso (a, b)
    }
}
</script>
<button onclick="elso(0,1)">kezdés</button>

 

Remélem nem fog semmilyen formázás történni az üzeneten, azt a részt, hogy alert( c) át kell alakítani helyessé, alert után zárójel bal, utána szóköz nélkül c utána zárójel jobb.

Link to comment
Share on other sites

payskin

Szia!

 

Ez klassz meg minden, de:

 

1. Ha kódként formázod a programot, akkor nem történik rajta semmilyen változás és nem kell trükközni.

 

2. Van a JavaScriptnek saját témája a Websarok témacsoportban, ahova hamarosan át is helyezem a topicot.

 

Kérlek, legyél körültekintőbb a témanyitásnál (és ne rövdítsd a "hogy"-ot, allergiásak vagyunk rá)! Köszi! :)

 

----------

Később: áthelyezést, szerkesztést megcsináltam, akkor most érdemben tennék fel kérdéseket:

 

1. Miért kell a két függvényhez két külön <script>?

 

2. Miért kell két függvény? :)

Link to comment
Share on other sites

payskin

Az én megoldásom. Egy kicsit hosszabb, de csak azért, mert megcsináltam hozzá szépen a körítést is! ;)

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
    <meta name="message" content="IN VALID CODE WE TRUST" />
    <title>Fibonacci</title>

<script type="text/javascript">
function fibonacci ()
{
    var darab = window.document.fibo.darab.value;
    var a,b,s,i;
    a = 0; b = 1; s = "";

    for (i=0; i<darab; i++)
    {
        b = a + b;
        a = b - a;
        s = s + (b + '<br />');
    }

    document.getElementById("eredmeny").innerHTML = s;
    return true;
}
</script>
</head>

<body>
    <form action="" name="fibo" onSubmit="fibonacci(); return false;">
        Hány számot kérsz? 
        <input type="text" name="darab" size="5" /><br />
    </form>
    <p id="eredmeny"></p>
</body>
</html>

Kezdjük a

-n belüli résszel: csinálunk egy fibo nevű kicsi űrlapot (), megkérdezzük, hány számot szeretne, bekérjük a számot egy szövegmezőben, és Enter megnyomásakor átdobjuk az egészet a fibonacci() című JavaScript függvénynek. A számokat nem csak úgy hűbelebalázs módjára belenyomjuk a képernyőbe, de nem is használunk alertet, mert nem szeretjük az Entert koptatni, hanem szépen előkészítünk egy eredmény id-jű

bekezdést, amibe majd a JavaScript kód beleírja az eredményt. Elegáns ez, vagy mi? ;)

 

Na, akkor nézzük a függvényünket. Először is megcímezzük a fibo űrlap darab szövegmezőjének értékét, és ezt gondosan eltároljuk egy darab nevű változóban, aztán deklaráljuk és inicializáljuk a többi változót, amit használni akarunk. Elindítjuk a ciklust 0-tól, megyünk darabig, egyesével.

 

A ciklusban nagyon furfangos módon kezeljük a-t és b-t. A b-ben tároljuk mindig az aktuális fibonacci számot, és az a kiszámításánál kihasználjuk csúnyán, hogy b-ben a kettejük összege van, tehát ha a-t kivonjuk a b-ből, akkor éppen a b korábbi értékét kapjuk eredményül. Szemléltetem: keressük a negyedik fibonacci számot, tudjuk, hogy az előző két szám a 2 (a) és a 3 (b) volt. Összeadjuk a két számot (b=5), majd ebből kivonjuk a-t: 5-2=3, és így valóban pont az az érték került bele, ami korábban b-ben volt. (Lásd még a klasszikus programozástechnikai feladatot: van két numerikus változód, cseréld meg a tartalmukat harmadik változó bevonása nélkül.) s stringhez minden körben "hozzáadjuk" (amolyan string módra, természetesen) az éppen aktuális eredményt.

 

Mikor végeztünk a ciklussal, megcímezzük a gondosan előkészített eredmeny id-jű

bekezdésünket, és megváltoztatjuk a tartalmát (innerHTML), pontosabban belevarázsoljuk azt, amit összegyűjtöttünk az s-ben. Ezután angolosan távozunk a függvényből.

 

Remélem, tanulságos volt. Még lehetne egy fokkal szebben csinálni (a

-ban levő onSubmit ugyanis nem szép megoldás, keverjük a JavaScriptet a HTML-lel, ami, ugye, ejnye-bejnye kategória), de nem akartam annyira túlbonyolítani. ;)

 

Ja, és csinálhattam volna rekurzívra is, de... azt hiszem túlbeszéltük! :alszik:

Link to comment
Share on other sites

durato

Hát, igen, én a saját kis béna megoldásomat raktam be... és az én megoldásomnál a document.write elképzelhetetlenül lassú, itt meg hipphopp elénk tárja a számokat

Link to comment
Share on other sites

payskin

Semmi gond, mindannyian elkezdjük valahol. Egy hónapja valószínűleg még én is document.write-tal csináltam volna, és csodálkoztam volna, hogy miért nem jó úgy. Ezért írtam le ilyen részletesen, hogy lehessen belőle tanulni. ;)

 

A lényeg: a szkript ne direkt írjon bele a weboldalba, hanem módosítsa egy már ott levő elem tartalmát. Nem könnyű megérteni ezt az egész ez.az.amaz.micsoda jellegű dokumentum objektmodell-kezelést (DOM), de ha sikerül, fontos előrelépést jelent a JS-tudásodban.

Link to comment
Share on other sites

Giraffe1
Ja, és csinálhattam volna rekurzívra is, de... azt hiszem túlbeszéltük! :alszik:

Én úgy emlékszem - és ebben legalábbis megerősített a wikipedia is -, hogy a Fibonacci számsor 0,1,1,2...-vel kezdődik. Ezért én inkább így csinálnám meg a JavaScript részt:

 

function fibonacci () {
    var darab = window.document.fibo.darab.value;
    var tomb = (darab < 1) ? [] : ((darab == 1) ? [0] : [0, 1]);

    for (i=2; i<darab; i++)
        tomb.push(tomb[i-2]+tomb[i-1])

    document.getElementById("eredmeny").innerText = tomb.toString();
}

Az inicializálás a "kedves felhasználó" miatt kicsit összetettebb, hiszen megadhat 1-nél kisebb számot is, de onnantól kezdve egyszerűbb a dolog, hiszen csak nyomni kell a tömbbe az előző kettő összegét, a végén pedig kiíratni a tömböt stringként. :)

 

És ha ragaszkodsz ahhoz, hogy nem vesszőkkel, hanem soremelésekkel kell elválasztani a számokat, akkor a kiíratást cseréld le erre: :démonikacaj:

 

document.getElementById("eredmeny").innerHTML = (tomb.toString()).replace(/,/g, "<br />");

Link to comment
Share on other sites

eremit

A Fibonacci számsor két db. 1-essel kezdõdik. A Wikipedia nem mindig megbízható.

 

u.i.

http://boersenlexikon.faz.net/fibonacc.htm - Itt 1-gyel kezdõdik, de másutt több helyen tényleg 0-val. Én 1-gyel tudom.

Link to comment
Share on other sites

Giraffe1

Hmmm, futottam egy gyors kört Fibonacci témában a google segítségével. Kb. két tucat oldal fele-fele arányban indul nulláról és egyről, ez utóbbiaknál pedig szintén van némi szórás, hogy egy vagy két 1-sel kezdődik a számsor.

Ez esetben így módosul a program közepe:

 

    for (i=0; i<darab; i++)
        tomb.push(tomb[i]+tomb[i+1]);

    tomb.shift(); tomb.shift();

Vagyis kettővel tovább töltögetjük a tömböt, a végén pedig kiszedjük az első két elemet.

Link to comment
Share on other sites

arpsoft

Az eredeti Fibonacci probléma, amibõl a számsor született:

Hány pár nyúlra szaporodik egy év alatt a kezdeti pár, ha tudjuk, a nyulak két hónap alatt válnak ivaréretté, és ezután minden pár minden hónapban egy új párnak ad életet és mindegyikük életben marad?
Ebbõl kifolyólag nem kezdõdhet nullával.

 

Link to comment
Share on other sites

eremit

És még az is lényeges, hogy két db. 1-essel kezdõdik.

Link to comment
Share on other sites

durato

Látom, sikerült felkelteni az érdeklõdésteket, jó lenne, ha elszakadnánk a fibonacci-témától, hiszen van érdekesebb téma is példák bemutatására :!: :)

Link to comment
Share on other sites

  • 1 month later...
durato

Most legyen a sor egy javascriptes pixelről pixelre rajzolgatós programon. Kikötés: onMouseover esemény legyen benne, és ki lehessen kapcsolni a rajzolást pl: onclick eseménnyel. Táblázattal érdemes csinálni, majd rakok ide forrást egy példáról.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...