Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Il passaggio di parametri non funziona

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2018
    Messaggi
    33

    Il passaggio di parametri non funziona

    Ho scritto questo programma che ordina tre numeri, per provare il passaggio di parametri, ma i numeri non vengono ordinati. Come imporre il passaggio di parametri per indirizzo?

    lanvoel

    codice:
    <html>
    <head>
    <script language=JavaScript>
    function scambia(x,y)
    {
    var box=x;
    x=y;
    y=box;
    }
    function ordina()
    {
    var a=eval(form1.a.value);
    var b=eval(form1.b.value);
    var c=eval(form1.c.value);
    if (a>b){scambia(a,b)}
    if (a>c){scambia(a,c)}
    if (b>c){scambia(b,c)}
    form1.a1.value=a;
    form1.b1.value=b;
    form1.c1.value=c;
    }
    </script>
    </head>
    <body>
    Scrivi tre numeri: <br>
    <form name="form1">
    a=<input type="text" name="a"><br>
    b=<input type="text" name="b"><br>
    c=<input type="text" name="c"><br><br>
    <input type="button" name="pulsante" value="ordina i tre numeri" onclick="ordina()"><br><br>
    I tre numeri ordinati sono:<br>
    <input type="text" name="a1"><br>
    <input type="text" name="b1"><br>
    <input type="text" name="c1"><br><br>
    </form>
    </body>
    </html>

  2. #2
    Moderatore di Javascript L'avatar di ciro78
    Registrato dal
    Sep 2000
    residenza
    Napoli
    Messaggi
    8,007
    se lo fai per esercizio stai sbagliando approccio. se lo devi fare per ottenere un risultato sbagli approccio.

    x e y sono parametri della funzione. smettono di esistere nel momento stesso in cui esci dalla funzione stessa.
    se vuoi invertire i valori non serve che passi parametri ma devi usare variabili a livello globale
    Ciro Marotta - Programmatore PHP - MySql - ZEND FRAMEWORK 2
    Preferisco un fallimento alle mie condizioni che un successo alle condizioni altrui.


  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2018
    Messaggi
    33
    Grazie ciro78.
    Così ora funziona. Ma per più numeri, c'è un metodo più veloce?

    lanvoel

    codice:
    <html>
    <head>
    <script language=JavaScript>
    var a=0
    var b=0
    var c=0
    var x=0
    function ordina()
    {
    a=eval(form1.a.value)
    b=eval(form1.b.value)
    c=eval(form1.c.value)
    if (a>b){x=a;a=b;b=x;}
    if (a>c){x=a;a=c;c=x;}
    if (b>c){x=b;b=c;c=x;}
    form1.a1.value=a
    form1.b1.value=b
    form1.c1.value=c
    }
    </script>
    </head>
    <body>
    Scrivi tre numeri:<br><br>
    <form name="form1">
    a=<input type="text" name="a"><br>
    b=<input type="text" name="b"><br>
    c=<input type="text" name="c"><br><br>
    <input type="button" name="pulsante" value="ordina numeri" onclick="ordina()"><br><br>
    <input type="text" name="a1"><br>
    <input type="text" name="b1"><br>
    <input type="text" name="c1"><br>
    </form>
    </body>
    </html>

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2018
    Messaggi
    33
    Ho pensato che se si hanno più numeri, basta metterli in un array e poi usare il metodo sort() per ordinarli.
    Ho scritto un programma dove si inseriscono in un array 50 numeri casuali tra 1 e 100 e poi si ordinano con sort().
    Si ha l'inconveniente che 10 e 100 vengono considerati uguali ad 1. Come ovviare? Grazie

    lanvoel

    codice:
    <html>
    <head>
    <script language=javascript>
    function scrivi()
    {
    for (i=0; i<=50;i++)
    {
    form1.area1.value=form1.area1.value+numeri[i]+" "
    }
    }
    function ordina()
    {
    numeri.sort()
    for (i=0; i<=50;i++)
    {
    form1.area2.value=form1.area2.value+numeri[i]+" "
    }
    }
    </script>
    </head>
    <body>
    Scrivere 50 numeri casuali tra 1 e 100 e ordinarli <br><br>
    <form name="form1">
    <textarea name="area1" id="area1" rows=20 cols=20></textarea>
    <textarea name="area2" id="area2" rows=20 cols=20></textarea><br><br>
    <input type=button value="scrivi i n umeri" onclick="scrivi()">
    <input type=button value="ordina i numeri" onclick="ordina()"><br><br>
    <input type=reset value="cancella tutto"><br>
    </form>
    <script language=javascript>
    var numeri= new Array(10)
    var i=0
    for (i=0; i<=50;i++)
    {
    numeri[i]=Math.floor(Math.random()*100)+1
    }
    </script>
    </body>
    </html>

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2018
    Messaggi
    33
    Ho risolto i difetti dell'ordinamento con il metodo sort() usando la tecnica del bubble sort. Nel programma vi sono 3 <textarea>: nella prima vi sono 50 numeri casuali tra1 e 100, nella secondo i numeri ordinati con sort() e nella terza con bubble sort.
    Usando più volte il programma si nota che il metodo sort() considera 10 e 100 uguali ad 1, 2 uguale a 20, 3 uguale a 30, ...., 9 uguale a 90. Perché con il metodo sort() si hanno questi errori logici? Grazie

    lanvoel

    codice:
    <html>
    <head>
    <script language=javascript>
    function scrivi()
    {
    for (i=0; i<=50;i++)
    {
    form1.area1.value=form1.area1.value+numeri[i]+" "
    }
    }
    function ordina()
    {
    numeri.sort()
    for (i=0; i<=50;i++)
    {
    form1.area2.value=form1.area2.value+numeri[i]+" "
    }
    }
    function ordina2()
    {
    for (i=0; i<50; i++)
    {
       for (j=i+1; j<50; j++)
       {
          if (numeri[i]>numeri[j])
          {
           box=numeri[i];
           numeri[i]=numeri[j];
           numeri[j]=box;
          }
       }
    }
    for (i=0; i<=50;i++)
    {
    form1.area3.value=form1.area3.value+numeri[i]+" "
    }
    }
    </script>
    </head>
    <body>
    Scrivere 50 numeri casuali tra 1 e 100 e ordinarli <br><br>
    <form name="form1">
    <textarea name="area1" id="area1" rows=20 cols=20></textarea>
    <textarea name="area2" id="area2" rows=20 cols=20></textarea>
    <textarea name="area3" id="area3" rows=20 cols=20></textarea><br><br>
    <input type=button value="scrivi i numeri" onclick="scrivi()">
    <input type=button value="ordina i numeri con sort()" onclick="ordina()">
    <input type=button value="ordina i numeri con bubble sort" onclick="ordina2()"><br><br>
    <input type=reset value="cancella tutto"><br>
    </form>
    <script language=javascript>
    var numeri= new Array(10)
    var i=0
    for (i=0; i<=50;i++)
    {
    numeri[i]=Math.floor(Math.random()*100)+1
    }
    </script>
    </body>
    </html>

  6. #6
    Moderatore di JavaScript L'avatar di br1
    Registrato dal
    Jul 1999
    Messaggi
    19,943
    Stai ordinando un array di stringhe, non numeri.
    Guarda l'esempio in fondo http://www.devguru.com/content/techn...rray-sort.html
    Il guaio per i poveri computers e' che sono gli uomini a comandarli.

    Attenzione ai titoli delle discussioni: (ri)leggete il regolamento
    Consultate la discussione in rilievo: script / discussioni utili
    Usate la funzione di Ricerca del Forum

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2018
    Messaggi
    33
    Grazie br1: la stringa 39 < stringa 4, ma numero 39 > numero 4.
    Proseguendo nelle prove ho visto che il passaggio di parametri con array (e in genere con elementi di riferimento, cioè non primitivi) funziona.
    Ho aggiunto al programma una quarta <textarea> e un pulsante che ordina i 50 numeri casuali usando il passaggio di parametri ad una funzione scambia() e li scrive ordinati appunto in questa quarta <textarea>.
    Ma si ha una stranezza. Usando il programma più volte, rilanciandolo finché tra i numeri casuali figura anche 100, e scrivendoli ordinati, stranamente il 100 è il penultimo numero e non l'ultimo, sia con il metodo bubble sort che con il passaggio di parametri. Come spiegarlo? Grazie

    lanvoel

    codice:
    <html>
    <head>
    <script language=javascript>
    function scrivi()
    {
    for (i=0; i<=50;i++)
    {
    form1.area1.value=form1.area1.value+numeri[i]+" "
    }
    }
    function ordina()
    {
    numeri.sort()
    for (i=0; i<=50;i++)
    {
    form1.area2.value=form1.area2.value+numeri[i]+" "
    }
    }
    function ordina2()
    {
    for (i=0; i<50; i++)
    {
       for (j=i+1; j<50; j++)
       {
          if (numeri[i]>numeri[j])
          {
           box=numeri[i];
           numeri[i]=numeri[j];
           numeri[j]=box;
          }
       }
    }
    for (i=0; i<=50;i++)
    {
    form1.area3.value=form1.area3.value+numeri[i]+" "
    }
    }
    function scambia(x,y)
    {
       box=x; y=x; x=box;
    }
    function ordina3()
    {
    for (i=0; i<50; i++)
       {
        if (numeri[i]>numeri[i+1]) {scambia(numeri[i], numeri[i+1])}       
       }
    for (i=0; i<=50;i++)
    {
    form1.area4.value=form1.area4.value+numeri[i]+" "
    }
    }
    </script>
    </head>
    <body>
    Scrivere 50 numeri casuali tra 1 e 100 e ordinarli <br><br>
    <form name="form1">
    <textarea name="area1" id="area1" rows=20 cols=20></textarea>
    <textarea name="area2" id="area2" rows=20 cols=20></textarea>
    <textarea name="area3" id="area3" rows=20 cols=20></textarea>
    <textarea name="area4" id="area4" rows=20 cols=20></textarea><br><br>
    <input type=button value="scrivi i numeri" onclick="scrivi()">
    <input type=button value="ordina i numeri con sort()" onclick="ordina()">
    <input type=button value="ordina i numeri con bubble sort" onclick="ordina2()">
    <input type=button value="ordina i numeri con passaggio par," onclick="ordina3()"><br><br>
    <input type=reset value="cancella tutto"><br>
    </form>
    <script language=javascript>
    var numeri= new Array(10)
    var i=0
    for (i=0; i<=50;i++)
    {
    numeri[i]=Math.floor(Math.random()*100)+1
    }
    </script>
    </body>
    </html>

  8. #8
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    3,774
    100 è il penultimo numero e non l'ultimo, sia con il metodo bubble sort che con il passaggio di parametri. Come spiegarlo?
    Ciao, molto semplicemente stai facendo un grande pasticcio (senza offesa).

    Il metodo per ottenere una lista ordinata di valori ti è stato già indicato ma vedo che stai continuando ad applicarlo solo per metà.
    Come indicato sul link suggerito da br1, dovresti fare una cosa del genere:
    codice:
    numeri.sort(function(a, b){return a-b});
    Ad ogni modo, considerando l'oggetto della discussione, se il tuo intento è quello di "provare il passaggio di parametri" forse dovresti concentrarti su questo punto. Nel tuo ultimo script invece stai continuando ad aggiungere altri vari ingredienti al minestrone ottenendo quindi dei risultati sconclusionati oltreché fuorvianti.

    Prima cosa, stai usando un'unica variabile globale (numeri) che vai a modificare man mano con l'esecuzione delle diverse funzioni e questo ovviamente ti porta a dei falsi risultati se vai ad applicare quei vari metodi uno dopo l'altro.

    Se provi infatti ad aprire/aggiornare la pagina e cliccare esclusivamente su "scrivi i numeri" e poi su "ordina i numeri con passaggio par," (senza eseguire nient'altro prima) puoi notare che questo metodo non funziona proprio. Forse tu hai notato che i numeri venissero in qualche modo ordinati perché andavi ad eseguire degli altri metodi prima di questo.

    Mentre, il problema del 100 che viene messo come penultimo valore prescinde dal fatto che si tratti di 100 o di qualsiasi altro valore. Se fai caso infatti, è invece l'ultimo valore quello ad essere fuori posto, perché? Perché tra tutte quelle funzioni hai pasticciato al punto da non vedere più nemmeno dei banali errori...

    Nel ciclo per creare l'array dei numeri casuali hai usato questa definizione (i=0; i<=50; i++) che va a creare una serie di 51 elementi (esatto, non 50 ma proprio 51, perché da 0 a 50 sono 51 elementi), mentre nella funzione ordina2 hai usato un ciclo con quest'altra definizione (i=0; i<50; i++) che va a "passare in rassegna" i primi 50 (da 0 a 49) elementi dell'array creato prima. Conclusione, l'ultimo elemento (il 51esimo) non viene considerato e resta così com'è al suo ultimo posto.

    Ora, ti consiglio, se ti serve sperimentare l'uso delle funzioni e il passaggio di parametri (come da oggetto di questa discussione) prova a partire da qualcosa di più semplice magari focalizzandoti su un singolo metodo, perché diversamente rischi di creare solo confusione come hai già fatto.
    Prima di postare considera che tra i link utili puoi trovare il 75% delle risposte alle tue domande; il 15% tra i post del forum; il 9% sul web.
    Ti resta l’1% ... usalo bene!

    Le cattive domande sono quelle che non meritano risposta, le buone domande sono quelle che non hanno risposta
    L'Itailano non e nu'opnioine. E' improntate uslaro correattemtne sul froum. Garize!

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2018
    Messaggi
    33
    Grazie KillerWorm per tutte le particolareggiate risposte ai miei quesiti e spiegazioni dei miei errori e "pasticci".
    Un saluto

    lanvoel

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2018 vBulletin Solutions, Inc. All rights reserved.