[:it]Progettazione orientata agli oggetti[:]

[:it]

ivan slavinsky

Si consideri un’automobile.

Essa è caratterizzata:

  • dal colore,
  • dalla cilindrata,
  • dalle caratteristiche degli interni,
  • dalla dimensione

Essa ha alcune funzioni:

  • si accende e si spegne
  • va più o meno veloce
  • trasposta una o più persone

Per definire il modello ho effettuato:

  1. un’astrazione sui dati mediante le sue caratteristiche (attributi)
  2. un’astrazione funzionale individuando le azioni che può compiere (operazioni)

Queste due astrazioni sono alla base dell’approccio orientato agli oggetti OO (Object Oriented), sia in relazione alla progettazione OOD  (Object Oriented Design) sia alla programmazione (OOP, Object Oriented Programming).

In pratica un dato è caratterizzato da:

  • insieme di valori
  • insieme di operazioni

Con l’espressione tipo di dato astratto ADT (Abstract Data Type) ci si riferisce a un tipo di dato completamente specificato, ma indipendentemente da una sua particolare implementazione.

Lo sviluppatore si occuperà dei contenuti informativi (dati o attributi) che per le operazioni specifiche associate al tipo di dato (metodi)

CLASSE

Il concetto di classe è alla base della progettazione e programmazione orientate agli oggetti.

Una classe rappresenta un modello formale per la descrizione di un certo tipo di oggetti definendone gli attributi, i metodi e le caratteristiche dell’interfaccia.

Le funzionalità sono chiamate METODI

Le componenti informative (dati) sono proprietà o ATTRIBUTI

Nella programmazione OO la creazione di un oggetto ha come conseguenza due azioni fondamentali:

  • allocare un’area di memoria per la memorizzazione dell’oggetto stesso;
  • inizializzare i valori degli attributi che costituiscono la componente informativa dell’oggetto–> COSTRUTTORE della classe.

UML

Per schematizzare una classe si usa la rappresentazione UML (Unified Modeling Language).

il simbolo + e – distingue il fatto che le componenti sono pubbliche o private.

  • nella prima sezione, a partire dall’alto, si inserisce il nome della classe;
  • la seconda sezione è relativa alla definizione degli attributi (proprietà)
  • la terza ed ultima sezione è relativa alla definizione delle operazioni  (metodi).

Per ogni metodo, oltre al suo livello di visibilità (pubblica o privata) è necessario definire:

  • i nomi e i tipi degli eventuali parametri e il loro ruolo (in/out/in-out)
  • il tipo dell’eventuale valore restituito

EREDITARIETA’

Si possono creare nuove classi a partire da classi già esistenti ereditandone le caratteristiche (attributi e/o metodi), aggiungendone di nuove o ridefinendone alcune. L’ereditarietà è finalizzata alla creazione di gerarchie di classi e grazie a essa si estende la possibilità di riutilizzare componenti comuni a più classi della stessa gerarchia.

Si definisce una classe generale o (classe base o superclasse) avente la funzione di definire le caratteristiche comuni a uno specifico insieme di oggetti. Le caratteristiche della classe generale potranno quindi essere ereditate o estese da altre classi (classi derivate o sottoclassi) che integreranno le caratteristiche della classe base con elementi specifici.

POLIMORFISMO

Utilizzando il polimorfismo è possibile ottenere comportamenti e risultati diversi invocando gli stessi metodi a carico di oggetti diversi.

Il polimorfismo è fondato sulla possibilità di ridefinire nelle classi derivate i comportamenti originali dei metodi ereditati dalla classe base; in questo modo è possibile ottenere metodi in grado di operare in modo appropriato su oggetti di diversa tipologia.

Ad esempio definisco una classe figura_geometrica ed all’interno di essa un metodo per il calcolo dell’area. Poi definisco tante figure geometriche con all’interno la classe calcolo area che si adatta alla singola figura geometrica.

METODI ASTRATTI

Il funzionamento dell’ereditarietà e del polimorfismo nei linguaggi di programmazione OO prevede esplicitamente la ridefinizione nelle sottoclassi derivate e i metodi definiti in una superclasse; in alcuni casi l’implementazione di un metodo in una classe base diviene puramente formale.

Ad esempio nel caso dell’area di una figura il metodo calcola area è vuota nel senso che la sua definizione viene poi demandata alle classi derivate.

I metodi con questa caratteristica prendono il nome di metodi astratti.

Classi che presentano uno o più metodi astratti sono definite classi astratte.[:]

Pubblicato in Senza categoria | Lascia un commento

[:it]Python: indentazione[:]

[:it]

ivan slavinsky

Dopo aver introdotto l’IF e successivamente il FOR, per indentazione si intende la necessità di incolonnare in maniera corretta tutto ciò che è compreso nell’IF o nella ricorsone (For o while).

In pratica in Python tutto ciò che è posto sulla stessa colonna viene interpretato come all’interno di un unico blocco di comandi.

Ad esempio:

IF (a>b)
        print(“prima riga”)
         print (“seconda riga”)
print(“terza riga)

 

In questo brevissimo pezzo di codice, si nota come a video vengono scritte la prima e la seconda riga solo se a>b e comunque scrive anche l’ultima.

 

Questo pezzo di codice invece cosa fa?

IF (a>b)
        print(“prima riga”)
         print (“seconda riga”)
         print(“terza riga)

scrive le tre righe solo se a>b.[:]

Pubblicato in Senza categoria | Lascia un commento

[:it]C++: Esercizi sulla ripetizione[:]

[:it]

Ivan Slavinsky

1. costruire un programma che accetta da tastiera dei numeri finchè viene inserito il valore 0; man mano li visualizza.

2. costruire un programma che accetta da tastiera dei caratteri e li conti. L’inserimento si interrompe quando il numero dei caratteri inseriti diventa 10;

3. dato un elenco di nomi con le rispettive città, conta quanti sono quelli di Milano;

4. dato un elenco di prodotti con i rispettivi prezzi, conta quanti sono quelli che hanno il prezzo superiore a 100€.

5. Dato un elenco di prodotti con descrizione e prezzo, calcolare l’incremento del prezzo secondo una percentuale fornita da tastiera. Comunicare per ciascun prodotto la descrizione ed il prezzo incrementato.

6. Calcolare il consumo medio di carburante di un elenco di veicoli utilizzando come dati di input i valori dei Km percorsi e dei litri di carburante per ciascun veicolo.

7. Riscrivere il seguente frammento di codice usando l’istruzione for

a=1;
while (a<=10) {
cout<<a<<endl;
a++;
}

8. Riscrivere il seguente frammento di codice utilizzando l’istruzione for

a=1
while(a<=10) a++
cout<<a<<endl;

9. costruire un programma che accetta da tastiera un elenco di N pezzi e li sommi. Alla fine fornisce il totale dei pezzi inseriti.

10. Dato un elenco di 20 studenti della prima classe della scuola superiore, con voto finale della scuola media, calcolare il valore medio dei voti.

11. Dati N studenti partecipanti ad una gara sportiva di velocità (nome studente, categoria, tempo) visualizzare il tempo dello studente vincitore (tempo minimo) tra gli studenti della categoria allievi.

12. Dati N modelli di cilomotori e motoclicli (nome del modello, cilindrata, prezzo), visualizzare il prezzo massimo tra i modelli di cilindrata superiore a 50 cc.[:]

Pubblicato in Senza categoria | Lascia un commento

[:it]C++: ciclo do …while[:]

[:it]

Ivan Slavinsky

La struttura di ripetizione si presenta con la forma do…while

do {
cout < “il mese: “;
cin>>mese;
} while (mese <1 || mese >12}

solo quando il mese digitato è compreso tra 1 e 12 l’esecuzione del programma procede con l’istruzione successiva while

RIPETIZIONE PRECONDIZIONALE

Nel lingiaggio C++ la ripetizione precondizionale, si presenta con l’istruzione while:

while(condizione) {
istruzioni;
}

mentre la condizione si mantiene vera, viene eseguita la sequenza di istruzioni (racchiuse tra le parentesi graffe)

Per esempio se si vuole far entrare da tastiera un elenco di numeri, segnando la fine dell’elenco con il numero 0, si può utilizzare il seguente pezzo di codice:

int numero;

cout << “inserire un numero (0=fine): “;

cin>>numero;

while(numero!=0)
{
..
}
cout<<“Inserire un numero (0=fine): “;
cin>> numero;
}[:]

Pubblicato in Senza categoria | Lascia un commento

[:it]Java: inserimento dati da tastiera[:]

[:it]

Ivan Slavinsky

In Java l’immissione di un dato avviene tramite la gestione di una stringa di dati in input.

Nell’esempio che segue il dato immesso viene convertito da stringa di caratteri ad intero.

/**
* semplice esempio per il casting eplicito
* @author Francesco Bragadin
* @version 1.0
*/

import java.io.InputStreamReader;
import java.io.BufferedReader ;
import java.io.IOException;

public class rettangolo {
public static void main(String[] args) {

double base, altezza,area;
/**
* legge da tastiera il tipo di dato
*/
System.out.println(“inseirsci il valore della base del rettangolo”);
base =0;
   BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
     try {
       base = Double.parseDouble(input.readLine());
         }
         catch (Exception e) {
         e.printStackTrace();
        }
System.out.println(“inseirsci il valore dell’altezza del rettangolo”);
altezza=0;
BufferedReader input1 = new BufferedReader(new InputStreamReader(System.in));
try {
altezza = Integer.parseInt(input1.readLine());
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println(“Area risulta”);
area=base*altezza;
System.out.println(area);
}
}

 

 

L’istruzione fondamentale per immettere un dato è quindi:

BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

che è una semplice istruzione di inizializzazione dell’oggetto input nella classe BufferReader.

Andando più avanti nella programmazione si nota che il comando

new ha il compito di inizializzare un oggetto con un opportuno valore.

Ad esempio:

Triangolo t= new Triangolo(p1,p2,p3);

la variabile t che è di tipo triangolo viene inizializzata con i tre valori dei vertici del triangolo stesso.

Poi il comando:

base = Double.parseDouble(input.readLine());

la variabile input1.readLine() viene passata alla funzione Double.parseDouble che effettua l’operazione da char a Double (in questo caso).

Il comando:

catch (Exception e) {
         e.printStackTrace();

questo comando invece gestisce gli errori, ad esempio invece che inserire un dato si dà direttamente l’invio, e compare il seguente messaggio:

java.lang.NumberFormatException: empty String
inseirsci il valore dell’altezza del rettangolo
at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
at sun.misc.FloatingDecimal.parseDouble(Unknown Source)
at java.lang.Double.parseDouble(Unknown Source)
at rettangolo.main(rettangolo.java:24)

 

 [:]

Pubblicato in Senza categoria | Lascia un commento

[:it]Java: Ereditarietà delle classi[:]

[:it]

Pierre Marcel

Un concetto fondamentale dell’OOD/OOP è quello dell’ereditarietà: utilizzando questo meccanismo è infatti possibile in un linguaggio OO creare nuovi classi a partire da classi già esistenti ereditandone le caratteristiche (attributi o metodi), aggiungendone di nuove o ridefinendone alcune. L’ereditarietà è finalizzata alla creazione di gerarchie di classi e grazie a essa si estende la possibilità di riutilizzare componenti comuni a più classi della stessa gerarchia.

Questi due pgm Java sono all’interno del package geometria e la prima definisce le caratteristiche di un punto mentre l’altro pgm triangolo utilizza gli attributi e i metodi della classe punto.

public class Punto {
             private double x;
             private double y;

public Punto(double x, double y)
{
   setX(x);
   setY(y);
}

public Punto(Punto p) {
        x=p.getX();
        y=p.getY();
}

public void setX(double x) {this.x=x;}
public void setY(double y) {this.y=y;}
public double getX() {return x;}
public double getY() {return y;}

public double distanza(Punto p) {
         double dx=x-p.getX();
        double dy=y-p.getY();
   return Math.sqrt((dx*dx)+(dy*dy));
}

public boolean equals(Punto p) {
return ((x==p.x)&&(y==p.y));
}

public String toString() {return “(“+x+”;”+y+”)”;}

public static void main(String[] args) {
         Punto p1=new Punto(1.,1.);
         System.out.println(“P1=”+p1.toString());
}
}

public class Triangolo {
private Punto a;
private Punto b;
private Punto c;
public Triangolo (Punto a, Punto b, Punto c) {
this.a=a;
this.b=b;
this.c=c;
}
public String toString() {
return “A”+a.toString()+” B”+b.toString()+” C”+c.toString();}
public static void main(String[] args) {
Punto p1= new Punto(1.,1.);
Punto p2=new Punto(3.,5.);
Punto p3=new Punto(5.0,7.9);
System.out.println(“P1=”+p1.toString());
System.out.println(“P2=”+p2.toString());
Triangolo t= new Triangolo(p1,p2,p3);
System.out.println(“Triangolo “+t.toString());

}
}

 

Almeno la classe principale del programma deve avere un metodo main da cui avrà inizio l’esecuzione. Ma una buona pratica di programmazione prevede di dotare ogni singola classe sviluppata di un metodo main che esegua un test dei metodi della classe, indipendentemente dal contesto di utilizzazione finale; senza sostituire la necessaria documentazione della classe, il metodo main costituisce anche un esempio di invocazione dei metodi per gli sviluppatori che devono utilizzare la classe nei programmi.

 [:]

Pubblicato in Senza categoria | Lascia un commento

[:it]Java: primo programma[:]

[:it]Il primo programma Java è inevitabilmente lo stampare il classico messaggio:

Hello word

Ripoterò qui e poi basta, per non generare confusione, il confronto tra il programma scritto in C++ e in Java

C++ Java
# include<iostream>
using namespace std;
int main(){
            cout<<“Hello word”;
                }
public class primoprogramma {

public static void main(String[] args) {
System.out.println(“Hello word”);
}

}

Si nota immediatamente che la sintassi utilizzata da Java potrebbe essere molto più complicata ad un primo approccio.

Vedo di analizzare riga per riga il programma Java.

  • Il nome della classe è il nome dello stesso file con estensione.java
  • un programma Java è costituito da un insieme di classi la cui dichiarazione inizia con la parola riservata class, seguita dal nome della classe, in questo caso primoprogramma.
  • questa classe contiene un solo metodo (funzione o operazione) denominato main.

il metodo iniziale è il metodo main che ha SEMPRE la forma:

public static main (String[] args);

Esso

  • è pubblico (public), ovvero visibile da ogni punto del codice;
  • è statico (static), è invocabile (si può eseguire) indipendentemente dall’esistenza di oggetti istanza della classe
  • non restituisce nulla (void)
  • gli eventuali parametri in input forniti dall’utente sulla riga di comando costituiscono un vettore di stringhe.

Da notare che ogni classe di un programma Java può avere un suo metodo main, in ogni caso l’esecuzione del programma ha inizio con l’invocazione del metodo main di una classe specificata come “classe principale” main class.

Approfondimenti tecnici

La JVM (ambiente di esecuzione dei programmi Java) è logicamente costituita dai seguenti componenti logici:

  • un insieme di istruzioni (bytecode)
  • un insieme di registri;
  • un’area di memoria per l’esecuzione dei metodi (stack);
  • un’area di memoria per l’allocazione degli oggetti (heap) su cui opera lo strumento automatico di istruzione degli oggetti inutilizzati (garbage collector);
  • un’area per la memorizzazione dei metodi.

Le strutture di controllo del flusso di esecuzione sono le stesse del lingaggio C++

  • if-else
  • switch-case
  • do while
  • for

[:]

Pubblicato in Senza categoria | Lascia un commento

[:it]Java: ambiente di sviluppo[:]

[:it]Uno degli ambienti di sviluppo per Java è sicuramente eclipse

https://www.eclipse.org/downloads/

Una vota installato, bisogna evidenziare una cosa fondamentale dell’ambiente Java ossia che una cosa è il package ed una cosa il programma.

Bisogna allontanarsi dal concetto di compilazione classico che si è utilizzato ad esempio in C++ che crea alla fine un file eseguibile. Nel caso della programmazione Java durante la digitazione l’IDLE Eclipse consente subito di evidenziare problema inoltre i vari pezzi del programma che si chiameranno classe sono posti all’interno di una libreria a package.

Appena si apre il programma si deve creare il package (contenitore) ed ad esso si può dare il nome che si vuole.

A questo punto si deve creare  il primo programma ed una volta dato il nome esso

DOVRA’ ESSERE UGUALE ALLA CLASSE che conterrà le istruzioni del programma.

Ancora un progamma Java è formato da tante classi che stanno all’interno di uno o più package.

Per creare il nuovo programma di deve creare non tanto il nuovo file ma la nuova classe che sarà all’interno del package precedentemente creato. Quindi si va su File/New/Classe e si dà un nome che corrisponderà alla classe.

Al termine l’IDE si presenterà così:

 [:]

Pubblicato in Senza categoria | Lascia un commento

[:it]TPSIT: crittografia per la sicurezza dei dati: cifrario a sostiuzione/ trasposizione[:]

[:it]

Pierre Marcel

L’e-business ha la necessità che ogni operazione avvenga in maniera sicura. In maniera analoga con l’avvento dei servizi in cloud, non è possibile che i dati che vengono trasmessi nella rete possano essere letti da persone diverse dal destinatario.

Per questo motivo è nata l’esigenza di rendere visibili i dati solo alla persone a cui stati indirizzati: tale processo si chiama crittografia.

Il messaggio che può essere letto da tutti si chiama testo in chiaro. Tramite i metodi di cifratura (codifica) si trasforma il testo in chiaro in un testo cifrato in cui l’informazione viene codificata e resa illeggibile. L’operazione inversa, chiamata decifrazione (decodifica), serve per ricostruire il testo in chiaro a partire dal testo cifrato.

Per cifrare e decifrare un messaggio di utilizzano opportuni algoritmi.

Cifrario a sostituzione

E’ il cifrario più antico e più facile da decodificare pur non conoscendo la chiave. Si racconta che esso venne usato da Giulio Cesare per informare i propri centurioni delle operazioni belliche.

Esso consiste nel sostituire la lettera del messaggio con la lettera posta alla n-esima posizione successiva. La n-esima posizione è chiamata chiave.

Ad esempio:

la seguente tabella evidenzia la posizione delle lettere dell’alfabeto che ci serve poi nella codifica utilizzando la chiave.

0 1 2 3 4 5 6 7 8 9
A B C D E F G H I L
10 11 12 13 14 15 16 17 18 19
M N O P Q R S T U V
20
Z

Uso la chiave 4, la tabella precedente diventa

0 1 2 3 4 5 6 7 8 9
E F G H I L M N O P
10 11 12 13 14 15 16 17 18 19
Q R S T U V Z A B C
20
D

Si noti che per voler implementare in programmazione l’algoritmo della crittografia a sostituzione si indica lo 0 come prima lettera.

L’alfabeto è formato da 21 lettere.

Si usa l’algebra modulare per effettuare la crittografia del messaggio.

Il calcolo che si deve effettuare è sempre il seguente:

(i+k) mod 21 = n

i  posizione della lettera da cifrare

k valore chiave

n posizione della lettera

Se adesso voglio mandare il messaggio:

CIAO usando chiave 4 il messaggio nel trasportato sarà:

GOES

in questo caso sia il mittente che il destinatario devono conoscere la chiave di decodifica.

Cifrario a trasposizione

In crittografia un cifrario a trasposizione è un metodo di cifratura in cui le posizioni occupate dalle unità di testo in chiaro (che in genere sono lettere o gruppi di esse) sono cambiate secondo un determinato schema, così che il testo cifrato costituisca una permutazione del testo in chiaro.

In pratica il messaggio viene spezzato ed incolonnato secondo la lunghezza di una parola chiave. Un esempio è dato dal cifrario a

trasposizione colonnare

Si deve mandare il messaggio: ACQUISTARE TITOLI FAC

Si usa la parola CIAO come chiave:

2 3 1 4
C I A O
A C Q U
I S T A
R E T I
T O L I
F A C  Z

Si invia questo messaggio:

(Si noti che si è inserita una lettera fasulla per riempire esattamente tutti gli spazi)

QTTLCAIRTFCSEOAUAIIZ

ossia si manda il messaggio per colonne che sono ordinate seguendo l’ordine alfabetico delle lettere che compongono la parola chiave.

Per decifrarlo si contano il numero di lettere, in questo caso 19, si divide per il numero delle lettere che compongono la parola chiave, in questo caso 4. E si divide in maniera opportuna il messaggio.

20:4=5 e non si tiene conto del resto.

Divido il messaggio in blocchi di 4

QTTLC AIRTF CSEOA UAIIZ

conoscendo la parola CIAO e sapendo che:

blocco 1  –> lettera A

blocco 2–> lettera C

blocco 3–> lettera I

blocco 4–> lettera O

metto in colonna i singoli bocchi ed ho il messaggio inviato.

Anche in questo caso il mittente ed il destinatario devono conoscere la chiave.

Vi sono altri tipi di cifrari a trasposizione:

  • a staccionata
  • a percorso usata durante la guerra di secessione americana
  • a trasposizione doppia usata durante la prima guerra mondiale dai tedeschi ma violato dai francesi, usato anche durante la seconda guerra mondiale dalla resistenza olandese e francese e dai gruppi di sabotatori inglesi. Furono usati moltissimo prima dell’avvento di un nuovo cifrario chiamato VIC.
  • a trasposizione Myszkowski
  • a trasposizione disturbata
  • a griglia

[:]

P.S. Ecco un esempio molto schematico di realizzazione del cifrario di Cesare implementato in C++:



Pubblicato in Senza categoria | Lascia un commento

[:it]TPSIT: I servizi finanziari in rete[:]

[:it]

Pierre Marcel

Una banca offre due tipi di servizi:

  • home banking: visione del conto corrente, bonifici on line, lista dei movimenti
  • trading on line: acquisto titoli e vendita titoli

Più in dettaglio, i servizi in rete offrono le seguenti opportunità:
• disporre bonifici su conti della banca stessa o di altre banche;
• richiedere informazioni sul proprio conto corrente (saldo, movimenti, situazione assegni, disponibilità,
condizioni applicate);
• effettuare pagamenti rateali, conferme d’ordine e utenze domestiche (elettricità e gas);
• trasferire su computer tutti i movimenti del proprio conto corrente;
• seguire in ogni momento l’andamento delle principali divise e dei tassi interbancari;
• memorizzare i dati dei bonifici ricorrenti per riutilizzarli successivamente;
• stampare i promemoria di tutte le operazioni effettuate con il servizio di home banking;
• ricercare i codici e i dati di tutte le filiali della banca;
• comprare, vendere e conoscere la quotazione aggiornata di azioni, fondi e obbligazioni;
• essere aggiornato sulla situazione del proprio deposito titoli e verificare i movimenti effettuati;
• effettuare ricerche di titoli obbligazionari con determinate caratteristiche;
• ricercare i codici delle azioni quotate.[:]

Pubblicato in Senza categoria | Lascia un commento