Programmazione ad Oggetti

Slides:



Advertisements
Presentazioni simili
Trieste, 26 novembre © 2005 – Renato Lukač Using OSS in Slovenian High Schools doc. dr. Renato Lukač LinuxDay Trieste.
Advertisements

I numeri, l’ora, I giorni della settimana
L’esperienza di un valutatore nell’ambito del VII FP Valter Sergo
Cache Memory Prof. G. Nicosia University of Catania
Teoria e Tecniche del Riconoscimento
Ambiente Java.
Interfacce Java.
1 Teaching Cloud Computing and Windows Azure in Academia Domenico Talia UNIVERSITA DELLA CALABRIA & ICAR-CNR Italy Faculty Days 2010.
DG Ricerca Ambientale e Sviluppo FIRMS' FUNDING SCHEMES AND ENVIRONMENTAL PURPOSES IN THE EU STRUCTURAL FUNDS (Monitoring of environmental firms funding.
JPA Overview della tecnologia. Java Persistence Architecture Definita nella JSR-220 EJB 3.0 ( Tentativo di unificare EJB2.1 con.
Massa Laura Mela Enrica
1.E un algoritmo ricorsivo: Tutti le istanze di oggetti raggiungibili da un oggetto persistente diventano anchessi persistenti.
Università La Sapienza Web programming e programmazione multimediale 1 Web Programming e comunicazione multimediale Lezione 10: PHP.
Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – – SIENA.
Pierluigi Plebani - Politecnico di Milano MAIS Registry URBE (Uddi Registry By Example) WP2 Roma - 25 Novembre 2005.
1 Fac.Scienze – Università di Trento Programmazione 2 - Marco Ronchetti Java JAVA: una introduzione.
Esempio: Tombola! Parte seconda.
Unified Modeling Language class C {…} class B extends C {…} Esiste una notazione grafica per mostrare le relazioni di ereditarietà. Object StringC B Tutte.
1 Fac.Scienze – Università di Trento Programmazione 2 - Marco Ronchetti Java JAVA: una introduzione.
J0 1 Marco Ronchetti - Corso di Formazione Sodalia – Febbraio 2001 – Modulo Web Programming Tomcat configuration.
Sezione: Costruttori Costruttori. Definizione dei costruttori Se per una classe A non scrivo nessun costruttore, il sistema automaticamente crea il costruttore.
Programmazione II Marco Ronchetti
prompt> java SumAverage
1 struct Pila { private: int size; int defaultGrowthSize; int marker; int * contenuto; void cresci(int increment); public: Pila(int initialSize) ; Pila();
C Consiglio Nazionale delle Ricerche - Pisa Iit Istituto per lInformatica e la Telematica Reasoning about Secure Interoperation using Soft Constraints.
Biometry to enhance smart card security (MOC using TOC protocol)
Corso di Laurea in Ingegneria Elettronica - U niversità di N apoli F EDERICO II Autori XXXXX XXXXXXX YYYYY YYYYYYY ZZZZZ ZZZZZZZ Titolo tesina Parte X:
Costruzione di Interfacce Lezione 10 Dal Java al C++ parte 1
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
1. Conoscere luso delle collezioni in Java Comprendere le principali caratteristiche nelle varie classi di Collection disponibili Saper individuare quali.
Progetto Sicurezza di rete
Gestione dei Progetti Software 2 (a.a. 2004/05) - Lezione 3 1 JAVA e Internet: il World Wide Web Internet: milioni di computer collegati fra di loro attraverso.
Programming with JXTA Hello World Peer discovery Peer Group discovery Creating Peer group Joining a Peer Group.
2000 Prentice Hall, Inc. All rights reserved. 1 Capitolo 3 - Functions Outline 3.1Introduction 3.2Program Components in C++ 3.3Math Library Functions 3.4Functions.
CAPITOLO 4 LINGUAGGIO JAVA: COSTRUTTI DI BASE. ALFABETO Java adotta la codifica standard Unicode della società Unicode, Inc. (ftp://ftp.unicode.org) definito.
2000 Prentice Hall, Inc. All rights reserved. 1 Capitolo 6: Classi e astrazione dati 1.Introduzione 2.Definizione delle strutture 3.Accedere ai membri.
Array Ricerca Ordinamento Fusione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.
1 laboratorio di calcolo II AA 2003/04 ottava settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
Classi e Oggetti.
ATE / 31 Lezione 3 i sistemi automatici di misurazione - gli ATE.
Argomenti della lezione
Programmazione in Java
Programmazione in Java Claudia Raibulet
realizzazione app per Google Android OS
Palermo, may 2010 F.Doumaz, S.Vinci (INGV-CNT- Gruppo di telerilevamento)
Ischia, giugno 2006Riunione Annuale GE 2006 Exploiting the Body Effect to Improve Analog CMOS Circuit Performances *P. Monsurrò, **S. Pennisi, *G.
JAVA Franco Bombi 8 ottobre FB Introduzione Java è un linguaggio di impiego generale, basato su classi e orientato agli oggetti Java.
PROGETTO DI STRUMENTI PER LA CONFIGURAZIONE DI APPLICAZIONI JAVA ENTERPRISE Anno Accademico 2006 / 2007 Sessione III FACOLTÀ DI INGEGNERIA CORSO DI LAUREA.
1 Lucidi delle esercitazioni di Sistemi di Elaborazione in Rete Università degli Studi della Calabria Corso di Laurea in Ingegneria Informatica A.A. 2003/2004.
Funzioni stringhe. chr Restituisce il carattere di un valore ascii dato. Per vedere lelenco dei codici ascii clicca QQQQ uuuu iiiiEsempio
Tutor: Elisa Turrini Mail:
Test con JUnit. zJUnit è un ambiente di test per programmi Java ySviluppato da Kent Beck É possibile usare JUnit allinterno di Eclipse per eseguire i.
Giovedì 17 Aprile 2008 Heroes {Community} Launch Giovedì 17 Aprile 2008.
1 Numeri interi e numeri in virgola mobile F. Bombi 2 6 novembre 2003.
Appunti di Java (J2SDK 1.4.2, JDK 1.6.0) prof. Antonella Schiavon settembre 2009.
Analysis and Development of Functions in REST Logic: Application to the «DataView» Web App UNIVERSITA’ DEGLI STUDI DI MODENA E REGGIO EMILIA DIPARTIMENTO.
Collection & Generics in Java
Introduction to automatic ABMs documentation Keywords: Doxygen ODD protocol MASON documentation Simone Romano.
Programmazione ad Oggetti
Lezione n°27 Università degli Studi Roma Tre – Dipartimento di Ingegneria Corso di Teoria e Progetto di Ponti – A/A Dott. Ing. Fabrizio Paolacci.
Linguaggio Java e Algoritmi ( 09CBIPC, 09CBIMQ ) Corsi di Laurea in Ingegneria del cinema e dei mezzi di comunicazione Matematica per l’Ingegneria Silvano.
Esercitazione sull’ ordinamento 20 maggio 2003
Lezione 2 : Basi del linguaggio Variabili. Come visto nella lezione 1 le classi registrano il proprio stato nelle variabili  int cadenza = 0;  int velocita.
Introduzione. 2 Perché Java? Java è un linguaggio di programmazione nato per essere eseguito su macchine e sistemi operativi molto diversi fra loro. A.
Java World Introduzione.
Corso di Reti di Calcolatori Programmazione Java
Corso Java Introduzione.
Java Introduzione.
Transcript della presentazione:

Programmazione ad Oggetti ( 09CBIPC, 09CBIMQ ) Corsi di Laurea in Ingegneria del cinema e dei mezzi di comunicazione Matematica per l’Ingegneria Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Obiettivi del corso Obiettivi Competenze acquisite Prerequisiti Il corso ha lo scopo di introdurre i concetti base della programmazione ad oggetti dal punto di vista dell’ingegneria del software. La metodologia di programmazione è presentata nel contesto delle diverse fasi che compongono il ciclo di vita del software ed è illustrata da numerosi esempi realizzati in linguaggio Java e descritti mediante diagrammi UML Competenze acquisite Conoscenza teorica e sperimentale della metodologia di sviluppo del software object oriented, del linguaggio Java, dell’ambiente integrato di sviluppo Eclipse Prerequisiti concetti base dell’informatica linguaggio C Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Programma Algoritmi e strutture dati Object Oriented Programming Linguaggio Java Complessità computazionale Sviluppo di algoritmi per raffinamenti successivi Algoritmi ricorsivi Algoritmi di ordinamento Algoritmi di ricerca Strutture dati ricorsive Liste, Stack, Code, Alberi Object Oriented Programming Classi Oggetti Ereditarietà Polimorfismo Exception Handling Java Class Library Collections Framework Files and Streams Graphical User Interfaces Reflection  Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Dipartimento di Automatica e Informatica Docente Prof. Silvano Rivoira Dipartimento di Automatica e Informatica 011 090 7056 silvano.rivoira@polito.it http://staff.polito.it/silvano.rivoira Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Organizzazione del corso Lezione Mercoledì - 13.00/14.30 - aula 2T Laboratorio Mercoledi` - 14.30/16.00 – aula5T Ricevimento su appuntamento Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Materiale e testi Libri Software Slides The Java Tutorials http://docs.oracle.com/javase/tutorial/index.html P. Deitel, H. Deitel : Java How to Program , International Edition 9/E, Pearson, 2011 http://catalogue.pearsoned.co.uk/catalog/academic/product?ISBN=9780273759768 Software Java Platform (JDK) , Standard Edition (SE) http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html JDK API Documentation http://www.oracle.com/technetwork/java/javase/documentation/java-se-7-doc-download-435117.html Eclipse http://www.eclipse.org/downloads/packages/eclipse-ide-java-developers/junor Slides http://staff.polito.it/silvano.rivoira/didattica.html Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

L'esame consiste in una prova scritta: Algoritmi e strutture dati Domande sulla teoria Object Oriented Programming Sviluppo di un progetto software in linguaggio Java mediante Eclipse Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Java language Originally developed by James Gosling at Sun Microsystems and released in 1995 It derives much of its syntax from C and C++ Java applications are typically compiled to bytecode that can run on any Java Virtual Machine (JVM) regardless of computer architecture As of May 2007 Sun relicensed most of its Java technologies under the GNU General Public License Sun Microsystems was acquired by Oracle Corporation's in 2010 Java is as of 2012 one of the most popular programming languages in use, particularly for client-server web applications, with a reported 10 million users Google and Android, Inc. have chosen to use Java to design applications for the Android operating system, an open-source operating system built on the Linux 2.6 kernel, designed primarily for touchscreen mobile devices (smartphones, tablet PCs, mobile Internet devices, …) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Java Environment Java bytecodes Java Virtual Machine (Java VM) platform-independent intermediate language Java Virtual Machine (Java VM) virtual machine able to execute Java bytecodes Java bytecodes Java source Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Java Portability any implementation of Java VM can execute Java bytecodes Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Java Security Check of correctness of parameter types and compliance with access rules Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Java Platform Java Application Programming Interface (Java API) set of Java bytecodes libraries (packages) supporting a large range of functionalities http://docs.oracle.com/javase/6/docs/api/index.html Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Java Technology CDC = Connected Device Configuration CLDC = Connected Limited Device Configuration PDA = Personal Digital Assistant (palmare) POS = Point Of Sale Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Java Platform - Standard Edition Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Java Development Kit (JDK) Tools javac The compiler for the Java programming language. java The launcher for Java applications. javadoc API documentation generator. appletviewer Run and debug applets without a web browser. jar Manage Java Archive (JAR) files. jdb The Java Debugger. javah C header and stub generator. Used to write native methods. javap Class file disassembler extcheck Utility to detect Jar conflicts. Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Java: HelloWorld program HelloWorld.java public class HelloWorld { /* The HelloWorld class implements an application that displays "Hello World!" to the standard output */ public static void main ( String[] args ) { System.out.println( "Hello World!" ); } Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Eclipse Integrated Development Environment (IDE) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Java: Primitive Data Types Keyword byte short int long float double char boolean Description Byte-length integer Short integer Integer Long integer Single-precision floating point Double-precision floating point A single character A boolean value (true or false) Size/Format 8-bit two's complement 16-bit two's complement 32-bit two's complement 64-bit two's complement 32-bit IEEE 754 64-bit IEEE 754 16-bit Unicode character true or false (integers) Literal Data type 178 int 8864L long 37.266 double 37.266D 87.363F float 26.77e3 ' c' char true boolean false (real numbers) (other types) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Java: Arithmetic Operators Use Description ++ op++ Increments op by 1; evaluates to the value of op before it was incremented ++op Increments op by 1; evaluates to the value of op after it was incremented -- op-- Decrements op by 1; evaluates to the value of op before it was decremented --op Decrements op by 1; evaluates to the value of op after it was decremented + op1 + op2 Adds op1 and op2 - op1 - op2 Subtracts op2 from op1 * op1 * op2 Multiplies op1 by op2 / op1 / op2 Divides op1 by op2 % op1 % op2 Computes the remainder of dividing op1 by op2 Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Java: Relational and Conditional Operators Use Returns true if && op1 && op2 op1 and op2 are both true , conditionally evaluates op2 || op1 || op2 either op1 or op2 is true , conditionally evaluates op2 ! ! op op is false & op1 & op2 op1 and op2 are both true , always evaluates op1 and op2 | op1 | op2 either op1 or op2 is true , always evaluates op1 and op2 ^ op1 ^ op2 if op1 and op2 are different--that is if one or the other of the operands is true but not both > op1 > op2 op1 is greater than op2 >= op1 >= op2 op1 is greater than or equal to op2 < op1 < op2 op1 is less than op2 <= op1 <= op2 op1 is less than or equal to op2 == op1 and op2 are equal != op1 != op2 op1 and op2 are not equal op1 == op2 Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Java: Shift and Logical Operators Use Operation >> op1 >> op2 shift bits of op1 right by distance op2 << op1 << op2 shift bits of op1 left by distance op2 >>> op1 >>> op2 shift bits of op1 right by distance op2 (unsigned) & op1 & op2 bitwise and | op1 | op2 bitwise or ^ op1 ^ op2 bitwise xor ~ ~op2 bitwise complement Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Java: Assignment Operators Use Equivalent to += op1 += op2 op1 = op1 + op2 -= op1 -= op2 op1 = op1 - op2 *= op1 *= op2 op1 = op1 * op2 /= op1 /= op2 op1 = op1 / op2 %= op1 %= op2 op1 = op1 % op2 &= op1 &= op2 op1 = op1 & op2 |= op1 |= op2 op1 = op1 | op2 ^= op1 ^= op2 op1 = op1 ^ op2 <<= op1 <<= op2 op1 = op1 << op2 >>= op1 >>= op2 op1 = op1 >> op2 >>>= op1 >>>= op2 op1 = op1 >>> op2 op1= op2; Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Java: Other Operators Operator Use Description ?: op1 ? op2 : op3 If op1 is true, returns op2. Otherwise, returns op3. [ ] type [] Declares an array of unknown length, which contains type elements. type [ op1 ] Creates and array with op1 elements. Must be used with the new operator. op1[ op2 ] Accesses the element at op2 index within the array op1. Indices begin at 0 and extend through the length of the array minus one. . op1.op2 Is a reference to the op2 member of op1. ( ) op1(params) Declares or calls the method named op1 with the specified parameters. The list of parameters can be an empty list. The list is comma-separated. (type) (type) op1 Casts (converts) op1 to type . An exception will be thrown if the type of op1 is incompatible with type. new new op1 Creates a new object or array. op1 is either a call to a constructor, or an array specification. instanceof op1 instanceof op2 Returns true if op1 is an instance of op2 Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Java: Control Flow Statements - looping while (boolean expression) { statement(s) } do { statement(s) } while (boolean expression); for (initialization ; termination ; increment ) { statement(s) } Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Java: Control Flow Statements – decision making if (boolean expression) { statement(s) } else { statement(s) switch (expression) { case constant expression : statement(s) break; ... default: statement(s) break; Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Java: Control Flow Statements – branching label: someJavaStatement ; break; terminates the innermost switch , for , while , or do-while statement break label; terminates an outer switch , for , while , or do-while statement with the given label continue; terminates the current iteration of the innermost loop continue label; terminates the current iteration of the loop with the given label return; terminates the current method return value; terminates the current method and returns a value to the method's caller Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Java: Creating Arrays Declaring a Variable to Refer to an Array int[] anArray; // declare an array of integers float[] anArrayOfFloats; boolean[] anArrayOfBooleans; Object[] anArrayOfObjects; String[] anArrayOfStrings; Creating an Array anArray = new int[10]; // create an array of 10 integers Declaring, Creating and Initializing an Array boolean[] answers = { true, false, true, true, false }; Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Java: Using Arrays Getting the Size of an Array Copying Arrays System.arraycopy (Object source, int srcIndex, Object dest, int destIndex, int length) Getting the Size of an Array arrayname.length Accessing an Array Element anArray[i] source Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Java: Iterating through Arrays (for statement) class ForDemo { public static void main(String[] args) int[] numbers = {1,2,3,4,5,6,7,8,9,10}; for (int i=0 ; i<numbers.length ; i++) System.out.print(" " + numbers[i]); } Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Java: Iterating through Arrays (enhanced for statement) class EnhancedForDemo { public static void main(String[] args) int[] numbers = {1,2,3,4,5,6,7,8,9,10}; for (int item : numbers) System.out.print(" " + item); } Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Software Quality Software Quality Functionality Usability Performance to perform the requirements and specification to perform the requirements and specification Functionality Usability to be user friendly to be user friendly to provide appropriate response and processing time to provide appropriate response and processing time Performance to be in a failure-free condition at all times to be in a failure-free condition at all times Reliability Software Quality to perform appropriately, relative to the amount of resources used to perform appropriately, relative to the amount of resources used Efficiency to be easily and transparently upgradable to be easily and transparently upgradable Scalability to have consideration for future growth to have consideration for future growth Extensibility Security to keep away from security threats to keep away from security threats Maintainability to be easily modifiable to be easily modifiable Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Complessità computazionale algoritmo : sequenza finita di operazioni, capace di risolvere un determinato problema in un tempo finito programma : rappresentazione di un algoritmo mediante un linguaggio di programmazione dimensione di un problema : intero positivo n proporzionale allo spazio occupato dai dati di ingresso relativi al problema complessità temporale ( o spaziale ) di un algoritmo : indicazione del tempo ( o dello spazio) richiesto dall'algoritmo in funzione della dimensione n del problema Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Complessità worst/average case complessità nel caso peggiore ( worst-case ) : Dn è l'insieme degli ingressi I di dimensione n t(I) è il tempo di esecuzione relativo all'ingresso I complessità media ( average-case ) : p(I) è la probabilità di I W(n) = max { t(I) ç I Î Dn } A(n) = å p(I) t(I) I Î Dn Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Complessità Asintotica insieme delle funzioni che crescono con rapidità non superiore a quella di f(n) insieme delle funzioni che crescono con rapidità uguale a quella di f(n) insieme delle funzioni che crescono con rapidità non inferiore a quella di f(n) O( f(n) ) W( f(n) ) Q( f(n) ) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Notazione O O( f(n) ) è l'insieme di tutte le funzioni g(n) tali che esistano due costanti positive c e m per cui : g(n) £ c f(n) , "n ( n ³ m ) g(n) Î O( f(n) ) se lim = c La notazione O delimita superiormente la crescita asintotica della complessità e fornisce quindi una indicazione della bontà di un algoritmo g(n) f(n) n ® ¥ O(c) Ì O(log n) Ì O( (log n)k ) Ì O(n) Ì O( n(log n)k ) Ì Ì O(nk) Ì O( nk(log n)h ) Ì O(nk+1) Ì O(dn) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Notazione W W( f(n) ) è l'insieme di tutte le funzioni g(n) tali che esistano due costanti positive c e m per cui : g(n) ³ c f(n) , "n ( n ³ m ) g(n) Î W(f(n)) se lim = f(n) Î O( g(n) ) se e solo se g(n) Î W( f(n) ) Un algoritmo di complessità O( f(n) ) si dice ottimo se qualunque algoritmo che risolva lo stesso problema ha complessità W ( f(n) ) c > 0 ¥ g(n) f(n) n ® ¥ Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Programming in the Small/Large software projects are developed by single programmers main problems to be solved: choice of appropriate data structures development of efficient algorithms Programming in the large software projects are developed by large groups of programmers different groups make development (analysis, design, coding, integration, testing) maintenance (extensions, upgrading) over large time intervals good choice of software components communication of information among components component integration Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Sviluppo di algoritmi per raffinamenti successivi definizione delle specifiche del problema scomposizione del problema in una sequenza , o selezione , o iterazione di sottoproblemi e definizione delle specifiche di ciascun sottoproblema soluzione ricorsiva del problema codifica della soluzione scelta di un problema start stop si no la soluzione del problema è esprimibile direttamente nel linguaggio di programmazione prescelto ? uno dei sottoproblemi generati coincide con uno dei problemi da cui è stato derivato ? ancora problemi da risolvere ? Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Massimo Comune Divisore (1) MCD(a,b) = MCD(b,a) MCD(a,a) = a MCD(a,0) = a /* a,b interi positivi */ CALCOLA MassimoComuneDivisore(a,b) /* MCD(a,b) */ P Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Massimo Comune Divisore (2) /* a,b interi positivi */ { int x,y; P1: INIZIALIZZA x,y ; /* MCD(x,y) = MCD(a,b) */ while (x!=y) P2: RIDUCI |x-y| SENZA VARIARE MCD(x,y) ; } /* x = MCD(a,b) */ P MCD(a,a) = a { x=a; y=b; P1 Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Massimo Comune Divisore (3) Se k è divisore comune di x e y Þ x = k qx ; y = k qy Þ |x-y| = k |qx - qy| Þ k è divisore comune di |x-y| /* MCD(x,y) = MCD(a,b); x!=y */ { if (x>y) x -= y; else y -= x; } /* MCD(x,y) = MCD(a,b) */ P2 Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Massimo Comune Divisore (4) /* a,b interi positivi */ { int x,y; /* P1: INIZIALIZZA x,y */ x=a; y=b; /* MCD(x,y) = MCD(a,b) */ while (x!=y) /* P2: RIDUCI |x-y| SENZA VARIARE MCD(x,y) */ if (x>y) x -= y; else y -= x; } /* x = MCD(a,b) */ P Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Massimo Comune Divisore (5) public class Mcd1 { public static void main( String[] args ) System.out.println("MCD(42,56)= "+ mcd(42,56)); } static int mcd(int a, int b) while (a!=b) if (a>b) a -= b; else b -= a; return a; Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Massimo Comune Divisore (6) /* a,b interi positivi */ { int x,y; P1: INIZIALIZZA x,y ; /* MCD(x,y) = MCD(a,b) */ while (y!=0) P3: RIDUCI y SENZA VARIARE MCD(x,y) ; } /* x = MCD(a,b) */ P MCD(a,0) = a { x=a; y=b; P1 Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Massimo Comune Divisore (7) Se k è divisore comune di x e y Þ x = k qx ; y = k qy Þ x % y = x – (x / y) y = k(qx – (x / y) qy) Þ k è divisore comune di x % y /* MCD(x,y) = MCD(a,b); y!=0 */ { r = x % y; x = y; y = r; } /* MCD(x,y) = MCD(a,b) */ P3 MCD(x,y) = MCD(y,x%y) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Massimo Comune Divisore (8) /* a,b interi positivi */ { int x,y,r; /* P1: INIZIALIZZA x,y */ x=a; y=b; /* MCD(x,y) = MCD(a,b) */ while (y!=0) /* P2: RIDUCI y SENZA VARIARE MCD(x,y) */ { r = x % y; x = y; y = r; } /* x = MCD(a,b) */ P Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Massimo Comune Divisore (Euclide) public class Mcd2 { public static void main( String[] args ) System.out.println("MCD(42,56)= "+ mcd(42,56)); } static int mcd(int a, int b) int r; while (b!=0) { r = a % b; a = b; b = r; return a; Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Ricorsione n! = n*(n-1)! 1! = 1 Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Algoritmi ricorsivi (MCD) MCD(a,b) = MCD(b,a%b) MCD(a,0) = a mcd(36,42) mcd(42,36) mcd(36,6) mcd(6,0) 6 /* a,b interi positivi */ int mcd(int a, int b) { if (b==0) return a; else return mcd(b,a%b); } Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Algoritmi ricorsivi (Fattoriale) n! = n*(n-1)! 1! = 1 fact(4) fact(3) fact(2) fact(1) 24 6 2 1 /* n intero positivo */ int fact(int n) { if (n==1) return 1; else return n * fact(n-1); } complessità: O(n) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Algoritmi ricorsivi (Potenza) b¹ = b be = b * be-1 pot(3,4) pot(3,3) pot(3,2) pot(3,1) 81 27 9 3 /* b,e interi positivi */ int pot(int b, int e) { if (e==1) return b; else return b * pot(b,e-1); } complessità: O(e) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Algoritmi ricorsivi (Potenza) b¹ = b e pari Þ be = (b * b)e/2 e dispari Þ be = b * be-1 = b * (b * b)e/2 pot(3,5) pot(9,2) pot(81,1) 243 81 /* b,e interi positivi */ int pot(int b, int e) { if (e==1) return b; else if ((e & 1)==1) return b*pot(b*b,e/2); //e dispari return pot(b*b,e/2); //e pari } complessità: O(log2 e) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Algoritmi ricorsivi (Torri di Hanoi) 1 sorgente intermedia destinazione /* n dischi ordinati in s */ Sposta n dischi da s a d utilizzando i, muovendo un disco per volta e mantenendo l’ordinamento /* n dischi ordinati in d */ P Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Algoritmi ricorsivi (Torri di Hanoi) sorgente intermedia destinazione n 1 n-1 Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Algoritmi ricorsivi (Torri di Hanoi) /* n dischi ordinati in s */ { P: Sposta n-1 dischi da s a i utilizzando d, muovendo un disco per volta e mantenendo l’ordinamento; /* n-1 dischi ordinati in i */ P1: Sposta il disco n da s a d; P: Sposta n-1 dischi da i a d utilizzando s, muovendo un disco per volta e mantenendo l’ordinamento; } /* n dischi ordinati in d */ P Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Algoritmi ricorsivi (Torri di Hanoi) /* n dischi ordinati in s */ void hanoi(int n, char s, char i, char d) { if (n==1) System.out.println("muovi 1 da " + s + " a " + d); else hanoi(n-1,s,d,i); /* n-1 dischi ordinati in i */ System.out.println("muovi " + n + " da " + s + " a " + d); hanoi(n-1,i,s,d); } /* n dischi ordinati in d */ P Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Algoritmi ricorsivi (Torri di Hanoi) public class Hanoi { public static void main( String[] args ) hanoi(5,'S','I','D'); } static void hanoi(int n, char s, char i, char d) if (n==1) System.out.println("muovi 1 da " + s + " a " + d); else hanoi(n-1,s,d,i); System.out.println("muovi " + n + " da " + s + " a " + d); hanoi(n-1,i,s,d); Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Algoritmi ricorsivi (Torri di Hanoi) complessità: O(2n) 1 20 21 22 2n-1 … 20 + 21 + 22 +…+ 2n-1 = 2n - 1 Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Algoritmi ricorsivi (Fibonacci) L'intento di Fibonacci (Pisa, 1170-1240) era quello di trovare una legge matematica che potesse descrivere la crescita di una popolazione di conigli Assumendo per ipotesi che: si disponga di una coppia di conigli appena nati questa coppia diventi fertile al compimento del primo mese e dia alla luce una nuova coppia al compimento del secondo mese le coppie fertili, dal secondo mese di vita in poi, diano alla luce una coppia di figli al mese le nuove coppie nate si comportino in modo analogo si verifica quanto segue: nel primo mese c’è 1 coppia di conigli (non fertile) nel secondo mese c’è 1 coppia (fertile) nel terzo mese ci saranno 1+1=2 coppie (1 fertile , 1 non fertile) nel quarto mese ci saranno 1+2=3 coppie (2 fertili , 1 non fertile) nel quinto mese ci saranno 2+3=5 coppie (3 fertili , 2 non fertili) … in ogni mese il numero totale di coppie è uguale alla somma dei numeri di coppie presenti nei due mesi precedenti: 1 , 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55 , 89 , 144 , 233 , … Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Algoritmi ricorsivi (Fibonacci) fib(n) = fib(n-1) + fib(n-2) fib(1) = 1 fib(0) = 0 /* n intero positivo */ int fib(int n) { if (n<=1) return n; else return fib(n-1) + fib(n-2); } Mario Merz: Il volo dei numeri Torino, Luci d’artista Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Algoritmi ricorsivi (Fibonacci) 3 fib(4) 2 1 fib(3) fib(2) fib(1) fib(0) complessità: O(2n) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Ricorsione Û Iterazione (Fibonacci) /* n intero positivo */ int fib(int n) { int f1=1; int f0=0; for (int i=1; i<n; i++) /* f1 = fib(i) , f0 = fib(i-1) */ f1 += f0; /* f1 = fib(i+1) , f0 = fib(i-1) */ f0 = f1-f0; /* f1 = fib(i+1) , f0 = fib(i) */ } return f1; complessità: O(n) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Algoritmi di ordinamento v insieme non ancora ordinato v insieme ordinato int[] v; ... for(i=0; i<v.length; i++) { P1: sposta un elemento di v dalla porzione non ordinata a quella ordinata } P v N-1 v N-1 i v N-1 Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Algoritmi di ordinamento (crescente) P1 P12: sELEZIONA iL PIU’PICCOLO elemento dElla porzione non ordinata E ScambiALO con quello di indice i v m N-1 i P1 P13: Inserisci l’elemento di indice i nElla porzione ordinata, spostando in avanti quelli piu’ grandi v N-1 i Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Ordinamento per selezione 3 1 v m = v[i] ; im = i ; for(j=i+1; j<N; j++) if( v[j] < m ) { m = v[j]; im = j; } v[im] = v[i]; v[i] = m; P12 N-1 i im 2 Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Ordinamento per selezione void selectSort(int[] v) { int i,j,m,im; int n = v.length; for (i=0; i<n-1; i++) m = v[i]; im = i; for (j=i+1; j<n; j++) if( v[j] < m ) m = v[j]; im = j; } v[im] = v[i]; v[i] = m; complessità: O(n2) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Ordinamento per selezione public class Selectsort { public static void main(String[] args) int[] a = {3,2,4,6,3,9,8,7,5}; selectSort(a); for(int i:a) System.out.print(i+" "); } static void selectSort(int[] v) ... Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Ordinamento per inserimento v N-1 i x 1 4 v N-1 i 3 2 x = v[i] ; for( j=i-1; j>=0 && x<v[j]; j-- ) v[j+1] = v[j]; v[j+1] = x; P13 Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Ordinamento per inserimento void insertSort(int[] v) { int i,j,x; int n = v.length; for (i=1; i<n; i++) x = v[i]; for (j=i-1; j>=0 && x<v[j]; j--) v[j+1] = v[j]; v[j+1] = x; } complessità: O(n2) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Ordinamento per inserimento public class Insertsort { public static void main(String[] args) int[] a = {3,2,4,6,3,9,8,7,5}; insertSort(a); for(int i:a) System.out.print(i+" "); } static void insertSort(int[] v) ... Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Quicksort v l h m int[] v; ... { P1: pARTIZIONa gLI elementI di v IN MODO TALE CHE OGNI ELEMENTO DELLA PARTIZIONE VERDE SIA MINORE DI (O UGUALE A) OGNI ELEMENTO dELLA PARTIZIONE ROSSA P: ORDINA GLI ELEMENTI NELLA PARTIZIONE VERDE P: ORDINA GLI ELEMENTI NELLA PARTIZIONE ROSSA } P Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Quicksort void quickSort(int[] v, int l, int h) { int m; if ( l < h ) m = partition(v, l, h); /* P1 */ quickSort(v, l, m); quickSort(v, m+1, h); } Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Quicksort v P1 int partition ( int[] v, int i, int j ) { v[ i ] < x v[ j ] > x v i j int partition ( int[] v, int i, int j ) { SCEGLI COME PERNO UN QUALUNQUE ELEMENTO x DI v while (true) FINCHè v[i] < x INCREMENTA i /* v[i]>=x */ FINCHè v[j] > x deCREMENTA j /* v[j]<=x */ if ( i < j ) scambia tra loro v[i] e v[j] else return j } P1 Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Quicksort int partition(int[] v, int i, int j) { int x,t; x = v[(i+j)/2]; while (true) while ( v[i] < x ) i++ ; while ( v[j] > x ) j-- ; if ( i < j ) t = v[i]; v[i] = v[j]; v[j] = t; i++; j--; } else return j; P1 complessità(partition): O(n) compl_media(quickSort): O(n log2 n) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Quicksort public class Quicksort { public static void main(String[] args) int[] a = {3,2,4,6,3,9,8,7,5}; quickSort(a, 0, a.length-1); for(int i:a) System.out.print(i+" "); } static void quickSort(int[] v, int l, int h) ... static int partition(int[] v, int i, int j) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Mergesort v P int[] v; ... { P: ORDINA la prima metà di v h l + h 2 int[] v; ... { P: ORDINA la prima metà di v P: ORDINA la seconda metà di v P1: FONDI le due metà in un unico insieme ordinato } P Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Mergesort void mergeSort(int[] v, int l, int h) { int m; if ( l < h ) m = (l+h)/2; mergeSort(v, l, m); mergeSort(v, m+1, h); merge(v, l, h); /* P1 */ } Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Mergesort P1 void merge ( int[] v, int l, int h ) { COPIA LA PRIMA METà DI v IN aux NELLO STESSO ORDINE COPIA LA SECONDA METà DI v IN aux IN ORDINE INVERSO i = l; j = h; for (k = l; k <= h; k++) v[k] = (aux[j] < aux[i])? aux[j--]: aux[i++]; } P1 Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Mergesort void merge(int[] v, int l, int h) { P1 int i,j,k,m; m = (l+h)/2; for (i = l; i <= m; i++) aux[i] = v[i]; for (j = m+1; j <= h; j++) aux[j] = v[h-j+m+1]; i = l; j = h; for (k = l; k <= h; k++) v[k] = (aux[j] < aux[i])? aux[j--]: aux[i++]; } P1 complessità(merge): O(n) complessità(mergeSort): O(n log2 n) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Mergesort public class Mergesort { static int[] aux; public static void main(String[] args) int[] a = {3,2,4,6,3,9,8,7,5}; aux = new int[a.length]; mergeSort(a, 0, a.length-1); for(int i:a) System.out.print(i+" "); } static void mergeSort(int[] v, int l, int h) ... static void merge(int[] v, int l, int h) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Algoritmi di ricerca v insieme x int[] v; int x; P ... { if ( x è UN ELEMENTO di v ) return LA POSIZIONE DI x IN v ; else return -1 ; } P Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Ricerca in insiemi non ordinati int search(int[] v, int x) { int i; int n = v.length; for (i=0; i<n; i++) if (x == v[i] ) return i; return -1; } complessità: O(n) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Ricerca in insiemi ordinati (crescenti) int search(int[] v, int x) { int i; int n = v.length; for (i=0; i<n && x >= v[i]; i++) if (x == v[i] ) return i; return -1; } complessità: O(n) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Ricerca dicotomica (binaria) in insiemi ordinati (crescenti) v l h l + h 2 int[] v; int x; int m; ... { m = (l+h)/2; if ( x == v[m] ) return m ; else if ( x < v[m] ) P: RICERCA x NELLa prima metà di v; P: RICERCA x NELLa SECONDa metà di v; } P Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Ricerca binaria (ricorsiva) int rbsearch(int[] v, int l, int h, int x) { int m; if ( l > h ) return -1; else m = (l+h)/2; if ( x == v[m] ) return m; if ( x < v[m] ) return rbsearch(v, l, m-1, x); return rbsearch(v, m+1, h, x); } complessità: O(log2 n) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Ricerca binaria (iterativa) int ibsearch(int[] v, int l, int h, int x) { int m; while ( l <= h ) m = (l+h)/2; if ( x == v[m] ) return m; if ( x < v[m] ) h=m-1; else l=m+1; } return -1 complessità: O(log2 n) Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Ricerca indicizzata da chiave Se gli elementi con chiave di ricerca x vengono memorizzati nella posizione x , il tempo di accesso è costante … 325 673 729 325 x = v[x] 673 729 xmax Tuttavia, se l’intervallo dei valori di x è molto più grande del numero di elementi da memorizzare, lo spreco di memoria diventa inaccettabile Es: se 0 < x < 1000 e il numero di elementi è 100 , lo spreco è del 90% Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Tabelle Hash Una funzione hash trasforma una chiave x in un indice h(x) minore della dimensione N della tabella Es: h(x) = x % N N = 100 … 325 729 673 25 x = v[ h(x) ] 29 73 99 Se h(x1) = h(x2) , si verifica una collisione Es: 729%100 = 29 = 29%100 = 129%100 = 229%100 = … Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Risoluzione delle collisioni (con scansione lineare) Quando si verifica una collisione ( la posizione h(x) è già occupata) , l’elemento con chiave x viene inserito nella prima posizione libera successiva Es: N = 100 … 325 -1 127 528 729 831 232 25 26 x = v[ (x%N + i)%N ] insert(427) 27 28 posizione k libera: v[k] = -1 29 30 31 32 Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Tabella Hash a scansione lineare int[] v = new int[N]; for(int i=0; i< v.length; i++) v[i]= -1; void insert(int[] v, int x) { int i = x % v.length; while ( v[i] != -1 ) i = (i+1) % v.length; v[i] = x; } int search(int[] v, int x) { if (v[i] == x) return i; else i = (i+1) % v.length; return -1; Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino

Costo della scansione lineare Nel caso peggiore la scansione lineare ha complessità O(n) ( n = numero di elementi presenti nella tabella ) Il costo (numero di sondaggi) medio di una ricerca è: (ricerca con successo) (ricerca senza successo) dove a = n / N è il fattore di carico La complessità media di una ricerca è pertanto: O( n / (N-n) ) (con successo) O( n2 / (N-n)2 ) (senza successo) 1 2 + 2(1-a) 1 2 + 2(1-a)2 Silvano Rivoira - Dipartimento di Automatica e Informatica - Politecnico di Torino