Maple per la programmazione

    di Marisa Di Luca                                 

   marisadl@libero.it


 

Premessa

Alcune riflessioni sull’insegnamento dell’informatica nelle nostre scuole prendendo come riferimento il biennio dell’istituto tecnologico. Cosa vuol dire insegnare, oggi, informatica? Oggi che i nostri studenti “nativi digitali” sanno, o pensano di sapere, tutto sulla tecnologia?
Vorrei iniziare con una domanda: perché quella che nei paesi anglosassoni è la Computer Science nel nostro paese è diventata, spesso, “Informatica”? In alcuni casi si è perso il riferimento alla SCIENZA. Eliminare questo termine potrebbe significare svuotare l’insegnamento di quelle che sono le caratteristiche fondamentali proprie di una disciplina scientifica: la lettura problematica della realtà, un atteggiamento rivolto verso la scoperta, la risoluzione di problemi, la creatività, quindi il pensiero divergente. L’insegnamento dell’informatica sempre più è visto come la trattazione di aspetti tecnici a discapito di quelli procedurali e formativi. Anche nella programmazione si rileva, spesso, questo pericoloso atteggiamento.

Qualsiasi sia la tipologia di scuola l’insegnamento dell’informatica, soprattutto al biennio, deve necessariamente riguardare gli aspetti formativi piuttosto che quelli tecnicistici che contribuiscono in maniera forte all’acquisizione delle competenze necessarie nell’ottica del lifelong learning; mettere lo studente nelle condizioni di costruire autonomamente il proprio sapere.
Dando alla disciplina una connotazione molto tecnicistica, come si può pensare in questi termini? Qual è il ruolo della computer science nel nostro panorama scolastico? Cosa vuol dire “programmare”? “Scrivere un programma”? Molto, anzi troppo, spesso i nostri studenti, di fronte ad una situazione da risolvere mediante l’impostazione di un programma, si concentrano subito sulle istruzioni del linguaggio e procedono più o meno per tentativi sorvolando completamente su quella che risulta essere una fase fondamentale nella programmazione: l’analisi. Sempre più spesso gli studenti, di fronte ad una situazione problematica, non si concentrano sulla strategia da seguire per arrivare alla soluzione, ma piuttosto cercano di individuare quali istruzioni utilizzare, cioè la loro attenzione non è sul problema, ma sulle operazioni!
Riporto, per meglio chiarire questo concetto, la domanda di uno studente di seconda: “Prof, non ho capito quando nel SE va l’ALTRIMENTI e quando NO”; ecco un quesito di questo tipo fa capire come i ragazzi siano alla ricerca della “regola”, “della formula” da applicare. Bene: nella computer science non ci sono formule e regole da applicare! Ecco l’importanza della impostazione progettuale di un lavoro informatico, che inizia, appunto, con l’analisi del problema.
Tralasciando questa fase preliminare si rischiano gli stessi danni che sono stati registrati in questi anni con la matematica: insegnare “attraverso” l’esercizio. Quindi un approccio della didattica “per problemi” è non solo opportuna ma naturale proprio per le caratteristiche della disciplina, necessaria se si vuole che essa ricopra un ruolo importante nella formazione delle generazioni future.
Il riferimento ad una didattica per problemi è chiaro anche quando si analizzano i documenti di riferimento sulle competenze; fra le otto competenze chiave si trova: Risolvere problemi: affrontare situazioni problematiche costruendo e verificando ipotesi, individuando le fonti e le risorse adeguate, raccogliendo e valutando i dati, proponendo soluzioni anche originali e creative utilizzando contenuti e metodi delle diverse discipline”.
Quindi il primo passo che porta alla costruzione di un oggetto software riguarda proprio il problema, la sua analisi. Questa è la fase di problem solving, troppo spesso viene trascurata la fase di problem posing che non può essere solo il preparare il “cappello” ad una situazione, “contestualizzare” per portare la realtà nel problema, è il problema che disegna la realtà! Deve essere necessariamente coinvolta la capacità dello studente di “costruire” un problema partendo da una situazione reale. Di seguito un esempio di attività che va proprio in questo senso e che potrebbe costituire proprio l’inizio di un insegnamento “progettato” nella direzione del problem posing & solving.

 

Ricerca del problema

  • vengono consegnati agli studenti testi/storie senza dati nei quali si narrano eventi appartenenti al quotidiano degli alunni; il testo si chiude con una domanda;
  • a corredo del testo verranno riportate alcune domande con le relative risposte che consistono nei dati utili alla domanda scelta;
  • lo studente deve scegliere tra le domande proposte quelle che lui ritiene utili per rispondere al quesito del testo/storia;
  • a questo punto risolve il problema;
  • al termine si può prevedere la ri-scrittura del problema con i dati scelti.

Questo step è molto utile perché abitua lo studente ad una visione problematica della realtà. Prende un po’ di tempo per la sua organizzazione, tempo che però successivamente si recupererà.
Il problem solving riguarda la soluzione del problema che implica l’esame di tutte le informazioni e l’utilizzo razionale di tutti i metodi di cui disponiamo per affrontarlo. Ma perché sia una procedura efficace è necessario che si proceda per fasi, vediamo due schemi diversi, ugualmente validi e che vanno sempre nella direzione della riflessione critica che lo studente deve necessariamente percorrere perché si possa parlare di vero problem solving.

Il primo schema

  1. Analisi del problema.
  2. Applicazione della soluzione.
  3. Estensione: generalizzazione, discriminazione, rinforzo.

Il secondo schema

Fredericksen (1984) ha stilato una lista di operazioni utili per problemi diversi:

  1. Cerca di farti un’idea generale del problema, senza badare ai dettagli.
  2. Sospendi il giudizio fino a quando non disponi di un numero sufficiente di informazioni.
  3. Semplifica il problema usando parole chiave, diagrammi, simboli.
  4. Cerca di cambiare il modo con cui il problema è presentato.
  5. Poniti domande relative al problema.
  6. Cerca di essere critico e di mettere in discussione tutto ciò che sembra scontato.
  7. Ripercorri in senso contrario le tappe.
  8. Verbalizza ad alta voce il problema e le attività.

Quindi l’analisi di un problema, propedeutica della costruzione di un oggetto software, è molto delicata perché condiziona poi le scelte successive; richiede che la mente compia passaggi importanti per:

  1. Capire il testo: questo è un vero problema, si può risolvere? Quindi: circoscrivere il problema eliminando tutte le notizie/dati che non occorrono per arrivare alla soluzione. Qual è l’obiettivo? (OUTPUT).
  2. Individuare i dati/informazioni necessari. Cosa mi serve per raggiungere l’obiettivo? (INPUT).
  3. Vengono forniti i dati di cui ho bisogno? Ci sono dati/informazioni inutili? Qual è la loro natura?
  4. Quale strategia risolutiva? Esiste una sola strada? Qual è quella più conveniente? (PASSI, ALGORITMO).
  5. L’algoritmo: costruzione.
  6. Scelta dell’ambiente software che meglio si adatta alla formalizzazione dell’algoritmo (riflessione critica sullo strumento tecnologico).
  7. Validazione dell’algoritmo.
  8. Impostazione del programma.
  9. TEST e DEBUG del programma.

Gli studenti sono portati a “saltare” i punti da (1) ad (6) e partono subito con la scrittura del codice; molto spesso impiegano molto più tempo del necessario perché vanno per tentativi. Altro aspetto su cui riflettere è che spessissimo i ragazzi ignorano anche la fase di test e debug! Si limitano a “far girare” il programma e dicono: “Prof, non mi dà errori!”. Non si preoccupano di verificare se il programma fa esattamente ciò per cui è stato progettato e costruito! Così facendo la mente non ha la visione analitica di ciò che ha fatto, non riesce a collocare nella mappa cognitiva la strada che ha seguito perché non l’ha costruita, non riesce a validare il prodotto.
I punti da (1) a (6) sono tutte le fasi che richiede il problem solving “vero”; (7) e (8) possiamo dire che coinvolgono il computational thinking. Il CT si può definire come un metodo di risoluzione di problemi che utilizza la tecnologia informatica. I passi:

  • Scomposizione del problema in sottoproblemi, più semplici, verifica se i singoli sottoproblemi sono stati già affrontati. La scomposizione di un problema porta alla costruzione di un algoritmo risolutivo; Es: a) individuare i componenti quando assaggiamo un nuovo piatto, b) quando diamo indicazioni di una strada.
  • Definizione degli elementi costitutivi di un oggetto/situazione che daranno la possibilità di costruire modelli. Es: a) studenti che cercano di capire quali comportamenti sono graditi ai loro docenti, stanno identificando un modello.
  • Individuazione delle informazioni necessarie alla soluzione e generalizzazione per poter “esportare” la soluzione ad altri problemi simili; costruzione della sequenza di passi per la soluzione non del problema specifico, ma di tutti i problemi di una determinata classe (algoritmo).

Fatta questa premessa, ovvio che questo lavoro, sia in una classe di liceo sia in una del tecnologico, va fatto al biennio, periodo di “formazione” che possiamo definire “propedeutica” a quella successiva, più specialistica.

Quale software

La scelta dell’ambiente software a questo punto diventa QUASI irrilevante. La scelta è caduta su Maple sia per l’importanza della matematica nel tecnologico sia perché si dà agli studenti la possibilità di imparare ad utilizzare (almeno in parte) uno strumento che potrà essere sicuramente utile nel proseguimento degli studi.
Come usare Maple per l’introduzione alla programmazione? Ecco quali sono i passi che ho seguito nella mia esperienza. Ovviamente la presentazione dell’ambiente non è partita dai comandi, ma piuttosto da come poter “codificare” un algoritmo. I comandi sono stati “scoperti” dagli studenti stessi ogni volta che si sono trovati di fronte alle varie situazioni; hanno visto come la “libreria” fosse ricca e articolata.
Ho iniziato a presentare agli studenti problemi, chiedendo loro di risolverli impostando un foglio di lavoro utilizzando comandi Maple. Non ho chiesto loro di risolvere esercizi di matematica, ma di “tradurre” nel linguaggio Maple algoritmi che avevamo impostato. Il primo esempio che è stato presentato è il seguente.

Problema 

Il testo
Un numero è triplo di un altro e la loro somma è 64. Quali sono i due numeri?
L’analisi
Il testo ci chiede di individuare due numeri di cui sappiamo solo che uno è triplo di un altro. Chiamiamo x il primo numero, ovviamente l’altro sarà y=3*x.
Il nostro problema si risolve, quindi, impostando una equazione di primo grado, precisamente:
x+3*x=64
Risolvendo troveremo la x (primo numero), per individuare l’altro basterà moltiplicare quello trovato per 3.

Vediamo come si risolve con Maple.

In modalità DOCUMENT

 

In modalità WORKSHEET

 

Naturalmente è semplice, ma lo scopo era di introdurre l’ambiente.

Ma Maple dà la possibilità di impostare un foglio di lavoro utilizzando tutti i costrutti fondamentali della programmazione strutturata: sequenza, selezione (binaria e multipla), iterazione (definita e indefinita). Per impostare un “programma” possono essere utilizzate istruzioni proprie di Maple insieme con i comandi Maple. Ovviamente quando si imposta un percorso sequenziale si tratta semplicemente di impostare in sequenza i vari comandi. Un semplice esempio:

Anche questo esempio è semplice, naturalmente. Di seguito vengono presentate le istruzioni per la selezione binaria e quella multipla, per il ciclo definito e indefinito. Infine un cenno sulle procedure: Sarà evidente che non ci sono differenze sia di scrittura sia sostanziali con altri ambienti di programmazioni (C++, Python).

Al di là delle differenze relative alla sintassi la sostanza non cambia.Sia in Maple sia in C++, ovviamente, possiamo utilizzare i connettivi logici, cambiano solo le modalità di scrittura.

Sia in Maple sia in C++, ovviamente, possiamo utilizzare i connettivi logici, cambiano solo le modalità di scrittura.

Sono state tralasciate alcuni possibilità ulteriori dei due linguaggi: ad esempio in Maple nel ciclo for può essere utilizzata la clausola by che indica l’incremento dell’indice; in C++ le operazioni aritmetiche possono essere “compattate”: i=i+1 si può scrivere i++; a=a+b si può scrivere a=+b. Questo perché lo scopo era quello di INTRODURRE gli studenti alla “traduzione di un algoritmo in programma”.

Le procedure

In Maple possono essere costruite procedure che introducono gli studenti ad alcuni concetti fondamentali quali: variabile locale, variabile globale, di “ritorno”, di parametro.
Alcuni punti fondamentali:
a) una procedura si identifica con la parola chiave proc e con una assegnazione ad una variabile
b) end proc chiude una procedura
c) return mi dice cosa mi viene restituito successivamente alla chiamata
d) possono essere definite variabili locali o globali; le prime si utilizzano solo ed esclusivamente all’interno della procedura, sono variabili di "comodo", di "lavoro"; quelle globali hanno senso anche fuori dalla procedura

Vediamo qualche primo semplice esempio:

 

Esempio 

Il testo
Riprendiamo un problema risolto utilizzando i comandi Maple. Tre studenti si sottopongono ognuno a tre prove riportando le relative valutazioni. Si vuole avere la media più alta.

Analisi
Le variabili sono 9: siano a1, a2, a3 le valutazioni del primo studente, b1, b2, b3 del secondo e c1, c2, c3 del terzo. Come viene calcolata la media? Sommando i tre voti e dividendo per 3.
L’idea è quella di costruire una procedura per il calcolo della somma di tre numeri x, y, z e richiamare tale procedura per tre volte. Vediamo

PROCEDIMENTO 1

a1 := 7;
a2 := 5;
a3 := 4;
SommaRossi := Somma(a1, a2, a3)                 16

Nella variabile SommaRossi ho calcolato la somma dei voti dello studente Rossi, procediamo con gli altri

b1 := 3;
b2 := 8;
b3 := 6;
SommaBianchi := Somma(b1, b2, b3)              17

c1 := 6;
c2 := 8;
c3 := 7;
SommaVerdi := Somma(c1, c2, c3);                 21

Vediamo come calcolare la media:

MediaRossi := (1/3)*SommaRossi;                16/3

Mi restituisce una frazione, vediamo come possiamo avere un valore numerico. Un metodo potrebbe essere quello di usare il tasto destro e di scegliere di arrotondare, vediamo:

MediaRossi := (1/3)*SommaRossi;             5.3333

MediaBianchi := (1/3)*SommaBianchi;       5.6667

MediaVerdi := (1/3)*SommaVerdi               7.

Non ho finito, devo ancora individuare il massimo, utilizzo la funzione max

max(MediaRossi, MediaBianchi, MediaVerdi);           7

 

PROCEDIMENTO 2

Adesso domandiamoci: non potremmo calcolare la media direttamente nella procedura ed avere come ritorno non più la somma, ma la media? Certamente, vediamo:

Media := proc (x, y, z) local somma, M; somma := x+y+z; M := (1/3)*somma end proc;

Vediamo come si avere un risultato float: c’è il comando evalf che inserito in una formula dà il risultato reale.

a1 := 7;
a2 := 5;
a3 := 2;
media := evalf((a1+a2+a3)*(1/3)); 4.666666667
Quindi possiamo inserire l’evalf nella formula all’interno della procedura

Media := proc (x, y, z) local somma, M; somma := x+y+z; M := evalf((1/3)*somma); return M end proc;

Sempre facendo riferimento ad una classe del biennio, in Maple possono essere introdotte anche variabili strutturate quali vettori e matrici usando le “palette”. Di seguito una immagine del worksheet Maple che riporta la costruzione di una matrice 2×2.

 

Ovviamente queste poche righe non sono esaustive circa le possibilità di usare il software Maple per introdurre gli studenti alla programmazione, ma rendono l’idea della delicatezza del lavoro nel biennio e di come sia difficile il lavoro degli operatori che devono insegnare non semplici contenuti, ma piuttosto guidare i ragazzi al ragionamento, alla lettura della realtà. Tutto questo è molto difficile, ma è una sfida che i docenti di questa disciplina devono raccogliere, non possono ignorare.

 

Condividi!
Share On Twitter

You may also like...

Show Buttons
Share On Facebook
Share On Twitter
Share On Google Plus
Hide Buttons