Casa / Internet / Cicli e altri controlli. Programmazione strutturale. Strutture di controllo di base Strutture di controllo. Informazioni generali sui cicli

Cicli e altri controlli. Programmazione strutturale. Strutture di controllo di base Strutture di controllo. Informazioni generali sui cicli

Le istruzioni di controllo sono istruzioni eseguibili che modificano la sequenza di esecuzione delle istruzioni del programma. Di tutte le istruzioni utilizzate nei linguaggi di programmazione, le istruzioni di controllo hanno causato la maggior controversia. L'argomento principale di discussione è l'istruzione goto control più semplice. Consente di modificare l'ordine di esecuzione del programma e di passare all'esecuzione del programma a partire da una posizione specifica, indicata da un nome o da un numero. Pertanto, questa affermazione non è altro che un'applicazione diretta di un'istruzione di salto in linguaggio macchina. La presenza di un tale operatore nella lingua alto livello consente ai programmatori di scrivere tali programmi non sistematici1:

vai a 40 20 Applicare la procedura di evasione

vai a 70 40 se (KryptoniteLevel< LethalDose) then goto 60

60 Applicare la procedura RescueDamsel 70 ...

mentre tutte queste azioni possono essere scritte con un'unica struttura:

se (KryptoniteLevel< LethalDose)

poi (applica la procedura RescueDamsel) else (applica la procedura Evade)

Per evitare tali complicazioni, i moderni linguaggi di programmazione contengono istruzioni di controllo che consentono di scrivere strutture ramificate con una singola espressione. In Fig. 5.7. Si noti che abbiamo già incontrato le prime due strutture nel Capitolo 4. Nel nostro pseudocodice, sono rappresentate da istruzioni if-then-else e while. La terza struttura, chiamata scelta, può essere vista come un'estensione della struttura i f-then-el se. La differenza tra loro è che l'istruzione if-then-else ti consente di scegliere tra due opzioni, mentre l'istruzione case ti consente di scegliere tra diverse.

Un'altra struttura comune è l'istruzione for loop (Figura 5.8), simile all'istruzione while del nostro pseudocodice. La differenza tra loro è che l'inizializzazione, la modifica e il controllo della condizione di terminazione del ciclo sono combinati in un'unica istruzione. Tale operatore è conveniente da usare quando il corpo del ciclo deve essere eseguito un certo numero di volte, una per ogni valore della variabile contatore in un dato intervallo. In particolare, l'operatore mostrato in Fig. 5.8, indica che il corpo del ciclo deve essere eseguito più volte: quando il valore della variabile Count è 1, quindi quando il suo valore è 2 e l'ultima volta quando il suo valore è 3.

Dagli esempi precedenti, possiamo concludere che le strutture ramificate sono presenti con variazioni minori sia nei linguaggi di programmazione imperativi che orientati agli oggetti. Nell'informatica teorica, si presume che la soluzione di qualsiasi problema che abbia una soluzione algoritmica possa essere scritta utilizzando un numero limitato di strutture. Discuteremo questa affermazione nel Capitolo 11. Nel frattempo, va notato che l'apprendimento di un linguaggio di programmazione non è uno studio senza fine. vari operatori gestione. Infatti, la maggior parte delle strutture di controllo utilizzate nei moderni linguaggi di programmazione sono una variazione delle strutture descritte in questo capitolo.


La scelta di quali strutture includere in un linguaggio di programmazione è una questione di gusti. L'obiettivo del creatore di un linguaggio è sviluppare un linguaggio che non solo consenta di scrivere algoritmi in una forma leggibile, ma aiuti anche il programmatore a farlo. Questo obiettivo viene raggiunto limitando l'uso di elementi che storicamente hanno portato a una programmazione sciatta e introducendo elementi ben congegnati. Di conseguenza, abbiamo una programmazione strutturata, che combina i metodi di scrittura dei programmi e l'uso corretto delle istruzioni di controllo. L'obiettivo è creare un programma che sia facile da capire e faccia quello che dovrebbe fare.

Commenti

L'esperienza mostra che quando una persona sta cercando di capire un programma di grandi dimensioni, non è così importante quanto sia ben congegnato il linguaggio di programmazione e come vengono utilizzate le sue caratteristiche, quanto sia utile o addirittura necessario Informazioni aggiuntive presentato nel normale linguaggio umano. Pertanto, i linguaggi di programmazione prevedono la possibilità di inserire commenti esplicativi (commenti) nel programma. Il compilatore ignora i commenti, quindi la loro presenza o assenza non ha alcun effetto sul programma dal punto di vista della macchina. La versione in linguaggio macchina del programma generato dal traduttore rimane invariata, con o senza commenti. Ma le informazioni che contengono sono importanti per una persona. Senza di essa, sarebbe impossibile comprendere programmi grandi e complessi.

Visual Basic è un linguaggio di programmazione orientato agli oggetti. È stato sviluppato da Microsoft come strumento con cui gli utenti sistema operativo Microsoft Windows potrebbe sviluppare la propria interfaccia utente grafica. In effetti, Visual Basic è più di un semplice linguaggio di programmazione. È un pacchetto di sviluppo completo Software, che consente al programmatore di creare un'interfaccia utente da componenti specifici (come pulsanti, caselle di controllo, caselle di testo, barre di scorrimento, ecc.) e personalizzare tali componenti in base alle proprie esigenze, descrivendo come dovrebbero rispondere a determinati eventi. Ad esempio, nel caso di un pulsante, il programmatore può descrivere cosa dovrebbe accadere quando si fa clic sul pulsante. Questo metodo di creazione di software da componenti predefiniti è la tendenza attuale nello sviluppo del software.

A causa della popolarità del funzionamento Sistemi Windows e facilità d'uso del pacchetto Visual Basic, il linguaggio Visual Basic è diventato oggi uno dei linguaggi di programmazione più diffusi. D'altra parte, perché Visual Basic è compatibile solo con strumenti software da Microsoft, non è riconosciuto come linguaggio di programmazione generico.

Esistono due modi principali per separare i commenti dal testo del programma. Uno di questi è racchiudere il commento tra parentesi speciali. Un altro modo è contrassegnare l'inizio di un commento, che potrebbe occupare il resto della riga a destra del carattere. In C++, C# e Java sono possibili entrambi i modi di scrivere commenti. In essi, un commento può essere inserito tra i segni /* e */ o iniziare con //. Pertanto, in C++, C# e Java, entrambe le notazioni sono valide:

/* Questo è un commento. */

// Questo è un commento.

Alcune parole dovrebbero essere dette su ciò che dovrebbe essere scritto nei commenti. I programmatori inesperti, quando viene loro informata della necessità di fornire un programma con commenti, di solito a un'espressione come

ApproachAngle - SlipAngle - HyperSpacelncine:

aggiungi un commento "Sottrai HyperSpacelncine da SlipAngle e assegna un valore alla variabile ApproachAngle". Tali commenti non rendono il programma più comprensibile, ma solo lo allungano. Ricorda che lo scopo del commento è spiegare il programma, non ripeterlo. A questo esempioè meglio spiegare perché viene calcolato il valore della variabile ApproachAngl (se non è chiaro dal programma). Ad esempio, il commento: "La variabile ApproachAngle è usata successivamente per calcolare il valore della variabile ForceFiel dJetti sonVel ocity" è molto più utile del precedente.

Inoltre, i commenti inseriti tra le istruzioni del programma a volte rendono difficile la lettura e la comprensione del programma. È meglio inserire i commenti su un blocco di programma in un posto, ad esempio all'inizio di esso. È così che viene creata una determinata sezione del programma, che contiene una descrizione dell'obiettivo e Caratteristiche generali blocco di programma in cui l'utente può trovare le spiegazioni necessarie. Se si utilizza questa tecnica per tutti i blocchi del programma, il programma diventa uniforme: ogni blocco è costituito da commenti esplicativi, seguiti da una presentazione formale di questo blocco. Questa uniformità rende il programma molto più facile da leggere.

Unità procedurali

Nei capitoli precedenti abbiamo parlato dei vantaggi di suddividere programmi di grandi dimensioni in unità piccole e gestibili. In questa sezione focalizzeremo la nostra attenzione sul concetto di procedura, che è il mezzo principale per ottenere una rappresentazione modulare di un programma scritto in un linguaggio di programmazione imperativo. Una procedura è anche uno strumento utilizzato in un programma scritto in un linguaggio orientato agli oggetti per descrivere come un oggetto dovrebbe rispondere a vari input.

Procedure

Una procedura è un insieme di istruzioni per eseguire alcune attività che altre unità di programma possono utilizzare come strumento astratto. Il controllo viene trasferito alla procedura (usando un'istruzione di salto in linguaggio macchina) quando le sue azioni sono necessarie, quindi, al termine dell'esecuzione della procedura, viene nuovamente restituito all'unità di programma originale (Fig. 5.9). Il processo di trasferimento del controllo a una procedura è chiamato chiamata di procedura. L'unità di programma che richiede l'esecuzione di una procedura sarà chiamata programma chiamante o unità chiamante.

In molti modi, una procedura è un piccolo programma costituito da istruzioni di dichiarazione seguite da istruzioni eseguibili che definiscono le azioni che devono essere eseguite dalla procedura. Tipicamente, una variabile dichiarata in una procedura è una variabile locale, il che significa che può essere utilizzata solo all'interno di quella procedura. Questo approccio elimina la confusione che può sorgere se due routine indipendenti utilizzano variabili con lo stesso nome. Le variabili il cui effetto non è limitato a nessuna parte del programma sono chiamate variabili globali e sono disponibili ovunque nel programma. La maggior parte dei linguaggi di programmazione utilizza variabili sia locali che globali.

Nei linguaggi di programmazione che stiamo considerando, la descrizione della procedura è quasi la stessa del nostro pseudocodice (vedi Capitolo 4). Inizia con un'espressione chiamata intestazione della procedura, che contiene, tra le altre cose, il nome della procedura. L'intestazione è seguita da istruzioni che definiscono la procedura in modo più dettagliato.

Tuttavia, a differenza del nostro pseudocodice sciolto, in cui abbiamo richiesto l'esecuzione della procedura con un'espressione come "Applica procedura DeactivateCrypton", la maggior parte lingue moderne La programmazione permette di chiamare una procedura semplicemente specificandone il nome. Ad esempio, se GetNames, SortNames e WriteNames sono i nomi delle procedure per ottenere, ordinare e stampare un elenco di nomi, il programma che ottiene l'elenco, lo ordina e lo stampa può essere scritto come

Applicare la procedura GetNames. Applicare la procedura SortNames. Applicare la procedura WriteNames.

Si noti che poiché a ciascuna procedura è stato assegnato un nome che rappresenta l'azione eseguita dalla procedura, questa scorciatoia è una sequenza di comandi che riflette lo scopo del programma.

strutturato operatori - si tratta di costruzioni costruite secondo determinate regole di altri operatori. Le dichiarazioni strutturate includono:

Dichiarazione composta

Operatore condizionale

Operatori di selezione

Dichiarazioni di ciclo

con dichiarazione

1. Operatore composto

Composito operatore è un gruppo di un numero qualsiasi di istruzioni, separate l'una dall'altra da un punto e virgola e delimitate da parentesi dell'operatore inizio e fine.

Formato della dichiarazione composta:

inizio<Оператор1>; ... ; <ОператорN>;

Indipendentemente dal numero di istruzioni che contiene, un'istruzione composta viene trattata come una singola entità. L'uso più comune dell'istruzione composta è nelle istruzioni condizionali e nelle istruzioni di ciclo.

Le istruzioni composte possono essere nidificate l'una nell'altra e non vi è alcuna restrizione sulla profondità di nidificazione delle istruzioni composte.

2. Operatore condizionale

Condizionale operatore assicura che determinate istruzioni vengano eseguite o meno a seconda di determinate condizioni.

Formato dell'istruzione condizionale:

Se poi<Оператор1> ;

La condizione è un'espressione di tipo booleano. L'istruzione funziona come segue: se la condizione è vera (ha il valore True), viene eseguita l'istruzione1, altrimenti viene eseguita l'istruzione2. Entrambi gli operatori possono essere composti.

Una proposizione condizionale può essere scritta in forma abbreviata quando non ci sono altre parole e proposizioni2 dopo di essa.

Per organizzare i rami in tre o più direzioni, puoi utilizzare diverse istruzioni condizionali annidate l'una nell'altra. In questo caso, ogni altro corrisponde all'allora che lo precede immediatamente. per colpa di possibili errori l'annidamento di istruzioni condizionali dovrebbe essere evitato.

3.Selezionare l'operatore

Operatore scelta è una generalizzazione dell'operatore condizionale e consente di effettuare una scelta tra un numero arbitrario di opzioni disponibili. Questa affermazione consiste in un'espressione chiamata selettore, un elenco di opzioni e un ramo else opzionale che ha lo stesso significato dell'istruzione condizionale.

Seleziona il formato dell'estratto conto:

Astuccio<Выражение-селектор>di

<Список1> : <Оператор1>;

<СписокN> : <ОператорN>

Espressione del selettore deve essere di tipo ordinale. Ogni variante è un elenco di costanti separate da due punti dall'operatore associato a quella variante. L'elenco delle costanti di selezione è composto da importo arbitrario valori e intervalli separati da virgole. I limiti dell'intervallo sono scritti come due costanti separate da "..". Il tipo di costanti deve corrispondere al tipo dell'espressione del selettore.

L'istruzione select viene eseguita come segue:

1. Viene valutato il valore dell'espressione del selettore.

2. Viene eseguita una revisione sequenziale delle opzioni per la corrispondenza del valore del selettore con costanti e valori dagli intervalli dell'elenco corrispondente.

3. Se questa ricerca per la variante successiva ha esito positivo, viene eseguito l'operatore di questa variante. Dopodiché, l'esecuzione dell'istruzione select termina.

4. Se tutti i controlli non hanno avuto esito positivo, viene eseguita l'istruzione dopo la parola else (se presente).

Esempio. Seleziona istruzione

caseNumberDay di

1..5: strDay:= "Giorno lavorativo";

6..7: strDay:= "Giorno libero"

altrimenti strGiorno:="";

A seconda del valore della variabile intera NumberDay, che contiene il numero del giorno della settimana, alla variabile stringa strDay viene assegnato il valore appropriato.

>> Strutture di controllo. Informazione Generale sui cicli

Corsi di addestramento:

strutture di controllo. Informazioni generali sui cicli

Strutture di controllo

Informazioni generali sui cicli

I cicli sono la ripetizione di operazioni fintanto che una condizione logica è vera. Ad esempio, impostiamo una condizione di ciclo che una variabile a sia inferiore a 10.

Il ciclo verrà eseguito fino a quando (cioè, le istruzioni racchiuse in esso verranno eseguite così tante volte) fino a quando questa condizione non diventa vera.

Esistono tre tipi di loop: for, do...while, while. Si consideri, ad esempio, il costrutto del ciclo for.

for (inizializzazione della variabile; condizione; modifica della variabile dopo ogni esecuzione del blocco di istruzioni di ciclo)
{
corpo ad anello
}

Diamo un'occhiata a un esempio di utilizzo di un ciclo for (Listato 3.1).

Listato 3.1.
Esempio di ciclo per

Questo programma visualizzerà dieci asterischi su una riga. Non è necessario inizializzare la variabile contatore nel ciclo (una variabile contatore è una variabile che determina il numero di esecuzioni del corpo del ciclo). Si consideri un esempio di programma senza dichiarare una variabile contatore in un ciclo (Listato 3.2).

Listato 3.2.
Un esempio di programma senza dichiarare una variabile contatore in un ciclo

È possibile utilizzare più di una variabile contatore, ma diverse. Si consideri un esempio di tale programma, mostrato nel Listato 3.3.

Listato 3.3.
Un esempio di utilizzo di più variabili contatore

Considera un ciclo while. In questo ciclo, una condizione viene specificata come parametro. La condizione viene verificata prima dell'esecuzione del ciclo. Il ciclo while ha la forma seguente.

mentre (condizione)
{
corpo ad anello
}

Si consideri un programma di esempio che utilizza un ciclo while (Listato 3.4).

Listato 3.4.
Un esempio di utilizzo di un ciclo while

L'output di questo programma sarà di dieci asterischi.

Tenere presente che se si dimentica di specificare un incremento per una variabile nella condizione, o semplicemente si specifica la condizione in modo errato, potrebbe verificarsi un errore di runtime che non verrà rilevato in fase di compilazione e il ciclo verrà eseguito a tempo indeterminato.

Un esempio di programma errato.

Considera ora il ciclo do...while.
È molto simile al ciclo while e differisce solo per il fatto che controlla la condizione non prima della successiva esecuzione del ciclo, ma dopo che è stato eseguito. Il ciclo do...while è mostrato di seguito.

if , if-else e switch sono i mezzi più importanti per controllare l'esecuzione di un programma C. Dovrebbero essere utilizzati per implementare la struttura generale del programma. I tre operatori discussi di seguito sono generalmente discussi meno frequentemente, perché un uso eccessivo di essi compromette la leggibilità del programma, aumenta la probabilità di errori e rende difficile modificarlo. Niklaus Wirth ha definito la programmazione strutturata come una programmazione senza goto.

dichiarazione di rottura

L'istruzione break viene utilizzata per uscire dall'istruzione while , do , for , switch che la contiene direttamente. Il controllo è trasferito al prospetto successivo a quello da cui è stata effettuata l'uscita. L'istruzione break ha la forma

while((ch=getchar()) != EOF) /* Leggi il carattere ch=getchar(). Se non corrisponde a EOF, viene eseguito il corpo dell'istruzione while */ ( if(ch=="\n") break; putchar(ch); )

Il ciclo è completamente terminato non appena il carattere di input " nuova linea".

continua dichiarazione

L'istruzione continue viene utilizzata per saltare il resto dell'iterazione in corso del ciclo che lo contiene immediatamente. Se una nuova iterazione è consentita dalle condizioni del ciclo, viene eseguita, altrimenti il ​​ciclo termina. L'istruzione continue ha la forma seguente:

while((ch=getchar()) != EOF) /* Leggi il carattere ch=getchar(). Se non corrisponde a EOF, viene eseguito il corpo dell'istruzione while */ ( if(ch=="\n") continue; putchar(ch); )

La versione con l'istruzione continue salta semplicemente i caratteri di nuova riga ed esce dal ciclo solo quando viene letto il flag EOF.

vai alla dichiarazione

L'istruzione goto ha lo scopo di trasferire incondizionatamente il controllo all'istruzione con l'etichetta specificata. Ha la seguente forma:

vai all'etichetta;

Kernighan e Ritchie considerano l'affermazione goto "estremamente negativa" e suggeriscono di usarla il meno o il meno possibile. Ecco un esempio di voce operatore:

Affinché questa istruzione venga eseguita correttamente, deve esserci un'altra istruzione denominata part1 . In questo caso, la voce dell'istruzione inizia con un'etichetta seguita da due punti:

parte1: printf("punto di salto\n");

Se non puoi fare a meno delle istruzioni goto , break , continue , return, quindi quando usi goto, vai avanti nel codice e non indietro.

È meglio non utilizzare l'istruzione break per interrompere un ciclo prematuramente, è utile utilizzarla all'interno di un'istruzione switch.

L'istruzione continue non deve essere utilizzata per modificare la logica dei cicli.

Perché non è desiderabile utilizzare funzioni con molte istruzioni di ritorno. Uno dei principi della programmazione strutturata è che un programma dovrebbe avere un punto di ingresso e un punto di uscita. Le funzioni con molte istruzioni di ritorno sono più difficili da leggere rispetto a quelle con una sola istruzione di ritorno alla fine del corpo della funzione.

Più struttura semplice- seguente. Può essere rappresentato così:

I moduli "a" e "c" possono contenere sia un'istruzione che un numero qualsiasi di strutture successive l'una all'altra, incl. e discusso di seguito.

La struttura fork (if-then-else) serve a selezionare uno dei due modi possibili per eseguire l'algoritmo. La verifica è la sua base. La forcella si presenta così:

Le strutture IF-THEN-ELSE possono essere nidificate l'una nell'altra, ad esempio, in questo modo.

Il numero di strutture nidificate è limitato dalle capacità del PC e dal software installato su di esso. Questo numero è solitamente specificato nella descrizione della lingua. Per garantire la leggibilità dello schema a blocchi, le strutture nidificate possono essere sostituite da rettangoli e lo schema a blocchi di ciascun rettangolo è rappresentato in dettaglio su un foglio separato. In generale, è meglio leggere qualsiasi diagramma di flusso o programma se è posizionato interamente su una pagina.

La struttura mostrata nell'ultimo schema a blocchi permette di scegliere uno dei tre percorsi. Allo stesso modo, utilizzando le strutture nidificate, è possibile organizzare la scelta di uno tra un numero qualsiasi di percorsi. Poiché la necessità di ciò appare abbastanza spesso, è stata introdotta una struttura speciale: una scelta, che assomiglia a questa

Qui, il simbolo "P" denota ancora la condizione, in base al compimento della quale viene selezionato uno dei possibili percorsi.

Quando si sviluppano algoritmi, diventa spesso estremamente importante ripetere qualsiasi operazione o gruppo di operazioni. Per visualizzare tali frammenti dell'algoritmo, vengono fornite strutture speciali: cicli. Esistono tre tipi di Οʜᴎ: bye-loop, do-loop e counter-loop. Il lavoro del ciclo-mentre è rappresentato dal seguente schema a blocchi.

Prima della prima esecuzione del blocco di istruzioni, comunemente chiamato corpo del ciclo, viene verificata la condizione "P" e, se è vera, viene eseguito il corpo del ciclo e il controllo viene riportato all'inizio del ciclo. Quindi la condizione viene nuovamente verificata e così via fino a quando la condizione del ciclo non diventa falsa. In questo caso, il ciclo è terminato. Viene eseguito finché la condizione è soddisfatta.

Il ciclo do è organizzato in modo diverso.

La verifica della verità della condizione di loop viene eseguita dopo l'esecuzione del corpo del loop, e l'uscita da essa avviene quando la condizione è vera. Τᴀᴋᴎᴍ ᴏϬᴩᴀᴈᴏᴍ, il corpo del ciclo viene sempre eseguito una volta, a differenza di ciclo ciao, che non viene mai eseguito se la condizione del ciclo non è soddisfatta.

Il terzo tipo di loop è il counter loop. Viene utilizzato nei casi in cui è estremamente importante ripetere il corpo del ciclo un certo numero di volte. La sua struttura può essere rappresentata dal seguente schema a blocchi.

Da esso si può vedere che questo ciclo è un caso speciale ciclo ciao, ma poiché questo caso è comune, nei linguaggi di programmazione, in particolare in VBA, viene introdotto un apposito operatore per descrivere un ciclo con un contatore.
Ospitato su ref.rf
Per questo motivo abbiamo stanziato una struttura speciale per questo ciclo.

Ad esempio, considera un diagramma di flusso per trovare l'elemento massimo in una tabella di N numeri.

Qui Max è il numero massimo, i è il numero del numero nella tabella dei numeri X, N è la dimensione della tabella. Il diagramma di flusso contiene i seguenti costrutti strutturali: follow, un ciclo while, che viene eseguito fino a quando il numero del numero da controllare è minore o uguale alla dimensione della tabella, e un fork in cui viene selezionato il percorso contenente l'assegnazione del numero corrente dalla tabella alla variabile Max, nel qual caso, se questa variabile è minore del numero corrente.

Strutture di controllo di base - concetto e tipi. Classificazione e caratteristiche della categoria "Principali strutture di gestione" 2017, 2018.