



Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Informatica, programmazione procedurale teoria
Tipologia: Dispense
1 / 6
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!




In questo modo è possibile ridurre la complessità, insita nel realizzare un algoritmo complesso, in una serie di algoritmi più semplici che risolveranno il problema originario. Top-down: La metodologia che, partendo dal problema generale (top), chiamato problema principale, lo scompone in sottoproblemi più semplici. In proc sfruttata per l’analisi e la comprensione del problema. La Bottom-up si focalizza e privilegia invece l’aspetto esecutivo (“come devo operare”) su il funzionale (“cosa devo fare”), procedendo dal particolare verso il generale secondo una strategia induttiva che si concentra sui punti cardine del problema. Usata per la ricerca di sfruttare codice già esistente ad alcuni livelli. Il sottoalgoritmo : una parte dell’algoritmo che risolve un particolare sottoproblema. Tecnicamente un sottoalgoritmo è una parte dell’algoritmo risolutivo che non può essere eseguito autonomamente, ma solo su invocazione e controllo dell’algoritmo (o del sottoalgoritmo) che lo invoca, che è denominato ‘chiamante’. Algoritmo principale (main) programma principale, che descrive e gestisce globalmente il problema, implementandone le funzionalità. Un insieme di sottoalgoritmi sottoprogr. che risolvono i singoli problemi. Un sottoprogramma può essere richiamato anche più volte Dal programma principale, Da altri sottoprogrammi nello stesso programma, Da altri programmi. Conviene descrivere e implementare un’attività per mezzo di un sottoalgoritmo quando Non conviene È di interesse generale Non è di interesse generale ma si presenta più volte all’interno del programma Pur essendo di scarso interesse generale, permette una maggiore leggibilità È di scarso interesse generale Non migliora la leggibilità del programma o, addirittura, la peggiora L’utilizzo della programmazione procedurale permette quindi di ottenere i seguenti benefici:
L’uso di variabili globali deve essere attentamente valutato e ridotto al minimo. Le variabili globali rischiano infatti di generare interazioni tra diverse parti del programma, perdendone il controllo e rendendo difficile individuare, isolare e correggere eventuali errori (bug). Un eccessivo uso di variabili globali è indice del fatto che il programma non è stato attentamente analizzato e scomposto globali locali Sono allocate (e inizializzate) in ogni caso Rimangono allocate per tutta la durata del programma Vengono inizializzate solo una volta Sono allocate (e inizializzate) ogni volta che si entra nel sottoprogramma Rimangono allocate solo per la durata del sottoprogramma Vengono inizializzate tutte le volte che viene chiamato il sottoprogramma SCOPE All’interno di un programma, ogni oggetto ha il suo campo di validità (scope) , cioè l’ambito in cui è ‘visibile’ e può essere usato e riconosciuto. I principi che regolano il campo di visibilità degli oggetti globali e locali di un programma sono i seguenti: 1.Gli oggetti globali sono accessibili a (e visibili in) tutto il programma
int : è il tipo del risultato calcolato dal metodo somma10: è il nome del metodo (identificatore per il quale valgono le stesse regole sintattiche delle variabili) () : all’interno delle parentesi è possibile indicare eventuali parametri: vedremo degli esempi più avanti return : è il comando che termina l’esecuzione del metodo, e fornisce il risultato (dato da una espressione), il tipo di una funzione deve essere compatibile con il return, deve essere raggiungibile (se lo metto in un if il compilatore dice che potrebbe non essere mai raggiunto e da errore). Un modificatore è una parola chiave di Java che può essere usata per modificare in qualche modo le funzionalità e le caraReris5che di un metodo o una variabile: e.g. public, static, final, …. Un modificatore sta ad un componente di un’applicazione Java come un aggettivo sta ad un sostantivo nel linguaggio umano. INVOCAZIONE DI UN METODO quando adiamo a invocare un metodo in java utilizza una particolare area di memoria (stack) in cui vengono memorizzati tutte quelle informazioni che servono per gestire le chiamate alle funzioni, questi blocchi di memoria vengono chiamati record di attivazione. Record di attivazione : blocco di memoria (dello stack) che contiene i parametri attuali della funzione, le varibili locali di quella funzione, l’indirizzo di ritorno cioè il punto del metodo chiamante cui bisogna cedere il controllo (e restituire il risultato) alla fine dell’esecuzione del metodo invocato. Lo stack è un’area di memoria in cui la JVM alloca le variabili locali. Gli oggetti (le variabili d’istanza) vengono invece allocati nello Heap, che è invece quel sito della memoria nella quale vengono allocati gli oggetti appena creati: nello heap “vivono” i componenti (classi e oggetti). In una sequenza di chiamate di metodi (uno dentro l’altro) l’ultimo metodo chiamato è il primo a terminare l’esecuzione. I record di attivazione formano quindi una pila (o stack). Quando un metodo termina l’esecuzione: l il controllo passa all’istruzione del metodo chiamante riferita dall’indirizzo di ritorno, eventualmente con il passaggio del risultato. Il frame del metodo corrente viene disallocato (chiusi e quindi persi) , mentre il metodo chiamante riprende l’esecuzione. JAVA Un programma Java e' costituito da un insieme di classi (almeno una) public significa che questa classe e' pubblica: puo' essere utilizzata da qualunque altra classe del programma. Un metodo e' una funzionalita' della classe messa disposizione del resto del programma o di altre parti (altri metodi) della stessa classe. Questo metodo e' chiamato main (principale) ed e' un metodo speciale. Viene subito eseguito all'inizio del programma. public significa che questo metodo puo' essere usato da altre classi System.out e' un oggetto che rappresenta il canale di output standard del sistema (la console...) println e' un metodo dell'oggetto System.out che stampa un messaggio e va a capo Un oggetto e' un'entita attiva che corrisponde a una determinata classe (vedremo...) Ogni variabile deve essere dichiarata UNA SOLA VOLTA (la prima volta che compare nel programma) Prima di poter essere usata (letta) in un'espressione una variabile deve: essere stata dichiarata, essere stata assegnata almeno una volta (inizializzata)
Nella libreria (package) java.util (di cui è necessario farne l'import, in quanto non è importata automaticamente come la libreria java.lang) è presente la Classe Scanner , che permette di leggere dati da un dispositivo di input. Se ne nostro programma vogliamo leggere dallo standard input (il monitor), possiamo sfruttare i metodi della Classe Scanner che ci facilita l'operazione di lettura: Per ricevere valori in input dall'utente si usa in Java la classe Scanner, che fa parte della Libreria Standard di Java (detta Java API). La classe Scanner deve essere richiamata usando la direttiva import prima dell'inizio della classe: import java.util.Scanner; // richiama la classe Scanner Scanner input = new Scanner (System.in); predispone il programma per la lettura dell'input. L'oggetto input (che puo essere chiamato anche differentemente) deve essere predisposto (creato) prima di Iniziare a chiedere i valori all'utente. Istanziamo un oggetto della Classe Scanner, richiamandone il costruttore e passandogli come l'oggetto System.in1) (creiamo cioè un oggetto che potrà leggermi dati dallo standard input): input.nextInt() ; attende l'inserimento di due numeri e li assegna. Richiamiamo i metodi dell'oggetto (input) appena creato (definiti nella Classe Scanner) per leggere i valori in input a seconda del tipo dei valori attesi:La lettura vera e propria dei valori in input si fa tramite metodi diversi a seconda del tipo dei valori attesi: x = input.nextInt(); y = input.nextDouble(); OUTPUT: Nella libreria (package) java.lang (la più importante di Java, che racchiude le Classi fondamentali del linguaggio e che non è necessario farne l'import, in quanto importata automaticamente) è presente una particolare classe, System, che contiene: System.out: è un oggetto definito nella Classe System (di tipo: Static PrintStream out), che rappresenta lo standard output. La Classe PrintStream (statica) contiene i metodi print() e println(), che permettono la stampa di caratteri, stringhe, numeri, etc. Questo ci permette di richiamare il metodo: System.out.print() per stampare sullo standard output (il monitor) qualsiasi cosa. TRADUZIONE: Occorre sempre tradurre il programma dal programma utilizzato (codice sorgente) in LM (Linguaggio Macchina) (codice oggetto). I traduttori sono di due tipologie : compilatori e interpreti. Compilatori: prende in input il codice sorgente e lo traduce completamente in codice oggetto. L’esecuzione del file oggetto è possibile solo a traduzione ultimata. Interpreti : traduce ed esegue immediatamente ogni singola istruzione del codice sorgente, e la manda in esecuzione Un programma scritto in linguaggio Java viene tradotto, all’atto della compilazione, in un insieme di istruzioni definite dalla Macchina Virtuale Java (Java Virtual Machine - JVM) Il codice binario (detto bytecode ) prodotto dalla compilazione Java viene poi eseguito dalla Java Virtual Machine (che è pertanto l’interprete che esegue il programma , avendo anche il compito di caricare ‘run-time’ quanto serve per l’esecuzione (ad ex. le Classi delle librerie standard Java usate dal programma) L'interprete del byte-code Java è detto Java Virtual Machine (JVM)