Istruzioni di controllo in C, Parte 1
Benvenuti nella prossima puntata della nostra serie, Fundamentals of C.
Istruzioni di controllo ci consentono di specificare il flusso di controllo del programma; cioè, l’ordine in cui le istruzioni in un programma devono essere eseguite. Permettono di prendere decisioni, eseguire attività ripetutamente o saltare da una sezione di codice a un’altra.
Ci sono quattro tipi di istruzioni di controllo in C:
- Decision making statements
- Selection statements
- Iteration statements
- Jump statements
Decision Making Statements: l’istruzione if-else
L’istruzione if-else viene utilizzata per eseguire un test logico e quindi eseguire una delle due azioni possibili in base alla il risultato del test (cioè, se il risultato è vero o falso).
Sintassi:
if (condition){ statements} else{ statements}
Se la condizione specificata nell’istruzione if viene valutata true, le istruzioni all’interno del blocco if vengono eseguite e quindi il controllo viene trasferito all’istruzione immediatamente dopo il blocco if. Anche se la condizione è false e nessun altro blocco è presente, il controllo viene trasferito all’istruzione immediatamente dopo il blocco if.
La parte else è richiesta solo se è necessario eseguire una determinata sequenza di istruzioni se la condizione risulta falsa. È importante notare che la condizione è sempre specificata tra parentesi e che è buona norma racchiudere le istruzioni nel blocco if o nel blocco else in parentesi, sia che si tratti di una singola istruzione o di un’istruzione composta.
Il seguente programma controlla se il numero inserito è positivo o negativo.
#include<stdio.h>int main( ) { int a; printf("n Enter a number:"); scanf("%d", &a); if(a>0) { printf( "n The number %d is positive.",a); } else { printf("n The number %d is negative.",a); } return 0; }
Il seguente programma confronta due stringhe per verificare se sono uguali o meno.
#include <stdio.h>#include <string.h>int main( ) { char a , b; printf("n Enter the first string:"); scanf("%s",a); printf("n Enter the second string:"); scanf("%s",b); if((strcmp(a,b)==0)) { printf("nStrings are the same"); } else { printf("nStrings are different"); } return 0; }
Il programma precedente confronta due stringhe per verificare se sono uguali o meno. A questo scopo viene utilizzata la funzione strcmp
. È dichiarato nel file string.h
come:
int strcmp(const char *s1, const char *s2);
Confronta la stringa a cui punta s1
con la stringa a cui punta s2
. La funzione strcmp
restituisce un numero intero maggiore di, uguale o inferiore a zero, di conseguenza poiché la stringa a cui punta s1
è maggiore di, uguale o inferiore alla stringa a cui punta s2
.
Pertanto nel programma precedente, se le due stringhe a
e b
sono uguali , la funzione strcmp
dovrebbe restituire uno 0. Se restituisce uno 0, le stringhe sono le stesse; altrimenti sono diverse.
Istruzioni if e if-else annidate
È anche possibile incorporare o annidare le istruzioni if-else una nell’altra. L’annidamento è utile in situazioni in cui è necessario selezionare una delle diverse linee d’azione.
Il formato generale di un’istruzione if-else nidificata è:
if(condition1){// statement(s);}else if(condition2){//statement(s);}....else if (conditionN){//statement(s);}else{//statement(s);}
Quanto sopra è anche chiamato la scala if-else. Durante l’esecuzione di un’istruzione if-else annidata, non appena viene rilevata una condizione che restituisce true, le istruzioni associate a quel particolare blocco if-else verranno eseguite e il resto delle istruzioni if-else annidate verrà bypassato. Se nessuna delle condizioni è vera, viene eseguito l’ultimo blocco else o se il blocco else è assente, il controllo viene trasferito all’istruzione successiva presente immediatamente dopo la ladder else-if.
Il seguente programma utilizza l’istruzione if-else nidificata per trovare il più grande dei tre numeri.
#include<stdio.h>int main( ) { int a, b,c; a=6,b= 5, c=10; if(a>b) { if(b>c) { printf("nGreatest is: " , a); } else if(c>a) { printf("nGreatest is: ", c); } } else if(b>c) //outermost if-else block { printf("nGreatest is: " , b); } else { printf( "nGreatest is: " , c); } return 0; }
Il programma precedente confronta tre quantità intere e stampa la più grande. La prima istruzione if confronta i valori di a
e b
. Se a>b
è true, il controllo del programma viene trasferito all’istruzione if-else nidificata all’interno del blocco if, dove b
viene confrontato con c
. Se b>c
è anche vero, viene stampato il valore di a
; altrimenti vengono confrontati i valori di c
e a
e se c>a
è vero, viene stampato il valore di c
. Dopo questo il resto della scala if-else viene bypassato.
Tuttavia, se la prima condizione a>b
è falsa, il controllo viene trasferito direttamente al blocco else-if più esterno, dove il valore dib
viene confrontato con c
(poiché a
non è il massimo). Se b>c
è true viene stampato il valore di b
altrimenti viene stampato il valore di c
. Notare l’annidamento, l’uso di parentesi graffe e l’indentazione. Tutto ciò è necessario per mantenere la chiarezza.
Istruzione di selezione: l’istruzione switch-case
Un’istruzione switch viene utilizzata per selezioni a più vie che si diramano in segmenti di codice diversi in base al valore di una variabile o di un’espressione. Questa espressione o variabile deve essere di tipo di dati interi.
Sintassi:
switch (expression){ case value1: code segment1; break; case value2: code segment2; break;... case valueN: code segmentN; break; default: default code segment;}
Il valore di questa espressione viene generato durante l’esecuzione del programma o letto come input dell’utente. Il caso il cui valore è uguale a quello dell’espressione viene selezionato ed eseguito. L’etichetta predefinita opzionale viene utilizzata per specificare il segmento di codice da eseguire quando il valore dell’espressione non corrisponde a nessuno dei valori del caso.
L’istruzione break
è presente alla fine di ogni caso. Se così non fosse, l’esecuzione continuerebbe nel segmento di codice del caso successivo senza nemmeno controllare il valore del caso. Ad esempio, supponendo che un’istruzione switch
abbia cinque casi e il valore del terzo caso corrisponda al valore dell’espressione. Se nessuna dichiarazione di interruzione fosse presente alla fine del terzo caso, tutti i casi dopo il caso 3 verrebbero eseguiti insieme al caso 3. Se break è presente solo il caso richiesto viene selezionato ed eseguito; dopo di che il controllo viene trasferito all’istruzione successiva immediatamente dopo l’istruzione switch. Non c’è break
dopo default
perché dopo il caso predefinito il controllo verrà in entrambi i casi trasferito all’istruzione successiva immediatamente dopo lo switch.
Esempio: un programma per stampare il giorno della settimana.
#include<stdio.h>int main( ) { int day; printf("nEnter the number of the day:"); scanf("%d",&day); switch(day) { case 1: printf("Sunday"); break; case 2: printf("Monday"); break; case 3: printf("Tuesday"); break; case 4: printf("Wednesday"); break; case 5: printf("Thursday"); break; case 6: printf("Friday"); break; case 7: printf("Saturday"); break; default: printf("Invalid choice"); } return 0; }
Questo è un programma molto semplice che spiega il funzionamento del costrutto switch-case. A seconda del numero inserito dall’utente, viene selezionato ed eseguito il caso appropriato. Ad esempio, se l’input dell’utente è 5, verrà eseguito il caso 5. Il break
dichiarazione presente nel caso 5 sospendere l’esecuzione dell’istruzione switch dopo il caso 5 e il controllo verrà trasferito all’istruzione successiva dopo l’interruttore, che è:
return 0;
è anche possibile incorporare il composto istruzioni all’interno del caso di un’istruzione switch. Queste istruzioni composte possono contenere strutture di controllo. Pertanto, è anche possibile avere un interruttore nidificato incorporandolo all’interno di un case.
Tutti i programmi scritti usando l’istruzione switch-case possono anche essere scritti usando l’istruzione if-else. Tuttavia, ha un buon senso di programmazione utilizzare l’istruzione if quando è necessario intraprendere alcune azioni dopo aver valutato alcune condizioni semplici o complesse che possono comportare una combinazione di espressioni relazionali e logiche (ad esempio, (if((a!=0)&&(b>5))
).
Se è necessario selezionare tra un ampio gruppo di valori, un’istruzione switch verrà eseguita molto più velocemente di un set di if nidificati. Lo switch differisce da if in quanto lo switch può solo testare l’uguaglianza, mentre if può valutare qualsiasi tipo di espressione booleana.
L’istruzione switch deve essere utilizzata quando è necessario effettuare una scelta da un determinato insieme di scelte. L’istruzione switch case viene generalmente utilizzata nelle applicazioni basate su menu. L’uso più comune di un’istruzione switch-case è nella gestione dei dati o nell’elaborazione dei file. La maggior parte della gestione dei file coinvolge le funzioni comuni: creazione di un file, aggiunta di record, eliminazione di record, aggiornamento di record, stampa dell’intero file o di alcuni record selettivi. Il seguente programma fornisce un’idea di come l’istruzione switch case può essere utilizzata nella gestione dei dati. Non coinvolge il codice per l’elaborazione dei file in quanto possiamo discutere la gestione dei file in C solo dopo aver appreso concetti avanzati come puntatori, strutture e sindacati.
Esempio: un’istruzione switch case utilizzata nell’elaborazione dei file di dati.
#include<stdio.h>int main() { //create file &set file pointer . int choice; printf("n Please select from the following options:"); printf("n 1. Add a record at the end of the file."); printf("n 2. Add a record at the beginning of the file:"); printf("n 3. Add a record after a particular record:"; printf("nPlease enter your choice:(1/2/3)?"); scanf("%d",&choice); switch(choice) { case 1: //code to add record at the end of the file break; case 2: //code to add record at the beginning of the file break; case 3: //code to add record after a particular record break; default: printf("n Wrong Choice"); } return 0; }
L’esempio precedente di switch-case in genere comporta l’annidamento del costrutto switch-case all’interno di un costrutto di iterazione come do-while. Nel nostro post nex, discuteremo queste dichiarazioni di iterazione.
Leave a Reply