Come configurare smartphone e PC. Portale informativo

Per ogni ordine inverso 1s. Cicli usando l'espressione booleana

Descrizione:

Cycle operator For è inteso per la ripetizione ciclica di operatori situati all'interno della costruzione Cycle - EndCycle.

Prima dell'inizio del ciclo, il valore di Expression 1 viene assegnato alla variabile VariableName . Il valore di VariableName viene incrementato automaticamente ad ogni iterazione del ciclo. Il valore di incremento del contatore ogni volta che viene eseguito il ciclo è 1.

Il ciclo viene eseguito fintanto che il valore della variabile VariableName è minore o uguale al valore di Expression 2 . La condizione di esecuzione del ciclo viene sempre verificata all'inizio, prima che il ciclo venga eseguito.

Sintassi:

Parametri:

Variable_name Identificatore di una variabile (contatore di loop) il cui valore viene incrementato automaticamente di 1 ogni volta che il loop si ripete. Il cosiddetto contatore di cicli.Espressione 1 Espressione numerica che specifica il valore iniziale assegnato al contatore del ciclo alla prima iterazione del ciclo.By Il collegamento della sintassi per il parametro Expression 2.Espressione 2 Il valore massimo del contatore di loop. Quando la variabile VariableName diventa maggiore di Expression 2, l'esecuzione dell'istruzione del ciclo For si interrompe.Loop Le istruzioni che seguono la parola chiave Loop vengono eseguite fintanto che il valore della variabile VariableName è minore o uguale al valore di Expression 2 .

Ciclo per tutti

Descrizione:

L'istruzione For each loop serve per scorrere le raccolte di valori. Ogni iterazione del ciclo restituisce un nuovo elemento della raccolta. L'attraversamento continua fino a quando tutti gli elementi della raccolta non sono stati iterati.

Sintassi:

Parametri:

Nome_variabile_1 La variabile a cui viene assegnato il valore dell'elemento successivo della raccolta ogni volta che si ripete il ciclo.Dal collegamento Sintassi per il parametro nome_variabile_2.nome_variabile_2 La variabile o l'espressione che rappresenta la raccolta. Gli elementi di questa raccolta verranno assegnati al parametro nome_variabile_1.Loop Le istruzioni che seguono la parola chiave Loop vengono eseguite per ogni elemento della raccolta.// Istruzioni Un'istruzione da eseguire o una sequenza di tali istruzioni.Abort Consente di interrompere il ciclo in qualsiasi momento. Dopo l'esecuzione di questa istruzione, il controllo viene trasferito all'istruzione successiva alla parola chiave End of Loop.Continua Trasferisce immediatamente il controllo all'inizio del ciclo, dove vengono valutate e verificate le condizioni di esecuzione del ciclo. Le istruzioni che seguono nel corpo del ciclo non vengono eseguite in questa iterazione dell'attraversamento.EndLoop Una parola chiave che termina la struttura di un'istruzione di ciclo.

Cicla ciao

Descrizione:

L'istruzione Loop while è intesa per la ripetizione ciclica di istruzioni che si trovano all'interno della struttura Ciclo - Fine ciclo. Il ciclo viene eseguito mentre l'espressione logica è Vero. La condizione di esecuzione del ciclo viene sempre verificata per prima, prima che il ciclo venga eseguito.

Sintassi:

Parametri:

espressione booleana Espressione booleana.Loop Le istruzioni che seguono la parola chiave Loop vengono eseguite fintanto che lo è il risultato dell'espressione logica Vero. // Istruzioni Un'istruzione da eseguire o una sequenza di tali istruzioni.Abort Consente di interrompere il ciclo in qualsiasi momento. Dopo l'esecuzione di questa istruzione, il controllo viene trasferito all'istruzione successiva alla parola chiave End of Loop.Continua Trasferisce immediatamente il controllo all'inizio del ciclo, dove vengono valutate e verificate le condizioni di esecuzione del ciclo. Le istruzioni che seguono nel corpo del ciclo non vengono eseguite in questa iterazione dell'attraversamento.EndLoop Una parola chiave che termina la struttura di un'istruzione di ciclo.
12 dicembre 2014 alle 13:13

Quale ciclo è più veloce? Prova 1C

  • Alte prestazioni ,
  • programmazione anomala,
  • Programmazione

Ho programmato 1C per diversi anni, e poi è venuto il pensiero: "Perché non seguire una sorta di corso di formazione, all'improvviso ci sono alcune lacune nelle conoscenze che prima non sospettavo nemmeno"? Detto fatto. Mi siedo, ascolto il corso, raggiungo gli operatori ciclici e poi il secondo pensiero (sì, non mi appaiono spesso) - "Quale ciclo è più veloce?" Dovremmo controllare.
Così ho trovato cinque modi come puoi organizzare il ciclo usando 1C.

Il primo tipo di ciclo, chiamiamolo condizionale "ForPo" sembra così:

For n = 0 per numero di iterazioni Loop SomeAction(); ciclo finale;
Secondo punto di vista "Per ciascuno":

Per ogni ItemCollection dalla raccolta Loop SomeAction(); ciclo finale;
Il terzo "Ciao":

Ciao n<>NumberIterations Loop SomeAction(); n = n + 1; ciclo finale;
Poi ho ricordato la giovinezza dell'assemblatore: il ciclo "Se":

~LoopStart: Se n<>NumberIterations Then SomeAction(); n = n + 1; Salta ~StartCycle; Finisci se;
E infine "Ricorsione"

Procedura RecursiveLoop(n, Numero di iterazioni) SomeAction(); Se n<>Numero di iterazioni poi ciclo ricorsivo(n+1, numero di iterazioni); Finisci se; EndProcedura
Naturalmente, non è del tutto corretto attribuire la ricorsione ai cicli, ma tuttavia, con il suo aiuto, puoi ottenere risultati simili. Prenoterò subito che la ricorsione non ha partecipato a ulteriori test. In primo luogo, tutti i test sono stati eseguiti a 1.000.000 di iterazioni e la ricorsione scende già a 2.000. In secondo luogo, la velocità di ricorsione è dieci volte inferiore alla velocità di altri loop.

Ultimo ritiro. Una delle condizioni era l'esecuzione di qualsiasi azione nel ciclo. Innanzitutto, il ciclo vuoto viene utilizzato raramente. In secondo luogo, il ciclo "For Each" viene utilizzato per una raccolta, il che significa che il resto dei cicli deve funzionare con la raccolta in modo che il test avvenga nelle stesse condizioni.

Bene, allora andiamo. Il corpo del ciclo è stato letto da un array precompilato.


o, quando si utilizza un ciclo "ForEach".

Ricevitore valore di prova = elemento;
Il test è stato effettuato sulla piattaforma 8.3.5.1231 per tre tipologie di interfaccia (Applicazione Regolare, Applicazione Gestita e Taxi).
I numeri sono il tempo in millisecondi ottenuto utilizzando la funzione CurrentUniversalDateInMilliseconds(), che ho chiamato prima del ciclo e dopo che è terminato. I numeri sono frazionari perché ho usato la media aritmetica di cinque misurazioni. Perché non ho usato il benchmarking? Non avevo un obiettivo per misurare la velocità di ogni riga di codice, solo la velocità dei cicli con lo stesso risultato di lavoro.

Sembrerebbe tutto qui, ma - per testare così testare!
Risultato per la piattaforma 8.2.19.106
In media la piattaforma 8.2 è più veloce del 25% rispetto alla 8.3. Non mi aspettavo un po' una tale differenza e ho deciso di testarlo su un'altra macchina. Non darò i risultati, puoi generarli tu stesso usando questa configurazione. Posso solo dire che l'8,2 era il 20 percento più veloce.

Come mai? Non lo so, smontare il kernel non faceva parte dei miei piani, ma ho comunque esaminato la misurazione delle prestazioni. Si è scoperto che le operazioni cicliche stesse in 8.3 sono leggermente più veloci rispetto a 8.2. Ma in linea
Ricevitore TestValue = TestArray.Get(n);
ovvero, si verifica un significativo calo delle prestazioni durante la lettura di un elemento della raccolta in una variabile.

Infine:
Perché tutto questo? Per quanto mi riguarda, ho tratto diverse conclusioni:

1. Se è possibile utilizzare un ciclo specializzato - "For Each", è meglio usarlo. A proposito, da solo funziona più a lungo di altri loop, ma la velocità di accesso a un elemento di raccolta è molto più alta.
2. Se conosci il numero di iterazioni in anticipo, usa "For". "Ciao" funzionerà più lentamente.
3. Se usi il ciclo "If", ovviamente gli altri programmatori non ti capiranno.

Attenzione! Alla fine dell'articolo c'è un link a un video tutorial.
Se non hai mai incontrato la programmazione prima, allora la necessità di usare un ciclo in un programma 1C probabilmente non è del tutto chiara. In questo articolo parlerò delle istruzioni di ciclo e del loro scopo principale.

Ma prima, per chiarezza, alcune spiegazioni sulle espressioni utilizzate nell'articolo:
Iterazioneè una ripetizione.
Staffe operatore sono parole riservate, che sono sempre scritte in coppia, una dichiarazione di apertura e una dichiarazione di chiusura. Ad esempio: Function - EndFunction, If - EndIf, For - EndCycle, ecc.
Corpo ad anello- il codice del programma che si trova all'interno delle parentesi operatore del loop.
Cicloè una costruzione che ripete l'esecuzione di linee poste nel corpo del ciclo, il numero di ripetizioni dipende dal risultato delle condizioni all'inizio del ciclo.

Se questo operatore non esistesse, allora il codice all'interno del ciclo dovrebbe essere scritto tante volte quante sono le iterazioni necessarie. Immagina se ci sono 100 righe in un documento e devi ordinarle e, ad esempio, modificare il valore e se allo stesso tempo il loro numero cambia periodicamente, ad es. vengono aggiunti e rimossi. Non sarebbe facile.
Il ciclo consente di semplificare il compito di eseguire righe di codice ripetute.
Nel programma 1C 8.1, ci sono tre costruzioni di loop:
"For.. To.. Loop" - ripete il numero di cicli dal valore iniziale del contatore al valore finale specificato, aggiungendo 1 alla variabile del contatore ad ogni iterazione. Usato quando è noto il numero di iterazioni.

Ciclo 1C per

Per contatore = 1 per 3 Loop // Loop corpo End Loop;

Ciclo 1C Ciao

"While... Loop" - viene eseguito mentre il valore calcolato è True. Può essere utilizzato nei casi in cui le variabili per il calcolo dell'espressione vengono modificate nel corpo del ciclo, o se la raccolta viene ripetuta e dispone di un metodo corrispondente che restituisce un booleano, che viene chiamato all'inizio del ciclo.

While Selection.Next() Loop //Corpo del ciclo EndCycle;

Ciclo 1C Per ciascuno

"For Each...From...Loop" scorre la raccolta dal primo all'ultimo elemento. Scrivendo in una variabile (nell'esempio: CurrentElement ) il valore dell'elemento.

Per ogni CurrentElement da ArrayElements Loop // Loop Body End Loop;

Ciclo inverso 1C

C'è anche un ciclo inverso che può essere utilizzato per attraversare le raccolte in ordine inverso, ad es. dal basso verso l'alto (dalla fine). Questo metodo potrebbe essere necessario se è necessario eliminare elementi della raccolta

Numero di articoli = Matrice di articoli.Quantità(); Per ReverseIndex = 1 per numero di elementi Loop CurrentItem = Array di elementi[Numero di elementi - ReverseIndex]; ciclo finale;

Gli operatori Continua e Annulla sono trattati nel video, link sotto.

Gli algoritmi di molti programmi spesso implicano la ripetizione ciclica di determinate azioni. 1C in questo caso non fa eccezione. I cicli in 1C consentono di:

  • Iterare sugli elementi della directory;
  • Riempi le aree di layout;
  • Eseguire determinate azioni con una selezione di documenti;
  • E molti molti altri.

Tipi di loop

In 1C, è consuetudine distinguere tre tipi di cicli a seconda dell'insieme di parole incluse nella costruzione:

  1. Per ogni “Variabile” da “Raccolta di Valori”;
  2. Per "Variabile" = "Avvia. valore "Secondo" Kon. Significato";
  3. Mentre "Espressione".

Consideriamoli più in dettaglio.

Per ciascuno di

Questo crawler è adatto per raccolte di valori (selezione di documenti o articoli di riferimento, stock). L'esecuzione continuerà fino a quando l'ultimo elemento della raccolta non sarà stato attraversato. La riga deve contenere:

  • Una variabile che specifica l'elemento corrente della raccolta;
  • Definizione di un insieme di valori.

L'errore più comune in questo caso è mostrato in Fig. 1

Molto spesso, si verifica quando un programmatore non comprende appieno la differenza tra un oggetto (documento, directory) e una raccolta (selezione) di valori ottenuti utilizzando l'operatore Select().

Per da

In questo caso i parametri passati alla stringa sono:

  1. Il nome della variabile è un iteratore;
  2. Il valore iniziale della variabile;
  3. Il valore finale della variabile.

Il blocco di istruzioni incluso nel corpo del ciclo verrà ripetuto finché la variabile non eguaglia o supera il valore finale per la prima volta. In questo caso, l'iteratore aumenterà di 1 ogni passaggio.I valori vengono confrontati prima dell'esecuzione del passaggio successivo.

Questa costruzione è molto spesso utilizzata quando si aggirano le sezioni tabulari.

Quando si utilizza questo crawler, è importante distinguere tra il numero di righe nella sezione tabellare e l'indice di una singola riga presa. Nel primo caso il valore iniziale sarà pari a 1, il valore finale può essere ottenuto utilizzando l'operatore Quantità(). Gli indici iniziano da 0 e terminano con Count()-1. In caso contrario, è possibile ottenere un errore (Fig.2).

Ciao

C'è solo un parametro qui: un'espressione logica, che viene verificata per verificarne la verità prima di ogni passaggio successivo del ciclo. Non appena l'espressione booleana fallisce, il gestore completerà l'attraversamento.

È molto importante capire che in alcuni casi l'espressione in prova può sempre essere True, quindi l'attraversamento verrà eseguito un numero infinito di volte, bloccando il sistema.

In questi casi, è necessario registrare una delle due opzioni per interrompere l'esecuzione all'interno del corpo del ciclo.

A volte può sorgere una situazione in cui la verità dell'espressione controllata non arriverà mai. Questo può portare a inutili ricerche di errori nel codice e perdite di tempo.

Interrompere l'esecuzione premendo una combinazione di tasti

Se scrivi la procedura UserInterrupt Handling() nel corpo del ciclo, in qualsiasi momento durante la sua esecuzione, premendo la combinazione di tasti Ctrl + PauseBreak, puoi interromperne il lavoro. In questo caso verrà visualizzata una riga nella finestra dei messaggi (Fig. 3).

Al fine di evitare spiacevoli conseguenze delle proprie attività, è estremamente utile che i programmatori si abituino a registrare tale procedura nell'organismo di elaborazione.

Interruzione condizionale

Abbastanza spesso, l'algoritmo del programma prevede l'interruzione dell'elaborazione ciclica se viene soddisfatta una condizione particolare. Puoi inserire questa procedura nel corpo del ciclo usando l'istruzione Break.

Scritta correttamente nel codice del programma, questa affermazione è evidenziata in rosso.

Saltare alcune operazioni in loop

Spesso in un loop è necessario verificare il soddisfacimento di una condizione e, se questa condizione non è soddisfatta, saltare il gestore principale. Tali strutture possono essere implementate in due modi:

  • Nel primo metodo, impostiamo una condizione e all'interno di If Then End Se scriviamo il codice eseguibile, se la condizione non è soddisfatta, il codice non verrà eseguito di conseguenza. L'ovvio svantaggio di questo approccio è che è piuttosto ingombrante e nel caso di un gran numero di condizioni è facile sbagliare dove inizia un "Se" e dove finisce un altro;
  • È molto più corretto utilizzare una costruzione dove, invece di asserire una condizione, se ne prende la negazione (anziché uguale, si prende in modo disuguale, ecc.) e si pone l'operatore Continua all'interno della costruzione;

L'istruzione "Continua" nel corpo del codice è evidenziata in rosso e sposta l'esecuzione del ciclo all'inizio.

Articoli correlati in alto