Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16

Discussione: Ciclo FOR con "buco"

  1. #1

    Ciclo FOR con "buco"

    Salve a tutti,
    e' possibile gestire con unico ciclo FOR il listing di una serie di valori con un buco in mezzo? Mi spiego con un esempio, l'output sarebbe:

    1
    2
    3
    4
    Ciao
    5
    6
    7
    8
    9
    10

    In poche parole il ciclo FOR gestisce il listing dei numeri solo che ad un certo punto (gestito da una variabile) vorrei far apparire un valore fuori dal ciclo for. La posizione del "buco" è regolata da una variabile. Devo per foza di cosa usare due FOR oppure e' possibile farlo con uno solo?

    Grazie mille.

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Potrebbe essere + performante l'uso di 2 cicli
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    Due cicli

  4. #4
    Puoi farlo con due cicli for separati oppure con un if dentro il ciclo, in C sarebbe

    for (i=1; i<=10; i++)
    {
    printf("%d\n", i);
    if (i==4)
    printf("Ciao\n");
    }

    Potrebbe essere leggermente meno efficiente della versione con due cicli però:
    - il compilatore potrebbe essere abbastanza furbo da fare l'ìunrolling e praticamente sarebbe come avere i due cicli separati
    - per cambiare la posizione del buco basta cambiare il valore nell'if invece della fine del primo ciclo e dell'inizio del secondo
    Message by Webmaster UFO
    http://forum.html.it/forum/faccine/054.gif CAUTION! THE NET IS DANGEROUS! http://forum.html.it/forum/faccine/144.gif
    http://nadia.too.it TUTTO QUELLO CHE VUOI SAPERE SU JEAN, NADIA, NEMO, ELECTRA & CO.

    NON CONSIGLIERO' PIU' NIENTE NELLA FIRMA!!!

  5. #5
    Assolutamente inutile fare due cicli for

    Codice PHP:
    $done false;
    $pos 5;
    for (
    $x 1$x <= 10$x++) {
        if (
    $x == $pos and ! $done) {
            echo 
    "Ciao
    "
    ;
            
    $done true;
            
    $x $pos 1;
        } else {
            echo 
    "{$x}
    "
    ;
        }


  6. #6
    Anche se la soluzione dell'utente dascos funziona mi sembra inutilmente complicata perché prima arriva a 5, scrive Ciao al posto del numero poi rimette il contatore a 4 in modo che al passo successivo sia di nuovo 5 e controlla con done se ha già scritto il done o no scrivendo stavolta normalmente il numero. Guardandola ho però notato che volevi una variabile che ovviamente nel mio caso sarebbe al posto del 4 se la inizializzi prima con 4 (con la soluzione di dascos come vedi devi inizializzarla a 5 in pratica con la mia serve il numero prima, con la sua il numero dopo il Ciao).
    Message by Webmaster UFO
    http://forum.html.it/forum/faccine/054.gif CAUTION! THE NET IS DANGEROUS! http://forum.html.it/forum/faccine/144.gif
    http://nadia.too.it TUTTO QUELLO CHE VUOI SAPERE SU JEAN, NADIA, NEMO, ELECTRA & CO.

    NON CONSIGLIERO' PIU' NIENTE NELLA FIRMA!!!

  7. #7
    Utente di HTML.it L'avatar di las
    Registrato dal
    Apr 2002
    Messaggi
    1,221
    Codice PHP:
    $pos 5;
    for (
    $i 1$i <= 10$i++) {
        if (
    $i == $pos) {
            echo 
    "Ciao
    "
    ;
        } else {
            echo 
    "{$i}
    "
    ;
        }

    Il calcolatore è straordinariamente veloce, accurato e stupido.
    L'uomo è incredibilmente lento, impreciso e creativo.
    L'insieme dei due costituisce una forza incalcolabile.
    (Albert Einstein)

  8. #8
    Originariamente inviato da las
    Codice PHP:
    $pos 5;
    for (
    $i 1$i <= 10$i++) {
        if (
    $i == $pos) {
            echo 
    "Ciao
    "
    ;
        } else {
            echo 
    "{$i}
    "
    ;
        }

    Fatto così salta un numero però...anzichè scrivere 5 scrive ciao, ma non è quel che vuole l'utente

  9. #9
    Utente di HTML.it L'avatar di las
    Registrato dal
    Apr 2002
    Messaggi
    1,221
    Originariamente inviato da Dascos
    Fatto così salta un numero però...anzichè scrivere 5 scrive ciao, ma non è quel che vuole l'utente
    non mi ero accorto che l'utente voleva che stampasse anche il numero, in questo caso comunque basta farglielo stampare .... senza complicarsi ulteriormente la vita:

    Codice PHP:
    $pos 5;
    for (
    $i 1$i <= 10$i++) {
        if (
    $i == $pos) {
            echo 
    "Ciao
    "
    ;
        } 
            echo 
    "{$i}
    "
    ;
        

    Il calcolatore è straordinariamente veloce, accurato e stupido.
    L'uomo è incredibilmente lento, impreciso e creativo.
    L'insieme dei due costituisce una forza incalcolabile.
    (Albert Einstein)

  10. #10
    Esatto, ma dato che l'output dell'utente sembra essere una semplificazione, se ne deduce che non sia detto che debba semplicemente stampare "ciao".

    Fatto come dici tu obbliga la riscrittura (quindi la duplicazione) delle istruzioni che vorrebbe siano fatte se NON si trova nel punto scelto.
    La mia no

    Semplifichiamo e facciamo finta che le istruzioni da eseguire sempre siano 5 echo (in realtà potrebbero essere ben più complesse ma cambia poco a livello logico)
    Codice PHP:
    $pos 5;
    for (
    $i 1$i <= 10$i++) {
        if (
    $i == $pos) {
            echo 
    "Ciao
    "
    // Questo va fatto SOLO se siamo nella posizione 5
            
    echo "{$i}
    "
    // Tutti questi echo vanno fatti SEMPRE
            
    echo "{$i}
    "
    // ma sono pure duplicazioni di quando NON siamo
            
    echo "{$i}
    "
    // nella posizione 5 e quindi
            
    echo "{$i}
    "
    // ci troviamo con n righe duplicate inutili
            
    echo "{$i}
    "
    ;
        } else {
            echo 
    "{$i}
    "
    // Questi echo sono quelli da fare in NON match
            
    echo "{$i}
    "
    ;
            echo 
    "{$i}
    "
    ;
            echo 
    "{$i}
    "
    ;
            echo 
    "{$i}
    "
    ;
        }

    La mia invece
    Codice PHP:
    $done false;
    $pos 5;
    for (
    $x 1$x <= 10$x++) {
        if (
    $x == $pos and ! $done) {
            echo 
    "Ciao
    "
    ;
            
    $done true;
            
    $x $pos 1;
        } else {
            echo 
    "{$x}
    "
    ;
            echo 
    "{$x}
    "
    ;
            echo 
    "{$x}
    "
    ;
            echo 
    "{$x}
    "
    ;
            echo 
    "{$x}
    "
    ;
        }

    Con notevole risparmio di codice e soprattutto meno punti di errore.
    Se invece ciò che deve fare, con le relative conseguenze sulle elaborazioni successive, sono ininfluenti, allora potrebbe essere meglio la logica di webmaster, ma dipende tutto da che conseguenze (logiche e procedurali) provoca il "fuori ciclo".
    La mia soluzione tiene conto di questa possibilità, dividendo di fatto le due condizioni (match e !match) permettendo l'esecuzione SOLO di quello che effettivamente serve NELLA condizione attuale.


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