• Non ci sono risultati.

Programmazione Procedurale in Linguaggio C++

N/A
N/A
Protected

Academic year: 2021

Condividi "Programmazione Procedurale in Linguaggio C++"

Copied!
23
0
0

Testo completo

(1)

G. Mecca – [email protected] – Università della Basilicata

Programmazione Procedurale in Linguaggio C++

Strutture di Controllo Parte 3

Istruzioni Iterative (Cicli)

versione 2.1

Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina)

Sommario

m

Introduzione

m

Tipologie di Ciclo

m

Istruzione WHILE in C++

m

Istruzione FOR in C++

m

Nidificazioni

m

Esercizi

Strutture di Controllo: Cicli >> Sommario

(2)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 3

Introduzione

m

In molti casi

ðè necessario ripetere più volte in un programma le stesse operazioni su dati diversi

ðes: lettura dei dati di molti studenti

ðsarebbe opportuno evitare di duplicare le istruzioni

m

Istruzioni iterative

ðservono esattamente a questo scopo

Strutture di Controllo: Cicli >> Introduzione

Introduzione

m

Istruzioni Iterative o “Cicli”

ðconsentono di ripetere l’esecuzione di una porzione di programma più volte

ðl’esecuzione procede fino a quando una condizione opportuna è verificata

ðquando la condizione non è più verificata, l’esecuzione si interrompe e si procede con le istruzioni successive

Strutture di Controllo: Cicli >> Introduzione

(3)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 5

Introduzione

m

Parti fondamentali di un ciclo

ð“corpo del ciclo”: istruzioni di cui ripetere l’esecuzione

ð“condizione del ciclo”: condizione che regola l’esecuzione del ciclo

m

Corpo del ciclo

ðistruzione semplice o blocco di istruzioni

m

Condizione del ciclo

ðespressione a valori booleani

Strutture di Controllo: Cicli >> Introduzione

Introduzione

m

Istruzioni di ciclo

ðdue istruzioni disponibili nei linguaggi procedurali

ðIstruzione while (“ciclo while”) ðIstruzione for (“ciclo for”)

Strutture di Controllo: Cicli >> Introduzione

(4)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 7

Introduzione

m

ATTENZIONE

ðcome affrontare lo studio dei cicli

m

Ciclo while

ðsemplice capire la semantica

ðdifficile utilizzarlo correttamente in pratica

m

Ciclo for

ðleggermente più articolata la semantica ðsemplice da utilizzare in pratica

Strutture di Controllo: Cicli >> Introduzione

ATTENZIONE allo studio dei

cicli

Tipologie di Iterazione

m

Prima di illustrare le due istruzioni

ðcerchiamo di capire che tipo di ripetizioni (iterazioni) sono normalmente richieste nelle applicazioni

m

Tipologie di iterazione

ð“iterazione aperta”

ð“iterazione chiusa” (o “a conteggio”) ðcorrispondono ad esigenze diverse di

programmazione

Strutture di Controllo: Cicli >> Tipologie di Iterazione

(5)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 9

Tipologie di Iterazione

m

Iterazione aperta

ðnon è possibile stabilire a priori quante volte dovranno essere eseguite le operazioni da ripetere

ðil tutto dipende dal valore di una condizione ðpossono verificarsi 0 ripetizioni (la condizione

non è verificata la prima volta)

ðo indefinite ripetizioni (la condizione è sempre verificata)

Strutture di Controllo: Cicli >> Tipologie di Iterazione

Tipologie di Iterazione

m

Iterazione chiusa o a conteggio

ðè noto prima che l’iterazione cominci quante volte è necessario ripetere le operazioni

m

Realizzazione pratica

ðattraverso una tecnica di conteggio ðviene utilizzata una variabile intera per

“contare” quante volte le operazioni sono state effettuate

Strutture di Controllo: Cicli >> Tipologie di Iterazione

(6)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 11

Tipologie di Iterazione

m

Iterazione a conteggio

ðvengono fissati (a priori) un valore iniziale ed un valore finale per la variabile (la cui

differenza corrisponde al numero di ripetizioni da effettuare)

ðil valore della variabile viene fatto crescere ad ogni ripetizione

ðfinché la variabile non raggiunge il valore massimo

Strutture di Controllo: Cicli >> Tipologie di Iterazione

Tipologie di Iterazione

m Normalmente

ðil while si può usare sia per programmare iterazioni aperte che chiuse

ðil for solo per iterazioni chiuse

ðdi conseguenza il while è un’istruzione più generale

m In effetti

ðin alcuni linguaggi la distinzione è rigida (es:

FORTRAN)

ðin C++ non esiste una vera distinzione (>>) ðma ragioneremo alla maniera tradizionale

Strutture di Controllo: Cicli >> Tipologie di Iterazione

(7)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 13

Istruzione WHILE

m

Sintassi:

while (<condizione>) <corpo>

m Dove

ð<condizione> è un’espressione booleana ð<corpo> è un blocco di istruzioni

m

Esempio:

int i; cin >> i;

while (i>0) {

cout << sqrt(i) << endl;

cin >> i;

}

Strutture di Controllo: Cicli >> Istruzione WHILE in C++

Istruzione WHILE

m

Semantica

ðquando viene incontrato il ciclo, viene valutata la condizione

ðse la condizione viene trovata vera viene eseguito il corpo del ciclo

ðal termine dell’esecuzione del corpo, si torna in cima e si valuta nuovamente la condizione ðse la condizione viene trovata falsa il ciclo si

interrompe e si passa all’istr. successiva

Strutture di Controllo: Cicli >> Istruzione WHILE

(8)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 15

Istruzione WHILE

1. int i;

2. cout << “Dammi il primo num.”;

3. cin >> i;

4. while ( i > 0 ) {

5. cout << sqrt(i) << endl;

6. cout << “Dammi un altro num.“;

7. cin >> i;

8. }

9. cout << “Fine”;

Strutture di Controllo: Cicli >> Istruzione WHILE

...

#2500 ...

Memoria RAM

Schermo

i xxx

Dammi il primo num. 25

Dammi un altro num. 9 5

3

Dammi un altro num. 144 12

Dammi un altro num. 0 Fine

2591440

Istruzione WHILE

m

Numero di esecuzioni del corpo

ðci sono casi in cui il corpo del ciclo non viene mai eseguito; es: digito subito 0

ðci sono casi in cui l’esecuzione può andare avanti indefinitamente; es: non digito mai 0 ðpossono esserci situazioni di errore

m

Condizioni di ciclo indefinito (“loop”)

ðciclo scritto in modo tale che l’esecuzione va sempre avanti indefinitamente

Strutture di Controllo: Cicli >> Istruzione WHILE

(9)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 17

Istruzione WHILE

m

Esempio di loop

ðla condizione è sempre verificata

int i;

i = 1;

while ( i > 0 ) {

cout << sqrt(i) << endl;

i = i + 1;

}

cout << “Fine”;

Strutture di Controllo: Cicli >> Istruzione WHILE

la condizione non diventa mai falsa perchè il valore di i aumenta

>> loop.cpp

Istruzione WHILE

m

Attenzione alla semantica

ðla condizione viene verificata solo all’inizio e al termine di ogni esecuzione del corpo

ðnon viene controllata continuamente ðci possono essere istanti in cui, durante

l’esecuzione del corpo, la condizione non è verificata, ma questo non basta ad

interrompere il ciclo

Strutture di Controllo: Cicli >> Istruzione WHILE

(10)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 19

Istruzione WHILE

m

Uno strano ciclo

1. int i, j;

2. i=1;

3. while ( i*i <= 4 ) {

4. j=i;

5. cout << Eseguito << endl;

6. i=100;

7. i=j+1;

8. }

9. cout << “Fine”;

Strutture di Controllo: Cicli >> Istruzione WHILE

dopo l’esecuzione di questa istruzione la condizione è sicuramente falsa, ma questo non interrompe il ciclo ...

j

#2501 i

#2500 ...

Memoria RAM

1 1 1002 2

1003

Istruzione WHILE

m

Con il while

ðsi possono scrivere anche iterazioni chiuse

m

Esempio di iterazione chiusa

ðleggere la lunghezza del lato di 5 quadrati e calcolare e stampare l’area di ciascuno

ðin questo caso l’operazione da ripetere (calcolo e stampa dell’area del quadrato) deve essere ripetuta esattamente 5 volte (ogni volta su un valore diverso)

Strutture di Controllo: Cicli >> Istruzione WHILE

(11)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 21

Istruzione WHILE

m

Tecnica standard per realizzarlo

ðuso una variabile intera (es: i) per “contare”

quante volte il ciclo viene eseguito ðinizialmente i = 0

ðad ogni esecuzione i = i + 1

ðmi fermo quando i raggiunge il valore 5

m

Variabile di controllo del ciclo

ðil valore di i mi dice in ogni istante quante volte è stato già eseguito il corpo del ciclo

Strutture di Controllo: Cicli >> Istruzione WHILE

Istruzione WHILE

#include <iostream.h>

void main() {

float lato, area;

int i;

i=0;

while (i<5){

cout << “Immetti la lung. del lato” << endl;

cin >> lato;

area=lato*lato;

cout << “Area quadrato: “ << area << endl;

i=i+1;

}

cout << “Fine”;

Strutture di Controllo: Cicli >> Istruzione WHILE

3 elementi fondamentali -valore iniziale di i

-condizione sul valore finale -istruzione di incremento

(12)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 23

Istruzione FOR

m

Questo tipo di ciclo è molto frequente

m

Per rendere più facile la struttura

ðesiste un’istruzione apposita

ðl’istruzione FOR

ðconsente di scrivere in modo più compatto il ciclo, ed in particolare i 3 elementi

fondamentali

Strutture di Controllo: Cicli >> Istruzione FOR

Istruzione FOR

#include <iostream.h>

void main() {

float lato, area;

int i;

for ( i=0 ; i<5 ; i=i+1 ) {

cout << “Immetti la lung. del lato” << endl;

cin >> lato;

area=lato*lato;

cout << “Area quadrato: “ << area << endl;

}

cout << “Fine”;

}

Strutture di Controllo: Cicli >> Istruzione FOR

>>

I 3 elementi fondamentali sono tutti sulla stessa riga

-valore iniziale di i

-condizione sul valore finale -istruzione di incremento

(13)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 25

Istruzione FOR

float lato, area;

int i;

for (i=0; i<5; i++) { cout << “Lato ? ”

<< endl;

cin >> lato;

area=lato*lato;

cout << “Area: “

<< area

<< endl;

}

cout << “Fine”;

float lato, area;

int i;

i=0;

while (i<5) {

cout << “Lato ? ”

<< endl;

cin >> lato;

area=lato*lato;

cout << “Area: “

<< area

<< endl;

i++;

}

cout << “Fine”;

Strutture di Controllo: Cicli >> Istruzione FOR

Istruzione FOR

m

Sintassi:

for (<e1>; <e2>; <e3>) <corpo>

m

Dove

ð<e1> è l’inizializzazione della variabile ð<e2> è la condizione del ciclo

ð<e3> è l’incremento della variabile ð<corpo> è un blocco di istruzioni

Strutture di Controllo: Cicli >> Istruzione FOR

(14)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 27

Istruzione FOR

m

Semantica: è equivalente ad un while

m

In particolare

for (<e1>; <e2>; <e3>) <corpo>

equivale a

<e1>;

while (<e2>) {

<corpo>

<e3>

}

Strutture di Controllo: Cicli >> Istruzione FOR

Istruzione FOR

m

Più in dettaglio

ðviene eseguita l’inizializzazione (e1) ðviene verificata la condizione (e2)

ðse la condizione viene valutata come vera

ðviene eseguito il corpo

ðal termine viene effettuato l’incremento (e3) ðviene valutata di nuovo la condizione

ðse la condizione viene valutata come falsa

ðil ciclo termina e si passa all’istruzione succ.

Strutture di Controllo: Cicli >> Istruzione FOR

(15)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 29

Istruzione FOR

1. float lato, area;

2. int i;

3. for (i=0; i < 3; i++) { 4. cout << “Lato ? ”;

5. cin >> lato;

6. area = lato * lato;

7. cout << “Area: “

<< area << endl;

8. }

9. cout << “Fine”;

Strutture di Controllo: Cicli >> Istruzione FOR

xxx area

#2502

xxx lato

#2501

xxx i

#2500 ...

Memoria RAM

Schermo Lato ? 5 Area: 25

Fine

25 0

144 512

Lato ? 12 Area: 144 Lato ? 3 Area: 9

12 3 9 3

Istruzione FOR

m

ATTENZIONE

ðla variabile del ciclo serve per contare

ðdi conseguenza normalmente è una variabile intera (tipo int)

ðin alcuni linguaggi questo è obbligatorio (ma in C++ può anche essere float o double) ðmolto spesso la chiameremo “i” (ma il nome

può essere qualsiasi)

Strutture di Controllo: Cicli >> Istruzione FOR

(16)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 31

Nidificazione

m

Nel corpo di un ciclo

ðqualsiasi istruzione

m

In particolare

ðaltri cicli, nidificazione arbitraria

m

In generale

ðle strutture di controllo possono essere nidificate liberamente

m

Esempio: if in un for in un while in un else

Strutture di Controllo: Cicli >> Nidificazione

Nidificazione

m Vale la stessa semantica

ðcon qualche accortezza per i cicli

ði cicli interni ricominciano e vengono eseguiti per ogni esecuzione del ciclo esterno

m Esempio

int i, j;

for (i=0; i<5; i++) { for (j=0; j<10; j++) {

cout << “Eseguito”;

}

}

Strutture di Controllo: Cicli >> Nidificazione

ciclo esterno

corpo del ciclo esterno (ciclo interno)

corpo del ciclo interno eseguito 50 volte

(17)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 33

Esempio

m

Stampare sullo schermo la tabella pitagorica 5x5

Strutture di Controllo: Cicli >> Nidificazione

25 20 15 10 5

20 16 12 8 4

15 12 9 6 3

10 8 6 4 2

5 4 3 2 1

Esempio

m

Analisi del problema

ðil problema non ha dati di ingresso

m

Algoritmo

ðla tabella è divisa per righe e colonne

ðogni elemento è pari al valore dell’indice di riga (i) per l’indice di colonna (j)

ðsi tratta di calcolare e stampare 25 moltiplicazioni

Strutture di Controllo: Cicli >> Nidificazione

(18)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 35

Esempio

m

Algoritmo (continua)

ðpossiamo utilizzare due cicli for uno nell’altro ðil ciclo esterno serve a ripetere per 5 volte le operazioni necessarie per stampare una riga ðil ciclo interno serve, per ciascuna riga, a

ripetere 5 volte le operazioni necessarie a stampare un elemento

ðal termine di ciascuna riga è necessario andare a capo

Strutture di Controllo: Cicli >> Nidificazione

Esempio

# include <iostream.h>

void main (){

const int N = 5;

int i, j;

for(i = 1; i <= N; i++) { for(j = 1; j <= N; j++) {

cout << i * j << " ";

}

cout << endl;

}

cout << “Fine”;

}

Strutture di Controllo: Cicli >> Nidificazione

>>

(19)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 37

Esempio

1. int i, j;

2. for (i=1; i <=3; i++) { 3. for (j=1; j <=3; j++) { 4. cout << i*j << “ “;

5. } cout << endl;

6. }

7. cout << “Fine”;

Strutture di Controllo: Cicli >> Nidificazione

...

xxx j

#2501

xxx i

#2500 ...

Memoria RAM

Schermo 1

Fine

12 12 3

2 3 ? 2 4 6 ? 3 6 9 ?

41234 3

1234 4

Esempio

m

Sono possibili altre soluzioni

ðes: due while uno nell’altro ðsemantica equivalente

m

Ma anche

ðun for esterno con un while interno ðun while esterno con un for interno

m

Il comportamento è sempre lo stesso

Strutture di Controllo: Cicli >> Nidificazione

(20)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 39

Soluzione con While

# include <iostream.h>

void main (){

const int n=5;

int i, j;

i=1;

while(i<=n) { j=1;

while(j<=n) {

cout << i*j << " ";

j++;

}

cout << endl;

i++;

}

cout << “Fine”;

}

Strutture di Controllo: Cicli >> Nidificazione

>>

Esempio

m

Attenzione

ðè molto più semplice, nel caso del while, commettere errori

m

Errore frequente

ðomettere l’istruzione di incremento della variabile di conteggio

ðin questo caso si genera un “loop”

m

In generale

ðper i cicli a conteggio meglio il for

Strutture di Controllo: Cicli >> Nidificazione

(21)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 41

Riassumendo

m

Due tipi di cicli

ðcicli while per iterazioni “aperte” o “chiuse”

ðcicli for per iterazioni “chiuse” (“a conteggio”)

m

In C++

ðil for è una forma particolare di while

m

Errori frequenti nell’uso dei cicli

ðcicli nidificati (ATTENZIONE) ðloop (ATTENZIONE)

Strutture di Controllo: Cicli >> Sommario

Esercizi

m Esercizio n.1

ðsimulare il funzionamento dei due programmi per il calcolo della media

m Esercizio n.2

ðscrivere un programma che legge dalla tastiera 7 numeri complessi

ðcalcola e stampa il modulo di ciascun numero

m Esercizio n.3

ðcome il precedente, ma il programma deve andare avanti finchè non viene inserito il numero 0

Strutture di Controllo: Cicli >> Sommario

(22)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 43

Un Esempio: Media con For

#include <iostream.h>

void main() {

int voto, sommaVoti;

float media;

int numeroEsami, i;

cout << "Quanti esami hai sostenuto ?" << endl;

cin >> numeroEsami;

sommaVoti = 0;

for (i = 0; i < numeroEsami; i++) {

cout << "Immetti il voto di un esame" << endl;

cin >> voto;

sommaVoti += voto;

}

if (numeroEsami > 0) {

media = ((float)sommaVoti) / numeroEsami;

cout << "La media vale: " << media << endl;

} else

cout << "Non hai fornito nessun voto" << endl;

}

Strutture di Controllo >> Un Esempio

Un Esempio: Media con While

#include <iostream.h>

void main() {

int voto, sommaVoti, numeroEsami;

float media;

bool continua;

continua = true;

numeroEsami = 0;

sommaVoti = 0;

while (continua == true) {

cout << "Immetti il voto (0 per fermarti)" << endl;

cin >> voto;

if (voto == 0) { continua = false;

} else {

numeroEsami++;

sommaVoti += voto;

} }

if (numeroEsami > 0) {

media = ((float)sommaVoti) / numeroEsami;

cout << "La media vale: " << media << endl;

} else {

cout << "Non hai fornito nessun voto" << endl;

}

Strutture di Controllo >> Un Esempio

(23)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 45

Ringraziamenti

m Parte del materiale di questa lezione è stato sviluppato con la collaborazione della Dott.ssa Maria Samela

([email protected]), a cui va il mio ringraziamento.

Ringraziamenti

Termini della Licenza

m This work is licensed under the Creative Commons Attribution- ShareAlike License. To view a copy of this license, visit

http://creativecommons.org/licenses/by-sa/1.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.

Termini della Licenza

m Questo lavoro viene concesso in uso secondo i termini della licenza “Attribution-ShareAlike” di Creative Commons. Per ottenere una copia della licenza, è possibile visitare

http://creativecommons.org/licenses/by-sa/1.0/ oppure inviare una lettera all’indirizzo Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.

Riferimenti

Documenti correlati

Concetti Introduttivi: Linguaggi &gt;&gt; Ciclo di Vita di un Programma.. Mecca - Programmazione Procedurale in Linguaggio

Strutture di Controllo: Conclusioni &gt;&gt; Convenzioni di Stile.. Mecca - Programmazione Procedurale in Linguaggio C++ 11. Convenzioni

il sottoprogramma lavora su tre dati di tipo float chiamati a,b,c attraverso cui è possibile modificare i corrispondenti argomenti. istruzione

ðil numero e il tipo degli argomenti (1 argomento di tipo double) &gt;&gt; parametri ðil tipo del risultato restituito (double). m Intestazione di

ðDefinizione di Funzioni ðDefinizione di Procedure ðChiamata di Funzioni ðChiamata di Procedure ðPassaggio dei Parametri ðProgrammazione Modulare. Termini

Strutture di Dati: Lista &gt;&gt; Rappresentazione con Record e Array. ATTENZIONE ai

Strutture di Dati: Lista &gt;&gt; Inserimenti e Cancellazioni. Mecca - Programmazione Procedurale in Linguaggio

Strutture di Dati: Lista &gt;&gt; Gestione dei File. i conta il numero di valori prelevati dal