Programmazione di processi di elaborazione dati computazionali ciclici. Programmazione di processi computazionali ciclici. Un esempio di utilizzo dell'istruzione for

Nella programmazione, ci sono spesso compiti che richiedono l'esecuzione ripetuta dello stesso gruppo di istruzioni di programma con valori diversi dei loro operandi. Tali processi sono chiamati ciclico o semplicemente cicli. Un gruppo di affermazioni ripetute ciclicamente costituisce il cosiddetto corpo del ciclo, che può essere rappresentato da un'espressione semplice o composta. Chiameremo l'esecuzione una tantum del corpo del ciclo iterazione.

Il corpo di un ciclo in un programma è sempre preceduto da intestazione del ciclo, contenente la designazione operatore di ciclo e un'espressione che definisce (direttamente o indirettamente) il numero di iterazioni. Si noti che il corpo del ciclo è l'operando dell'operatore del ciclo; pertanto, l'intestazione e il corpo del ciclo costituiscono un'unità strutturale indivisibile del programma. Nel seguito si utilizzerà il termine " operatore di ciclo", intendiamo sia l'intestazione che il corpo del ciclo.

Per organizzare i cicli in tutti i sistemi di programmazione, ci sono specializzati operatori di ciclo, il cui utilizzo solleva il programmatore dalla necessità di programmare i cicli “manualmente”. MathCAD supporta due tipi di tali operatori: ciclo con predestinazione Per (chiamato anche anello con contatore) E ciclo con precondizione Mentre . Una descrizione della struttura di questi operatori è riportata nella Tabella 5.

5.4.1 Operatore Per

Questo operatore dovrebbe essere utilizzato nei casi in cui il numero di iterazioni è predeterminato, cioè noto in anticipo.

Intestazione del ciclo di questo operatore (l'operando destro) contiene una variabile chiamata parametro(o contatore) ciclo, E elenco di valori questo parametro. Il numero di elementi dell'elenco determina anche il numero di iterazioni: durante ogni iterazione, il parametro del ciclo riceve il valore successivo dall'elenco specificato nell'intestazione.

Parametro del ciclo ha lo stato di una variabile interna del programma e possiede tutte le sue proprietà (descritte nella sezione 5.1.4). Di norma, il parametro loop viene utilizzato sul lato destro delle espressioni incluse nel corpo del ciclo, sebbene non sia formalmente vietato utilizzarlo sul lato sinistro delle espressioni (cioè a sinistra della definizione locale operatore "f"). Va ricordato che se un parametro è stato modificato nel corpo del ciclo, il suo valore modificato sarà valido solo fino alla fine dell'iterazione corrente, poiché prima dell'inizio dell'iterazione successiva il parametro riceverà ancora il valore successivo dal elenco specificato nell'intestazione del ciclo.

Formalmente, è consentito non utilizzare affatto il parametro loop nelle espressioni del corpo del loop - in questo caso l'elenco dei valori dei parametri non ha alcun ruolo - solo la lunghezza di questo elenco è significativa, il che determina il numero di iterazioni (possibilmente prive di significato).

Al completamento dell'ultima iterazione, verrà eseguita l'istruzione del programma successiva all'istruzione del ciclo. In questo caso la variabile utilizzata come parametro del ciclo completato mantiene il valore che aveva nell'ultimo effettivamente completato iterazione[*]. Si noti che questo valore non sempre coincide con l'ultimo valore dell'elenco specificato nell'intestazione del ciclo, poiché è possibile un'uscita "anticipata" dal ciclo quando l'operatore viene attivato Rottura incluso nel corpo del ciclo.

Elenco dei valori Il parametro del loop viene scritto nell'intestazione del loop dopo il simbolo " Î ", che indica l'appartenenza a un set (non è necessario inserire manualmente questo simbolo: verrà visualizzato automaticamente all'accesso dell'operatore Per ). MathCAD ne consente l'utilizzo tre forme voci in questo elenco: trasferimento diretto– gli elementi della lista sono specificati esplicitamente separati da virgole, il parametro riceve i valori dalla lista nell'ordine in cui appaiono; nello stile delle variabili classificate – gli elementi della lista formano la serie aritmetica corrispondente; vettore– Gli elementi della lista ricevono in sequenza i valori degli elementi dell'array nell'ordine dei loro indici (prima le colonne da sinistra a destra, poi le righe dall'alto al basso).

I tre programmi mostrati nella Figura 21 illustrano diversi utilizzi dell'operatore Per .

Programma Fatto(n) calcola il fattoriale di un numero N . L'operatore di ciclo in questo programma fa parte di un'espressione composta che, a sua volta, è l'operando di un operatore condizionale Altrimenti. Parametro del ciclo K ottiene valori da una serie aritmetica intera.

Programma Cap(V,N,p) elabora il vettore di input V , sostituendolo con il valore P quegli elementi i cui indici sono specificati dagli elementi del secondo vettore di input N . In questo esempio, un elenco di valori dei parametri del loop io definito da un insieme di elementi vettoriali N . Si noti che entrambi questi programmi eseguono il controllo dei dati di input e bloccano l'esecuzione dell'algoritmo principale se gli argomenti effettivi del programma vengono specificati in modo errato.

Programma L(M,z) dato nell'esempio V ), è accompagnato da commenti dettagliati e non richiede spiegazioni. Questo programma illustra la possibilità di utilizzare più istruzioni di loop, una delle quali è inclusa tra le istruzioni corpo un altro. Utilizzo cicli nidificati- una tipica tecnica utilizzata per elaborare array multidimensionali.

Figura 21 – Esempi di programmazione del ciclo Per


La Figura 22 illustra l'uso degli operatori Rottura E Continua nel corpo del ciclo. In genere, questi operatori sono essi stessi operandi dichiarazioni condizionali Se O Altrimenti .

Operatore Rottura ("interruzione") interrompe esecuzione del ciclo e trasferisce il controllo all'operatore successivo all'operatore del ciclo interrotto. Tieni presente che se l'operatore Rottura interrotto ciclo nidificato, l'esecuzione del ciclo esterno continuerà.

Operatore Continua ("continua") agisce diversamente - lui interrompe solo l'iterazione corrente del ciclo e trasferisce il controllo all'intestazione di questo ciclo, dopodiché il ciclo viene eseguito continua dall'iterazione successiva (a meno che, ovviamente, l'iterazione interrotta non fosse l'ultima).

Operatore Rottura consentito l'uso e al di fuori corpo del ciclo. In questo caso l'esecuzione dell'intera subroutine viene interrotta e viene restituito il risultato della valutazione della sua ultima espressione effettivamente eseguita.

Figura 22 – Esempi di utilizzo degli operatori Rottura E Continua

Funzione SommaN(V) somma solo gli elementi vettoriali che contengono dati numerici scalari e salta gli elementi rimanenti. Funzione Inverso(V) forma un vettore i cui elementi sono i valori inversi degli elementi corrispondenti del vettore originale. Inoltre, se l'elemento successivo contiene il numero "0" o non è uno scalare di tipo numerico, il ciclo viene interrotto. Tieni presente che l'operatore Rottura nell'ultimo esempio non interrompe il programma, ma trasferisce il controllo all'operatore Ritorno , subito dopo l'operatore Per .

5.4.3 Operatore Mentre

A differenza dell'operatore Per , intestazione dell'istruzione Mentre (nella traduzione - " Ciao") non contiene indicazioni esplicite sul numero di iterazioni - contiene espressione logica, il cui valore viene calcolato automaticamente prima dell'inizio esecuzione di ogni iterazione successiva[†]. Finché questa espressione è vera, il ciclo continuerà a scorrere; non appena l'espressione diventa falsa dopo il completamento dell'iterazione successiva, la successiva iterazione del ciclo non verrà eseguita e l'istruzione di programma successiva all'istruzione riceverà il controllo Mentre .

Ovviamente, se nell'intestazione del ciclo viene inserita un'espressione logica identicamente falsa, questo ciclo non completerà nessuna delle sue iterazioni, e se questa espressione è identicamente vera, il ciclo sarà infinito (quest'ultima situazione è chiamata looping programmi). Per evitare tali situazioni, gli operandi di un'espressione logica devono includere una o più variabili che ne modificano il valore nel corpo del ciclo in modo che il ciclo sia finito (si possono usare altri mezzi per impedire il ciclo, ad esempio forzando l'operatore a uscire dal ciclo Rottura ).

Esempi di utilizzo dell'operatore Mentre sono mostrati nella Figura 23. Vengono fornite tre opzioni per risolvere lo stesso problema: ciascuno dei programmi F0 , F1 E F2 restituisce l'indice del primo elemento del vettore sorgenteV superando il valore specificatoz .

Primo programma (es UN ) aggiunge uno al contatore K nel corpo del ciclo Mentre fino al prossimo K l'esimo elemento del vettore originale non supererà il valore specificato z . Successivamente il ciclo termina e il programma restituisce l'ultimo valore modificato della variabile K , che è la soluzione al problema. Si noti che, a differenza del ciclo Per , contatore K qui è necessario elaborarlo con istruzioni separate: inizializzare (cioè assegnargli un valore iniziale) prima dell'operatore del ciclo e modificarne il valore nel corpo del ciclo.

È facile vedere che l'opzione UN ) del programma presenta un notevole inconveniente: non impedisce il ciclo del programma nel caso in cui il problema non abbia soluzione, cioè quando il parametro z supera il valore dell'elemento più grande del vettore V . In questo esempio, il looping in una situazione del genere non avverrà realmente, ma questo non è merito del nostro programma, ma del sistema MathCAD, che controllerà l'output dell'indice vettoriale V al di fuori dei valori consentiti e genererà un messaggio di errore.

L'opzione è libera da questo inconveniente B ) di un programma in cui il corpo del loop contiene un ulteriore controllo sulla validità del successivo valore dell'indice e interrompe forzatamente il loop con l'operatore Rottura nella situazione appropriata con l'emissione di un messaggio di testo.

Forse la soluzione più efficace a questo problema è l'opzione V ), che non utilizza affatto l'operatore Mentre . In questo programma la variabile K utilizzato solo per mantenere la “purezza dello stile” - per escludere l'elaborazione del parametro del loop io esterno all'operatore Per .

Figura 23 – Esempi di programmazione del ciclo Mentre

Obiettivo del lavoro:

Studia gli operatori ciclici for, while, do - while, impara a comporre e programmare algoritmi ciclici.

Brevi informazioni teoriche

Gli operatori di loop vengono utilizzati quando è necessario ripetere più volte determinate azioni (operatori e operazioni) e tali sezioni di algoritmi sono chiamate loop.

L'operatore del ciclo for

La forma base dell'istruzione del ciclo for è:

per (espressione_1; espressione_2; espressione_3)

operatore;

Dove espressione_1– valore iniziale del parametro ciclo;

espressione_2– verificare le condizioni per la prosecuzione del ciclo;

espressione_3– modifica del parametro del ciclo (correzione);

operatore– operatore semplice o composto in linguaggio C.

Lo schema di funzionamento dell'operatore è il seguente: solo una volta, prima viene calcolata espressione_1, poi viene verificata espressione_2 e, se è "true", viene eseguita una sezione ciclica del programma, quindi il parametro viene corretto e così via fino a quando espressione_2 assume il valore "falso".

Per esempio: per (k=1; k<5; k++)

printf("\n %d", k);

Come risultato dell'esecuzione di questo operatore, i numeri da 1 a 4 vengono stampati in una colonna.

È possibile utilizzare una variabile di qualsiasi tipo base come parametro di ciclo.

Per esempio:

for(ch=’a’; cap<=’z’; ch++) // Вывод на экран букв

printf(“%c”,ch); // Alfabeto latino

È necessario controllare attentamente la struttura dei cicli for nel programma in modo da non ritrovarsi con un ciclo infinito (da cui non c'è uscita).

Per esempio:

per(k=10; k>6;k++)

printf("ciclo infinito\n");

Ciclo di uscita in anticipo rispetto al programma con le seguenti modalità:

Per condizione aggiuntiva;

Utilizzando i seguenti operatori:

rottura;- uscita dal ciclo in cui si trova break, il controllo viene trasferito alla prima istruzione eseguita dopo il ciclo;

uscita(int Kod);- uscire dal programma;

ritorno;- uscire dalla funzione;

Utilizzo dell'operatore di salto incondizionato vai a<метка>;

Presto completamento della fase ciclica corrente possibile utilizzando una condizione o un operatore aggiuntivo Continua, che interrompe l'esecuzione del passo del ciclo corrente, ovvero salta le istruzioni del resto del ciclo e trasferisce il controllo all'istruzione principale del ciclo per regolare il parametro e verificare la condizione.

È vietato trasferire il controllo dall'esterno all'interno del circuito.

Potrebbe mancare una qualsiasi delle espressioni del ciclo for tra parentesi, tranne il simbolo ";". non può essere abbassato.

Per esempio:

per(; i<3; i++)

puts("Ciao!");

Istruzioni cicliche while e do– while

Forma base dell'operatore ciclico Mentre:

Mentre (condizione)

operatore;

Dove operatore

Il ciclo viene eseguito finché la condizione risulta vera, ovvero l'espressione tra parentesi restituisce un risultato diverso da zero. Questo è un ciclo con una precondizione: prima viene verificata la condizione, quindi viene eseguita l'istruzione. Pertanto, il ciclo while non verrà eseguito nemmeno una volta se il risultato iniziale del calcolo della condizione è 0.

Forma base dell'operatore fare durante:

operatore;

mentre(condizione);

Dove operatoreè un'affermazione semplice, composta o vuota.

Operatore FareMentre– operatore di ciclo con postcondizione, ovvero prima viene eseguita l'istruzione, quindi viene verificata la verità della condizione. Poiché in un ciclo do– while la condizione viene verificata alla fine del ciclo, il ciclo verrà eseguito almeno una volta.

Nei cicli come while e do– while, sono consentiti gli stessi metodi di uscita anticipata dal ciclo e di completamento anticipato del passo corrente del ciclo come nell'istruzione for, ma in quest'ultimo caso, a differenza del ciclo for, il controllo viene trasferito per verificare la condizione. Per evitare un ciclo infinito all'interno dei cicli while e do– while è necessario provvedere alla modifica delle variabili incluse nella condizione.

Per esempio:

per (i=1;i<=300;i++) // Печать целых чисел, кратных 5

se (i%5!=0) continua;

printf("%5d",i);

Esempi di cicli infiniti:

operatore;

2) while(number_not_0) // Sempre vero!

operatore;

operatore;

while(numero_non_0); // Sempre vero!

Tra gli operatori del loop deve esserci una condizione di uscita.

Cicli nidificati

Nel caso dei cicli nidificati, un ciclo è dentro un altro, ad esempio:

for(i=nn;i

for(j=mn;j

operatore;

Dove operatoreè un'affermazione semplice, composta o vuota. Il ciclo interno verrà eseguito per ogni valore del parametro i che soddisfa la condizione del ciclo esterno.

Esempio:

per(i=1;i<10;i++) // Печать таблицы умножения

per(j=1;j<4;j++)

printf("\n %d*%d=%2d", i, j, i*j);

printf(“\n”);

Un esempio di utilizzo dell'istruzione for

Calcolare. Il programma dovrebbe stampare i risultati intermedi e finali.

Il testo del programma potrebbe essere simile

#includere

#includere

puts("Inserisci N");

scanf(“%d”,&N);

per (s=0, k=1; k<=N; k++) // В заголовке цикла можно выпол-

( // prendi e doppio incarico

printf(" \n k=%d s=%f ", k, s);

printf("\n RISPOSTA: s=%f, Premi un tasto qualsiasi...",s);

Opzioni per incarichi individuali

Scrivere un programma per determinare una tabella di valori di funzione A in un intervallo arbitrario [ UN,B] l'argomento cambia X con passaggi arbitrari H. Valori a, b, h inserito dalla tastiera. La tabella deve contenere le seguenti colonne: numero di sequenza, valore dell'argomento X, valore della funzione, messaggio sulla funzione crescente o decrescente, differenza di due valori di funzione adiacenti.

Determinare i valori massimo e minimo della funzione.

1. a=-p; b=p; h=0,4.

2. a=0,7; b=1,8; h=0,1.

3. a=-0,5; b=2,5; h=0,2.

4. a=-0,9; b=2,7; h=0,3.

5. a=-2; b=0,8; h=0,2.

6. a=-1,9; b=2,7; h=0,3.

7.a=-0,4p; b=0,4p; h=0,5.

8. a=-0,3p; b=1,3p; h=p/10.

9. a=-p/2; b=p/2; h=p/10.

10. a=-3; b=3; h=0,5.

“Programmazione dei processi di calcolo ciclico”

Obiettivo del lavoro: padroneggiare metodi per compilare algoritmi per processi computazionali ciclici e organizzare programmi ciclici di struttura complessa.

Parte teorica

4.1.1. Algoritmi ciclici.

Un ciclo è una sequenza di azioni che possono essere eseguite più di una volta.

Un algoritmo round-robin è un algoritmo che contiene uno o più cicli.

Esistono 3 tipi di cicli:

Ciclo con precondizione;

Ciclo con postcondizione;

Ciclo con un contatore (ciclo di conteggio).

Se l'esecuzione di un ciclo è associata ad una condizione logica, vengono utilizzati cicli con una precondizione o una postcondizione.

I counter loop sono una classe in cui l'esecuzione del corpo del loop deve essere ripetuta un numero prestabilito di volte.

I diagrammi a blocchi degli algoritmi ciclici assomigliano a questo:

1. Loop con un contatore.

2. Ciclo con precondizione. 3. Ciclo con postcondizione.

4.1.2 Operatori di ciclo nel linguaggio di programmazione C++.

In C++, per ogni tipo di ciclo esiste un operatore corrispondente:

Ciclo come while (con precondizione);

Ciclo come do... while (con postcondizione);

Ciclo come for (conteggio).

1.Operatore di loop come while

Modulo di iscrizione:

while (condizione) istruzione;

dove: (condizione) – espressione logica;

operatore – l'operatore o il corpo del ciclo eseguito in un ciclo.

Se il corpo del ciclo è un'istruzione composta, deve essere racchiuso tra parentesi quadre (...):

mentre (condizione)

gruppo di operatori

Lo schema di come funziona un ciclo di questo tipo: mentre la condizione è vera, il corpo del ciclo viene eseguito e la condizione viene nuovamente verificata, ecc. Quando la condizione diventa falsa, il ciclo termina.

2. Operatore di ciclo come do... while

Modulo di iscrizione:

operatore;

mentre(condizione);

Lo schema di come funziona un ciclo di questo tipo: prima viene eseguito l'operatore, quindi viene verificata la condizione, se la condizione è vera, l'operatore viene eseguito e la condizione viene nuovamente verificata, ecc. Quando la condizione diventa falsa, il ciclo termina.

Se il corpo del ciclo è un'istruzione composta, allora, come per un ciclo con una precondizione, deve essere racchiuso tra parentesi quadre (...):



gruppo di operatori

mentre(condizione);

3. Operatore di ciclo come for

Modulo di iscrizione:

operatore;

A è un'espressione iniziale che specifica i valori iniziali per il parametro del ciclo e, se necessario, i valori iniziali per altri parametri. Per esempio:

i=0, x=0,5, p=1, s=0

B è un'espressione condizionale che controlla la condizione per continuare il ciclo. Per esempio:

C è un'espressione di incremento che specifica l'incremento del parametro del ciclo e, se necessario, altri parametri, quindi vengono scritti in una lista. Ad esempio: x+=0.1, i++

4.1.3 Un esempio di compilazione di un algoritmo e di un programma in C++ per un processo di calcolo ciclico.

Calcolare il valore di un'espressione:

B– valore iniziale, il suo valore si inserisce da tastiera e non cambia;

UN– variazioni del range a passi di 1;

– risultato, i suoi valori vengono visualizzati sullo schermo.

In base alle specifiche, la variabile a è un numero intero, quindi può essere utilizzata come contatore in un ciclo di conteggio.

Lo schema a blocchi dell'algoritmo per risolvere questo problema utilizzando un ciclo di conteggio è il seguente:

#includere

#includere

#includere

printf("Inserisci b: ");

scanf(“%f”,&b);

printf("una sì\n");

per (a=0;a<=10;a++)

printf("%3d",a);

printf("%8.2f\n",y);

y=(a-b)/quadrato(a);

printf("%8.2f\n",y);

Lo schema a blocchi dell'algoritmo per risolvere questo problema utilizzando un ciclo con una precondizione è il seguente:

Il testo del programma C++ corrispondente a questo algoritmo è il seguente:

#includere

#includere

#includere

printf("Inserisci b: ");

scanf(“%f”,&b);

printf("una sì\n");

printf("%3d",a);

printf("%8.2f\n",y);

y=(a-b)/quadrato(a);

printf("%8.2f\n",y);

else printf(“ y non esiste\n”);

Lo schema a blocchi dell'algoritmo per risolvere questo problema utilizzando un ciclo con una postcondizione è il seguente:

Il testo del programma C++ corrispondente a questo algoritmo è il seguente:

#includere

#includere

#includere

printf("Inserisci b: ");

scanf(“%f”,&b);

printf("una sì\n");

printf("%3d",a);

printf("%8.2f\n",y);

y=(a-b)/quadrato(a);

printf("%8.2f\n",y);

else printf(“ y non esiste\n”);

mentre (a<=10);

Parte pratica

4.2.1 Requisiti per l'esecuzione del lavoro:

Completa l'attività dal lavoro di laboratorio n. 3 per un intervallo di valori di una delle variabili. La variabile da modificare, il suo intervallo di modifica e il passo sono indicati nella Tabella 4. Creare diagrammi a blocchi di algoritmi e programmi per i due tipi di cicli specificati nel singolo compito (Tabella 4).

Formalizzare l'output dei risultati in modo tale che i valori del parametro variabile siano chiaramente evidenziati e per ogni valore specifico i valori del risultato (tre variabili dalla colonna 2 della Tabella 3) siano visualizzati nel modulo di un tavolo.

L'ordine di lavoro.

1. Eseguire un'analisi del compito, formulare una dichiarazione del problema.

2. Creare diagrammi a blocchi di algoritmi.

3. Creare un programma in C++. Fornire l'input dei dati iniziali dalla tastiera e l'output dei risultati sullo schermo.

4. Verificare la funzionalità del programma su vari dati iniziali.

5. Analizzare i risultati ottenuti.

Opzioni per incarichi individuali.

Le opzioni per i compiti individuali vengono selezionate dalla Tabella 4 in base al numero dello studente nell'elenco dei gruppi nel diario dell'insegnante.

Tabella 4. Opzioni per attività individuali

NO. Variabile mutabile Tipi di cicli
10 ≤ a ≤ 10,Δ un=1
-4 ≤ d ≤ 4, Δ d = 0,5
-6 ≤ x ≤ 3, Δ x = 0,5
0 ≤ b ≤ 3 0, Δ b = 1,5 1. Con precondizione, 2. Numerabile
-15 ≤ j ≤ 1 0, Δ j = 0,5 1. Con precondizione, 2. Con postcondizione
5 ≤ e ≤ 35,Δ e = 2 1. Numerabile, 2. Con postcondizione
-5 ≤ m ≤ 15,Δ m = 1 1. Con precondizione, 2. Numerabile
1 ≤ c ≤ 70,Δ c = 3 1. Con precondizione, 2. Con postcondizione
1,5 ≤ c ≤ 15,Δ c = 0,5 1. Numerabile, 2. Con postcondizione
-8 ≤ b ≤ 28,Δ b = 2 1. Con precondizione, 2. Numerabile
-4,5 ≤ x ≤ 11,5,Δ x = 0,5 1. Con precondizione, 2. Con postcondizione
-7 ≤ k ≤ 2,Δ k = 0,3 1. Numerabile, 2. Con postcondizione
-1 ≤ m ≤ 21,Δ m = 1 1. Con precondizione, 2. Numerabile
-2 ≤ e ≤ 34,Δ e = 2 1. Con precondizione, 2. Con postcondizione
-11 ≤ c ≤ 23,Δ c = 2 1. Numerabile, 2. Con postcondizione
-13 ≤ p ≤ 50,Δ p = 3 1. Con precondizione, 2. Numerabile
3,3 ≤ b ≤ 9,3,Δ b = 0,3 1. Con precondizione, 2. Con postcondizione
3,5 ≤ y ≤ 12,3,Δ y = 0,4 1. Numerabile, 2. Con postcondizione
-7,5 ≤ a ≤ 5,7,Δ a = 0,6 1. Con precondizione, 2. Numerabile
-1,5 ≤ h ≤ 1,2,Δ h = 0,1 1. Con precondizione, 2. Con postcondizione
0 ≤ h ≤ 10,Δ h=0,5 1. Numerabile, 2. Con postcondizione
-15 ≤ b ≤ 15, Δ b =2 1. Con precondizione, 2. Numerabile
-7 ≤ l ≤ 3, Δ l = 0,5 1. Con precondizione, 2. Con postcondizione
-5,5 ≤ b ≤ 6,5, Δ b = 0,5 1. Numerabile, 2. Con postcondizione
1 ≤ k ≤ 9, Δ k = 0,4 1. Con precondizione, 2. Numerabile
0 ≤ b ≤ 6,9,Δ b = 0,3 1. Con precondizione, 2. Con postcondizione
-3 ≤ v ≤ 9,Δ v = 0,6 1. Numerabile, 2. Con postcondizione
-2 ≤ p ≤ 2,6,Δ p = 0,2 1. Con precondizione, 2. Numerabile

4.3 Domande del test e compiti pratici:

1. Come funziona l'istruzione while?

2. Come funziona l'istruzione do... while?

3. Come funziona l'istruzione for?

4. Sottolinea le affermazioni del programma che formano un ciclo.

5. Qual è la differenza tra le istruzioni while e do ... while?

6. Sostituisci un operatore di ciclo nel programma con un altro.

Nella programmazione, spesso incontriamo problemi che coinvolgono processi che si ripetono. Pertanto, dobbiamo conoscere ed essere in grado di utilizzare un concetto come “ processi di calcolo ciclici».

Sarà facile per un programmatore alle prime armi capirli usando un esempio generalizzato. Inoltre, è importante capire che in tutti i linguaggi di programmazione esistono modi per implementare i loop.

Cos'è un loop nella programmazione?

Un ciclo - nella programmazione, è la ripetizione ripetuta delle stesse azioni o calcoli, ma secondo le stesse dipendenze con valori diversi delle variabili.

Incontriamo il concetto di ciclo non solo nella programmazione. Ci sono cicli in molti ambiti della nostra vita.

Ad esempio, il ciclo dell'acqua in natura è un ciclo naturale nella nostra vita.

Ora diamo un'occhiata alle regole generali e ai concetti utilizzati nei cicli computazionali.

Fasi del processo ciclico

In generale, il ciclo dovrebbe essere implementato in 4 fasi:
  • Fase 1 – preparazione del ciclo (inizializzazione).
    Impostazione del valore iniziale per il parametro e la variabile del loop.
    Parametro del ciclo– questo valore che conta il numero di passi del ciclo (il numero di ripetizioni del ciclo).
    Variabile del cicloè una quantità che cambia il suo valore in ogni fase del ciclo.
    Inizializzazione– questo sta impostando i valori iniziali per il parametro e la variabile del loop.
  • Fase 2 – corpo del ciclo.
    Si tratta della ripetizione ripetuta di un'azione in un ciclo o di calcoli basati sulle stesse dipendenze matematiche con diversi valori di variabili.
  • Fase 3 – modifica (cambiamento) del ciclo.
  • Fase 4 – gestione del ciclo.
    Questo è un controllo delle condizioni per la continuazione o l'inizio del ciclo.
Ci sono 3 operatori di loop in pascal che possono implementarne qualsiasi algoritmicamente – struttura ciclica :
  1. Dichiarazione di loop con parametro
  2. Operatore di ciclo con precondizione
  3. Operatore di ciclo con postcondizione
Li vedremo in dettaglio nel seguente articolo.

1. Metodi per costruire processi computazionali ciclici nei programmi.

2. Inserito nel computerNnumeri reali. Scrivi un programma che visualizzi la media aritmetica di questo insieme.

introduzione

I programmi ciclici sono utilizzati in quasi tutti i software. In questo caso i cicli possono essere espliciti o impliciti. In particolare, il ciclo implicito è presente nei gestori di interrupt, che di fatto vengono eseguiti in un ciclo infinito il cui corpo viene attivato dall'interrupt. Anche le subroutine, ovvero le funzioni delle finestre delle applicazioni Windows, sono cicliche. Di seguito consideriamo i programmi con un loop il cui corpo contiene moduli funzionali.

Processo ciclicoè un processo computazionale in cui i calcoli vengono eseguiti ripetutamente utilizzando le stesse formule per diversi valori dell'argomento.

Programmi, che implementano un processo ciclico sono chiamati programmi ciclici.

L’organizzazione del ciclo può essere suddivisa nelle seguenti fasi:

preparazione (inizializzazione) del ciclo (AND);

eseguire calcoli sul loop (corpo del loop) (T);

modifica dei parametri (M);

verifica della condizione di fine ciclo (U).

L'ordine di questi passaggi, come T e M, può variare. A seconda della posizione del controllo della condizione di fine ciclo, viene fatta una distinzione tra cicli con terminazioni inferiore e superiore. Per un ciclo che termina in fondo, il corpo del ciclo viene eseguito almeno una volta perché prima vengono eseguiti i calcoli e poi viene verificata la condizione per uscire dal ciclo.


Nel caso di un ciclo top-end, il corpo del ciclo non può essere eseguito nemmeno una volta se la condizione di uscita viene immediatamente soddisfatta.

Un ciclo si dice deterministico se il numero di ripetizioni del corpo del ciclo è noto o determinato in anticipo. Un ciclo si dice iterativo se il numero di ripetizioni del corpo del ciclo non è noto in anticipo, ma dipende dai valori dei parametri (alcune variabili) coinvolti nei calcoli.

Corpo del ciclo- Questa è una sezione del programma ripetuta ripetutamente.

Parametro del cicloè una variabile che assume nuovi valori ogni volta che il ciclo viene ripetuto (i cicli possono essere semplici o complessi).

Vista generale del ciclo n volte

In generale, un ciclo n volte si scrive così:

nc numero di ripetizioni volte

Le parole di servizio nts (inizio del ciclo) e kts (fine del ciclo) sono scritte rigorosamente una sotto l'altra e collegate da una linea verticale. A destra di questa riga è scritta una sequenza ripetibile di comandi (corpo del loop).

Il numero di ripetizioni è un numero intero arbitrario.

Durante l'esecuzione dell'algoritmo, la sequenza di comandi nel corpo del ciclo viene ripetuta il numero di volte specificato. Le regole del linguaggio algoritmico consentono di specificare qualsiasi numero intero di ripetizioni. Può essere zero o addirittura negativo. Questi casi non sono considerati errati, semplicemente il corpo del ciclo non verrà eseguito nemmeno una volta e il computer procederà immediatamente ad eseguire i comandi scritti dopo cc

Visione generale del ciclo finora

In generale, il ciclo è attualmente scritto come segue:

nessuna condizione ancora

| corpo del loop (sequenza di comandi)

Quando si esegue un ciclo, il computer ripete le seguenti azioni:

a) controlla la condizione scritta dopo la parola funzione while;

b) se la condizione non è soddisfatta, allora l'esecuzione del ciclo termina e il computer inizia ad eseguire i comandi scritti dopo cc. Se la condizione è soddisfatta, il computer esegue il corpo del ciclo, controlla nuovamente la condizione, ecc.

Vista generale del ciclo per

nc per i da i1 a i2

| corpo del loop (sequenza di comandi)

Qui i è il nome di un valore di tipo intero, i1, i2 sono numeri interi arbitrari o espressioni con valori interi. Il corpo del ciclo viene eseguito in sequenza per i = i1, i = i1 + 1, i1 + 2, …i = i2.

Le regole del linguaggio algoritmico consentono di specificare qualsiasi numero intero i1, i2. in particolare i2 può essere minore di i1. questo caso non è considerato un errore: semplicemente il corpo del ciclo non verrà eseguito nemmeno una volta e il computer procederà immediatamente all'esecuzione dei comandi scritti dopo cc.

Ripeti n volte e ripeti while

I cicli n volte e finora sono formattati quasi allo stesso modo nel linguaggio algoritmico. Ciò non sorprende, poiché entrambi questi comandi definiscono un ciclo, una sequenza ripetuta di comandi. Le parole di servizio nts e kts indicano che un ciclo è in esecuzione e l'intestazione del ciclo specifica il meccanismo specifico per la sua esecuzione.

Tuttavia, questi due cicli presentano una differenza significativa. Quando il computer inizia ad eseguire un ciclo n volte, sa quante volte dovrà ripetere il corpo del ciclo. Quando si esegue un ciclo, questo non è ancora il caso: il computer controlla ogni volta lo stato del ciclo e non può determinare in anticipo quando terminerà l'esecuzione. Per ora, puoi scoprire il numero di ripetizioni di un ciclo solo al termine del ciclo.

Ciò chiarisce in quali casi quale ciclo deve essere utilizzato. Se il numero di ripetizioni è noto al momento dell'avvio del ciclo, è conveniente utilizzare il ciclo n volte. Se non è possibile determinare in anticipo il numero di ripetizioni, è necessario un ciclo.

Ad esempio, un programma di controllo automatico ha la struttura mostrata in Fig. 1. Moduli inclusi nel ciclo(così come i moduli di gestione degli interrupt), con un ingresso e un'uscita ciascuno, hanno tipicamente la caratteristica che i moduli contengono variabili statiche a cui viene assegnato un valore nel ciclo corrente e l'analisi di queste variabili viene eseguita nel ciclo successivo . Pertanto, le variabili menzionate caratterizzano lo stato del modulo alla fine del ciclo di programma corrente o all'inizio del ciclo successivo. Di seguito considereremo solo tali moduli di programmi ciclici e li denomineremo brevemente MCP.


Fig. 1. Struttura tipica di un programma di controllo ad anello infinito.

Gli MCP hanno una struttura articolata, la cui complessità deve essere valutata secondo criteri particolari. V.V. Lipaev ha proposto un criterio conveniente e oggettivo per la complessità dei moduli software, vale a dire: il numero e la lunghezza totale dei percorsi nel grafico di controllo del modulo. Vengono prese in considerazione solo le dichiarazioni condizionali e di selezione. Tuttavia questo criterio chiaramente non è sufficiente per un MCP con memoria statica, perché quando si analizza un MCP è necessario ricordare i valori di tutte le variabili statiche impostate nel ciclo precedente. Inoltre, non esistono raccomandazioni per la standardizzazione di algoritmi e programmi, ad eccezione della programmazione strutturata nota da tempo in linguaggi di programmazione comunemente utilizzati come C e Pascal. Questo articolo si propone di colmare queste lacune in relazione alla MCP.

2. Frammenti di moduli di programma ciclico

Un frammento a due terminali, o semplicemente un frammento, sarà considerato una sezione di un programma con un input e un output (compresi gli operatori di loop) presupponendo che gli MCP in questione siano strutturati. Il frammento più semplice include una singola istruzione. Anche una sequenza di frammenti è un frammento. L'MCP, a sua volta, è un frammento ed è costituito da una sequenza di frammenti.

Viene proposto il metodo dei frammenti indipendenti per sintetizzare la struttura dei moduli che implementano tabelle decisionali. In questo caso viene considerato indipendente un frammento che può essere inserito ovunque nella sequenza dei frammenti del modulo. L'indipendenza della posizione di tale frammento è dovuta al fatto che i dati in esso analizzati non vengono generati nella sequenza di frammenti specificata e i dati generati nel frammento indipendente non vengono analizzati in questa sequenza di frammenti. Pertanto, i frammenti indipendenti possono essere eseguiti in parallelo (pseudo-parallelo). Nella fig. La Figura 2 mostra le possibili opzioni di implementazione per un modulo con due frammenti indipendenti. Nelle opzioni “a” e “b” i frammenti vengono riorganizzati senza distorcere l'essenza del programma; nell'opzione “c” i frammenti sono implementati in parallelo.


Fig.2. Opzioni per implementare un modulo con frammenti indipendenti:

a) e b) - implementazione sequenziale,

c) - implementazione parallela: una doppia linea orizzontale indica la parallelizzazione del programma, una linea orizzontale spessa indica il completamento dei processi paralleli.

Un frammento dipendente è quello la cui posizione dipende dalla posizione di un altro frammento nel modulo. Distingueremo tra frammenti dipendenti dall'alto e dal basso. Il frammento dipendente dall'alto deve sempre trovarsi sotto un frammento in cui si formano le variabili utilizzate in questo frammento (dipendente). Un frammento dipendente dal fondo dovrebbe essere sempre posizionato sopra un frammento che utilizza variabili generate in questo frammento. Due frammenti dipendenti, di cui uno dipendente dall'alto dal secondo, e il secondo dipendente dal basso dal primo, si chiameranno frammenti mutuamente dipendenti. Non possono essere scambiati e non possono essere implementati in parallelo. Nella fig. La Figura 3 mostra un esempio di un modulo con frammenti reciprocamente dipendenti. Tra frammenti reciprocamente dipendenti possono essercene altri, dipendenti o indipendenti da essi. Fig.3. Modulo con frammenti dipendenti.

Chiameremo fisso un frammento dipendente la cui posizione nel modulo è strettamente definita. Ad esempio, nel modulo per il riconoscimento di un carattere immesso dalla tastiera, il primo deve essere il frammento inferiore dell'effettivo carattere immesso. Gli operatori “inizio” e “fine” di un modulo sono frammenti fissi.

Non esistono frammenti assolutamente indipendenti, se non altro perché in ogni modulo ci sono i frammenti fissi dell'inizio e della fine menzionati. Pertanto, un frammento indipendente, in generale, ha una possibile area di localizzazione limitata da due frammenti reciprocamente dipendenti. Cioè, una definizione più rigorosa di frammento indipendente è la seguente: indipendente rispetto a due frammenti fissi chiameremo un frammento che può essere posizionato ovunque nella sequenza di frammenti delimitati sopra e sotto dai frammenti fissi specificati.




Superiore