Scarica Introduzione all'informatica: Codifica, Algoritmi e Strutture Dati e più Appunti in PDF di Fondamenti di informatica solo su Docsity!
L’INFORMATICA
Il termine informatica è stato introdotto da Philippe Dreyfus nel 1962: l’etimologia deriva dal termine francese informatique , come fusione di inform(ation electronique ou autom)atique. Il termine voleva rappresentare di conseguenza il trattamento dell’informazione mediante uno strumento automatico (il calcolatore). Tutti coloro che ritengono l’informatica come una scienza che parla inglese ma in tale lingua non esiste l’equivalente di informatica : viene infatti usato il termine più generico ‘computer science”. Dunque è la scienza degli elaboratori, della rappresentazione e dell’elaborazione (trasformazione) dell’informazione. , la convergenza di 2 aspetti distinti l’informazione e la sua elaborazione.
L’INFORMAZIONE
La parola informazione è molto generale: Qualunque notizia o elemento di conoscenza; È qualcosa che se fornita dà conoscenza, dissipa i dubbi, aumenta la certezza Scambio di messaggi tra chi trasmette e chi riceve (presuppone l’esistenza di due entità il mittente e il ricevente) Per scambiare l’informazione bisogna avere uno o più simboli che la rappresentano (significato). Il simbolo la rappresenta. Il contenuto informativo del simbolo, dipende dal contesto. Shannen la definisce così “L’informazione è tutto ciò che può consentire di ridurre il nostro grado di incertezza su un evento che si può verificare” Un dato è un singolo elemento informativo (cioè elemento di possibili valori). La conoscenza (informazione) aumenta se riceviamo un dato e il suo significato. Il solo dato (la parte estensionale di un’informazione) non fornisce conoscenza non è informazione. Preso fuori dal suo contesto non è interpretabile manca la sua chiave di lettura (TIPO), non fornisce né accresce la conoscenza. Il concetto di informazione è legato a quello di scelta. Se non c’è scelta non c’è informazione. Quando si riceve informazione ogni simbolo recepito permette al ricevente di eliminare alternative. L’informazione riduce l’incertezza di una scelta. Quando più ampia è la scelta maggiore è l’informazione. (TEORIA DELL’INFORMAZIONE dice che porta a scioglier l’incertezza) L’incertezza di un evento è misurata dalla probabilità che esso si verifichi ed è inversamente proporzionale a tale probabilità L’informazione è una tripla I = {ATTRIBUTO, TIPO, VALORE} dove : l’attributo è il nome associato all’informazione, ne chiarisce cioè il significato (il contesto in cui avviene la scelta); il tipo è l’insieme (con cardinalità finita) di tutti i possibili valori che può assumere; Il valore è la scelta di uno dei possibili valori all’interno del tipo.
L’UNITA’ DI MISURA DELL’INFORMAZIONE
La quantità di informazione che consente di distinguere uno tra due eventi (configurazioni) equiprobabili e mutualmente esclusivi è l’unità di informazione il Bit. Il bit è l’incertezza associata a una variabile casuale che può assumere 2 valori (0 e 1) con eguale probabilità, o, l’informazione che si ottiene nel momento in cui è noto il valore di tale variabile. La quantità di misura dell’informazione collegata ad un simbolo è definita come I=log 2 P(x) dove P è la probabilità di trasmissione di quel simbolo. Probabilità lancio moneta = 1 bit La rappresentazione digitale di un informazione ha un’importanza fondamentale , solo nel caso un informazione può essere rappresentata come sequenza di cifre binarie , può essere rappresentata come sequenza di cifre binarie , può essere trasferita o elaborata da un computer. Il termine bit deriva dalla fusione di due parole Binary e digIT : poiché digit in inglese vuol dire cifra, bit è l’abbreviazione di cifra binaria. ( o cifra dell’aritmetica binaria) Comunemente si usa un aggregazione di 8 bit, detto byte e le unita di misura dell’informazione sono multipli ( in genere garndi) del byte. 1000 byte sonono un kiloByte , 1024 byte sono un kibibyte (2^10 ). La definizione di kilobyte per indicare 1024byte è stata espressamente vietata da diversi organi di standardizzazione quali la Commissione Elettronica internazionale(IEC), L’ISEEE e l’ISO.
CODIFICA (Convenzione per la manipolazione del valore)
Una stessa informazione potrebbe essere rappresentata in diversi modi.Tale informazione deve essere comprensibile affinchè chi riceve sia capace di interpretarla ( chiave di lettura). E’importante dunque conoscere il sistema di codifica ( o codifica o codice), ovvero il processo che porta ad assegnare una rappresentazione dell’informazione. Una codifica è un insieme di regole che devono essere condivise per attribuire un significato a ciascuna. Per trasferire un informazione è importante che si conosca ( o condivida) il metodo di rappresentazione usato, altimenti si creano ambiguità o non si riesce a stabilire i suo valore. Esistono svariate codifiche per un informazione , in ambito informatico la più importante è la rappresentazione binaria Un sistema di codifica usa un insieme di simboli (alfabeto Es. 1,0) , combinazione di questi simboli (configurazioni stati , regole di composizione,codice 1234,10). Rappresenta il processo che porta ad eseguire una rappresentazione all’informazione.
SIGNIFICATO DI UN CODICE
- Un codice non ha significato di per sé. Il significato è attribuito dalla codifica (cioè dalla funzione c )
- L’associazione stringa-codifica è data dall’operatore umano Ad esempio, la stringa 1000 0101 rappresenta: - il numero naturale 133 in binario naturale - il numero naturale - 123 in complemento a 2 - il carattere à in codice ASCII esteso Codifica con sequenze di bit
- Con 1 bit si possono distinguere due diverse informazioni .Per distinguere più informazioni bisogna usare sequenze di bit.
- Le diverse configurazioni di n bit permettono di individuare 2n^ informazioni diverse.
- Alcune sequenze di bit assumono nomi particolari:
- una sequenza di 8 bit viene chiamata “byte” GIORNI DELLA SETTIMANA => log 2 7 =k= DEFINIZIONE : Un sistema di numerazione si dice posizionale se le cifre (o più in generale i simboli) usate per scrivere dei numeri assumono valori diversi a seconda della posizione che occupano. Si dice pesato perché ad ogni posizione è associato un peso espresso come potenza della base Codifica di numeri (interi senza segno)
- Notazione posizionale
- concetto di base di rappresentazione, B
- rappresentazione del numero come sequenza di simboli , detti cifre
- appartenenti a un alfabeto composto di B simboli distinti
- in cui ogni simbolo rappresenta un valore fra 0 e B - 1
- il valore di un numero v espresso in questa notazione è ricavabile
- a partire dal valore rappresentato da ogni simbolo
- pesato in base alla posizione che occupa nella sequenza Valore di un numero (notazione posizionale) Osservazioni
- ogni numero è esprimibile in modo univoco in una qualunque base; in particolare:
- base B= 2 due sole cifre: 0 e 1
- base B=8 otto cifre: 0, 1, 2, 3, 4, 5, 6, 7
- base B=10 dieci cifre: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
- base B=16 sedici cifre: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F REAZIONE FRA DIVERSE BASI La relazione fondamentale se B1 = B * Bn-^1 , ogni cifra nella rappresentazione R1 corrisponde a n cifre nella rappresentazione
R2 ∑ nc=0 ci pi =∑ nc=0 ci bi^ base =b
- ogni cifra esadecimale corrisponde a 4 cifre binarie
- ogni cifra ottale corrisponde a 3 cifre binarie Conseguenze
- Se B1 è una potenza n della base B2 per passare dalla rappresentazione di un numero in base B1 a quella in base B2 (o viceversa) non è necessario applicare l'algoritmo di conversione, ma si può agire direttamente sostituendo ordinatamente ogni cifra di R con gruppi di n cifre di R2. COVERSIONE DI BASE Per effettuare una conversione di base di un numero N in base b 1 in un numero N’ in base b si effettua la divisione N/b, ottenendo un quoziente Q 0 ed un resto R 0 ; con R 0 < b e se Q 0 > b si divide successivamente Q 0 per b ottenendo un Q 1 ed un R 1. Detto procedimento si itera fino a che Qn< b. Si ha dunque : N = Q 0 * b + R 0 Q 0 = Q 1 * b + R 1 . Qn- 1 = Qn* b + Rn da cui N = Qn* bn+1+ Rn* bn+ Rn- 1 * bn-^1 ….. R 1 *b+ R 0 La sequenza di cifre del numero convertito N’ sarà dunque : Qn Rn Rn- 1 R 1 R 0 Con ciascuno dei numeri è compreso fra 0 e b- 1 - Da base 10 a base 2 ABBIAMO ANCHE LA CODIFICA ASCII
- BASE OTTALE - BASE ESADECIMALE
APPROCCI AL PROBLEM SOLVING
Ci sono due approcci fondamentali per progettare algoritmi, l’approccio top-down e l’approccio bottom-up , sono logicamente opposti ma in pratica nella programmazione si combinano insieme. TOP-DOWN o STEP-WISE REFINEMENT raffinamenti successivi
BOTTOM-UP
- parte dai requisiti della specifica ;
- li decompone in sottorequisiti;
- procede per decomposizione in modo gerarchico;
- termina quando i sotto-requisiti sono compiti elementari. Questo approccio consiste nel partire dal problema stesso e scomporlo in due o più problemi più semplici la cui soluzione equivale a quella del problema iniziale. Questo processo si dice scomposizione del problema iniziale in più sottoproblemi. I sottoproblemi possono esser ridotti in problemi più semplici e la scomposizione del problema viene iterata. Si prosegue nella scomposizione fino a giungere a problemi elementari risolvibili dall’esecutore. Il problema è rappresentato dalla descrizione finale delle scomposizioni
- parte dai compiti elementari che si sanno già svolgere;
- li combina per crearne di più complessi;
- stumenti librerie , subroutines , utilies;
- Mattoncini facili da realizzare e da verificare Questo approccio consiste nel partire dalla conoscenza dei problemi primitivi che l’esecutore sa risolvere e identificare composizioni o sequenze di tali problemi per risolvere il problema dato. Se iò non è sufficiente si deve trovare pe aggregazioni o giustapposizioni successive ) una sequenza appropriata di problemi primitivi. Il programma finale sarà rapresentato dalla descrizione della sequenza di problemi pimitivi da risolvere
ALGORITMO
L'informatica è lo studio sistematico degli algoritmi che descrivono e trasformano l’informazione: la loro teoria, analisi, progetto, realizzazione ed applicazione. [ACM – Association for Computing Machinery] Una volta formulato il problema e definito un procedimento sistematico risolutivo occorre dare le indicazioni su quli passi, quali azioni fare per garantire di arrivare alla soluzione del problema. Si definisce algoritmo una sequenza finita di passi tutti interpretabili ed eseguibili da chiunque e che a parità di dati inseriti (che definiscono l’istanza del problema), portano alla risoluzione automatica di un problema e alla stessa soluzione. Il singolo passo è detto azione elaborativa, e produce “semplici” trasformazioni sui dati del problema. L'esecuzione delle azioni nell'ordine specificato dall'algoritmo consente di ottenere, a partire dai dati di ingresso, i risultati che risolvono il problema Il terimine algoritmo significa “procedimento di calcolo”, deriva dal termine latino algorismus che a sua volta deriva dal nome del matematico Abu Ja’far Mohammed ib-Musa al Khowarismi, vissuto nel IX secolo d.C. IN SINTESI Un algoritmo è un procedimento effettivo di calcolo esplicito, descrivibile mediante un numero finite di regole non ambigue ( cioè interpretabili in modo univoco) che, partendo da un insieme di dati iniziali (input) conduce al risultato dopo un numero finito di operazioni ( cioè di applicazioni delle regole) e produce un insieme di valori finali (output). L’algoritmo deve essere eseguibile da un esecutore. Le parole chiave di un algoritmo sono dunque: Procedimento(o procedura). È un processo , un qualcosa che avvien nel tempo. Effettivo: qualcosa che avviene realmente , che è stato realizzato e soddisfatto Procedimento di Calcolo: serie di operazioni o istruzioni da eseguire per raggiungere il completamento o termine del calcolo Operazione : Azione specificata dall’applicazione di un’opportuna regola. Sequenzialità (di azioni). Numero finito di passi elementari. Determinismo Automatismo
ALGORITMO&PROGRAMMA
- Ogni elaboratore è una macchina in grado di eseguire azioni elementari su oggetti detti DATI.
- L’esecuzione delle azioni è richiesta all’elaboratore tramite comandi elementari chiamati ISTRUZIONI espresse attraverso un opportuno formalismo: il LINGUAGGIO di PROGRAMMAZIONE.
- La formulazione testuale di un algoritmo in un linguaggio comprensibile a un elaboratore è detta programma.
- Un programma è un testo scritto in accordo alla sintassi e alla semantica di un linguaggio di programmazione. ovvero la formulazione testuale, in un certo linguaggio di programmazione, di un algoritmo che risolve un dato problema.
- Un programma è la rappresentazione di un algoritmo in un dato linguaggio
- Il programma descrive un procedimento , il processo ne è l’attuazione Passi per la risoluzione di un problema: individuazione di un procedimento risolutivo scomposizione del procedimento in un insieme ordinato di azioni ALGORITMO rappresentazione dei dati e dell’algoritmo attraverso un formalismo ( linguaggio) comprensibile dal calcolatore LINGUAGGIO DI PROGRAMMAZIONE SOMMA CON IL PALLOTTOLIERE
- Si inizializzi il pallottoliere: si spostino sulla sinistra della prima riga un numero di palline pari al primo addendo, si spostino sulla sinistra della seconda riga un numero di palline pari al secondo addendo, si spostino tutte le palline della terza riga a destra
- Passo 1: si sposti una pallina dalla sinistra alla destra della prima riga e contestualmente se ne sposti una dalla destra alla sinistra della terza riga
- Si ripeta il passo 1 finché non si è svuotata la parte sinistra della prima riga
- Passo 2: si sposti una pallina dalla sinistra alla destra della seconda riga e contestualmente se ne sposti una dalla destra alla sinistra della terza riga
- Si ripeta l’operazione precedente finché non si è svuotata la parte sinistra della seconda riga
- Lettura del risultato: il numero di palline che si viene a trovare alla sinistra della terza riga al termine delle operazioni è il risultato SOMMA DI CIFRE IN BASE 10 _Disponendo di un esecutore in grado di comprendere il significato delle cifre decimali, di leggere e scrivere cifre su una lavagna, e di calcolare la somma e il riporto della somma di due cifre decimali e di un riporto, per effettuare la somma tra due numeri interi si può usare il seguente algoritmo:
- Si inizializzi la lavagna: si pulisca la lavagna e si scrivano i due numeri uno sotto l’altro incolonnati a destra.
- Si consideri la coppia costituita dalle cifre più a destra dei due numeri e si consideri come riporto iniziale 0.
- Si calcoli la somma e il riporto della coppia di cifre e del riporto considerati.
- Si scriva la somma sotto le due cifre considerate.
- Finché vi sono cifre a sinistra di quelle appena considerate, si al passo 3 considerando la coppia costituita da tali cifre e il riporto appena calcolato.
- Se l’ultimo riporto calcolato è diverso da 0, scriverlo a sinistra dell’ultima somma scritta sulla lavagna.
- Lettura del risultato: il risultato è scritto sulla lavagna sotto i due addendi._
ALGEBRA BOOLEANA- OPERATORI LOGICI
La costruzione di circuiti digitali , presenti negli elaboratori , si basa sull’algebra booleana. L’algebra di Boole ( dal suo inventore) serve a descrivere le operazioni logiche ,reti di manipolazione dei valori logici vero e falso (in stretta relazione l’algebra di Boole con il computer , vero e falso possono essere rappresentati con 0 e 1).Queste operazioni sono essenziali per l’architettura del computer. Ogni operatore può corrispondere booleano può corrispondere a un circuito elettronico che si comporta come l’operatore. Tali circuiti possono essere combinati per realizzare circuiti di grande importanza pratica nell’architettura del computer. Le funzioni dell’algebra booleana sono isomorfe ai circuiti digitali, cioè un circuito digitale può essere espresso tramite un espressione booleana e viceversa. I circuiti digitali elementari dette porte logiche( o gate che sono costruiti mediante transistor. Una porta può essere visualizzata come una Black box avente degi input e degli output binari) sono in grado di calcolare le principali operazioni. Le funzioni e le variabili possono assumere solo i valori vero o falso. Gli operandi ( detti anche variabili) sono proposizioni (semplici) vere o false e sono rappresentati spesso dalle lettere dell’alfabeto
- Gli operatori booleani di base sono:
- AND
- OR
- NOT ¬ Essi vengono applicati a uno (nel caso del NOT) o due e più (nel caso di AND e OR) argomenti e ritornano dei valori di verità. Unendo più proposizioni semplici tramite gli operatori si formano proposizioni complesse , il cui valore di verità è ricavabile dai valori assunti delle proposizioni costituenti. Una proposizione boolena può essere rappresentata in modo esaustivo ma non compatto ) tramite una tabella di verità. DEFINIZIONE ALGEBRICA
- Sia B è un insieme formato da almeno 2 elementi, si dice algebra booleana avente S come supporto la struttura algebrica costituita
- da S,
- da due operazioni binarie su B, OR e AND,
- da un'operazione unaria NOT su B
- e da un elemento particolare di B che indichiamo con 0,
- i quali godono delle seguenti proprietà:
- a,b B risulta
- a OR b = b OR a a AND b = b AND a
- NOT( NOT(a)) = a
- NOT (a OR b) = NOT(a) AND NOT(b)
- a AND 0 = 0 a OR 0 = a
LE ISTRUZIONI
Un algoritmo si presenta come un insieme di istruzioni opportunamente connesse tra loro in accordo a schemi precostituiti. Una prima classificazione è la seguente.
- Istruzioni dichiarative : servono fondamentalmente per descrivere i dati che sono utilizzati in un algoritmo e ne specificano le caratteristiche e la struttura.
- Istruzioni operative : corrispondono ad azioni semplici direttamente eseguibili dall’esecutore. Possono essere: Istruzioni di assegnazione che hanno il compito di calcolare il valore di un’espressione e di associarlo ad una variabile. Essa permette di attribuire un valore ad una variabile. In particolare questa può essere una costante, il valore assunto da un'altra variabile oppure il risultato di un’espressione. In ogni caso bisogna calcolare il valore assunto dalla frase a destra del simbolo di assegnazione ‘=’. Il significato attribuito a destra è quello di contenuto che è detto Right Value della variabile.. L’altro significato della variabile denota il Left Value , ovvero il contenitore o meglio la posizione del cntenitore della variabile. L’assegnazione gode di 2 proprietà: 1. È conservativa a destra : la variabile a destra dell’esecuzione non ambia valore tra prima e dopo l’esecuzione , ovvero mantiene il suo RV. 2. È distruttiva a sinistra : la variabile a sinistra perde il valore che aveva prima dell’assegnazione , evidenzia che il valore viene sovrascritto. Istruzioni di I/O: sono impiegate per leggere e scrivere i valori dei dati dei supporti di ingresso e di uscita come la tastiera e il monitor. Esse permettono o scambio di dati tra l’utente e l’esecutore, attraverso i dispositivi fisici (tastiera e monitor). Le istruzioni di ingresso permettono all’utente di comunicare i dati iniziali su cui l’esecutore deve effettuare l’elaborazione, mentre le istruzioni di uscita permettono all’esecutore di comunicare i risultati dell’elaborazione all’utente. ES. Semantica operazionale leggi(x) o scrivi (x)
FLOW – CHART
Nella risoluzione di un problema il primo passo verso la modellizzazione di un algoritmo è cercare di descrivere le azioni da fare in linguaggio naturale. In generale per descrivere gli algoritmi si ricorre a linguaggi formali. Si possono utilizzare gli pseudo-codici (forma testuale con costrutti di controllo descritti con la forma o parola chiave corrispondenti a quelli dei linguaggi di programmazione) o linguaggi grafici ( flow-chart o diagrammi di flusso ), in prima istanza. Il flow chart permette di descrivere un algoritmo concentrandosi principalmente sulla sequenza di operazioni di cui si compone; in particolare si basa su alcuni simboli grafici, che contengono operazioni da eseguire. I simboli vengono detti blocchi e si differenziano per la loro forma che è univocamente associata alla funzione che svolgono. Questi blocchi sono uniti da archi orientati che permettono di esprimere la direzione del flusso di elaborazione, ovvero di stabilire l’ordine di esecuzione delle varie istruzioni. Blocco ( rettangolo – simbolo di azione): rappresenta e descrive l’esecuzione di una o più istruzioni Selezione (rombo- simbolo di decisione) : Rappresenta un blocco selettivo che in funzione del valore predicato instrada il flusso in due strade distinte. Ha lo scopo di identificare strade alternative in funzione del valore assunt da una codizone.. Modulo : rappresenta l’astrazione di un diagramma di flusso Definizione Modulo : definisce inizio e fine di un modulo. Connettore : viene impiegato per far convergere diverse linee di flusso da cui si dirama un unico flusso uscente
La progettazione e la realizzazione dei programmi viene agevolato dai cosidetti IDE (integred development envirorment) che possiamo definire come una collezione di strumenti software integrati con interfaccia visuale che aiuta il programmatore nello sviluppo di un programma in tutte le fasi della realizzazione. Tipicamente è composto da:
- un editor di codice sorgente guidato da sintassi, che riconosce le principali strutture lessicali e sintattiche del linguaggio e agevola la fase di redazione evidenziando keywords, strutture di controllo e operando semplici controlli nel cosice sorgente per diminuire la probabilità di errori;
- un compilatore e un interprete ;
- un tool di building automatico che collega le unità che costituiscono il programma;
- un debugger che offre la possibilità di eseguire il programma controllandone l’esecuzione mediante la visualizzazione di valori che assumono le sue variabili e prevedono l’avanzamento istruzione per istruzione. Storia dei linguaggi di programmazione Sono stati sviluppati centinaia di linguaggi ad alto livello ma solo alcuni hanno ottenuto un largo consenso:
- Il FORTRAN (FORmula TRANslator) fu sviluppato dalla IBM negi anni 50 per essere utilizzato in pplicazioni scientifiche e di ingegneria che richiedono complessi calcoli matematici.
- Il COBOL ( Common Business Oriented Language) sviluppato nel 1959 da produttori di computer e da utenti governativi e industriali, è utilizzato per le applicazioni commerciali che richiedono una precisa ed efficiente manipolazioe di grandi quantità di dati.
- Il PASCAL sviluppato dal professor Wirth nel 1971 per insegnare la programmazione strutturata , più facile da testare e da modificare.
- Il linguaggio Ada sviluppato dal Dipartimento della Difesa degli Stati uniti , che voleva un unico linguaggio che potesse andare incontro alla maggior parte delle proprie necessità, che prende il nome da Lady Ada Lovelace figli di Lord Byron.Caratteristica di questo programma è il multitasking che consente ai programmatori di specificare molte attività in parallelo.
- Il C che si è evoluto da due linguaggi precedenti il BCPL e il B. Il BCPL fu sviluppato da Martin Richards nel 1967 come un linguaggio per scrivere il software dei sistemi operativi e dei compilatori. Thompson poi prendendo a modello il BCPL creò il B percreare le prime versioni del sistema operativo UNIX nei Bell Laboratories. Il linguaggio C fu un evoluzione sviluppata da Dennis Ritchie e implementato su computer DEC PDP-11 nel 1972. Il C aggiunge la tipizzazione dei dati , è indipendente dall’hardware e perciò i programmi scritti in C sono potabili su molti computer. Fu così che fu standardizzato nel 1989 e aggiornato nel 1999 creando dapprima un comitato tecnico X3J nel 1983 (INCIT/ISO/IEC9899-1999). Il C99 è uno standarsìd emendato per il linguaggio C che raffina ed esapande le potenzialità di quest’ultimo. Utilizza le funzioni della ibreria ANSI il che lo rende più efficiente.
- Il C++ è un estensione del C sviluppata da Bjarne Stroustup presso i Bell laboraties che fornice delle risorse per la programmazione modulare orientata agli oggetti. Ciò può contribuire a rendere i gruppi che sviluppano software più efficienti e produttivi. Ha acquisito anvche le capacità del Simula 67 per creare e manipolare gli oggetti.
- Il Java , sviluppato dal progetto di ricerca Greenistituito da Sun Microsystems nel 1993 e basato sul C e C++. Il suo creatore James Gosling lo chiamò Oak ( quercia) ma esistendo già un linguaggio coì fu chiamato Java. Su notò le potenzialità che esso poteva avere sulla costituzione di pagie Web con il cosidetto contenuto dinamico.
- Il BASIC, VISUAL C++ e C# che utilizzano le librerie .NET fu sviluppato dai professori Kemeney e Kurtz per far familiarizzare gli studenti con le tecniche di programmazione.
VARIABILI
Le variabili possono essere pensate come dei contenitori in cui memorizzare dei valori che serviranno durante l’esecuzione del programma. E’ un elemento della memoria che contiene una quantità di informazione(valore). Possiede un identificativo (nome univoco) , un tipo e un valore. L’istruzione di assegnazione permette di attribuire un valore ad una variabile. È un ’astrazione di una cella di memoria. Ogni volta che un valore è sistemato in una posizione di memoria esso si sostituisce al valore contenuto in precedenza in una data locazione. Dato che questa informazione srà distuttiva il processo di scrittura in una cella di memoria viene detto scrittura distruttiva. Un’informazione viene detta variabile se il suo valore viene determinato a tempo di esecuzione (run-time) del programma mediante un’esplicita istruzione di assegnazione nella quale l’informazione compare nel lato destro; viceversa è costante se il suo valore è predeterminato a tempo di compilazione , e quindi a tempo di esecuzione non può mai apparire a destra di un’assegnazione. IL SISTEMA DEI TIPI Ogni linguaggio mette a disposizione un sistema di tipi, che
- è composto da un insieme di tipi predefiniti, detti semplici, di utilità comune;
- consente di definire dei tipi strutturati ovvero aggregati di informazioni che condividono un significato.
- per ogni tipo c’è un nome detto identificatore di tipo che viene utilizzato nell’ambito di un programma per associare ad ogni variabile il tipo che le compete. Sono esempi di tipo: INTERO Informazioni numeriche di tipo intero positive o negative REALE Informazioni numeriche decimali co rappresentazione in virgola LOGICHE Informazioni di tipo booleano (2 valori) CARATTERE Informazione di tipo carattere alfanumerico STRINGA Informazione coatituita da una sequenza di caratteri REALE doppia precisone Informazioni numeriche in virgola mobile MODIFICATORI: stabiliscono la quantità di memoria allocata a un tipo di variabile ( short , long). SISTEMA DEGLI OPERATORI Sulle variabili possono essere eseguite operazioni che cambiano a seconda del tipo della variabile. Si utilizzano gli operatori a cui è associato un simbolo univoco che identifica la tipologia di trasformazione. Il sistema degli operatori è un insieme di regole e convenzioni sintattiche che consentono al programmatore di utilizzare gli operatori messi a disposizione dal linguaggio. Esso viene caratterizzato da:
- operatori previsti e loro tipologia ;
- precedenza degli operatori – cioè la proprietà che consente di determinare per un insieme di operatori l’ordine con cui viene applicato in un’espressione , in particolare un operatore viene aplicato se tutti gli altri più prioritari o della medesima priorità alla sinistra sono stati già applicati;
- associatività degli operatori- cioè la proprietà che determina la direzione in cui un operatore viene applicato. Un operatore viene detto unario se coinvolge un solo operando (operatore cambio di segno), binario se ne coinvolge due (operatore somma aritmentica) e ternario se invece prevede tre operandi.
bianchi alla sinistra ( allineamento a destra ) ES. (“%4d” ,123) ---- 123 e (“%-4d” ,123) 123 ----
- Il significato della precisone p , dipende dalla scelta della lettera X. Se il valore X è del tipo d cioè intero p indica il minimo numero di cfre da stampare , degli zero sono addizionati al numero se necessario , se p , in quest caso viene omesso si utilizza il valore di default 1. Con i valori floating point- formato decimale fissato- p indica quante cifre devono apparire dopo il punto ( il defult è 6). Se p , in questo caso è 0 non viene visualizzato neanche il punto decimale. Se è esponenziale p si comporta come per f. Es. se a = 123,4567 (“ %3.2f “, a) ---123. scanf (“ ”,& ) lettura da input- contiene solo i segnaposti CASTING CONVERSIONE PUO’ ESSERE ESPLICITO ( utilizzando (cast)) ED IMPLICITO TIPI Specifica di conversione TIPI Specifica di conversione Short int Int Long int Unsigned int (senza segno) %d %l %u Unsigned long Char Float (decimale) Float (scientifico) String %lu %c %f %e %s INDENTAZIONE : tecnica di scrittura molto utile per migliorare la leggiblità del programmatore ma ignorata dal compilatore: fa uso di spazi di rientro. STRUTTURE DI CONTROLLO Ogni linguaggio di programmazione mette a disposizione il proprio insieme di costrutti e passando da un linguaggio ad un altro si possono riscontrare differenze nella definizione e nel relativo funzionamento. Tuttavia ci sono dei requisiti generali che rispondono comunemente ai dettami della programmazione strutturata. In particolare:
- l’insieme delle strutture di controllo è funzionalmente completo , sono sufficienti a scrivere qualsiasi algoritmo , in particolare il famoso teorema di Bohm e Jacopini dimostra che un qualunque algoritmo può essere implementato utilizzando tre soli costrutti di programmazione: la sequenza , la selezione ( o struttura selettiva) e il ciclo( truttura iterativa), opportunamente composti ricorsivamente dalle istruzioni elementari (ovvero annidandoli).In questo modo l’istruzione goto , che consentiva al programmatore di specificare un trasferimeto di controllo verso uno di vastissimo raggio di possibili destinazioni all’interno del programma.
- Le strutture sono del tipo one-in e one-out ( singolo ingresso/uscita), possono essere considerate come una macro-istruzione ;
- Componibilità: le strutture possono contenere al loro interno istruzioni a loro volta composte senza limite con un procedimento di nesting (innesto). Strutture di controllo selettive Le strutture di controllo selettive consentono di instradare il flusso di controllo dell’algoritmo su più strade differenti in funzione del valore assunto da un condizione. Abbiamo diverse tipologie:
- il costrutto if-then , detta selezione unaria , in cui pur essendoci due strade distinte solo su una di queste si eseguono delle istruzioni.
- Il costrutto if-then-else , detta selezione binaria , prevede l’esecuzione di 2 blocchi alternativi di istruzioni sulla base del risultato della condizione.
- Nel caso in cui siano presenti più di 2 strade distinte si usa il case ; generalmente si aggiunge un'altra strada detta di default allorquando il valore dell’espressione di selezione non coincide con nessuno dei valori associato alle n strade. Il costrutto viene implementato in C con la variabile switch. Ogni ramo per essere esclusivo di altri deve terminare con un’istruzione di break. Inoltre abbiamo anche l’istruzione continue. Strutture di controllo iterative (o cicli) Consentono di ottenere che una data istruzione, o blocco, sia eseguito ripetutamente e deve consentire di specificare sotto quali condizioni l’iterazione (ripetizione) debba terminare. Un ciclo (loop) è un gruppo di istruzioni che il computer eseguirà finchè una certa condizione di continuazione del ciclo rimarrà vera. Elementi di un costrutto ciclico:
- Inizializzazione : le variabili usate devono essere inizializzate prima nella valutazione della condizione;
- Condizione : deve essere valutata la condizione di permanenza nel ciclo per determinare la sua ripetizione o la terminazione del ciclo.
- Modifica : almeno una delle variabili della condizione deve essere modificata all’interno del ciclo i modo che prima o poi la condizione di ripetizione diventi falsa , causando la terminazione de ciclo.
- Richiede inoltre una variabile di controllo nel caso in cui fosse predeterminata il numero di volte Si dividono in 2 categorie: non predeterminati (iterazione indefinita) :
- il ciclo while è un costrutto in cui la ripetizione è espressa in termini di una condizione logica che indica se si continua la ripetizione, se questa è vera allora il ciclo continua a ripetere le istruzioni in esso contenuto. Possiamo avere un valore sentinella, o valore fittizio, o valore dummy , o detto anche flag che mi fa terminare il ciclo.
- Il ciclo repeat-until ( utilizzato in Pascal) differisce dal precedente per due aspetti, viene espressa la condizione di terminazione del ciclo anziché quella di permanenza e il blocco di istruzioni dunque precede la verifica della condizione da cui dipende l’iterazione. Se questa è vera si esce dal ciclo
- Il do-while simile al repeat – until, ha dopo il blocco di istruzioni una condizione di continuazione del ciclo. Se questa è falsa si esce dal ciclo. Predeterminati (iterazione definita)
- Il ciclo for che consente di specificare quante volte debbano essere ripetute le istruzioni o il blocco controllato dal ciclo mediante l’introduzione di un contatore.
- NOTA : Un programma potrebbe andare in loop e bisogna assicurarsi che esiste almeno un caso in cui la condizione diventi falsa. CONTATORI : abbiamo i preincrementi ++i e i post incrementi i++ analogamente – i e i---