Università degli studi della Tuscia Dipartimento di Scienze Ecologiche e Biologiche Corso di laurea in Scienze Ambientali A.A. 2013-2014 - II semestre Colloquio di informatica (5 crediti) Prof. Pier Giorgio Galli ([email protected]) Problema Secondo le statistiche ufficiali di youtube ogni minuto vengono caricate un certo numero di ore video. Supposto che tale attività aumenti ogni ora del 3% in un giorno quante ore video verrebbero caricate? (Trova la soluzione prima di passare alle prossime diapositive) Ricerca dei dati Ricerca del procedimento risolutivo del problema Ogni ora aumento del 3% le ore caricate l'ora precedente, al termine faccio la somma delle ore caricate per ogni ora. Implementazione Costante Implementazione del procedimento risolutivo del problema con un foglio di calcolo =b4+(b4*3)/100 =b5+(b5*3)/100 =somma(b4:b27) Presentazione della soluzione In un giorno vengono caricate 206.558,82 ore video Dal problema alla soluzione Intuitivamente il processo che abbiamo seguito può essere schematizzato: Ricerca dei dati del problema Ricerca e implementazione del procedimento risolutivo Soluzione Gli algoritmi Gli algoritmi sono metodi formali per la soluzione di una classe problemi in un numero finito di passi. Ogni problema è caratterizzato dai dati iniziali e dei risultati che si vogliono ottenere: risolvere un problema significa ottenere in uscita i risultati desiderati a partire da un certo insieme di dati presi in ingresso. Possiamo assumere che ciascun problema consista di un insieme di casi particolari, o istanze di una classe di problemi. Se, ad esempio, conosco l'algoritmo per calcolare l'area del triangolo nota la base e l'altezza, allora conosco la procedura per calcolare l'area di tutti i triangoli. Dati (input) Algoritmo Dati (output) Gli algoritmi derivano il loro nome dal matematico arabo Muhammad ibn Musa alKhwarizmi (Corasmia o Baghdad, 780 circa – 850 circa) [il vocabolo algebra, invece, deriva dal suo libro al-Kitāb al-mukhtasar fī hisāb al-jabr wa l-muqābala] Proprietà fondamentali degli algoritmi (parte 1) Proprietà caratteristiche degli algoritmi: i passi costituenti devono essere "elementari", ovvero non ulteriormente scomponibili (atomicità); i passi costituenti devono essere interpretabili in modo diretto e univoco dall'esecutore, sia esso umano o artificiale (non ambiguità); l'algoritmo deve essere composto da un numero finito di passi e richiedere una quantità finita di dati in ingresso (finitezza) l'esecuzione deve avere termine dopo un tempo finito (terminazione); l'esecuzione deve portare a un risultato univoco (effettività); a ogni passo, il successivo deve essere uno e uno solo, ben determinato (determinismo). Da Wikipedia, l'enciclopedia libera. Proprietà fondamentali degli algoritmi (parte 2) Così, ad esempio, "rompere le uova" può essere considerato legittimamente un passo elementare di un "algoritmo di cucina" (ricetta), ma non potrebbe esserlo anche "aggiungere sale quanto basta", data l'ambiguità di questa frase. Un passo come "preparare un pentolino di crema pasticcera" non può considerarsi legittimo perché ulteriormente scomponibile in sotto-operazioni (accendere il fuoco, regolare la fiamma, mettere il pentolino sul fornello, ecc.) e anche perché contenente ambiguità (quanta crema?); potrebbe, però, essere associato a un opportuno rimando a un'altra sezione del ricettario, che fornisca un sotto-algoritmo apposito per questa specifica operazione. Questo suggerisce che, per comodità d'implementazione, gli algoritmi possano essere modulari, ovvero orientati a risolvere specifici sotto-problemi, e gerarchicamente organizzati. Inoltre, una ricetta che preveda la cottura a microonde non può essere preparata da un esecutore sprovvisto dell'apposito elettrodomestico; questo rimanda al problema della realizzabilità degli algoritmi, ovvero della loro compatibilità con le risorse materiali e temporali a disposizione. Infine, possono darsi più algoritmi validi per risolvere uno stesso problema, ma ognuno con un diverso grado di efficienza. Da Wikipedia, l'enciclopedia libera Rappresentazione grafica degli algoritmi Algoritmo risolutivo della classe di problemi Calcolare l'area del triangolo rappresentato graficamente con un diagramma di flusso. Inizio leggi b leggi h area(b*h)/2 scrivi area Inizio L'esecutore ottiene dall'esterno il valore della variabile b (il valore della base del triangolo) Si legge: la variabile di nome area assume il valore della variabile b moltiplicata per il valore della variabile h diviso 2 L'esecutore invia all'esterno il valore della variabile area (il valore dell'area del triangolo) Diagramma di flusso Il diagramma di flusso è una delle possibili rappresentazioni grafiche dell'algoritmo 1. 2. 3. si parte dal blocco iniziale si segue la freccia in uscita si giunge al blocco successivo e si effettua l'operazione descritta nel blocco 4. si procede iterando i passi 2 e 3 fino a giungere al blocco finale. Tra le operazioni si distinguono: • azione, che comportano una attività o un'elaborazione • test, che indicano due o più direzioni in base a un fattore di decisione • ingresso/uscita, che comportano l'immissione di informazioni dall'esterno oppure l'invio di informazioni verso l'esterno Da Wikipedia, l'enciclopedia libera Rappresentazione degli algoritmi Una combinazione di blocchi elementari può descrivere un algoritmo se: 1. viene usato un numero finito di blocchi 2. lo schema inizia con un blocco iniziale e termina con un blocco finale 3. ogni blocco soddisfa le condizioni di validità: a) blocco azione e blocco lettura/scrittura: ha una sola freccia entrante e una sola freccia uscente b) blocco di controllo: ha una sola freccia entrante e due frecce uscenti 4. ogni freccia deve entrare in un blocco 5. dal blocco iniziale seguendo le frecce deve essere possibile raggiungere ogni blocco 6. da ogni blocco dev'essere possibile raggiungere il blocco finale Esecuzione degli algoritmi Chi esegue gli algoritmi è l'esecutore. L'esecutore può essere una persona o una macchina. Chi esegue gli algoritmi non deve avere necessariamente consapevolezza delle istruzioni che sta eseguendo. Chiunque (in grado di eseguire le operazioni indicate nei blocchi) può calcolare l'area del triangolo eseguendo l'algoritmo rappresentato con il diagramma di flusso. Questo non implica che l'esecutore conosca cosa sia un triangolo e neanche cosa sia l'area di una figura geometrica. Il diagramma di flusso è una efficace rappresentazione dell'algoritmo quando l'esecutore è una persona, non lo è altrettanto quando l'esecutore è una macchina. Se gli algoritmi devono essere eseguiti da computer allora è necessario descriverli con specifici linguaggi: i linguaggi di programmazione. Linguaggi di programmazione Un linguaggio di programmazione è un linguaggio formale, dotato (al pari di un qualsiasi linguaggio naturale) di un lessico, di una sintassi e di una semantica ben definiti. È utilizzabile per il controllo del comportamento di un computer. Un algoritmo scritto con un linguaggio di programmazione assume il nome di programma [per computer] Chi scrive algoritmi facendo uso di linguaggi di programmazione è un programmatore [di computer] Linguaggio macchina 1 Il linguaggio macchina o codice macchina è il linguaggio in cui sono scritti i programmi eseguibili per computer. Il linguaggio macchina è basato su un alfabeto detto binario perché comprende due soli simboli, generalmente indicati con 0 e 1. Il processore o CPU è quella componente hardware di un computer che è in grado di eseguire i programmi solo se scritti in linguaggio macchina. In altre parole in linguaggio macchina sono definite l'insieme di istruzioni fondamentali che un processore è in grado di compiere (instruction set). Da wikipedia, l’enciclopedia libera Istruzione in linguaggio macchina che somma il contenuto di due registri della CPU Linguaggio macchina 2 I programmi scritti in linguaggio macchina sono formati da istruzioni elementari, che vengono codificate in forma numerica e che consentono di effettuare operazioni aritmetiche, conversioni di bit e poco altro. Scrivere programmi in tale linguaggio è quindi estremamente difficoltoso: un'operazione basilare può richiedere anche tre o quattro istruzioni; si rende così necessario molto codice anche per i programmi più semplici. Il fatto che tale codice sia solamente numerico comporta inoltre grosse possibilità di errori e difficoltà nell'individuarne. È necessario inoltre avere continuamente a che fare con le caratteristiche fisiche della macchina in cui si programma: bisogna ad esempio specificare manualmente gli indirizzi di memoria in cui salvare le informazioni e i registri del processore in cui mantenere i dati temporanei. Da wikipedia, l’enciclopedia libera Linguaggio Assembly Il linguaggio assemblativo o linguaggio assembly è, tra i linguaggi di programmazione, quello più vicino al linguaggio macchina. Per questo il linguaggio assembly è catalogato come linguaggio di programmazione a basso livello dove per linguaggio a basso livello si intende il sottogruppo di linguaggi di programmazione orientati alla macchina. Da wikipedia, l’enciclopedia libera Il programma produce in output la scritta "Ciao ciao mondo" L'assemblatore Il programma scritto in assembly risulta relativamente più leggibile di quello scritto in linguaggio macchina, con il quale mantiene però un totale (o quasi totale) isomorfismo. Il programma scritto in assembly non può essere eseguito direttamente dal processore; esso deve essere tradotto nella forma binaria corrispondente, usando uno specifico programma detto assembler che converte le istruzioni assembly nel corrispondente linguaggio macchina. Programma in linguaggio assembly Assembler Programma (eseguibile dalla CPU) in linguaggio macchina Linguaggi di programmazione ad alto livello Un linguaggio di programmazione ad alto livello non è direttamente eseguibile dalla CPU di un computer, ma è più vicino o familiare alla logica del nostro linguaggio naturale. L'idea di fondo è che i programmi ad alto livello possono essere ricondotti a programmi in linguaggio macchina in modo automatico facendo uso di un programma (compilatore) li converte in linguaggio macchina. Il linguaggio ad alto livello quindi astrae dalle caratteristiche fisiche della macchina in cui si opera. Quest'idea fu introdotta in informatica negli anni cinquanta, soprattutto grazie al lavoro di John Backus presso la IBM, dove fu sviluppato il primo compilatore per il linguaggio Fortran. Programma in linguaggio di programmazione ad alto livello Compilatore Programma (eseguibile dalla CPU) in linguaggio macchina Storia dei linguaggi di programmazione – Fortran Il Fortran è uno dei primi linguaggi di programmazione, essendo stato sviluppato a partire dal 1954, da un gruppo di lavoro guidato da John Backus. Il primo manuale di riferimento per il programmatore del FORTRAN I, "The FORTRAN automatic coding system for the IBM 704 EDPM", scritto dallo stesso Backus, è del 1956. Il fortran è un linguaggio specializzato per algoritmi risolutivi di problemi scientifici. Il programma produce in output la scritta "Hello, world" Storia dei linguaggi di programmazione - COBOL Il COBOL è uno dei primi linguaggi di programmazione ad essere stato sviluppato. Progettato nel 1959, nasce ufficialmente nel 1961, grazie ad un gruppo di lavoro composto dai membri dell'industria americana e da alcune agenzie governative degli Stati Uniti con lo scopo di creare un linguaggio di programmazione adatto all'elaborazione di dati commerciali. Il programma produce in output la scritta "HELLO, WORLD" Storia dei linguaggi di programmazione - BASIC Il BASIC è un linguaggio di programmazione ad alto livello sviluppato nel 1964 presso l'Università di Dartmouth. Il BASIC, fu progettato per essere un linguaggio semplice da imparare. Nacque infatti, come dice il suo nome, per poter essere usato anche da principianti. E' un linguaggio general purpose. Il programma produce in output la scritta "hello, world" Storia dei linguaggi di programmazione - PASCAL Il Pascal fu così chiamato in onore del matematico e filosofo francese Blaise Pascal, inventore della prima macchina calcolatrice automatica. Wirth, il creatore del linguaggio, era un docente di programmazione e sentiva la mancanza di un vero linguaggio di programmazione adatto alla didattica e che fosse dotato di strutture dati avanzate. La prima implementazione del linguaggio divenne operativa nel 1970. Il programma produce in output la scritta "Hello, World" Storia dei linguaggi di programmazione - C Il C (1972) è un linguaggio di programmazione con costrutti semplici e vicini al funzionamento dell'hardware dei calcolatori. La grammatica e la sintassi del C sono molto libere e flessibili, permettendo di scrivere istruzioni complesse e potenti in poche righe di codice. In C è per programmatori esperti. Il C è particolarmente adatto per scrivere il software di base. La sua importanza tuttavia, crebbe solo dopo il 1978 con la pubblicazione da parte di Brian Kernighan e Dennis Ritchie del libro The C Programming Language nel quale il linguaggio venne definito in modo preciso. Il programma produce in output la scritta "Hello, world" Storia dei linguaggi di programmazione - Java Java è un linguaggio di programmazione, specificatamente progettato per essere il più possibile indipendente dalla piattaforma di esecuzione. I programmi java vengono eseguiti da un processore virtuale detto Java Virtual Machine Java è stato creato a partire da ricerche effettuate alla Stanford University agli inizi degli anni Novanta. Al 2014, Java risulta essere uno dei linguaggi di programmazione più usati al mondo. Il programma produce in output la scritta "Hello, world" Dal problema al programma Problema Analisi Algoritmo Implementazione Programma Esecuzione Risultati Dati L'esecutore (programmi) Programma (Applicazione) Viene eseguito Implementazione dell'algoritmo La calcolatrice a corredo del sistema operativo Windows è un programma (sequenza di istruzioni) che viene eseguito dalla CPU (hardware) del computer. CPU L'esecutore (script) Script (Applicazione) Viene eseguito Software Implementazione dell'algoritmo La calcolatrice on line è un programma (sequenza di istruzioni) che viene eseguito dal browser (software) che a sua volta viene eseguito dalla CPU (hardware) del computer. Questa tipologia di programmi assume il nome di script. http://www.calcolatriceonline.it Visual Basic Scripting Edition Programma (script) Windows Script Host (software) Dati CPU Negli esempi di programmazione useremo il linguaggio VBScript (abbreviazione di Microsoft's Visual Basic Scripting Edition). È un sottoinsieme di Visual Basic (a sua volta derivato dal Basic) utilizzato in Windows Script Host (e in altri ambienti software) come linguaggio di scripting general-purpose. Windows Script Host viene fornito a corredo dei sistemi operativi Windows Produzione ed esecuzione di uno script VBScript 1. 2. 3. 4. 5. Avviare blocco note. Scrivere le istruzioni nel linguaggio VBSscript. Salvare il file con estensione vbs. Eseguire (doppio clic) lo script. Se necessario riaprire lo script per modificarlo e/o correggerlo (tasto destro Apri con). Attenzione! Se uno script VBS, per un errore di programmazione, non termina, l'esecuzione può essere interrotta terminando il processo wscript.exe.