Fondamenti di informatica
1.1 Calcolatori e programmi
I calcolatori eseguono istruzioni estremamente elementari a velocità molto elevata.
Di per sé, un computer è una macchina che immagazzina dati (numeri, parole, immagini), interagisce con dispositivi (lo schermo, gli altoparlanti, la stampante) ed esegue programmi.
Un programma per calcolatore spiega con grande dettaglio al calcolatore quale sia la sequenza di passi che devono essere messi in atto per risolvere un problema.
Chiamiamo hardware l’insieme costituito dalla parte fisica del calcolatore e dai suoi dispositivi periferici, mentre i programmi eseguiti sono il software.
La progettazione e la realizzazione di programmi per computer sono due attività che prendono il nome di programmazione. Essa consiste quindi nella progettazione e nella realizzazione di programmi per computer.
1.2 Anatomia di un calcolatore
Nel cuore del calcolatore si trova l’unità centrale di elaborazione (CPU, central processing unit). La CPU si occupa del controllo dell’esecuzione dei programmi e dell’elaborazione dei dati, cioè individua ed esegue le istruzioni del programma: effettua le operazioni aritmetiche, recupera i dati dalla memoria esterna o dai dispositivi periferici, per poi memorizzarvi i risultati delle elaborazioni.
Esistono due tipi di memoria:
- Memoria principale, detta anche semplicemente “memoria”, è costituita da circuiti elettronici che sono in grado di memorizzare dati quando sono alimentati elettricamente.
- Memoria secondaria, che generalmente è un disco rigido (hard disk) oppure un dispositivo allo stato solido, consente un’archiviazione dei dati meno costosa e più lenta, che, però, viene mantenuta anche in assenza di elettricità.
N.B: Quando viene avviato un programma, le sue istruzioni vengono copiate nella memoria, dove la CPU le può leggere: la CPU legge ed esegue un’istruzione per volta. A seconda delle direttive espresse da tali istruzioni, la CPU legge dati, li modifica e li scrive nuovamente nella memoria principale o nella memoria secondaria.
1.3 Linguaggio di programmazione Java
Un programma per computer è costituito da un gran numero di semplici istruzioni, per tale motivo sono stati ideati i linguaggi di programmazione di alto livello, mediante i quali si possono specificare le azioni che devono essere svolte da un programma, dopodiché sarà un compilatore a tradurre le istruzioni di alto livello nelle più dettagliate istruzioni necessarie alla CPU, che vengono chiamate codice macchina.
Java ha una ricca libreria che permette di scrivere programmi portabili (cioè “trasferibili”) da un sistema operativo all’altro. Inoltre esso ha due qualità: sicurezza e portabilità.
- L’ambiente Java consente a chiunque di eseguire programmi all’interno del proprio browser senza alcun timore: le caratteristiche di sicurezza previste dal linguaggio Java garantiscono l’interruzione dell’esecuzione di un programma nel momento in cui questo tenti di compiere azioni potenzialmente non sicure.
- L’altro vantaggio di Java è la portabilità: il compilatore Java non traduce i programmi Java direttamente in istruzioni per la CPU. I programmi Java compilati contengono, invece, istruzioni eseguibili dalla macchina virtuale Java, un programma che simula il funzionamento di una CPU reale; per questo motivo può operare in molti sistemi operativi.
I diversi sistemi operativi richiedono azioni significativamente differenti per mettere in esecuzione l’ambiente di sviluppo Java. Bisogna innanzitutto eseguire un editor, cioè un programma che svolge una funzione analoga a un elaboratore di testi, poi è necessario aprire una finestra per l’esecuzione di comandi o “finestra di terminale”, dove digitare i comandi che eseguono il programma realizzato.
N.B: Prima di poter eseguire il programma, il compilatore Java traduce il file sorgente, cioè gli enunciati che avete scritto, in file di classi, contenenti istruzioni per la macchina virtuale Java. Dopo che il compilatore ha tradotto il codice sorgente in istruzioni per la macchina virtuale, questa le può eseguire. Durante l’esecuzione, la macchina virtuale accede a una libreria di codice precompilato.
1.6 Errori
In Java possono presentarsi diversi tipi di errore quali:
- Errore in fase di compilazione (compile-time error) o errore di sintassi: in base alle regole del linguaggio c’è qualcosa di sbagliato e il compilatore se ne accorge.
- Errore in fase di esecuzione o errori logici: il programma è sintatticamente corretto e fa qualcosa, ma non quello che dovrebbe fare.
- Altri errori logici, invece, sono tanto gravi da generare un’eccezione: un messaggio d’errore emesso dalla macchina virtuale Java.
1.7 Il concetto di algoritmo
Per fornire una risposta a un problema che preveda il calcolo di una risposta, un programma per calcolatore deve seguire una sequenza di passi che:
- Non sia ambigua.
- Sia eseguibile.
- Arrivi a compimento (in un tempo finito).
Una sequenza di passi che non sia ambigua, che sia eseguibile e che termini in un tempo finito prende il nome di algoritmo.
Lo pseudo codice, inoltre, è una descrizione informale di una sequenza di passi che risolvono un problema.
Utilizzare oggetti (Capitolo 2)
Variabili
Assegnazione, vale solo per le variabili. Esso inizializza la variabile oppure modifica il valore assunto dalla variabile precedentemente.
Scrittura: tipo nome = valore
Es: int width = 20;
Es: width = 20; / width = width + 10; / width = height;
Metodi
Invocazione: invoco un metodo che altri hanno già creato. I metodi sono usati per manipolare gli oggetti.
Scrittura: oggetto.metodo();
- Es: String greeting = “hello, World!”;
- Int numberOfCharacters = greeting.length();
- String river = “Mississippi”;
- String bigRiver = river.toUppercase();
- String river = “Mississippi”;
- String river = river.replace(“issipp”, “our”);
- box.translate(15,20);
N.B: Si possono invocare più metodi alla volta con “l’invocazione a cascata”.
Es --> greeting.replace(“World”, “Dave”).length();
Dichiarazione: descrivo che cosa fa il metodo. Siamo noi a specificare le istruzioni parametriche dovrà eseguire. Per la dichiarazione abbiamo bisogno del tipo dei parametri e tipo del valore restituito.
Scrittura: public tipo valore restituito metodo(tipo argomento argomento)
- Es: public String replace(String target, String replacement)
- public void println(int output)
Oggetti
Costruzione oggetti: si usa l’operatore new seguito dal nome della classe e da parametri opportuni.
Es: new Rectangle(5,10,30,15)
Dopo averlo creato questo si può salvare in una variabile oggetto che deve avere come tipo la classe dell’oggetto.
All’interno della variabile non c’è l’oggetto ma solo un riferimento ad esso che ne descrive la sua posizione in memoria.
Es: box = Rectangle new Rectangle(5,9,3,4);
Pacchetto
La documentazione API contiene pacchetti in cui sono organizzate classi: per utilizzarle bisogna sempre importare questi pacchetti.
Es: import nomepacchetto.nomeclasse;
N.B: Le variabili possono essere di tipo:
- Locale: sono dichiarate e inizializzate nel corpo del metodo ed entrano in vita quando si invoca il metodo; muoiono alla fine dell’istruzione. Appartengono ai metodi.
- Parametro: vanno dichiarate e inizializzate con il valore di chiamata nell’argomento del metodo, entrano in vita quando si invoca il metodo; muoiono alla fine dell’istruzione.
- Di istanza: entrano in vita quando viene creato l’oggetto, muoiono quando non viene più utilizzato l’oggetto. Possono non essere inizializzate perché assumono un valore iniziale di default (0 per i numeri, null per le variabili oggetto). Appartiene agli oggetti.
Differenze:
- Parametri, locali sempre inizializzate (istanza no).
- Istanza, visibili in tutto il programma (altre no).
- Istanza sempre “vive” fintanto che l’oggetto viene usato. Le altre muoiono quando finisce l’istruzione del metodo.
Realizzare classi (Capitolo 3)
Struttura classi
Interfaccia pubblica: essa specifica cosa si può fare con gli oggetti della sua classe. È formata da:
I. Intestazione dei metodi pubblici:
Struttura: Modalità di accesso tipo nomeMetodo()
- Es: public void deposit(double amount)
- public double getBalance()
II. I costruttori.
Dichiarazione dei costruttori: impostano valori iniziali per i dati degli oggetti, cioè inizializzano gli oggetti. Il nome del metodo costruttore è sempre uguale al nome della classe; essi non definiscono il tipo del valore restituito.
Struttura: modalità di accesso nomeCostruttore()
Implementazione privata: essa comprende le variabili di esemplare (descrivono i dati interni dell’oggetto), il corpo di costruttori (inizializza gli oggetti) e metodi info private del progettista (istruzioni che modificano le variabili di istanza).
N.B: Nell’implementazione di un metodo si definisce una variabile parametro per ogni argomento che si vuole ricevere ma non viene analogamente definita una variabile parametro per memorizzare l’oggetto con cui il metodo verrà invocato, quest’ultimo è il parametro implicito (THIS). Tutte le variabili parametro, invece, sono i parametri espliciti.
La classe descrive i comportamenti di un insieme di oggetti e definisce dei metodi che vengono utilizzati per manipolare gli oggetti stessi. In generale la sintassi per la dichiarazione di una classe è:
Scrittura: Modalità di accesso class NomeClasse { variabili esemplare costruttori metodi }
N.B: Quella dentro le graffe è la dichiarazione della variabile di istanza. Essa memorizza i dati necessari per l’esecuzione dei propri metodi.
Es: Metodi Classe Counter:
- click, incrementa di una unità il valore del contatore;
- getValue, restituisce il valore attuale del conteggio.
Es: public class Nome delle Classe { private tipo nomeVariabile }
Esempio completo
File BankAccount.java
public class BankAccount
{
private double balance;
public BankAccount()
{ balance = 0; }
public BankAccount(double initialBalance)
{
balance = initialBalance;
}
public void deposit(double amount)
{
balance = balance + amount;
}
public void withdraw(double amount)
{
balance = balance - amount;
}
public double getBalance()
{
return balance;
}
}
File BankAccountTester.java
public class BankAccountTester
{
//collauda i metodi della classe BankAccount
public static void main(String[] args)
{
BankAccount harrysChecking = new BankAccount();
harrysChecking.deposit(2000);
harrysChecking.withdraw(500);
System.out.println(harrysChecking.getBalance());
System.out.println(“expected: 1500”);
}
}
N.B: In questo caso devo salvare i due file nella stessa directory e successivamente:
- Compilare entrambi i file;
- Eseguire solo il programma tester.
N.B: Qui si può utilizzare anche un altro metodo, il metodo transfer che trasferisce il saldo da un conto a un altro.
Scrittura: public void transfer(BankAccount finale, double amount){this.withdrow(amount); finale.deposit(amount);}
Tipi di dati fondamentali (Capitolo 4)
Numeri
I tipi Java ha otto tipi primitivi, tra i quali:
- Quattro tipi numerici interi: int, byte, short, long;
- Due tipi numerici in virgola mobile: double, float;
- Un tipo per memorizzare caratteri: char;
- Un tipo che può assumere solo due valori, vero o falso: boolean.
N.B: All’interno delle variabili di tipo intero si possono inserire solo numeri compresi in un certo range (tra circa -2 miliardi e +2 miliardi). Perciò per i valori più grandi si utilizza il tipo long, per quelli più piccoli il tipo short.
Aritmetica
Operatori aritmetici: Java consente l’esecuzione delle quattro operazioni aritmetiche basilari: addizione, sottrazione, divisione, moltiplicazione.
N.B: Incrementazione: items++ --> items = items + 1;
Decrementazione: items-- --> items = items - 1;
Divisione intera: intero/intero restituisce un numero intero e ignora il resto della divisione. Per avere anche la parte decimale è necessario utilizzare il tipo double.
Modulo: operatore che restituisce il resto della divisione intera (7%4).
La libreria Java contiene molte funzioni matematiche tra cui le più importanti:
- Math.pow(x,n) --> xn;
- Math.sqrt(x) --> √x;
- Math.round(x) --> metodo che arrotonda il valore all’intero più vicino, il valore che viene restituito è di tipo long.
N.B: Il metodo statico è un metodo che non opera su nessun oggetto. Essi infatti non vengono invocati nel metodo usuale ma viene specificata la classe al posto dell’oggetto.
Scrittura: nomeClasse.nomeMetodoStatico(argomento)
Dati in ingresso e in uscita
Per acquisire dati tramite la tastiera, all’interno di una finestra di console, si usa la classe Scanner.
Scrittura:
import java.util.Scanner;
Scanner in = new Scanner(System.in);
- Creo oggetto di tipo Scanner per leggere dalla tastiera.
System.out.print(“please enter the number: ”);
Int numer = in.nextInt();
- Definisce una variabile per memorizzare il valore acquisito.
N.B: L’istruzione next --> legge una parola; nextLine --> una riga; nextInt --> un numero int; nextdouble --> un numero double.
Stringhe
Una stringa è una sequenza di caratteri (caratteri = valori di tipo char).
I caratteri hanno valori numerici e letterali (‘H’, solo un apice). I metodi principali di tipo char sono:
- charAt: restituisce un valore di tipo char estratto da una stringa. I caratteri di ciascuna stringa hanno una propria posizione: si parte sempre a contare dalla posizione 0.
Scrittura: public char charAt(int posizione)
Es: String nome = “Harry”;
char start = nome.charAt(0);
Char last = nome.charAt(4);
- substring: restituisce una parte della stringa a partire dalla pos iniziale fino alla pos finale -1.
Es:
String hi = “Hello!”;
String sub = hi.substring(1,4);
Errori
- Errori di overflows: questi errori avvengono quando il risultato di un calcolo non rientra nell’intervallo di variabilità del tipo numerico;
- Errore di arrotondamento: i calcolatori rappresentano i numeri con il sistema binario nel quale non esiste una rappresentazione esatta di certi numeri razionali perciò si sfocia in un errore di arrotondamento;
- Errori di assegnazione: non si può assegnare un valore di tipo double in una variabile intera.
Costanti
Essi sono dei valori che non vengono modificati e che hanno un significato ben preciso all’interno dell’elaborazione. Per definire tali variabili si usa l’attributo FINAL.
Scrittura: final TipoVariabile NOMEVARIABILE = Valorevariabile;
Definita nel corpo del metodo visibile solo lì.
Se esse devono essere utilizzate in più metodi, è conveniente dichiararle assieme alle variabili di istanza.
Scrittura: public static final tipo Variabile NOMEVARIABILE = Valorevariabile;
CashRegisterSimulator.java
import java.util.Scanner;
public class CashRegisterSimulator
{ public static void main(String[] args)
{ Scanner in = new Scanner(system.in);
CashRegister register = new CashRegister();
System.out.print("Enter price: ");
double price = in.nextDouble();
register.recordPurchase(price);
System.out.print("Enter dollars: ");
int dollars = in.nextInt();
System.out.print("Enter quarters: ");
int quarters = in.nextInt();
System.out.print("Enter dimes: ");
int dimes = in.nextInt();
System.out.print("Enter nickels: ");
int nickels = in.nextInt();
System.out.print("Enter pennies: ");
int pennies = in.nextInt();
register.enterPayment(dollars, quarters, dimes, nickels, pennies);
System.out.print("Your change: ");
System.out.println(register.giveChange());
}}
Decisioni (Capitolo 5)
Enunciato if
Def: L’enunciato if con
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
-
Fondamenti cpp
-
Fondamenti di informatica
-
Fondamenti di informatica
-
Appunti Fondamenti di informatica