

























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
Una panoramica introduttiva all'informatica, esplorando concetti fondamentali come l'informazione, l'elaboratore elettronico e il software. Viene introdotto il linguaggio di programmazione python, con esempi pratici e spiegazioni chiare. Utile per studenti che desiderano acquisire una solida base in informatica e programmazione.
Tipologia: Appunti
1 / 33
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!


























Informazioni utili: Google colab : ti permette di scrivere ed eseguire Python nel tuo browser, dove tendenzialmente ogni codice è inframezzato dai risultati Replit : per avviare, condividere e sviluppare progetti in qualsiasi linguaggio di programmazione Python tutor : permette di scrivere il codice online e visualizzare graficamente quello che sta avvenendo durante il programma, per capire come viene trattata l’informazione. Vedo quello che avviene dentro il pc una volta scritto il programma. Libro : concetti di informatica e fondamenti di Python
Informatica : unione di due parole → informazione e automatica È la scienza che si occupa di gestire l'informazione tramite procedure automatizzate. Non tutto ciò che è digitale è informatica, ad esempio l’abaco veniva usato per fare i calcoli, è uno strumento che rappresenta delle unità numeriche in modo digitale. Informazione : sono i valori che andiamo a sottrarre o addizionare. Ad esempio il codice a barre permette di rappresentare un’informazione tramite linee nere e bianche.
Esegue calcoli su dati ricevuti in ingresso così da produrre risultati in output (come lo schermo). Basandoci su queste operazioni possiamo avere dei dubbi: un PC è realizzato con una certa tecnologia,
La codifica più comune è utilizzare la tabella ASCII, che associa una sequenza di bit ad ogni carattere (lettere e simboli della tastiera). Ogni tasto della tastiera corrisponde ad un codice binario.
Dato che servono molti bit, spesso, per comodità di linguaggio, si danno nomi a delle sequenze di una determinata lunghezza: ● 8 bit = 1 byte (scelto per rappresentare un carattere del nostro alfabeto) ● 16 bit = word ● 4 byte = double word
L’elaboratore elettronico si compone di due parti:
Hardware → gli strumenti Software → le informazioni
quello che si può toccare di un pc, la parte fisica : ● monitor, tastiera, mouse… ● la CPU : cuore del pc, central processing unit, conosce dove sono le istruzioni che deve eseguire e come fare ad eseguirle, coordina tutte le altre parti del pc ● dispositivi di memoria :
Indica la componente di un pc assolutamente necessaria per il pc, una componente intangibile in cui sono presenti programmi e dati , nonché le istruzioni che il pc esegue. Contiene i dati e le istruzioni (il codice).
○ la memoria principale , la memoria RAM , una memoria veloce che lavora a stretto contatto con la CPU, è volatile, l’informazione rimane in RAM fino a che il PC è alimentato da corrente, poi perde ogni informazione ○ la memoria secondaria è persistente ■ disco rigido , l’hard disk: una memoria secondaria che agisce quando si deve salvare qualcosa di persistente. Quando si vuole eseguire ciò che è salvato sul disco rigido carica le azioni nella memoria principale (RAM) e la CPU esegue le istruzioni ● dispositivi di input e output , capaci di “attaccarsi” al bus tramite controller o porte ● i bus : per collegare gli elementi fondamentali, su cui passano i bit
È tipicamente sviluppato sotto forma di “programma applicativo”.
Poi esiste il software di base , che deve essere necessariamente presente, come il sistema operativo, oppure il driver.
I computer eseguono istruzioni molto semplici in rapida successione: ● Il Software è una sequenza di istruzioni e decisioni implementata in qualche linguaggio e tradotta in una forma che possa essere eseguita nel computer ● Il Software gestisce i dati utilizzati dalle varie istruzioni ● Le istruzioni più semplici vengono raggruppate per eseguire compiti più complessi ● La programmazione è l’atto di progettare ed implementare i programmi software
Un programma per computer indica al computer la sequenza di passi necessaria a completare un determinato compito. Consiste in un gran numero di istruzioni (primitive) eseguite una dietro l’altra che produrranno così un effetto più complesso. I computer possono eseguire un ampio spettro di compiti perché possono eseguire diversi programmi. Ciascun programma è progettato per indirizzare il computer affinché lavori su un compito specifico, quindi un pc può fare qualunque cosa perché ci si può installare qualsiasi programma.
Programmazione : l’atto di progettare, implementare e verificare i programmi. (L’implementazione consiste nella scrittura di una lunga sequenza di informazioni che poi sarà eseguita dalla CPU)
Programmare vuol dire scrivere un documento, il file sorgente , che contiene le istruzioni per risolvere il problema, non esiste però una unica soluzione al problema. Compito del programmatore è anche trovare la soluzione più efficiente per il problema. Non ci sono soluzioni universali.
Eseguire un programma Si scrive un programma su un editor di testo, questo testo è salvato su un file di testo in memoria secondaria. Quando eseguo il mio programma la CPU carica il file dalla memoria secondaria alla ram e poi esegue un’istruzione dietro l’altra. Le istruzioni e gli input dell’utente determinano l’esecuzione del programma: la CPU legge i dati (compreso l’input utente), li modifica e li riscrive nuovamente in memoria, sullo schermo, o sulla memoria di massa.
Sviluppo di un programma Si deve arrivare alla soluzione in modo graduale, seguendo lo sviluppo:
Le sequenze dell’algoritmo ● non devono essere ambigue , le istruzioni devono essere chiare e precise, le azioni devono essere predeterminabili ● devono essere eseguibili , elementari, il pc deve essere in grado di eseguirle ● devono terminare , deve produrre un risultato in un tempo finito Per comporre algoritmi ci si deve mettere dal punto di vista del pc, che non sbaglia mai perché lavora con la sua logica.
Esempio - Problema: trovare l’alunno più anziano in aula Problem solving e descrizione formale:
algoritmo - domanda memoria - risposta
chiedi la data di nascita allo studente in prima fila a destra 5/8/
chiedi la data di nascita allo studente in prima fila seconda posizione
6/6/
… …
chiedi la data di nascita allo studente dell’ultima fila a sinistra
5/12/
suppongo che lo studente più anziano sia il primo, quello in prima fila a destra → max = 5/8/ se lo studente in prima fila in seconda posizione ha una data di nascita inferiore, allora cambio max → max = 6/6/ … continuo per tutti gli studenti e li controllo …
max contiene la data di nascita dello studente più anziano → max = 6/6/ chiedo allo studente in prima fila a destra se è nato nella data max … continuo per tutti gli studenti … se mi dice sì, chiedo il nome allo studente
Scrivere la soluzione in un linguaggio di programmazione. Scrivere un programma è un’operazione quasi immediata, se si parte da una soluzione formale (pseudo-codice o flow chart). I linguaggi di programmazione offrono diversi costrutti ed istruzioni , di complessità variabile → dipende dal linguaggio utilizzato
Essenzialmente i linguaggi di programmazione si dividono in: ● alto livello : come Python, sono linguaggi molto espressivi, mi permettono di usare istruzioni che corrispondono ai blocchi del programma di flusso ○ questi linguaggi sono indipendenti dall’hardware ● basso livello o “assembly” : sono nati per uno scopo diverso, sono molto meno espressivi, costituiti da espressioni estremamente elementari ○ gli elementi del linguaggio sono istruzioni microarchitetturali : non vedono la variabile ma l’equivalente realmente esistente sul pc (ad es. “mazzi” li legge come una seria di bit) ■ leggono la sequenza di bit nella memoria, la variabile è salvata da qualche parte in memoria? la immagazzino temporaneamente, una volta che ho quella sequenza di bit in un registro posso modificare e poi riportare in memoria per modificare il valore della variabile ○ dipendono fortemente dall’hardware , la sintassi del linguaggio dipende dal processore che sto usando ○ il vantaggio rispetto a quelli ad alto livello è che riesco a chiedere qualunque tipo di informazione , riesco ad accedere a qualsiasi cosa, posso interfacciarmi con ogni periferica ■ usato per scrivere il driver di una periferica
In modo non del tutto corretto si può affermare che i computer possono eseguire soltanto programmi scritti in linguaggi di basso livello : i programmi scritti in un linguaggio di alto livello devono essere elaborati prima di poter essere eseguiti. Questo processo di elaborazione impiega del tempo e rappresenta un piccolo svantaggio dei linguaggi di alto livello. I vantaggi sono d’altra parte enormi: ● In primo luogo è molto più facile programmare in un linguaggio ad alto livello: questi tipi di programmi sono più veloci da scrivere, più corti e facilmente leggibili, ed è più probabile che siano corretti. ● In secondo luogo i linguaggi di alto livello sono portabili: portabilità significa che essi possono essere eseguiti su tipi di computer diversi con poche o addirittura nessuna modifica. ○ I programmi scritti in linguaggi di basso livello possono essere eseguiti solo su un tipo di computer e devono essere riscritti per essere trasportati su un altro sistema. Questi vantaggi sono così evidenti che quasi tutti i programmi sono scritti in linguaggi di alto livello, lasciando spazio ai linguaggi di basso livello solo in poche applicazioni specializzate.
I programmi di alto livello vengono trasformati in programmi di basso livello eseguibili dal computer tramite due tipi di elaborazione: l’interpretazione e la compilazione.
● Un interprete legge il programma di alto livello e lo esegue , trasformando ogni riga di istruzioni in un’azione. L’interprete elabora il programma un po’ alla volta, alternando la lettura delle istruzioni all’esecuzione dei comandi che le istruzioni descrivono. ● Un compilatore legge il programma di alto livello e lo traduce completamente in basso livello , prima
che il programma possa essere eseguito. In questo caso il programma di alto livello viene chiamato codice sorgente , ed il programma tradotto codice oggetto o eseguibile. Dopo che un programma è stato compilato può essere eseguito ripetutamente senza che si rendano necessarie ulteriori compilazioni finché non ne viene modificato il codice.
Ogni dato è salvato come sequenza di bit nella memoria, che appare come una collezione/sequenza di celle : ogni cella è composta di un byte (8 bit). In una cella posso memorizzare una variabile di tipo intero, di tipo carattere, un numero con la virgola (devo memorizzare la parte intera e quella decimale, quindi non mi basta una cella) → ad ogni variabile corrisponde una o più celle in memoria, come faccio a indicare la relazione fra cella di memoria e la variabile associata? Identifico univocamente una cella di memoria con un indirizzo , parto con l’indirizzo 0 e scendo fino a quanta memoria ho, con questa notazione all’indirizzo 100 c’è una variabile, al 101 un’altra e così via, non tutte le celle devono essere necessariamente piene.
I linguaggi ad alto livello usano le celle, quelli di basso livello usano gli indirizzi.
● Istruzioni Vs direttive ○ istruzioni : operazioni supportate dal linguaggio di programmazione, che sono eseguite traducendole in codice macchina ○ direttive : comandi per l’interprete o compilatore del linguaggio, non corrispondono ad effettivo codice eseguibile. Istruzioni che non sono eseguite ma danno delle informazioni al programmatore. ● Istruzioni elementari (o primitive) Vs pseudo-istruzioni ○ istruzione elementare : operazione presente nel linguaggio di programmazione ○ pseudo-istruzione : rappresentazione compatta di più istruzioni elementari. Istruzioni composte, che vengono scisse in una sequenza di istruzioni per dare più potere espressivo al lingauggio. La traduzione da pseudo-istruzione ad istruzioni elementari è eseguita automaticamente dall'assemblatore. ● Istruzioni "operative" Vs istruzioni di controllo del flusso
stiamo lavorando, così da eseguire comandi scritti in byte code. Le istruzioni in bytecode sono eseguite dalla macchina virtuale, che non deve eseguire le istruzioni in linguaggio testuale. La macchina testuale si appoggia sulle librerie che vogliamo usare. Di base la libreria contiene: tipi di dati necessari, strutture dati (come combinare insieme questa serie di dati: tanti moduli che contengono le operazioni per fare qualche azione) (200+ moduli nella libreria standard), orientato agli oggetti → per il calcolo scientifico la libreria più comune è NumPy.
Unità P
Dettagli del linguaggio riferito all’informazione che andiamo a gestire, in particolare comunemente i programmi dovranno trattare con numeri e testo, quali sono i tipi di dati opportuni per memorizzare in numeri e testo, considerato che abbiamo sempre l’obiettivo di scrivere in Python.
Per implementare una soluzione in qualsiasi programmazione vanno usati testi e numeri, vediamo come li trattiamo: ● quando abbiamo un testo in realtà parliamo di “stringhe” ma in una terminologia informatica ● abbiamo bisogno di un contenitore che vada a memorizzare numeri e stringhe, questo contenitore si chiama “variabile” ● vedremo come scrivere espressioni matematiche usando funzioni e metodi
Una variabile è un contenitore che contiene un valore che useremo nel nostro programma. Una variabile è una zona di memoria dotata di un nome in un programma che fa riferimento ad un valore specifico. Nel nostro programma useremo diversi valori che sono salvati da qualche parte in memoria. In memoria sono riservati alcuni byte per contenere questi valori, infatti il computer salva tutto in bit. Python ci permette addirittura di salvare la nostra variabile neanche tramite un indirizzo, ma addirittura con un nome da noi scelto. (in linguaggio di programmazione più basso, in assembly, è veramente importante sapere la memoria corrispondente ad ogni variabile proprio perché si trova a lavorare con gli indirizzi della memoria)
Le tipologie di variabili :
● intere , memorizzano numeri interi ● reali , memorizzano numeri con una parte decimale → chiamate in informatica “ floating point ” (per memorizzare la parte intera e decimale esistono la modalità a virgola fissa e a virgola mobile, in cui il numero di cifre dopo la virgola è variabile) ● testi , memorizzano parole → chiamate in informatiche “ stringhe ” ○ assegnare valore ad una stringa tramite apici singoli o doppi (virgolette), perchè Python non conosce le parole che sto assegnando alla variabile
Definire una variabile : creare una variabile assegnandole un valore. Si specifica un nome e un valore iniziale.
Esempio : Base = 6 (è un’esecuzione passo passo: l'interprete ha creato una variabile allocando “6” in memoria → base contiene 6) Sto definendo una variabile: creo la variabile per la prima volta assegnandole un valore Altezza = 4 Area = base * altezza (non le do un valore noto a priori, sarà calcolato all’interno del programma) Assegnare un valore ad una stringa, non posso usare parole, perché python non le conosce, devo mettere le parole fra virgolette o apici singoli Indirizzo = “corso duca degli abruzzi” Citta_residenza = ‘Torino’ Citta_nascita = ‘Torino’
Nel momento in cui cambio una variabile (stesso nome ma contenuto diverso), salva l’ultimo valore della variabile (si nota anche dal fatto che la freccia si incrocia, perché è una notazione cambiata dopo) → il nuovo valore viene salvato in un’altra zona di memoria, la variabile si riferisce ad un’altra zona di memoria. La variabile viene ricreata. Le variabili sono immutabili , se provo a cambiare il valore, quello precedente viene cancellato (se non è più utilizzato all’interno del programma precedente) e quello nuovo riscritto ad un altro indirizzo.
Esempio : Devo trovare la quantità totale, il mio risultato, l’output. In base ai dati del problema posso definire le variabili.
Prima di definire le variabili faccio una considerazione: → il numero di bottiglie e di lattine per me è veramente una variabile, un valore che può variare → invece la quantità in bottiglia e in lattina è un valore che può cambiare ma è più fisso : la lattina solitamente è da 33 cl e una bottiglia è da 75 cl Generalmente quando si programma si fa una distinzione tra variabili e costanti , a livello pratico non cambia nulla, solo a livello concettuale per cercare di organizzare meglio il nostro codice. Una costante è un valore che nel corso del mio codice prevedo che non cambi. Se mi trovassi a scrivere questo programma per una compagnia che produce bevande, la capacità di una bottiglia e di una lattina è costante, invece il numero di queste ultime varia sicuro. Per migliorare la leggibilità del codice si tende a definire: ● le variabili costanti scritte tutte in maiuscolo, è una convenzione per cui si può assumere che nel corso del programma quella variabile non cambierà valore ● le variabili che “variano” scritte in minuscolo
● Non posso mettere spazi nel nome di una variabile quindi uso l’underscore ● Le lettere accentate non si usano, anche se si potrebbero mettere ● Maiuscolo e minuscolo fanno la differenza nella dicitura di una variabile, perché hanno una differente codifica ASCII: due variabili anche se con una sola maiuscola di differenza sono variabili diverse ○ Se ho variabili costituite da più parole scrivo la variabile tutta minuscola con l’underscore → tax_rate, notazione detta “ a serpente ”, metodo preferito da PyCharm ○ Oppure tutto attaccato ma indico l’inizio della seconda parola con la maiuscola → taxRate, notazione detta “ a gobba di cammello ” ● Non si possono usare segni grafici ● Il nome della variabile non può iniziare con un numero ● Il nome della variabile può iniziare con _
Il valore calcolato alla destra del segno '=' è assegnato alla variabile sulla sinistra → l’operatore uguale = assegna un valore attenzione a non confonderti: per confrontare non si usa l’=
La divisione / tra interi mi da un numero floating point, nel caso di ⅓ mi da infinite cifre dopo la virgola
L’interprete mi salva un certo numero di cifre, e quando lo eseguo il numero di cifre mostrate è di circa 16, se io volessi un certo numero di cifre devo arrotondare con la funzione round (che è una funzione predefinita, non deve essere importata da nessun modulo/libreria) La funzione approssima all’intero più vicino.
Se volessi un certo numero stabilito dopo la virgola aggiungo un parametro all'interno di round → round(operazione, numero cifre dopo la virgola)
se volessi una divisione intera uso l’ operatore // voglio il risultato intero , sono utili con operanti interi es. 7 // 4 = 1 Se si è interessati al resto della divisione tra interi, va usato l’operatore “%” (detto modulo ) es. resto = 7 % 4 (sarà 3) il modulo è utile da utilizzare per capire se i numeri sono divisibili
La **moltiplicazione *** è overloaded, un operatore a cui sono state assegnate più funzionalità in base al tipo di parametri → se mettiamo stringa * un intero viene fuori la stringa ripetuta quante volte indica l’intero non si può fare una moltiplicazione per stringhe
La somma/addizione + è un operatore overloaded (tranne tra stringhe e interi o float) come possiamo vedere nell’esempio:
quindi posso concatenare tante stringhe, in questo modo riesco a combinare diversi parametri attenzione ad avere sempre 2 stringhe da addizionare, se fosse una stringa e un numero, converti il numero con str(x)
differenza/sottrazione -
elevamento a potenza **** es. 23 = 2^3
espressioni si possono usare le parentesi
comunque la precedenza è simile a quella algebrica, elevamento a potenza ha precedenza sulla moltiplicazione/divisione, che ha precedenza su somma/sottrazione
Se metto la variabile dopo il calcolo, nel momento in cui scrivo il programma non si accorge, nella scrittura va bene → nel momento dell’esecuzione arriva l’errore. Non sa che valore stampare, la variabile non è definita nel momento del calcolo.
Può una variabile memorizzare tipi diversi? Nell’esempio sotto prima tasse era un intero, poi è un float e infine una stringa
Una volta che eseguo il programma non succede nulla di anomalo, ogni volta che cambio il valore della variabile, si cancella quello vecchio e gli viene attribuito quello nuovo. Si può fare ma non si dovrebbe per una questione della leggibilità del codice e perchè ci sono operatori che in base al tipo di dato su cui lavora fornisce un risultato diverso: se una variabile è di tipo intero ci si aspetta che durante tutto il programma la variabile rimanga di quel tipo, piuttosto si cambia il nome della variabile.
Esercizio: Scrivere il quadrato, il cubo e la quarta potenza di una variabile var = 6 risultato = var** risultato1 = var** risultato2 = var**
a. es. import math math.ceil(x)
Quando si lavora con floating point … rappresentata come susseguirsi di bit non sempre questa rappresentazione è accurata se voglio rappresentare ⅓, il suo valore esatto sarebbe 0,
quando ho memorizzato 4.35 in qualche cella di memoria (in cui c’è scritto una serie di bit corrispondente al valore), ma non è possibile scrivere tutte le cifre
se abbiamo una variabile di tipo float
Quando eseguiamo confronti con variabili float si deve stare attentissimi visto che non ci sono arrotondamenti va usato round
una sequenza di caratteri, la sequenza può essere racchiusa tra apici doppi “x” o singoli ‘x’ (anche tripli)
per conoscere la lunghezza di una stringa si usa len(“x”)
La stringa di lunghezza 0 è detta stringa vuota. Non contiene caratteri ed è scritta come "" o '' attenzione se tra le virgolette ci fosse uno spazio ottengo 1 (1 carattere = 1 spazio)
Estrarre un carattere da una stringa posso accedere ai singoli caratteri che costituiscono una stringa utilizzando una notazione data dalle parentesi quadre → sono un operatore che mi permette di accedere ad un singolo carattere si usano anche su altri tipi di dato
attenzione! inizia a contare dallo 0
I valori negativi sono valori che iniziano da destra, ma da destra si inizia dal -1, non dallo 0, che coinciderebbe con q
se volessi dare un intervallo, allora inserisco gli estremi → operatore di slice [] es. parola = stringa[7:12] → risultato: è una
parto da 7 e arrivo a 11, con questa notazione il 12 è escluso (l’estremo destro è sempre escluso) es1 parola = stringa[7:] → risultato: è una stringa → prendo da 7 alla fine es2 parola = stringa[:] → risultato: questa è una stringa → prendo tutta la stringa
operatore di step → stringa[ start : stop : step ] es. nome = "Paperon de' Paperoni" ● nome[ 2 : 8 : 2 ] restituisce una stringa contenente i caratteri di indice 2, 4, 6 "prn" ● nome[::2] tutti i caratteri di indice pari ● nome[1::2] tutti i caratteri di indice dispari
E se lo step è negativo? Intuitivamente, invece di spostarmi in avanti ad ogni passo, mi sposto indietro (e quindi prendo gli elementi in ordine inverso) ● In questo caso occorre che l’indice start sia maggiore di stop ● nome[9:3:-1] restituisce "ed nor" ● nome[::-1] tutta la stringa, in ordine inverso "inorepaP 'ed norepaP"
le stringhe sono immutabili, non posso provare a cambiare qualcosa all’interno di essa le liste invece si possono modificare
I caratteri sono memorizzati come valori interi inizialmente con ASCII (255 simboli) poi ampliata in tabella Unicode Unicode definisce oltre 100,000 caratteri, è stato creato capace di codificare il testo sostanzialmente in tutte le lingue scritte → vuole codificare, dare un valore, ad ogni simbolo: è in continuo accrescimento
se interessa conoscere ● il codice unicode di un carattere si utilizza ord (carattere), che mi restituisce l’equivalente unicode ● dal numero avere il carattere con chr (numero del carattere)
quello che chiamiamo variabile, in un linguaggio ad oggetti è chiamato oggetto su questi oggetti posso chiamare dei metodi → nomeoggetto.metodochechiamo
es. tutte le stringhe hanno il metodo upper() che restituisce una nuova stringa con i caratteri maiuscoli name = "John Smith" uppercaseName = name.upper() risultato: "JOHN SMITH" questo upper opera come opererebbe una funzione, potrebbe esistere una funzione upper che riceve come parametro la stringa, e la restituisce convertendola in maiuscolo es. upper(stringa) → non esiste come funzione, esiste solo il metodo
Le funzioni sono generali e possono accettare argomenti di diverso tipo Le funzioni sono chiamate direttamente, con un elenco di parametri ● func(param) Le funzioni restituiscono un risultato che può essere salvato in una variabile ● result = func(param)
Diversi metodi sono specifici per diversi tipi di oggetti Un metodo è chiamato sempre su un oggetto ● Tutte le stringhe hanno un gruppo di metodi ● Tutti gli interi hanno un gruppo di metodi I metodi sono chiamati con la notazione del punto (dot-syntax), con eventuali parametri ● object.method(parametri) I metodi restituiscono un risultato che può
● Nota: deve essere un numero intero ● Parte intera di: (larghezza totale – larghezza piastrella) / ( 2 * larghezza piastrella) Quante piastrelle? ● 1 + 2 x numero di coppie Spazio a ciascuna estremità ● (larghezza totale – numero di piastrelle * larghezza piastrella) / 2
L’algoritmo Calcolare il numero di coppie di piastrelle ● Numero di coppie = parte intera di (larghezza totale – larghezza piastrella) / (2 * larghezza piastrella) Calcolare il numero di piastrelle ● Numero di piastrelle = 1 + (2 * numero di coppie) Calcolare lo spazio ● Spazio ad ogni estremità = (larghezza totale – numero di piastrelle* larghezza piastrella / 2) ● Visualizzare il numero di coppie di piastrelle ● Visualizzare il numero di piastrelle totale in una riga ● Visualizzare lo spazio vuoto
Unità P
Finora abbiamo scritto programmi semplicissimi in cui avevamo variabili già impostate → programmi scritti in questo modo hanno un'utilità limitata, perché tutte le volte che li eseguo danno lo stesso risultato. La cosa più comoda e utile è avere un programma che si interfacci con l’utente, cambiando così variabili ogni volta, così che il programma produrrà un risultato differente ad ogni variazione di valori in input. Nel nostro caso l’interazione con l’utente sarà quella via tastiera.
Come possiamo chiedere un input all’utente? Con la funzione input. Accetta un argomento che è il messaggio che stampiamo a video → la funzione restituisce una stringa corrispondente a quello che l’utente ha composto, che memorizziamo in una variabile
Il pallino rosso è un “ break point ”, un punto in cui l’esecuzione del programma si fermerà in ogni caso (unico modo per capire i bug del programma). Pigiando lo “step through” invece della freccia verde. Utilizzare “step through” senza break point non esegue il programma passo per passo, ma tutto insieme, quindi non ha senso usarlo Premo il pulsante “ step over ” (per eseguire una istruzione alla volta), inserisco la mia istruzione/variabile così mi fa compilare una variabile alla volta, che compaiono durante l’esecuzione del programma.
Se invece di step over pigio la lineetta con il triangolino verde (“ resume program ”) per eseguire le istruzioni insieme, senza chiedere istruzione volta per volta.
Il quadrato rosso termina l’esecuzione del programma.
Pycharm segnala gli errori in alto a destra con il punto esclamativo nel pallino rosso , cliccandolo elenca gli errori e le specifiche ● su code → reformat code, sistema gli errori (non sempre funziona) segnala gli avvisi con i warnings nel triangolo beige, dice delle cose non “belle” dal punto di vista dello stile
Visualizzazione dei dati inseriti:
a. si indica con f all’inizio e tutti i valori nelle variabili vanno messi tra graffe (option + shift + parentesi quadre) b. sostituisce al contenuto della parentesi graffa, il valore della variabile c. permette di formattare la stringa, si può decidere alcuni azioni di visualizzazione d. opzione di visualizzazione i. :numero → {Giulia:20} → si visualizzano altri 14 spazi dopo il nome Giulia → ampiezza stringa ii. :^numero → {Giulia:^20} → si visualizza il nome al centro di 20 spazi iii. :>numero → {Giulia:>20} → si visualizza il nome allineato a destra dei 14 spazi iv. :>numero → {Giulia:>20} → si visualizzano 14 carattere riempitivi di asterischi prima del nome
opzioni di formattazione per le stringhe
la variabile che sto formattando la sto formattando come un intero → inserisco :d dopo la variabile
la variabile che sto formattando la sto formattando come un floating → inserisco :f dopo la variabile
Differenza tra round e f-string round → arrotonda il valore float alla terza cifra, non posso controllare l’ampiezza complessiva
se il numero di spazi non è lo stesso, pycharm lo segnala
ci sono dei casi in cui se la condizione non è verificata non si fa nulla → l’istruzione if esiste da sola (solo ramo vero) manca l’else, è una leggera ottimizzazione
possono anche esserci più istruzioni in if e else non è una buona tecnica di programmazione, in quanto si tratta di una duplicazione del codice, nei quali si rischia di incorrere in errori duplicati → quando mi accorgo devo correggere tutti gli errori precedenti
Ogni istruzione if è associata a una condizione che generalmente confronta due valori con un operatore
Indentazione dentro agli if o gli else → attenzione ai livelli I blocchi di istruzioni possono essere annidati all’interno di altri blocchi di istruzioni È possibile annidare un if all’interno di una delle due diramazioni di un altro if
Esempi:
Verificare se due stringhe sono uguali ==
Verificare se due stringhe sono diverse !=
Se uno qualunque dei caratteri è diverso, le stringhe non sono uguali:
Nella tabella ASCII confrontiamo il codice di ogni carattere corrispondente nella tabella (in cui anche maiuscole e minuscole sono diverse) → i caratteri sono ordinati Nella tabella ASCII le lettere minuscole valgono di più delle maiuscole, quindi in questo caso name2 > name
L’ordine delle lettere è definito dal codice Basic Latin (ASCII) Subset of Unicode ● Le lettere MAIUSCOLE vengono prima delle minuscole ○ ‘A’ viene prima di ‘a’, ma anche ‘Z’ viene prima di ‘a’ ● Lo ‘spazio’ viene prima di tutti i caratteri stampabili ● I numeri (0-9) vengono prima delle lettere ● L’ordine delle lettere accentate non è sempre logico né corretto….
Per confrontare due stringhe alfabeticamente si usa un operatore relazionale : string1 < string
Un controllo esatto su un floating point vuol dire che c’è un errore nella programmazione → generalmente quello che ci interessa vedere è che sia all’interno di un intervallo
Come comportarsi se ci sono più di due alternative (vero/falso)? Esempio: determinare gli effetti di un terremoto in base al valore della sua intensità in base alla scala Richter ● 8 (o superiore) ● Da 7 a 7.