Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Aiuto 4 variabili e possibili combinazioni

    Salve, sono nuovo del forum e di javascript e avrei un dubbio.

    Ho un script con 4 variabili (A,B,C,D) che possono assumere due solo valori (che raccolgo tramite radio button) di 1 o 0.
    Il mio problema nasce dal fatto che ogni possibile combinazione di queste 4 variabili mi danno un risultato diverso per una quinta variabile X.
    Esempio
    se A=0 B=0 C=0 D=0 -> X = 10
    se A=0 B=0 C=0 D=1 -> X = 20
    se A=0 B=0 C=1 D=0 -> X = 30
    ecc...


    Come faccio a fare le possibile combinazioni senza dover utilizzare un'infinità di IF e ELSE? Esiste un sistema più "elegante" e funzionale?
    Grazie

  2. #2
    Moderatore di Annunci siti web, Offro lavoro/collaborazione, Cerco lavoro L'avatar di cavicchiandrea
    Registrato dal
    Aug 2001
    Messaggi
    26,131
    Ciao e benvenuto,
    Verifica se switch può fare al caso
    Ultima modifica di cavicchiandrea; 09-10-2018 a 18:18
    Cavicchi Andrea
    Problemi con javascript, jquery, ajax clicca qui

  3. #3
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,684
    Ciao e benvenuto, io risolverei con un array dove dichiari tutti i risultati. Ogni combinazione (che è possibile effettuare) sarà quindi associata in qualche modo ad ogni singola voce dell'array.

    Bisogna capire però quali sono le combinazioni possibili. Se stai usando dei radio button, suppongo che appartengano ad uno stesso gruppo, per cui avrai praticamente 4 semplici combinazioni... o forse si tratta di checkbox?

    Puoi chiarire?
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  4. #4
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,359
    Prova questo.

    codice:
    <script>
    function calcola()
    {
         document.getElementById('mioDiv').innerHTML = 
      (document.getElementById('A0').checked ? 0 : 10) + 
      (document.getElementById('B0').checked ? 0 : 20) + 
      (document.getElementById('C0').checked ? 0 : 30) + 
      (document.getElementById('D0').checked ? 0 : 40) +
      (document.getElementById('E0').checked ? 0 : 50);
    }
    </script>
    <hr/>
    A:<input type="radio" name="A" checked id="A0" onclick="calcola()"/>0<input type="radio" name="A" id="A1" onclick="calcola()"/>1<br/>
    B:<input type="radio" name="B" checked id="B0" onclick="calcola()"/>0<input type="radio" name="B" id="B1" onclick="calcola()"/>1<br/>
    C:<input type="radio" name="C" checked id="C0" onclick="calcola()"/>0<input type="radio" name="C" id="C1" onclick="calcola()"/>1<br/>
    D:<input type="radio" name="D" checked id="D0" onclick="calcola()"/>0<input type="radio" name="D" id="D1" onclick="calcola()"/>1<br/>
    E:<input type="radio" name="E" checked id="E0" onclick="calcola()"/>0<input type="radio" name="E" id="E1" onclick="calcola()"/>1<br/>
    <hr/>
    <div id="mioDiv"></div>
    <script>
     calcola();
    </script>
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  5. #5
    Grazie delle risposte, per quanto riguarda il comando switch ammetto di non averlo preso in considerazione, ma me lo studierò.


    Quote Originariamente inviata da KillerWorm Visualizza il messaggio
    Ciao e benvenuto, io risolverei con un array dove dichiari tutti i risultati. Ogni combinazione (che è possibile effettuare) sarà quindi associata in qualche modo ad ogni singola voce dell'array.

    Bisogna capire però quali sono le combinazioni possibili. Se stai usando dei radio button, suppongo che appartengano ad uno stesso gruppo, per cui avrai praticamente 4 semplici combinazioni... o forse si tratta di checkbox?

    Puoi chiarire?
    Il codice sarà più o men o così

    codice:
    <h1>Variabili</h1>	<p>A</p>
            <label><input type="radio" name="A" value="AA" /> ALTO</label>
    		<label><input type="radio" name="A" value="AB" /> BASSO</label>
    	<p>B</p>
            <label><input type="radio" name="B" value="BA" /> ALTO</label>
            <label><input type="radio" name="B" value="BB" /> BASSO</label>
        <p>C</p>
            <label><input type="radio" name="C" value="CA" /> ALTO</label>
            <label><input type="radio" name="C" value="CB" /> BASSO</label>
        <p>D</p>
            <label><input type="radio" name="D" value="DA" /> ALTO</label>
            <label><input type="radio" name="D" value="DB" /> BASSO</label>
    Quindi le combinazioni saranno molte di più, perchè non è un unico gruppo ma 4 distinti.

  6. #6
    Grazie Badaze, stavo scrivendo e non ho visto subito la tua soluzione. Ho notato però che presenta un problema. Con la soluzione da te proposta con la funzione calcola mi ritrovo valori uguali per combinazioni diverse: ad esempio la combinazione 0-1-1-0-0 = 50 come 0-0-0-0-1

    codice:
    codice:
    <script>
    function calcola()
    {
         document.getElementById('mioDiv').innerHTML = 
      (document.getElementById('A0').checked ?0:10)+ 
      (document.getElementById('B0').checked ?0:20)+ 
      (document.getElementById('C0').checked ?0:30)+ 
      (document.getElementById('D0').checked ?0:40)+
      (document.getElementById('E0').checked ?0:50);
    }
    </script>
    <hr/>
    A:<inputtype="radio"name="A"checkedid="A0"onclick="calcola()"/>0<inputtype="radio"name="A"id="A1"onclick="calcola()"/>1<br/>
    B:<inputtype="radio"name="B"checkedid="B0"onclick="calcola()"/>0<inputtype="radio"name="B"id="B1"onclick="calcola()"/>1<br/>
    C:<inputtype="radio"name="C"checkedid="C0"onclick="calcola()"/>0<inputtype="radio"name="C"id="C1"onclick="calcola()"/>1<br/>
    D:<inputtype="radio"name="D"checkedid="D0"onclick="calcola()"/>0<inputtype="radio"name="D"id="D1"onclick="calcola()"/>1<br/>
    E:<inputtype="radio"name="E"checkedid="E0"onclick="calcola()"/>0<inputtype="radio"name="E"id="E1"onclick="calcola()"/>1<br/>
    <hr/>
    <divid="mioDiv"></div>
    <script>
     calcola();
    </script>
    (L'ho riscritta perchè non riuscivo a quotarti)
    Ultima modifica di piercolone; 09-10-2018 a 23:02

  7. #7
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,359
    Ho messo dei valori a casaccio. Prova a mettre i tuoi. Basta rimpiazzare i valori da 10 a 50.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  8. #8
    Hai ragione, sono un cretino. Ho sostituito i valori con 10000,1000,100,10 e ogni possibile soluzione mi da un risultato diverso.
    Ora devo impostare un output differente per ogni combinazione, e per questo credo che seguirò il consiglio di cavicchiandrea e proverò con il comando switch

  9. #9
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,684
    Il codice sarà più o men o così
    [...]
    Quindi le combinazioni saranno molte di più, perchè non è un unico gruppo ma 4 distinti.
    Ok. Non mi è molto chiaro il contesto, se però cerchi una soluzione più pulita, dinamica, estendibile, ecc, personalmente continuo a pensare che un array, dove inserire facilmente i vari risultati, possa andare meglio, senza nulla togliere alle soluzione che già ti hanno proposto.

    Qui un esempio completo di come farei io:
    codice:
    <!DOCTYPE HTML>
    <html lang="it">
       <head>
          <title>Esempio</title>
          <meta charset="utf-8">
          <script>
             var risultati = [
                "risultato 1"
              , "risultato 2"
              , "risultato 3"
              , "risultato 4"
              , "risultato 5"
              , "risultato 6"
              , "risultato 7"
              , "risultato 8"
              , "risultato 9"
              , "risultato 10"
              , "risultato 11"
              , "risultato 12"
              , "risultato 13"
              , "risultato 14"
              , "risultato 15"
              , "risultato 16"
             ];
             
             function restituisciRisultato(){
                if(!verificaInputSelezionati()) {
                   mostraOutput("Selezionare un valore per ogni variabile", true)
                   return;
                }
                var combinazioneBinaria =
                   (input_DA.checked ? "0" : "1")
                 + (input_CA.checked ? "0" : "1")
                 + (input_BA.checked ? "0" : "1")
                 + (input_AA.checked ? "0" : "1")
                ;
                var idArrayRisultati = parseInt(combinazioneBinaria, 2);
                var risultato =  risultati[idArrayRisultati];
                mostraOutput(risultato)
             }
             
             function verificaInputSelezionati(){
                // Controllo che almeno un radio-button sia selezionato per ogni gruppo
                return (
                   input_AA.checked
                 + input_AB.checked
                 + input_BA.checked
                 + input_BB.checked
                 + input_CA.checked
                 + input_CB.checked
                 + input_DA.checked
                 + input_DB.checked
                ) == 4;
             }
             
             function mostraOutput(msg,err){
                // Visualizzo il messaggio in output
                output.innerHTML = msg;
                err ? output.classList.add("outputErr") : output.classList.remove("outputErr");
             }
          </script>
          <style>
             #output.outputErr {
                color: red;
                font-weight: bold;
             }
          </style>
       </head>
       <body>
          <h1>Variabili</h1>
          <fieldset>
             <legend>A</legend>
             <label><input type="radio" name="A" id="input_AA">ALTO</label>
             <label><input type="radio" name="A" id="input_AB">BASSO</label>
          </fieldset>
          <fieldset>
             <legend>B</legend>
             <label><input type="radio" name="B" id="input_BA">ALTO</label>
             <label><input type="radio" name="B" id="input_BB">BASSO</label>
          </fieldset>
          <fieldset>
             <legend>C</legend>
             <label><input type="radio" name="C" id="input_CA">ALTO</label>
             <label><input type="radio" name="C" id="input_CB">BASSO</label>
          </fieldset>
          <fieldset>
             <legend>D</legend>
             <label><input type="radio" name="D" id="input_DA">ALTO</label>
             <label><input type="radio" name="D" id="input_DB">BASSO</label>
          </fieldset>
          <hr>
          <input type="button" value="Restituisci risultato" onclick="restituisciRisultato();">
          <span id="output"></span>
          <hr>
       </body>
    </html>
    In teoria se hai 4 variabili binarie, puoi ottenere 16 combinazioni (cioè 2 elevato 4).

    L'array conterrà i 16 risultati. Ogni voce è associata al corrispondente valore binario calcolato in base alle 4 scelte, per cui parseInt(combinazioneBinaria, 2) restituisce un valore da 0 a 15 relativo all'indice della voce nell'array.

    Dal momento che uno dei due radio deve per forza essere selezionato, ho inserito un controllo per verificare che tutte le scelte siano state effettuate (altrimenti visualizzo un messaggio di errore) e ho utilizzato il primo radio di ciascun gruppo per verificare se la scelta è 0 o 1, cioè se è stato selezionato rispettivamente il primo o il secondo radio button per ciascun gruppo.

    Sinceramente, se le opzioni possibili per ogni gruppo di radio sono sempre e solo due, opterei per dei singoli checkbox (anziche 2 radio button), magari adattandone la grafica in modo che sia possibile distinguere le due scelte (ma questa è un'altra storia).

    Magari fai qualche prova e vedi se può andare bene una soluzione del genere, oppure chiarisci meglio il contesto così che ti si possa suggerire qualcosa di più adatto; altrimenti vai pure di switch.

    Buon proseguimento e buona permanenza sul forum.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

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 © 2024 vBulletin Solutions, Inc. All rights reserved.