Informatica a colori – secondo biennio

Page 1

Preparare il domani con la scuola di oggi Un progetto Deascuola inclusivo, paritario, sostenibile e innovativo per essere più vicini a chi insegna e a chi studia

per il secondo biennio

Marco D'Isanto

Informatica a colori • Tra informatica e realtà: attività iniziale per coinvolgere il gruppo classe ed evidenziare i collegamenti con la realtà. • • Teoria organizzata in lezioni schematiche ed efficaci con numerosi esempi applicativi e osservazioni critiche. • L’essenziale: tutto ciò che è fondamentale sapere è evidenziato graficamente in modo diffuso. • Esercizio svolto: nelle pagine di teoria per creare modelli di riferimento per il problem solving, la programmazione e per sviluppare il pensiero computazionale.

• Input/output: rubrica con domande e risposte per allenarsi all’esposizione orale e al dibattito.

I CONTENUTI DIGITALI INTEGRATIVI

• Cittadinanza digitale: contenuti evidenziati da un logo grafico per educare all’uso consapevole dei mezzi digitali.

LA PIATTAFORMA PER CREARE VERIFICHE E METTERSI ALLA PROVA

• Sintesi e Test: strumenti inclusivi per focalizzare e verificare i saperi essenziali appresi. • Esercizi graduali, di varie tipologie, per verificare conoscenze, abilità e competenze.

LA PIATTAFORMA DEDICATA ALLA PREPARAZIONE DELL’INVALSI (CON PROVE CBT)

• Informatica e …: esercizi connessi ad altre discipline per evidenziare la funzione trasversale dell’informatica. • Compiti di realtà per applicare in modo contestualizzato i concetti appresi e acquisire le competenze proprie dell'orientamento STEM.

E IN PIÙ…

• Parola all’intelligenza artificiale: spunti per attività da svolgere facendo uso dell’intelligenza artificiale (AI).

SITO LIBRO

• Prova di autoverifica: per verificare e autovalutare quanto appreso. • Risorse digitali: audiosintesi, approfondimenti, risorse per il CLIL (sintesi e audiosintesi in inglese), esercizi interattivi.

Scopri di più su deascuola.it

Tutte le risorse digitali del libro immediatamente accessibili, senza dover sfogliare l’eBook. Organizzate per tipologia e indice, facilmente condivisibili nelle piattaforme educational.

Seguici su

blog.deascuola.it

Il libro di testo in formato digitale e ogni contenuto digitale integrativo saranno fruibili esclusivamente dall'utente che ne chiederà la prima attivazione, per un periodo di tempo pari alla durata del corso della specifica materia a cui il libro si riferisce più un anno, a partire dal giorno della prima attivazione. Per i dettagli e per consultare la licenza d'uso del libro in formato digitale e dei contenuti digitali si rimanda al sito deascuola.it.

RI O O N to OL AN an C ° 'Is A E 4 .I. -3 . D CA 3° .D 95 M ATI IL + C -26 4 R RM PE OK -49 I FO E BO 88 IN I N M E 8- T R L U + 97 P E BN VO

IS

Questo volume, sprovvisto del talloncino a lato, è da considerarsi copia di SAGGIO-CAMPIONE GRATUITO, fuori commercio (vendita e altri atti di disposizione vietati: art. 17, c. 2, L. 633/1941). Fuori campo applicazione I.V.A. (D.P.R. 26/10/72, n. 633, art. 2, 3° c., lett. d.)

Informatica a colori Volume per il 3° e 4° anno + eBook + C.D.I. (elementi indivisibili)

€ 29,00

Informatica a colori

• Check: esercizi collocati a fine lezione per la verifica immediata.

per il secondo biennio

L’APP PER USARE LA VERSIONE DIGITALE DEL LIBRO DI TESTO E I CONTENUTI DIGITALI INTEGRATIVI

Informatica a colori per il secondo biennio

LA PIATTAFORMA PER LA DIDATTICA DIGITALE

• Mappe inclusive: poste all’inizio di ogni lezione per avere un colpo d’occhio sui contenuti e sui collegamenti tra essi.

Marco D'Isanto

ANALIZZA COMUNICA PROGRAMMA C, C++, PYTHON, JAVA, DATABASE, LINGUAGGI DEL WEB



Unità di apprendimento

Le funzioni Tra informatica e realtà La scomposizione funzionale u La scomposizione funzionale è una strategia di

analisi dei problemi che si basa sulla scomposizione di un problema complesso in sottoproblemi più semplici. u Tali sottoproblemi, una volta individuati,

devono essere indipendenti tra loro e risolvibili separatamente. La soluzione di ognuno di essi concorre alla determinazione della soluzione del problema iniziale. u Riesci a individuare un’attività della tua vita in cui

applichi la scomposizione funzionale? Discutine con i tuoi compagni e con il docente proponendo la tua esperienza.

Obiettivi Conoscenze

Abilità

Competenze

• Il concetto di funzione in C e in Python • Sintassi delle funzioni in C e in Python

• Scomporre un problema in sottoproblemi • Implementare una funzione in C e in Python • Scrivere un algoritmo facendo uso di funzioni in C e in Python

• Ridurre la complessità di un problema scomponendolo in sottoproblemi • Strutturare un algoritmo facendo uso del concetto di funzione

Risorse per la didattica digitale integrata • Audiosintesi

• Spazio CLIL

• Esercizi interattivi


Lezione 1

Introduzione alle funzioni DIDATTICA INCLUSIVA

FUNZIONI IN C/C++ devono essere

dichiarate

tipoRitorno nomeFunzione(tipoPar1, ..., tipoParN);

definite

tipoRitorno nomeFunzione(tipoPar1 nomePar1, ..., tipoParN nomeParN) { ... }

invocate

nomeFunzione(elenco_identificatori_variabili);

Le funzioni e il modello black box Nell’apprendere le basi della programmazione abbiamo imparato a manipolare costanti, variabili e costrutti al fine di realizzare algoritmi che siano limitati, nella loro azione, alla risoluzione di singoli problemi; tuttavia, per sviluppare programmi complessi, facilmente leggibili e ben organizzati, dobbiamo necessariamente introdurre altre strutture di programmazione: quelle dei sottoprogrammi o, nel caso specifico dei linguaggi che studiamo, delle funzioni. DEFINIZIONE In informatica, una funzione è una sequenza di istruzioni, opportunamente strutturata, che permette di realizzare una specifica azione agendo su dati in ingresso e restituendo eventualmente dati in uscita; escludendo casi particolari (che affronteremo più avanti), ogni funzione può avere un numero variabile di ingressi ma al massimo una sola uscita. L’ESSENZIALE Si usano le funzioni per circoscrivere determinati blocchi di codice in grado di risolvere specifiche classi di problemi, semplicemente assegnando loro un nome unico, detto identificatore della funzione, che permette a chi scrive un algoritmo di risparmiare tempo e di alleggerire il carico di lavoro sul programma principale.

Esempi di problemi tipicamente risolti con l’uso di funzioni sono: la stampa di un’intestazione, il calcolo della radice quadrata, l’elevamento a potenza, la stampa dell’n-esimo numero primo, la generazione di un numero casuale appartenente a un certo intervallo e così via. È possibile immaginare una funzione come un blocco di istruzioni che definisce un modello black box in cui il contenuto della “scatola nera” è noto a chi la progetta ma non necessariamente a chi la usa. 2


Unità 1 - Le funzioni

Ciò che conta, per l’utilizzatore, è conoscere il tipo di operazione che la black box effettua, su quali ingressi agisce e quale uscita restituisce: ingressi

primario

uscita black box

Per esempio, immaginiamo di voler implementare una funzione che, dato in ingresso un numero intero, restituisca in uscita il suo valore assoluto. Se chiamiamo tale funzione abs(), il modello sarà il seguente: primario x

valore assoluto di x

abs()

La funzione così schematizzata può essere richiamata (o invocata, come si suol dire) dal programmatore usando la seguente sintassi: abs(x)

In pratica, se chi scrive un algoritmo ha a disposizione la funzione abs(), può disinteressarsi del codice che contiene e usarla direttamente per ottenere il risultato desiderato; quindi, scrivendo abs(x), ottiene come risultato il valore assoluto di x. L’uso delle funzioni porta innumerevoli vantaggi; tra questi: • Correggibilità e manutenibilità: il programma principale viene suddiviso in blocchi, più semplici da scrivere, correggere e manutenere. • Compattezza del codice, risparmio e leggibilità: gli algoritmi che fanno uso di funzioni acquisiscono compattezza e leggibilità; infatti, il codice di una funzione deve essere scritto inizialmente ma può essere richiamato all’occorrenza nel programma principale un numero indeterminato di volte. • Riusabilità: si può disporre di funzioni già scritte da altri (o anche da sé stessi) in precedenza. • Scomposizione funzionale: scrivere separatamente una funzione permette di concentrarsi sui singoli problemi da risolvere in maniera esclusiva. Le funzioni possono essere organizzate in categorie e raccolte in opportune librerie. Una volta richiamate le librerie necessarie nel programma principale, è possibile invocare le funzioni in esse incluse senza bisogno di specificare linee di codice aggiuntive. A titolo di esempio, citiamo le funzioni del linguaggio C, printf() e scanf(), incluse nella libreria stdio.h.

Le funzioni in C/C++ Nei programmi scritti finora in C/C++ abbiamo sempre inserito le istruzioni da eseguire all’interno della sezione main pur senza sapere che quest’ultima rappresenta effettivamente una funzione; precisamente, è la prima funzione che si esegue a ogni avvio.

Funzione main()

3


Lezione 1 Introduzione alle funzioni Nell’introdurre nel codice nuove funzioni seguiremo l’approccio convenzionale, che prevede due distinte fasi di scrittura: 1. dichiarazione della funzione; 2. definizione della funzione. Una volta realizzate tali fasi, la nuova funzione potrà essere invocata direttamente dal programma principale o dalle altre funzioni.

Fase 1: dichiarazione della funzione La fase di dichiarazione di una funzione si realizza prima del main e serve ad anticipare al compilatore che sarà creata una certa funzione con un dato nome e con determinate caratteristiche. L’ESSENZIALE

Precisamente, in questa fase si costruisce il cosiddetto prototipo della funzione, che contiene: • il tipo di dato che sarà restituito dalla funzione; • il nome della funzione; • l’elenco dei dati in ingresso alla funzione, i cosiddetti parametri formali. La sintassi da usare nella fase di dichiarazione è la seguente: tipoRitorno nomeFunzione(tipoPar1 [nomePar1], ..., tipoParN [nomeParN]); Parametro opzionale

Parametro opzionale

Vediamola nel dettaglio. • tipoRitorno rappresenta il tipo del cosiddetto parametro di ritorno, cioè del valore che la funzione restituirà al termine dell’elaborazione. Può essere uno dei tipi di dato elementari del linguaggio (int, float, char ecc.) oppure un tipo di dato derivato e più complesso (ma non approfondiremo al momento questa possibilità). Nel caso in cui la funzione non restituisca alcun valore in uscita, il tipo del parametro di ritorno sarà void. Scrivere void come tipo di ritorno della funzione indica al compilatore l’assenza di valori in uscita; di conseguenza, in tal caso, la funzione si limiterà a elaborare dati senza restituire nulla. Nel caso della funzione “somma di due numeri interi”, tipoRitorno potrebbe essere int; nel caso della funzione “radice quadrata di un numero naturale” potrebbe essere float e così via. • nomeFunzione è l’identificatore della funzione e ne specifica il nome. Per convenzione, proprio come nel caso delle variabili, tale nome inizia solitamente con una lettera minuscola. Può contenere lettere (minuscole e maiuscole), numeri, il trattino basso (underscore) ma non può iniziare con un numero e non può contenere caratteri speciali (@, #, ? ecc.). Inoltre, non si possono usare come identificatori nomi corrispondenti alle parole chiave o di sistema. Nomi di funzione accettati potrebbero essere somma, radQ, scambioValori, leggi1_2; invece, nomi non accettati potrebbero essere 1somma, rad:Q, void, leggi1&2. È bene anticipare che, in uno stesso ambito di visibilità (approfondiremo il concetto più avanti), una funzione non può avere lo stesso nome già assegnato a una costante, a una variabile o a un’altra funzione. • tipoVar1 [nomePar1], ..., tipoVarN [nomeParN], nel prototipo, sono i cosiddetti parametri formali. Per ogni variabile in ingresso alla funzione va specificato il tipo di dato che essa contiene e, in maniera opzionale e tutto sommato sconsigliata, il suo identificatore. Una funzione potrebbe non ricevere alcun ingresso; in tal caso nessun parametro formale sarebbe specificato. 4


Unità 1 - Le funzioni

Nel caso della funzione abs(), prima citata, un esempio di prototipo potrebbe essere il seguente: Identificatore della funzione

int abs(int x); Tipo e identificatore dell’ingresso Tipo dell’uscita

Guardando tale prototipo si deduce che la funzione abs() riceve in ingresso un numero intero e restituisce in uscita un valore intero. Come già accennato precedentemente, è sconsigliato in questa fase indicare il nome della variabile in ingresso, dato che il compilatore lo ignora; sarebbe quindi da preferire la seguente scrittura: Identificatore della funzione

int abs(int); Tipo dell’ingresso Tipo dell’uscita

Se la funzione abs() fosse progettata per operare su numeri reali, un prototipo potrebbe essere: float abs(float);

Ci sono anche dei casi in cui il tipo di dato in ingresso non coincide con il tipo di dato di ritorno. Pensiamo a una funzione che restituisce la media tra due numeri interi (chiamiamola media()); il risultato di tale media potrebbe essere un numero decimale; quindi, un prototipo corretto potrebbe essere il seguente: Tipo dell’uscita

Tipo dell’ingresso2

float media(int, int); Tipo dell’ingresso1

Osserviamo che, essendo due i numeri interi in ingresso alla funzione, il tipo int compare due volte: un’occorrenza per ogni valore da considerare.

Fase 2: definizione della funzione L’ESSENZIALE La fase di definizione di una funzione si realizza dopo il main e si occupa della reale implementazione del codice della funzione stessa. Una volta definita la funzione, il compilatore saprà cosa effettivamente fare quando essa sarà invocata.

La sintassi è la seguente: Intestazione della funzione

tipoRitorno nomeFunzione(tipoPar1 nomePar1, ..., tipoParN nomeParN) { ...

Corpo della funzione

}

5


Lezione 1 Introduzione alle funzioni Così come nel prototipo della funzione, anche nella sua definizione sono indicati: • il tipo di dato che sarà restituito dalla funzione; • il nome della funzione; • l’elenco dei parametri formali. Inoltre, in questa fase, compare tra parentesi graffe la parte reale di implementazione attraverso il codice, che costituisce il cosiddetto: • corpo della funzione. ATTENZIONE Nella fase di definizione, i parametri formali devono essere completamente specificati; quindi, per ogni variabile in ingresso devono essere indicati obbligatoriamente sia il tipo di dato che essa contiene sia il suo identificatore. Tale identificatore dovrà poi essere usato come nome di variabile nel codice che costituisce il corpo della funzione.

Nel caso in cui il tipo del parametro di ritorno sia diverso da void, il corpo della funzione si dovrà necessariamente concludere con un’istruzione return. Il compito di tale istruzione è quello di terminare la funzione e restituire il valore di un’espressione come risultato finale dell’elaborazione. Il tipo di dato fornito dal return dovrà coincidere o essere convertito nel tipo del parametro di ritorno specificato nell’intestazione della funzione e nel suo prototipo. A titolo di esempio, consideriamo ancora la funzione abs() che, dato in ingresso un numero intero, ne restituisce il valore assoluto. La sua definizione potrebbe essere la seguente: Tipo del parametro in uscita Tipo e identificatore del parametro in ingresso (parametro formale) Corpo della funzione

La riga di intestazione esplicita: • il tipo di dato che sarà restituito dalla funzione: int • il nome della funzione: abs • il tipo di dato in ingresso: int • il nome della variabile che contiene il dato in ingresso: x Il corpo della funzione è un semplice algoritmo che fa riferimento alla variabile x, presa in ingresso; come si vede, tale variabile non è stata dichiarata in quanto già nella disponibilità della funzione essendole stata passata come parametro formale.

Le variabili che vengono passate in ingresso alla funzione come parametri formali non devono essere dichiarate e possono essere usate direttamente. L’ESSENZIALE

L’algoritmo si conclude con l’istruzione return x;

che si occupa di terminare la funzione e restituire il valore ottenuto per x. Ovviamente, per come è stato costruito l’algoritmo, tale valore sarà certamente maggiore o uguale di 0, indipendentemente dal valore iniziale della variabile; quindi, effettivamente la 6


Unità 1 - Le funzioni

funzione scritta restituisce il valore assoluto di x. Inoltre, visto che la variabile x è di tipo intero, anche il valore restituito sarà intero, coerentemente con le specifiche dell’intestazione. Ciò che ora dobbiamo fare è capire come usare il parametro di ritorno della funzione, quando essa viene invocata.

Chiamata di una funzione e passaggio di parametri per valore Una volta che una funzione è stata dichiarata e definita, può essere richiamata dal programma principale, o dalle altre funzioni che intendono usarla, con la seguente sintassi: nomeFunzione(elenco_identificatori_variabili);

Precisamente: • nomeFunzione è il nome che è stato assegnato alla funzione nel prototipo e nell’intestazione della definizione; • elenco_identificatori_variabili è l’elenco dei nomi di variabile che la funzione deve ricevere in ingresso, separati da una virgola; tale elenco deve essere conforme in tipo, numerosità e ordine alla lista dei parametri formali elencati nell’intestazione della definizione della funzione. L’ESSENZIALE Per invocare una funzione basta scriverne il nome e inserire tra parentesi la lista degli identificativi delle variabili sulle quali vogliamo che essa operi, nello stesso ordine in cui intendiamo associarle ai parametri formali elencati nell’intestazione della sua definizione.

Le variabili che indichiamo tra parentesi quando invochiamo la funzione rappresentano i cosiddetti parametri attuali. Il loro contenuto va a inizializzare i parametri formali della funzione nell’ordine in cui sono scritti, generando di fatto una copia di tali variabili a uso esclusivo della funzione. In tal modo, ogni operazione o modifica che la funzione attua sui parametri formali non influenza il valore dei parametri attuali. Si parla, in tal caso, di passaggio di parametri per valore.

Un primo esempio completo Per fissare le idee su quanto detto finora, consideriamo il seguente algoritmo in cui invochiamo dal programma principale la funzione abs() prima creata:

Prototipo della funzione Parametro attuale

Parametro formale

Invocazione della funzione abs() con passaggio della variabile num

Definizione della funzione

7


Lezione 1 Introduzione alle funzioni La funzione abs() è stata dichiarata al rigo 3 e definita nei righi 13-18, come già visto in precedenza. Il programma principale invoca la funzione al rigo 9: esaminiamolo nel dettaglio.

Il primo specificatore di formato viene sostituito dal contenuto della variabile num. Il secondo, invece, viene sostituito dal parametro di ritorno della funzione, abs(num). Quando il compilatore incontra l’invocazione abs(num), riconosce abs() come funzione data la presenza del suo prototipo al rigo 3; inoltre, basandosi su tale prototipo, si aspetta per la funzione un ingresso di tipo intero. Dato che la chiamata avviene con l’istruzione abs(num) e che num è una variabile intera, la concordanza è soddisfatta. A questo punto, il valore del parametro attuale num viene copiato nel parametro formale x della funzione e l’esecuzione di quest’ultima può effettivamente iniziare. Una volta elaborato il corpo della funzione, l’istruzione return x;

restituisce come parametro di ritorno il valore ottenuto per la variabile x al programma principale; quest’ultimo avrà ricevuto effettivamente il valore assoluto della variabile num (visto che, dopo l’inizializzazione, num e x contenevano lo stesso valore). ATTENZIONE Osserviamo che tutte le operazioni interne alla funzione sono state effettuate sulla variabile x (parametro formale) e non sulla variabile num (parametro attuale). Per questa ragione, al termine dell’esecuzione della funzione, num non avrà subito modifiche e potrà ancora essere usata nel programma principale con il suo valore iniziale.

In definitiva, l’introduzione e l’uso di una funzione comportano il seguente schema logico. • La funzione viene dichiarata. • La funzione viene definita. • La funzione è richiamata dal programma principale o da un’altra funzione e riceve in ingresso una lista di variabili (parametri attuali). • Il valore delle variabili in ingresso alla funzione viene copiato nelle variabili specificate nella sua definizione (parametri formali). • La funzione opera sui parametri formali. • Se ha un parametro di ritorno diverso da void, la funzione ne restituisce il valore come risultato dell’elaborazione.

Check 1. Scrivi il prototipo di una funzione chiamata media che accetti in ingresso tre numeri interi e restituisca la loro media in uscita. 2. Scrivi la definizione di una funzione chiamata media che accetti in ingresso tre numeri interi e restituisca la loro media in uscita. 3. Scrivi in C o in C++ un algoritmo che faccia uso della funzione creata negli esercizi precedenti per calcolare la media di tre numeri interi inseriti in ingresso dall’utente.

8


Lezione 2

L’uso delle funzioni in C/C++

FUNZIONI IN C/C++

DIDATTICA INCLUSIVA

possono fare uso di

variabili

possono essere

ricorsive

locali

globali

Ambito di visibilità delle variabili in C/C++ Finora abbiamo sempre trattato le variabili come enti astratti da dichiarare a inizio programma e a cui poter fare riferimento in maniera arbitraria in ogni punto dell’algoritmo.

In realtà, quando introduciamo una nuova variabile, la sua visibilità (scope) cambia in funzione del blocco di codice in cui essa è dichiarata. L’ESSENZIALE

DEFINIZIONE Una variabile definita esternamente a ogni funzione e a ogni blocco di codice si dice variabile globale ed è visibile in tutto il programma. Viceversa, una variabile definita internamente a una funzione o a un singolo blocco di codice si dice variabile locale e mantiene una visibilità limitata alla sola funzione o al solo blocco di codice in cui è stata dichiarata.

Tranne che in rari casi, è sconsigliato l’uso di variabili globali. Nei nostri programmi abbiamo finora usato solo variabili locali. Una variabile locale: • non è visibile al di fuori della funzione o del blocco in cui è dichiarata; • esiste solo fintanto che è in esecuzione la funzione o il blocco di codice in cui è dichiarata; • può condividere il nome con altre variabili locali situate in funzioni o in blocchi di codice diversi da quello di appartenenza (lo vedremo nel prossimo esempio). Nel seguente esempio dichiariamo due variabili intere chiamate entrambe num: al rigo 4, nella funzione main(), e al rigo 6, nel blocco generato dall’if. La variabile num dichiarata al rigo 6 contiene il valore 5 limitatamente a questo blocco di codice.

Questa è la variabile num dichiarata al rigo 4 e contiene il valore 3.

9


Lezione 2 L’uso delle funzioni in C/C++ Il programma appena scritto produce, in uscita, il seguente output. È facile comprendere che, a meno di casi particolari, non è consigliato l’uso dello stesso identificatore di variabile all’interno di blocchi indentati.

Esercizio svolto 1. Scrivi in C un algoritmo che, facendo uso di una funzione, stampi la tabellina di un numero num inserito in ingresso.

Svolgimento La funzione si deve occupare di stampare la tabellina di un dato numero num. Quindi, pur avendo delle azioni da svolgere, non ha un valore da restituire in uscita. Per questo, il tipo del suo parametro di ritorno sarà void. L’algoritmo è il seguente:

Commentiamo il codice. 3:

scriviamo il prototipo della funzione tabellina() indicando void come tipo del parametro di ritorno e int come tipo della variabile in ingresso.

6:

dichiariamo la variabile locale num, con una visibilità ristretta alla sola funzione main(). Tale variabile: - non sarà visibile (quindi non potrà essere usata) nella funzione tabellina(); - esiste fintanto che ci troviamo nel main; - non impedisce che in altre funzioni siano dichiarate variabili con il suo stesso nome.

9:

invochiamo la funzione tabellina() in maniera diretta, senza operazioni di assegnamento o di scrittura, dato che tutte le azioni da eseguire devono essere compiute all’interno della funzione stessa, senza restituzione di parametri.

13:

definiamo la funzione tabellina(), rispettando la struttura del prototipo e indicando con n il parametro formale a cui passare il valore del parametro attuale num.

14:

dichiariamo la variabile locale i.

15-16: definiamo il ciclo for che ci permette di stampare effettivamente la tabellina di n. 10


Unità 1 - Le funzioni

Osserviamo che la funzione tabellina() non termina con un’istruzione return. La ragione è dovuta al fatto che il tipo del parametro di ritorno è void. Quindi, non dovendo la funzione restituire nulla a chi la invoca, non è presente l’istruzione di chiusura. In figura è mostrata una possibile esecuzione dell’algoritmo:

Esercizio svolto 2. Scrivi in C++ un algoritmo che, facendo uso di una funzione, permetta di stampare i primi n termini della successione di Fibonacci, con n inserito in ingresso dall’utente.

Svolgimento L’algoritmo è il seguente:

Commentiamo il codice. 4:

anche in questo caso, visto che la funzione fibo() deve stampare una sequenza di n numeri e non deve restituire nulla in uscita, scriviamo il suo prototipo indicando void come tipo del parametro di ritorno.

7:

dichiariamo la variabile locale num, con una visibilità ristretta al solo main(). 11


Lezione 2 L’uso delle funzioni in C/C++ 10:

invochiamo la funzione fibo().

15:

dichiariamo le variabili locali i, prec1, prec2 e attuale; prec1 e prec2 sono state inizializzate a 1 perché contenessero di default i primi due termini della successione di Fibonacci.

16:

stampiamo manualmente i primi due termini della successione.

17:

impostiamo un ciclo for con i che va da 2 a n. La scelta di i che parte da 2 deriva dal fatto che i primi due termini della successione di Fibonacci (1 1) sono stati già stampati al rigo precedente; quindi la stampa inizierà già dal terzo!

18-21: definiamo la procedura per determinare i termini della successione in maniera sequenziale attraverso semplici sostituzioni successive. Osserviamo che la funzione fibo() non termina con un’istruzione return. La ragione è dovuta al fatto che il tipo del parametro di ritorno è void. Quindi, non dovendo la funzione restituire nulla a chi la invoca, non è presente l’istruzione di chiusura. In figura è mostrata una possibile esecuzione dell’algoritmo:

Esercizio svolto 3. Scrivi in C un algoritmo che, facendo uso di una funzione, permetta di calcolare la potenza base con i valori di base ed exp inseriti in ingresso. Produci, di tale algoritmo, due versioni: una che faccia uso della variabile globale risultato, l’altra che restituisca la potenza attraverso il parametro di ritorno della funzione.

Svolgimento Presentiamo le due versioni dell’algoritmo:

La funzione modifica una variabile globale e il programma principale ne stampa il valore.

12


Unità 1 - Le funzioni

La funzione ritorna un valore che viene trasferito al programma principale.

Le funzioni ricorsive in C/C++ Finora abbiamo usato le funzioni richiamandole da altre funzioni. Un caso particolare di invocazione si ha quando la funzione richiama sé stessa; si parla in tal caso di funzione ricorsiva. L’ESSENZIALE

Le funzioni ricorsive sono usate per risolvere particolari classi di problemi; analizziamole a partire da un esempio. Consideriamo la potenza bexp, con exp numero intero maggiore di 0; si ha: b exp = b ⋅ b ⋅ b ⋅ … ⋅ b = exp volte

b ⋅ b ⋅ b ⋅ b ⋅ … ⋅ b = b ⋅ b exp−1 (exp − 1) volte

Se, per esprimere la formula precedente, usassimo una funzione informatica chiamata potenza(), potremmo scrivere: potenza(b, exp) = b * potenza(b, exp-1)

In pratica, avremmo di fronte un tipo di funzione che, nel suo termine generale, farebbe riferimento a sé stessa, con parametri di ingresso differenti. Replicando il discorso anche per b exp−1, con exp – 1 maggiore di 0, scriveremmo: potenza(b, exp-1) = b * potenza(b, exp-2)

e così via. La ricorsione si fermerebbe al raggiungimento dell’ultimo termine, potenza(b, 0), che vale 1; infatti b0 = 1. Guardiamo il grafico sottostante per chiarire meglio le idee. potenza(b, exp) = b * potenza(b, exp-1) b * potenza(b, exp-2) b * potenza(b, exp-3) exp

... b * potenza(b, 1) b * potenza(b, 0)

1 13


Lezione 2 L’uso delle funzioni in C/C++ In generale, la funzione potenza(b, exp) dovrebbe restituire: • b * potenza(b, exp-1) se exp è maggiore di 0 •1

se exp è uguale a 0

Volendo implementare in un algoritmo la funzione ricorsiva appena introdotta, otterremmo:

Per come è strutturata, la funzione potenza() restituisce di volta in volta il prodotto tra il valore della variabile base e il parametro di ritorno di una sua nuova invocazione, a cui passiamo la stessa base ma l’esponente diminuito di una unità (rigo 17). Così facendo, a ogni chiamata avviene una nuova moltiplicazione per la base. Il processo termina quando l’esponente scende a 0 e la funzione fornisce come valore di ritorno 1 (rigo 19). Il risultato finale è proprio il prodotto di tanti valori della base quanti sono indicati dall’esponente. In figura è mostrata una possibile esecuzione dell’algoritmo:

input/output 1. Perché in C/C++, nel prototipo di una funzione, si preferisce non inserire gli identificatori di variabile ma solo i tipi? Il prototipo della funzione ha un solo compito: quello di segnalare al programma principale che esiste una funzione che ha un certo nome e determinati tipi di variabili in ingresso e in uscita. Il dettaglio dei parametri può tranquillamente essere lasciato alla sua definizione.

14


Unità 1 - Le funzioni

2. Perché i parametri attuali e i parametri formali hanno nomi diversi? Non sarebbe più facile assegnare gli stessi identificatori a entrambi? In questa fase iniziale stiamo costruendo le funzioni all’interno degli stessi programmi in cui le invochiamo. In programmi complessi o quando le funzioni le costruisce qualcun altro, non possiamo pretendere di conoscere i nomi dei parametri formali. Ognuno chiama le variabili come vuole! L’importante è conoscere il tipo degli argomenti in ingresso e dell’eventuale parametro di ritorno.

3. Alcune funzioni non restituiscono nulla. Perché le usiamo? Ci sono molte ragioni per cui una funzione potrebbe non aver bisogno di parametri in ingresso o in uscita. Per esempio, se costruissimo una funzione che si occupasse di stampare l’ora attuale, potremmo invocarla senza passarle parametri e senza aspettarci alcun valore di ritorno. Il suo compito sarebbe esclusivamente quello di leggere l’ora di sistema e mostrarla a schermo.

4. Perché usare e scambiarsi tra funzioni le variabili locali, se quelle globali possono essere usate più facilmente? Le variabili locali facilitano le operazioni di scrittura dei programmi essendo riferite solo a porzioni di codice limitate; inoltre, la loro permanenza in memoria è limitata solo all’esecuzione del blocco o della funzione in cui compaiono. L’uso attento di variabili locali, infine, facilita le operazioni di manutenzione/riutilizzazione del codice.

Check 1. Spiega qual è la differenza tra variabili locali e variabili globali. Fornisci un esempio.

2. Scrivi in C/C++ un algoritmo che faccia uso di una funzione per ottenere la somma dei primi n numeri interi. 3. Scrivi in C/C++ un algoritmo che faccia uso di una funzione ricorsiva per ottenere la somma dei primi n numeri interi.

15


Lezione 3

Le funzioni in Python DIDATTICA INCLUSIVA

FUNZIONI IN PHYTON

possono fare uso di

variabili possono essere

devono essere

locali ricorsive

definite

sintassi def nomeFunzione (param. formali): ... ... ... [return espressione]

globali

invocate

sintassi nomeFunzione (elenco_identificatori_variabili)

Il Python, per sue caratteristiche, è un linguaggio di programmazione molto diverso dal C o dal C++. Le funzioni in Python sono strumenti indispensabili, soprattutto se inquadrate nel contesto di un linguaggio a oggetti semplice e potente. In questa lezione ci limiteremo a mostrare una corrispondenza di azioni tra le funzioni del Python e quelle del C/C++, riservandoci di entrare più avanti nei dettagli operativi esclusivi del linguaggio.

Definizione di funzioni in Python Le funzioni in Python sono introdotte dalla parola chiave def. A essa deve seguire il nome della funzione, la lista dei parametri formali racchiusa tra parentesi e il simbolo ':'. Al rigo successivo, indentato rispetto al rigo di intestazione (header), inizia del corpo della funzione che può terminare o meno con l’istruzione opzionale return. L’ESSENZIALE

La sintassi è dunque la seguente: Nome della funzione Parola chiave per definire la funzione

16

Variabili in ingresso

def nomeFunzione (parametri_formali): ... ... ... [return espressione] Espressione di ritorno opzionale


Unità 1 - Le funzioni

In ogni script in linguaggio Python, le funzioni possono essere invocate solo dopo essere state definite.

Esercizio svolto 4. Crea in Python uno script che includa una funzione in grado di calcolare la misura dell’ipotenusa di un triangolo rettangolo applicando il teorema di Pitagora.

Svolgimento Lo script è il seguente:

Algoritmo 1 Al rigo 1 importiamo il modulo math. Un modulo è una raccolta di funzioni predefinite relative a uno stesso ambito di utilizzo (equivalente alle librerie del C). In math troviamo la funzione sqrt che ci permette di calcolare la radice quadrata di un numero. Tale funzione viene usata al rigo 3 con la sintassi math.sqrt(). La definizione della funzione inizia al rigo 2 e termina con l’istruzione return al rigo 4. Il risultato dell’elaborazione è mostrato nella shell:

Nell’Algoritmo 1 abbiamo definito la funzione pitagora() che opera sui parametri formali cat1 e cat2, associandoli rispettivamente ai parametri attuali catMin e catMax che le vengono passati.

Funzioni con valori predefiniti dei parametri L’ESSENZIALE In Python, le funzioni non hanno necessariamente bisogno della diretta corrispondenza tra parametri attuali e parametri formali perché questi ultimi possono assumere valori di default, se opportunamente impostati.

Nel seguente esempio, l’Algoritmo 1 è riscritto associando a cat1 e cat2 i valori di default 3 e 4, nel caso che l’utente richiami la funzione pitagora() senza passarle parametri. 17


Lezione 3 Le funzioni in Python

Valori di default cat1=3 e cat2=4 Funzione richiamata senza passarle parametri

Il risultato è analogo a quello che avremmo ottenuto prima inserendo come misure dei cateti rispettivamente 3 e 4; infatti, la funzione pitagora(), non avendo ricevuto in ingresso alcun parametro, ha associato alle variabili i valori di default specificati in fase di definizione.

Ambito di visibilità delle variabili in Python Anche in Python, così come in C e in C++, le variabili hanno un proprio ambito di visibilità, che può essere globale o locale. L’ESSENZIALE

In linea di massima, le variabili locali sono quelle usate internamente alle funzioni mentre quelle globali sono definite esternamente a esse. Valgono le stesse considerazioni già fatte in precedenza: le variabili locali hanno una visibilità ristretta alla funzione in cui si trovano e un ciclo di vita che termina all’uscita dalla stessa. Nel codice che segue mostriamo la creazione di una variabile globale e di una locale.

18


Unità 1 - Le funzioni

Se usiamo una variabile globale in una funzione, essa sarà trattata come locale senza opportune indicazioni. Guardiamo il seguente esempio:

La variabile globale data non è stata aggiornata dopo l’esecuzione della funzione.

Commentiamo il codice. 1: inizializziamo la variabile globale data al valore “16/06/1975”. 2: stampiamo il contenuto della variabile data. 3: definiamo la funzione aggiornaData() che inizializza la variabile data al valore "16-06-2022" (rigo 4) e poi la stampa (rigo 5). 6: invochiamo la funzione aggiornaData(). 7: dopo l’invocazione della funzione, stampiamo nuovamente il contenuto di data. Il risultato non è quello aspettato: la variabile data ha ottenuto l’aggiornamento introdotto dalla funzione aggiornaData() solo nell’ambito della funzione stessa; ne deduciamo che è stata ivi trattata come una variabile locale. L’ESSENZIALE In Python, per poter apportare modifiche alle variabili globali nei contesti locali (come le funzioni), bisogna usare la parola chiave global:

La variabile data è stata aggiornata.

19


Lezione 3 Le funzioni in Python Come si vede dal nuovo output, la funzione aggiornaData() ha effettivamente cambiato il contenuto della variabile globale data che, nell’ultima stampa, risulta aggiornata alla modifica introdotta al rigo 5.

Le funzioni ricorsive in Python Abbiamo già acquisito il concetto di funzione ricorsiva. Vediamo come implementare in Python algoritmi che ne facciano uso, attraverso il seguente esercizio svolto.

Esercizio svolto 5. Crea in Python uno script che includa una funzione ricorsiva in grado di calcolare il fattoriale di un numero intero n inserito in ingresso. Il fattoriale di n è il prodotto dei primi n numeri interi positivi.

Svolgimento Lo script e l’output sono i seguenti:

Check 1. Spiega come modificare una variabile globale in Python all’interno di un contesto locale.

2. Scrivi in Python un algoritmo che faccia uso di una funzione per ottenere la somma dei primi n numeri interi. 3. Scrivi in Python un algoritmo che faccia uso di una funzione ricorsiva per ottenere la somma dei primi n numeri interi.

20


DIDATTICA INCLUSIVA

Sintesi

Unità 1 - Le funzioni Audiosintesi

Spazio CLIL

✔ In informatica, una funzione è una sequenza di istruzioni, opportunamente strutturata,

che permette di realizzare una specifica azione agendo su dati in ingresso e restituendo dati in uscita; escludendo casi particolari, ogni funzione può avere un numero variabile di ingressi ma sempre al massimo una sola uscita.

✔ L’uso delle funzioni porta innumerevoli vantaggi; tra questi:  • correggibilità e manutenibilità  • compattezza del codice, risparmio e leggibilità  • riusabilità  • scomposizione funzionale

✔ In C, nell’introdurre nel codice nuove funzioni, seguiamo l’approccio convenzionale che prevede tre fasi generali:

1) Dichiarazione della funzione 2) Definizione della funzione 3) Invocazione della funzione

✔ In Python, nell’introdurre nel codice nuove funzioni, seguiamo l’approccio convenzionale, che prevede due fasi generali:

1) Definizione della funzione 2) Invocazione della funzione

✔ Le variabili in ingresso a una funzione sono dette parametri formali. ✔ Le variabili passate a una funzione dal programma principale durante l’invocazione sono dette parametri attuali.

✔ In Python, le funzioni non hanno necessariamente bisogno della diretta corrispondenza tra parametri attuali e parametri formali in quanto questi ultimi possono assumere valori di default, se opportunamente impostati.

✔ Una variabile definita esternamente a ogni funzione e a ogni blocco di codice si dice variabile globale ed è visibile in tutto il programma.

✔ Una variabile definita internamente a una funzione o a un singolo blocco di codice

si dice variabile locale e mantiene una visibilità limitata alla sola funzione o al solo blocco di codice in cui è stata dichiarata.

✔ Le variabili locali facilitano le operazioni di scrittura dei programmi essendo riferite

a porzioni di codice limitate; inoltre, la loro permanenza in memoria è limitata solo all’esecuzione del blocco o della funzione in cui compaiono. L’uso attento di variabili locali, infine, facilita le operazioni di manutenzione/riutilizzazione del codice.

✔ In Python, per poter apportare modifiche alle variabili globali nei contesti locali (come le funzioni), bisogna usare la parola chiave global.

✔ Un caso particolare di invocazione si ha quando la funzione richiama sé stessa; si parla in tal caso di funzione ricorsiva.

21


Unità 1 - Le funzioni

Test 1. Completa. a. In informatica, una

è una sequenza di istruzioni,

opportunamente strutturata, che permette di realizzare una specifica azione e restituendo dati in

agendo su dati in

precisamente, ogni funzione più avere un numero

; di ingressi

ma sempre al massimo una sola uscita. b. In C, nell’introdurre nel codice nuove funzioni, seguiamo l’approccio convenzionale che prevede tre fasi generali: 1) 2) 3) c. In Python, le

non hanno necessariamente bisogno della diretta

corrispondenza tra

e

in quanto

questi ultimi possono assumere valori di default, se opportunamente impostati.

2. Vero o falso? a. Le variabili passate a una funzione dal programma principale durante l’invocazione sono dette parametri formali.

V

F

b. Le variabili locali facilitano le operazioni di scrittura dei programmi essendo riferite solo a porzioni di codice limitate.

V

F

c. L’uso attento di variabili globali facilita le operazioni di manutenzione/riutilizzazione del codice.

V

F

d. Una funzione che richiama sé stessa si dice ricorsiva.

V

F

3. Quale dei seguenti è un vantaggio derivato dall’uso di funzioni? A Manutenibilità del codice B Leggibilità del codice C Riusabilità del codice D Tutte le altre risposte sono valide

4. In quale dei seguenti linguaggi di programmazione è consigliato dichiarare una funzione, prima dell'uso, attraverso il suo prototipo? A C/C++ B Python C C/C++ e Python D Nessuna delle altre risposte è corretta

5. In Python, per poter apportare modifiche alle variabili globali nei contesti locali (come le funzioni), bisogna usare la parola chiave: A def B return C int D global

22


Verifica... Esercizi interattivi

le tue conoscenze 1. Una funzione è caratterizzata: da un nome univoco. da un parametro di ingresso univoco. da un parametro di uscita univoco. da un parametro di ingresso e da un parametro di uscita univoci.

2. Il contenuto del corpo di una funzione: A deve essere noto necessariamente a chi

lo progetta e a chi lo usa. B deve essere noto necessariamente a chi lo progetta. C deve essere noto necessariamente a chi lo usa. D non deve essere noto necessariamente né a chi lo progetta né a chi lo usa.

3. Nel prototipo di una funzione in C/C++, quale dei seguenti elementi è opzionale? A B C D

Il tipo del parametro di ritorno. Il nome della funzione. Il tipo dei parametri formali. Il nome dei parametri formali.

4. Nella definizione di una funzione in C/C++, è obbligatorio: A specificare il tipo del parametro di

ritorno.

B usare void come tipo per il parametro

di ritorno.

C usare int come tipo per il parametro di

ritorno. D usare float come tipo per il parametro di ritorno.

5. Nella definizione di una funzione in C/C++, nel corpo: A è obbligatorio l’uso del return. B è consigliato l’uso del return. C è vietato l’uso del return. D l’uso del return dipende

dall’eventualità che la funzione presenti o meno un’uscita.

6. Nella definizione di una funzione in Python, quale dei seguenti elementi non è obbligatorio? A La parola chiave def.

B Il nome della funzione. C I parametri formali. D Il simbolo “:” al termine dell’istruzione.

7. In C/C++, una variabile globale: A deve essere dichiarata nella funzione

Le funzioni

A B C D

main().

B deve essere dichiarata esternamente a

ogni funzione. C può essere dichiarata in una qualsiasi

funzione. D può essere dichiarata in un qualsiasi

blocco di codice.

8. In C/C++, una variabile locale: A può avere lo stesso nome di una variabile

globale. B può avere lo stesso nome di una

funzione. C può avere lo stesso nome di un’altra

variabile locale che si trova in un ambito di visibilità differente. D nessuna delle risposte precedenti è corretta.

9. In Python, una variabile globale: A non può mai essere modificata. B non può mai essere modificata in un

contesto locale. C può essere modificata in un contesto

locale se preceduta dalla parola chiave global. D può essere modificata in un contesto locale se seguita dalla parola chiave def.

10. In Python, una variabile locale: A viene cancellata dalla memoria quando

termina l’esecuzione del codice che ne definisce l’ambito di validità. B resta in memoria per l’intera durata del programma. C è contemporaneamente anche globale. D è contemporaneamente anche una funzione.

11. Quale delle seguenti affermazioni riguardanti gli ambiti di visibilità delle variabili in programmazione non è corretta? A Le variabili locali sono accessibili solo

all’interno della funzione in cui sono dichiarate. B Le variabili locali sono accessibili solo all’interno del blocco di codice in cui sono dichiarate. C Le variabili globali sono accessibili solo all’interno del blocco di codice in cui sono dichiarate. D Le variabili globali sono accessibili da ogni sezione del programma.

23


le tue abilità Scrivi in C/C++ il prototipo delle seguenti funzioni.

Unità 1

12. Media di tre numeri interi

13. Media di due numeri interi dispari

14. Media di due numeri interi pari

15. Prodotto di due numeri decimali

16. Prodotto di un numero intero e un numero decimale

17. Somma di 4 numeri interi casuali

Scrivi nel linguaggio che preferisci la definizione di una funzione che si comporti come indicato. 18. Accetta due valori interi in ingresso e ne stampa la somma.

19. Accetta due valori interi in ingresso e ne restituisce la somma.

20. Accetta un valore intero e uno decimale in ingresso e ne restituisce il prodotto.

21. Accetta due valori decimali in ingresso e ne restituisce la differenza.

24


Trova l’errore nei seguenti prototipi di funzione scritti in C/C++ e indicalo negli apppositi spazi. 22. def somma(int, int);

Le funzioni

23. int void(int, int); 24. int nome(int int); 25.void intero(int nome, void cognome); 26. int nomeFunzione(int, int) 27. void nome(int nome, cognome); Trova l’errore nelle seguenti definizioni di funzione scritte in C/C++ e indicalo negli apppositi spazi. 28. int somma(int, int) { return num1+num2; }

29. void somma(int num1, int num2) { return num1+num2; }

30. int somma(int num1, num2) { return num1+num2; }

31. int somma(int num1, int num2) { int somma; somma=num1+num2; return somma; }

Trova l’errore nelle seguenti definizioni di funzione scritte in Python e indicalo negli apppositi spazi. 32. def somma(num1, num2) return num1+num2

33. def somma(int num1, int num2): return num1+num2

25


le tue competenze Unità 1

Gli esercizi che seguono possono essere svolti usando uno qualsiasi dei linguaggi di programmazione noti. Scrivi i programmi richiesti, facendo uso di una o più funzioni. 34. Scrivi un programma che, dati due numeri interi in ingresso, stabilisca quale dei due ha il valore assoluto maggiore. 35. Scrivi un programma che, dati due numeri decimali in ingresso, stabilisca quale dei due ha il quadrato maggiore. 36. Scrivi un programma che, dato un numero intero positivo n in ingresso, crei una funzione isPrime() che restituisca 1 se il numero è primo, 0 se non lo è. 37. Scrivi un programma che ricrei la seguente schermata:

Una volta stampato l’elenco mostrato, l’utente deve poter effettuare una scelta. Il numero associato a tale scelta deve essere ritornato dalla funzione al programma principale attraverso l’istruzione return. Dal main deve avvenire la conferma della scelta effettuata, con la seguente frase:

La scelta da te effettuata è la x

38. Ricrea nel programma principale la seguente schermata:

Per ognuna delle voci ivi presenti, scrivi un’opportuna funzione che, al suo interno, richieda rispettivamente le misure di: 1 – base e altezza 2 – lato 3 – base e altezza 4 – base maggiore, base minore e altezza Tali funzioni devono restituire la superficie della figura piana inizialmente selezionata.

39. Scrivi un programma che, dato un numero n in ingresso, stampi i primi n numeri primi. 40. Scrivi un programma che, dato un numero n in ingresso, stampi tutti i numeri primi inferiori a n. 26


41. Scrivi un programma che, dato un numero n in ingresso, stampi, se esiste, il più grande numero primo inferiore a n.

Le funzioni

42. Scrivi un programma che, dato un numero n in ingresso, stampi, se esiste, il più piccolo numero primo superiore a n. 43. Scrivi un programma che, dati due valori in ingresso, num1 e num2, stampi, se esistono, tutti i numeri primi compresi tra num1 e num2. 44. Scrivi un programma che, dato un numero n in ingresso, stampi il primo termine della successione di Fibonacci maggiore di n. 45. Scrivi un programma che scomponga un numero intero num dato in ingresso nel prodotto dei suoi divisori primi. Per esempio: 100 = 2 ∙ 2 ∙ 5 ∙ 5. 46. Scrivi un programma che, dato un numero num in ingresso, stampi la somma delle sue cifre. Per esempio: 1290  12. 47. Scrivi un programma che, dato un numero num in ingresso, stampi il prodotto delle sue cifre escludendo eventuali zeri presenti. Per esempio: 1290  18. 48. Scrivi un programma che, dato un numero n intero positivo in ingresso, stampi i primi n numeri interi indicando accanto a ognuno di essi la sua scomposizione in fattori. 49. Un numero intero positivo si dice altamente composto se ha un numero di divisori maggiore di qualsiasi altro numero intero positivo più piccolo. Per esempio, 24 è altamente composto perché ha 8 divisori e nessun altro numero intero positivo minore di 24 ne ha così tanti. Scrivi un programma che, dato un numero n intero positivo in ingresso, stabilisca se n è altamente composto. 50. Scrivi un programma che, dato un numero intero num in ingresso, determini se la somma delle sue cifre dispari è maggiore della somma delle sue cifre pari. 51. Scrivi un programma che, dato un numero intero num in ingresso, determini se la somma delle sue cifre di posto dispari è maggiore della somma delle sue cifre di posto pari. 52. Scrivi un programma che, dato un numero intero num in ingresso, determini se è palindromo, cioè se può essere letto da destra verso sinistra o da sinistra verso destra senza cambiare. Per esempio: 132565231 è palindromo. 53. Scrivi un programma per convertire un numero intero inserito in ingresso da decimale a binario. 54. Scrivi un programma per convertire un numero intero inserito in ingresso da binario a decimale. 55. Scrivi un programma che, dato num in ingresso, stampi usando una funzione le prime num righe del triangolo di Tartaglia. 56. Scrivi una funzione che, dati un importo di denaro, un tasso di interesse e un numero di anni, permetta di calcolare l’importo al termine del periodo indicato accresciuto degli interessi. 57. Risolvi il problema precedente usando una funzione ricorsiva.

27


Informatica e... Unità 1

Per ciascuno degli esercizi seguenti, scrivi nel linguaggio di programmazione che preferisci un algoritmo che svolga il compito richiesto. 58. MATEMATICA Date due coppie di coordinate cartesiane, scrivi una funzione che restituisca come parametro di ritorno la loro distanza sul piano. Ricorda che: d

= (x − x ) + (y − y )

Usa la funzione sqrt, presente nella libreria math.h del C o nel modulo math del Python, per estrarre la radice quadrata di un numero. Inquadra la funzione creata nel contesto di un algoritmo completo e funzionante.

59. MATEMATICA Scrivi una funzione che riceva in ingresso i coefficienti angolari m e m di due rette le cui equazioni sono espresse nella forma y = mx + q. La funzione deve restituire il valore 0 se le rette sono parallele, 1 se sono perpendicolari e 2 per tutti gli altri casi.

60. MATEMATICA Realizza l’algoritmo di Euclide usando una funzione ricorsiva. Tale algoritmo prevede che, dati due numeri n1 e n2 in ingresso, il loro Massimo Comune Divisore si ottiene considerando che: – se n2 è un divisore di n1, allora il MCD è n2 – se n2 non è un divisore di n1, detto r il resto della divisione intera tra n1 e n2, allora MCD(n1, n2) = MCD(n2, r)

61. FISICA Un cubo di piombo (densità 11,4 g/cm ) ha il lato che misura x cm. Scrivi una funzione che, ricevuta in ingresso la misura x del lato, restituisca la massa del cubo. 62. ITALIANO / INGLESE In italiano, la lettera “a” compare con una frequenza percentuale di circa 11,74%; in inglese, invece, la percentuale è circa 8,05%. Scrivi una funzione che, ottenuto in ingresso il numero di lettere di un testo e delle occorrenze della lettera “a”, stabilisca se tale testo è scritto in italiano o in inglese. 63. GEOMETRIA Scrivi una funzione che, ricevute in ingresso le dimensioni di due lati di un triangolo rettangolo, applichi il teorema di Pitagora per calcolarne la terza. 64. SCIENZE MOTORIE Scrivi una funzione che, ricevuti in ingresso il numero di atleti che partecipano a una staffetta, chieda il tempo impiegato da ognuno nel singolo tragitto e restituisca il tempo totale impiegato dall’intera squadra. 65. ASTRONOMIA Aiutandoti con l’intelligenza artificiale, crea una semplice linea del tempo astronomica. Definisci alcuni eventi significativi relativi ai pianeti del sistema solare e implementa la visualizzazione dei dettagli di ciascun pianeta. – Passo 1: Dichiara una funzione per ogni pianeta, che stampi a schermo il nome del pianeta, la distanza dal Sole e il periodo orbitale. – Passo 2: Individua alcuni eventi importanti relativi ai pianeti, come l’esplorazione spaziale, la scoperta di nuove lune o altri avvenimenti significativi. Aggiungi informazioni sugli eventi nel codice delle funzioni relative ai pianeti corrispondenti. – Passo 3: Usando il ciclo for, stampa a schermo le informazioni di tutti i pianeti in ordine cronologico senza obbligo di richiamare manualmente ogni singola funzione. 28


Prova di autoverifica Scrivi, in C/C++: (1 punto)

2. la definizione della funzione stampa() che si occupi di stampare tutti i divisori della sua variabile in ingresso.

(2 punti)

3. un algoritmo completo che sfrutti la funzione stampa() invocandola in maniera opportuna.

(3 punti)

Le funzioni

1. il prototipo di una funzione chiamata stampa() che riceva in ingresso un numero intero e non restituisca nulla in uscita.

Scrivi, in Python: 4. la definizione di una funzione chiamata potenza() che riceva in ingresso due numeri interi e che si occupi di calcolare la potenza del primo numero elevato al secondo.

(3 punti)

5. un algoritmo completo che sfrutti la funzione potenza() invocandola in maniera opportuna.

(4 punti)

6. Nel linguaggio che preferisci, scrivi una funzione che, preso in ingresso un numero num, stabilisca se esso è divisibile per la somma delle sue cifre.

(6 punti)

7. In C/C++, scrivi un algoritmo con una funzione ricorsiva che calcoli il fattoriale di un numero n dato in ingresso.

(6 punti)

Punteggio finale della prova Somma i punteggi degli esercizi che hai risolto e confronta il tuo risultato con questa tabella per scoprire il livello che hai raggiunto 0-4 punti: livello base non raggiunto 5-13 punti: livello base 14-18 punti: livello intermedio 19-25 punti: livello avanzato

29


Compiti di realtà Compito 1 Il gioco del tris

Unità 1

Implementa una funzione che ci permetta di giocare al gioco del tris contro il computer. Le regole sono semplici e universali. Si gioca su una griglia quadrata di 3×3 celle.

I giocatori scelgono a turno una cella vuota e inseriscono al suo interno il loro simbolo (solitamente “X” per il primo giocatore e “O” per il secondo”). Vince il giocatore che riesce a formare per primo una linea orizzontale, verticale o diagonale di tre simboli uguali consecutivi. Se la griglia viene riempita senza che nessuno sia riuscito a completare una linea di tre simboli uguali, il gioco termina in parità. Nel progettare l’algoritmo: 1. Definisci le regole per giocare contro il computer (chi inizia per primo, come inserire il simbolo nella griglia ecc.). 2. Implementa le seguenti funzioni: • disegnaGriglia(), per disegnare una griglia così strutturata: • scegliMossa(), per definire la mossa del computer X O X X O O O X X 3. Definisci le altre funzioni che ritieni utili. 4. Cerca di costruire una procedura imbattibile.

Usa lo svolgimento di questo compito di realtà come spunto per il tuo Capolavoro. 30


Parola all’intelligenza artificiale Leggi le seguenti domande e scegline 5 il cui argomento stimola la tua curiosità, indipendentemente dal fatto che tu l’abbia affrontato o meno. Ponile all’intelligenza artificiale e riassumi il contenuto delle risposte negli appositi spazi a pagina seguente.

Le funzioni

1. Cosa sono le funzioni in programmazione? 2. Qual è lo scopo delle funzioni? 3. Qual è la sintassi di base per dichiarare una funzione in C? 4. Come si chiama il valore restituito da una funzione in C? 5. Qual è la differenza tra una variabile locale e una globale? 6. Quando una variabile locale viene inizializzata? 7. Come si dichiara una variabile globale in C? 8. Qual è la visibilità di una variabile globale in C? 9. Cosa succede se si dichiara una variabile globale con il nome uguale a una variabile locale? 10. Le variabili globali hanno lo stesso valore in tutte le funzioni del programma? 11. Come si passa un parametro a una funzione in C? 12. Come si dichiara una funzione che non restituisce alcun valore (void) in C? 13. Cosa succede se si dichiara una variabile con lo stesso nome di una variabile globale all’interno di una funzione? 14. Qual è la differenza tra una funzione e una procedura? 15. Come si passano gli argomenti per riferimento (passaggio per riferimento) in C? 16. Come si passano gli argomenti per valore (passaggio per valore) in C++? 17. Cosa sono le funzioni ricorsive? 18. Qual è la differenza tra le funzioni ricorsive e le funzioni iterative? 19. Può una funzione chiamare sé stessa all’interno di un codice C/C++/Python? 20. Come si dichiara una funzione in C++? 21. Cosa sono i parametri di default nelle funzioni di Python? 22. Come si restituisce più di un valore da una funzione in Python? 23. È possibile restituire una funzione da un’altra funzione in C/C++? 24. Qual è la differenza tra la ricorsione diretta e quella indiretta? 25. Cosa succede se si chiama una funzione ricorsiva senza una condizione di terminazione? 26. Come gestisce Python le variabili locali e globali all’interno delle funzioni? 27. Come si gestiscono le variabili locali nelle funzioni ricorsive? 28. Qual è la differenza tra una funzione ricorsiva e una funzione iterativa in termini di utilizzo di memoria? 29. Come è possibile dichiarare una variabile in modo che sia visibile solo all’interno del file sorgente corrente in linguaggio C? 30. Qual è il ruolo delle funzioni di conversione di tipo (casting) in programmazione? 31. Come la suddivisione del codice in funzioni può contribuire a una progettazione più sicura e a una gestione più efficace degli errori? 32. In che modo l’uso di funzioni garantisce leggibilità, manutenibilità, riusabilità e scomposizione funzionale al codice?

31


Unità 1

Domanda numero Risposta:

Domanda numero Risposta:

Domanda numero Risposta:

Domanda numero Risposta:

Domanda numero Risposta:

32


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.