Incremento contatore

di il
1 risposte

Incremento contatore

In merito al seguente codice che effettua un incremento da 0000 a 0199, qualcuno sa come fermare l'incremento quando si giunge ad un valore noto a priori, ad esempio 0125

for i=0:1
for j=0:9
for k=0:9

x=[0 i j k]

end
end
end

Spero di essere stato abbastanza chiaro. Grazie

1 Risposte

  • Re: Incremento contatore

    La domanda è un po' "datata", ma, forse, la risposta può essere utile a qualcuno.

    Per interrompere l'esecuzione di un "ciclo for" si possono utilizzare due diverse istruzioni:

    [*] "continue": l'istruzione "continue" interrompe l'esecuzione delle istruzioni presenti nel "ciclo for", viene quindi incrementato il contatore (es. la variabile "i", "j", ...) e, se la condizione di termine del "ciclo for" non è verificata, vengono eseguire le istruzione definite all'interno del ciclo stesso.
    help continue
    continue Pass control to the next iteration of FOR or WHILE loop.
    continue passes control to the next iteration of FOR or WHILE loop
    in which it appears, skipping any remaining statements in the body
    of the FOR or WHILE loop.

    In nested loops, continue passes control to the next iteration of
    FOR or WHILE loop enclosing it.
    [*] "break": l'istruzione "break" interrompe definitivamente l'esecuzione del "ciclo for" e viene quindi eseguita la prima istruzione definita dopo il "ciclo for"
    help break
    break Terminate execution of WHILE or FOR loop.
    break terminates the execution of FOR and WHILE loops.
    In nested loops, break exits from the innermost loop only.

    break is not defined outside of a FOR or WHILE loop.
    Use RETURN in this context instead.
    Nel caso della domanda in oggetto sembra si tratti di "interrompere" l'esecuzione di tutti e tre i "cicli for"; in questo caso si dovrà utilizzare l'istruzione "break"

    Il controllo del verificarsi della condizione di termine dei cicli deve essere effettuata nel terzo "ciclo for".
    L'evento deve essere "propagato" anche ai due cicli più esterni (l'istruzione "break" ha effetto solo sul ciclo all'interno del quale viene eseguita).
    Per propagare l'evento si può utilizzare un flag di controllo che deve essere opportunamente settato al verificasi della condizione desiderata.
    Il flag viene utilizzato nei cicli esterni per l'attivazione di altre istruzioni "break".

    In calce, lo script proposto nella domanda, modificato come sopra descritto.
    Per testare la soluzione, il primo ciclo è stato modificato in modo che effettuasse (in teoria) 3 iterazioni: essendo stata impostata nella domanda la condizione di uscita "0125" ed essendo stato impostato il primo ciclo "da 0 a 1", l'uscita dal primo ciclo risultava "implicita" e quindi inutile l'utilizzo del flag di controllo.
    Delle istruzioni "disp" sono state aggiunte per stare a video messaggi relativi al verificarsi della condizione di termine e del suo "propagarsi".
    
    %
    % Definizione ed inizializzazione del flag "go_on" per controlalre l'uscita
    % dai primi due cicli "for"
    %
    go_on=1;
    %
    % Cicli "for"
    %
    for i=0:3
       %
       %    Se il valore del flag "go_on" è "0" l'istruzione "break" interrompe
       %    il ciclo for "corrente"
       %
       if(~go_on)
          disp('Loop 1: condizione di uscita identificata tramite il flag "go_on"')
          break
       end
       for j=0:9
          %
          %    Se il valore del flag "go_on" è "0" l'istruzione "break"
          %    interrompe il ciclo for "corrente"
          %
          if(~go_on)
             disp('Loop 2: condizione di uscita identificata tramite il flag "go_on"')
             break
          end
          for k=0:9
             
             x=[0 i j k]
             %
             % Controllo del verificarsi della condizione di uscita dai cicli
             % "for": al verificarsi della condizione, viene settato a "0" il
             % flag di controllo e l'istruzioen break interrrompe l'esecuzione
             % del ciclo "for" corrente
             %
             if(i == 1 && j == 2 && k == 5)
                disp('Loop 3: condizione di uscita verificata; flag go_on settato a 0')
                go_on=0;
                break
             end
          end
       end
    end
    
    Hope this helps.
Devi accedere o registrarti per scrivere nel forum
1 risposte