Video Lezione n.3 – Linguaggio di Programmazione C/C++

29 01 2020

 





Video Lezione n.2 – Linguaggio di Programmazione C/C++

4 01 2020

Video sulle strutture fondamentali degli algoritmi e la loro implementazione in C/C++





Video Lezione n.1 – Linguaggio C/C++

12 11 2009

Video Lezione n.1 Linguaggio C/C++





Ultrasurf e dintorni aggiramento di server proxy squid e content filter come bloccarlo ?

19 05 2009

Come Bloccare Utrasurf

Oggi andando a scuola una persona molto fidata e di cui non dico il nome per correttezza, mi ha comunicato che gli alunni della scuola nonostante le mie restrizioni ad alcuni siti internet che io considero non dannosi, ma non idonei durante le lezioni in laboratori, le hanno bypassato con software giocattolo Ultrasurf,
Bene cari gagglioffi credete che ve lo lasci utilizzare ?
Come dicevo sopra la navigazione in Internet a scuola non è proibita ma deve essere coerente con le cose che hanno aderenza e attinenza con le attività di studio che voi svolgete.
Godetevi la festa per altri due e tre giorni tanto per chiudere il software basta attivare una regola sul firewall che vi chiude l’accesso alla porta tcp 9666. Questa porta è utilizzata da questo programma per accedere a un suo server esterno per mascherare i reali siti che voi utilizzate.
Ma lo sapete che questo in un’amministrazione pubblica perchè di quello che stiamo parlando è reato, in quanto nascondete anche i siti che visitate ?
Le norme sono fatte per essere rispettate non violate.
A voi ogni giudizio.

Ps se mettesse un po’ di impegno nello studio come lo mettete per eludere controlli, protezione.





Le matrici

15 01 2009

Visual Basic e le matrici:
La matrice è una struttura di dati astratta caratterizzata da n per m elementi dello stesso tipo raggruppati con un nome collettivo i cui elementi sono selezionati mediante un indice di riga e di colonna. L’intervallo di variabilità degli indici è da 1..n,1..m se  n e m sono il numero delle righe e delle colonne della matrice.

Teoria delle Matrici

Una matrice rettangolare è una matrice in cui il numero delle righe è diverso da quelle delle colonne. Una matrice diventa quadrata quando le sue dimensioni sono uguali se m e n sono il numero di righe e colonne la matrice per essere quadrata deve avere m=m.
Sulle matrici quadrate si hanno alcune proprietà inportanti.

Matrice Trasposta

Si definisce la matrice trasposta MT la matrice che si ottiene dalla matrice M scambiando gli elementi di riga con quelli di colonna in sintesi MT(i,j)=M(I,J).
Ad esempio la matrice traposta di

M=  Matrice di esempio

allora MT sarà

Matrice Trasposta
Diagonali delle matrici quadrate

Proprio come in un quadrato nelle matrici quadrate si definiscono le diagonali.
Se definisce la diagonale principale DP quella per cui gli elementi di matrice sono tali che I=J. Si definisce invece diagonale secondaria DS quella in cui gli elementi della matrice M sono tali che I+J=N+1.

Operazioni con le matrici

Indipendentemente dal fatto che le matrici sono quadrate o rettangolari se date due matrici A e B le cui dimensioni sono rispettivamente m,n e p,q e si ha che m=p e n=q si può sempre costruire la matrice somma, differenza.
Per la somma di due matrici A e B si ha che la matrice somma/diffenze nelle ipotesi di sopra sarà data

S(I,J)=A(I,J)+B(I,J)
D(i,J)=A(I,J)-B(I,J)
per ogni I,J minori o uguali alle dimensioni delle matrici di partenza.

Un’altra operazione sempre possibile è il prodotto di una matrice di qualunque tipo per una costante k. Infatti si ha:

P(I,J)=K*A(I,J)

Prodotto di matrici

Siano dati due matrici A e B di dimensione m,p e p,q la matrice prodotto sarà una matrice di dimensione m,q. Ogni elemento della matrice è dato dalla seguente formula

P(I,J)=Somma(1..p indice r)(A(i,r)*B(r,j)

Le matrici nell’informatica rivestono un campo di applicazione enorme. Per comprendere l’utilizzo delle matrici è opportuno comprendere quali sono le operazioni fondamentali con esse. Sulle matrici le operazioni preliminari che si svolgono sono il caricamento o immissioni dati, la ricerca di uno o più elementi specifici, l’ordinamento. Per le matrici esistono delle procedure standard per il caricamento che prevedono il doppio ciclo su riga e colonna. L’algoritmo per caricare una matrice di 3 per 3 elementi interi è:

1-inizio
2-per i=1 a 3
3-per j=1 a 3
4-scrivi “dammi elementi”
5-leggi m(i,j)
6-fine ciclo su j (colonna)
7-fine ciclo su i (riga)
8-fine

In visual basic esiste la possibilità di gestire le matrici, proprio come in ogni altro linguaggio di programmazione con la differenza che se si vuole implementare un form che permetta l’inserimento dei dati nella matrice conviene usare la matrice di controlli ovvero un insieme di controlli che sono identificati da un uno stesso nome, ma  diversificati da un indice intero. Inoltre la numerazione dei controlli comincia da zero e non da uno. La procedura di caricamento va modificata come segue:

1-inizio
2-k=0
3-per i=1 a 3
4-per j=1 a 3
5-m(i,j)=contenuto casella di testo(k)
6-k=k+1
7-fine ciclo su j (colonna)
8-fine ciclo su i (riga)
9-fine

L’indice k si rende necessario per scorrere i controlli indipendentemente da i e j che selezionano la riga i e la colonna j della matrice. Notare che k in questo ciclo varia da 0 a 8.
Andiamo a risolvere il seguente problema data una matrice di 3 per 3 elementi interi calcolarne la somma.
La tabella dati prevede pertanto:
Classe                        Nome            Tipo
Input                          M                  Matrice di 3 per 3 elementi interi
Interni                        I,j,k               Interi
Output                       Somma          Intero

L’interfaccia grafica (il form) che si vuole realizzare è:
Form esercizio Matrici

In questo form sono definite 10 caselle di testo tutte con nome “Text1” e sono posizionate in modo che la casella di testo con la proprietà “index” a zero sia posizionata in alto a sinistra. La decima casella di testo è stato inserita per visualizzare la somma. I tre pulsanti uno carica i dati nella matrice attiva l’algoritmo visto nella pagina precedente, l’altro somma gli elementi della matrice, l’ultimo pulsante chiude l’applicazione.
L’algoritmo che verrà attivato al click del pulsante somma sarà:
1-Inizio
2-Somma=0
3-Per i=1 a 3
4-Per j=1 a 3
5-Somma=somma+m(i,j)
6-Fine ciclo j
7-Fine ciclo i
8-Scrivi nella casella testo(10) somma convertita in stringa
9-Fine

Finalmente la codifica completa è:

Dim m(3, 3) As Double
Dim somma As Double
Private Sub Command1_Click()
k = 0
For i = 1 To 3
For j = 1 To 3
m(i, j) = Val(Text1(k).Text)
k = k + 1
Next j
Next i
End Sub
Private Sub Command2_Click()
somma = 0
For i = 1 To 3
For j = 1 To 3
somma = somma + m(i, j)
Next j
Next i
Text1(9).Text = Str(somma)

End Sub
Private Sub Command3_Click()
Unload Me
End Sub
Private Sub Form_Load()
Label1.Caption = “Elementi matrice”
Label2.Caption = “Somma”
Command1.Caption = “Carica Elementi”
Command2.Caption = “Somma elementi”
Command3.Caption = “Esci”
For k = 0 To 9
Text1(k).Text = “”
Text1(k).TabIndex = k
Next k
End Sub

Un esempio di applicazioni sulle matrici può essere il calcolo delle soluzioni un sistema di equazioni primo grado con la regola di kramer, quindi il calcolo di un determinante.
Ad esempio per il calcolo di un determinante di 3 ordine matrice 3 per 3 si può utilizzare la regola di Sarrus:
Ad esempio data la matrice 3 per 3
La regola di Sarrus prevede la trasformazione della matrice iniziale in una di dimensioni 3 righe e 5 colonne con ulteriori due colonne che sono la copia della prima e della seconda colonna.

1 2 3
3 4 5                  Matrice di cui si vuole calcolare il determinante
1 6 0

1 2 3 1 2
3 4 5 3 4                 Matrice Trasformata
1 6 0 1 6
Sulla nuova matrice ottenuta si effettua il calcolo la somma dei prodotti di degli elementi di diagonale principali da sinistra a destra meno la somma dei prodotti di diagonale secondaria da destra verso sinistra. A questo punto l’algoritmo consta prima nella trasformazione della matrice di partenza nella matrice di Sarrus e poi nel calcolo del determinante attraverso la regola citata in precedenza.
Allora si ha;

Inizio
Per i=1 a 3
Per j=1 a 5
Se j<=3 allora
S(i,j)=m(i,j)
Altrimenti
S(i,j+2)=m(i, j-3)
Fine se
Fine ciclo j
Fine ciclo u
Calcolo del determinante
D=1
Sp=0
P1=1
P2=1
P3=1
Per i=1 a 3
Per j=1 a 3
Se i=j allora
P1=P1*S(i,j)
Fine Se
Se j=i+1 allora
P2=P2*s(i,j)
Fine Se
Se i=i+2 allora
P3=S(i,j)*P3
Fine Se
Fine ciclo j
Fine ciclo i
D=P1+P2+P3
P1=1, P2=1, P3=1
Per i=1 a 3
Per j=1 a 3
Se i+j=4 allora
P1=S(i,j)*P1
Fine Se
Se i+j=5 allora
P2=S(i,j)*P2
Fine Se
Se i+j=6 allora
P2=S(i,j)*P2
Fine Se
Fine Ciclo j
Fine Ciclo i
D=D-P1-P2-P3
Scrivi “Il determinante è”
Scrivi D
Fine

La traduzione in Visual Basic è lasciata per esercizio allo studente.





Vettori , Matrici, Record e tabelle

1 10 2008

Vettori e Matrici

Un vettore è una variabile strutturata costituita da n variabili di tipo semplice identificata da un nome

collettivo e da un indice che ne seleziona il valore. La nomenclatura sui vettori suole indicare i vettori con

il nome collettivo seguito da una coppia di parentesi al cui interno è indicato l’indice che

obbligatoriamente indicando una posizione è intero. Ad esempio a(3) indica il terzo elemento del vettore,

a(i) indica l’i-mo elemento del vettore. Alcuni linguaggi di programmazione ammettono la dichiarazione

della dimensione del vettore nella parte dichiarativa (pascal, fortran) altri invece consentono un

dimensionamento dinamico nel programma. Normalmente anche sel la dimensione del vettore deve

essere fissata all’inizio prima dell’esecuzione dell’algoritmo non è un grosso problema ricondurlo ad una

gestione dinamica come vedremo in alcuni esempi. Il vettore graficamente può essere rappresentato

con un insieme di caselline al cui interno vi sono i valori che possono essere sia di tipo semplice che

composto (come vedremo nelle prossime lezioni). Normalmente per l’utilizzo del vettore è opportuno

procedere al caricamento dei valori attraverso l’utilizzo di un ciclo. Supponiamo di voler caricare un

vettore di nome b composto da 10 elementi interi; l’algoritmo è:

1. Inizio
2. Per i= 1 a 10 esegui
3. ciclo
4. scrivi “dammi elemento”
5. leggi b(i)
6. fine ciclo
7. fine

In questo esempio viene chiesto all’utente di inserire dei valori da tastiera che verranno memorizzati nel

vettore b(). Come primo esercizio si scambino gli elementi di posto pari con quelli di posto dispari di un

vettore di 10 elementi interi. Dopo aver caricato il vettore come fatto in precedenza l’algoritmo che

risponde la problema dovrebbe essere:

1. Per i=1 a 5 esegui
2. ciclo
3. temp=a(i)
4. a(i)=a(2i)
5. a(2i)=temp
6. fine ciclo
7. fine

In questo algoritmo si è utilizzata la variabile temp per memorizzare temporaneamente i valori che

vengono soprascritti con l’istruzione 4. Un altro esercizio potrebbe essere dato un vettore di 10 elementi

contare e visualizzare quante volte un elemento introdotto da tastiera si ripete. in questo problema oltre

al vettore a() è necessario utilizzare una variabile cont intera che conti il numero delle occorrenze, una

variabile num che contenga l’elemento inserito da tastiera di cui si vuole verificare il numero delle

occorrenze. La procedura per il caricamento è sempre la stessa per cui la omettiamo. L’algoritmo che

risolve il problema richiesto sarà:

1. inizio
2. cont=0
3. scrivi “inserisci l’elemento da cercare”
4. leggi num
5. Per i=1 a 10 esegui
6. ciclo
7. se a(i)=num allora
8. cont=cont+1
9. fine ciclo scrivi “il numero di volte che si ripete il valore inserito è: ” ,num
10. fine

In questo algoritmo si inserisce l’elemento da contare da tastiera, poi si confronta ogni elemento del

vettore con il valore di riferimento attraverso un ciclo e alla fine si visualizza il risultato ottenuto. Nei

vettori sono molto diffuse le procedure di ricerca di elementi specifici in strutture ordinate. Si supponga

di avere un vettore di 20 elementi numerici interi ordinati in ordine crescente. La ricerca di un elemento

specifico può avvenire in modo sequenziale come nel caso dell’algoritmo precedente o attraverso il

metodo dicotomico. Con questo metodo si riduce notevolmente il numero di scansioni degli elementi del

vettore. Nella ricerca dicotomica utilizza il metodo delle divisioni successive. Per meglio chiarire

riportiamo di sotto un vettore di 10 elementi interi ordinato in modo crescente:

1 3 4 5 6 8 9 12 15 18;

ora supponiamo che l’elemento da cercare è “9”. La dimensione del vettore è 10, quindi lsi introducono

tre indici sinistro, destro e centrale. Al primo passaggio sinistro=1, destro=10, centrale=(sinistro +

destro)/2=6 (intero successivo) ora gli elementi del vettore di posizione sinistro=1 (“1”), destro (“18”),

centro (“8”) non sono uguali all’elemento richiesto. A questo punto se l’elemnto di centro è minore del

valore da cercare  sinistro =centro+1 altrimenti destro=centro-1, e si ripete la procedura. in questo caso

l’uscita dal ciclo è condizionata o all’evento che è stato trovato l’elemento o che sinistro è diventato

maggiore di destro (sconfinamento dell’indice). Sulla base di quetso esempio l’algoritmo escludendo la

parte di caricamento è:

1. inizio
2. scrivi “dammi il valore da cercare”
3. leggi valore
4. trovato=falso // sto utilizzando una variabile logica
5. sinistro=1
6. destro=10 // o la dimensione del vettore
7. centro=(sinistro + destro)/2
8. ripeti
9. Se a(sinistro)=valore o a(destro)=valore o a(centro)=valore allora
10. trovato=vero
11. altrimenti
12. se a(centro)<valore allora
13. sinistro=centro+1
14. altrimenti
15. destro=centro-1
16. finché trovato=vero o sinistro>destro
17. Se trovato=vero allora
18. scrivi “valore trovato all’interno del vettore”
19. altrimenti
20. scrivi “valore non trovato”
21. fine

In questo algoritmo si fa uso di tre indici per la ricerca dell’elemento. Tale metodo riduce la ricerca di N/2

scansioni ad ogni passaggio di divisione. Nell’utilizzo dei vettori spesso è necessario operare con più

vettori in simultanea. Ad esempio in un vettore di 5 elementi di stringhe si inseriscano i nomi delle città, in

un altro composto da 5 elementi reali il reddito medio per abitante. Supponiamo di voler calcolare e

visualizzare in quale città un abitante ha il reddito massimo. Allora fermiamoci un at6timo a descrivere le

variabili in gioco nel problema. Esse sono:

Classe     Nome             Tipo
Inupt         cit                    vettore di stringhe di 5 elementi
Input         reddito             vettore di 5 elementi reali
Interna      i                    indice vettori
Output      cit_max        stringa
Output     max             numero reale conterrà il reddito massimo

Nella tabella precedente sono presenti due variabili di output max che rappresenta il massimo reddito e

cit_max che rappresenta il nome della città ove ogni abitante ha il reddito più alto.
L’algoritmo sarà:

* inizio
* per i=1 a 5 esegui
* ciclo
* scrivi “dammi il nome della città”
* leggi cit(i)
* fine ciclo
* inizio
* per i= 1 a 5 esegui
* ciclo
* scrivi “inserisci il reddito per abitante”
* leggi reddito(i)
* fine ciclo
* max=0
* cit_max=””
* per i=1 a 5 esegui
* se redditi(i)> max allora
* max=redditi(i)
* cit_max=cit(i)
* fine ciclo
* scrivi “la città con reddito più alto è”
* scrivi cit_max
* scrivi “con reddito per abitante di ”
* scrivi max
* fine

Questo problema è un esempio tipico di problemi risolti attraverso l’uso di vettori paralleli. La risoluzione

risulta agevole se le dimensioni dei vettori sono uguali altrimenti occorre utilizzare più indici.

Ordinamento di vettori

Ordinamento sequenziale
Consiste nell’ordinare il vettore mediante scambi successivi, Si Fissa l’elemento più a sinistra poi con un

altro indice si fa selezionano gli elementi rimanenti del vettore ogni volta che l’elemento fisso è maggiore

si scambia con quello selezionato (ordinamento crescente viceversa per il decrescente).
In altri termini se si ha un vettore di così composto:

3 5 6 10 2
Nel primo passaggio i=1 x(i)=3 mentre k=i+1..5 e quindi x(k) varia sugli elementi 5,6,10,2. Dopo una

prima serie di passaggi il vettore sarà:
2 5 6 10 3
Ora i=2 e k=i+1..5 perchè siamo sicuri che l’elemento di posto 1 è il più piccolo. Iterando ottieniamo

l’algoritmo di ordinamento che è così scritto:

inizio
ciclo su i=1..5
ciclo su k=i+1..5
se x(i)> x(k) allora
tmp=x(i)
x(i)=x(k)
x(k)=tmp
fine se
fine ciclo su k
fine ciclo su i
fine

La variabile tmp viene ad essere utilizzata come variabile temporanea.

Matrici

Un’altra struttura di dati molto utilizzata in informatica è la matrice ovvero un vettore bidimensionale

organizzato in una serie di elementi organizzati in righe e colonne. Infatti se supponiamo che la matrice si

chiama mat per indicare l’elemento di riga i e colonna j, si utilizza la simbologia mat(i,j). Come per i

vettori sulle matrici è possibile compiere alcune operazioni come caricamento ovvero inserimento di

elementi, ordinamento, ricerca di elementi. E’ bene notare che viene definita matrice un vettore

bidimensionale i cui elementi sono costituiti da variabili semplici tutte dello stesso tipo. La dimensione

delle matrici in alcuni linguaggi di programmazione devono essere fissate a priori in altri casi si può

definirla dinamicamente. Supponiamo di voler risolvere il seguente problema: dato una serie di voti per n

alunni calcolare e visualizzare le medie. Tale problema all’apparenza sembra complesso ma se

correttamente impostato si risolve in modo molto semplice. Ipotizziamo che ogni riga della matrice è

costituita da 8 elementi rappresentanti i voti degli alunni nelle 8 materie di studio. una volta caricata la

matrice basterà calcolare la media di riga per visualizzare la media di un alunno. Nel problema non è

dato il numero degli alunni. In questo caso dimensioniamo le righe della matrice a 30 elementi, e

richiediamo il numero degli alunni in input. La tabella delle variabili sara:
Classe     Nome                                 Tipo
Input     voti                                       matrice di 30 righe e 8 colonne
Input     n                                           numero di alunni
Interna     i,j                                       indici matrice
Interna     somma                              reale somma dei voti di alunno
Output     media                                reale media dei voti di un alunno

L’algoritmo verrà svolto in un unico blocco senza l’ausilio delle procedure per esporre i concetti. Le

strutture cicliche idonee per le matrici sono strutture nidificate in quanto si deve tener conto che un indice

sposta la riga e l’altro la colonna. Una volta richiesto in input il numero degli alunni memorizzato nella

variabile n, il ciclo esterno sarà svolto fino a n, mentre quello interno fino a 8.

1. inizio
2. somma=0
3. media=0
4. scrivi “dammi il numero degli alunni”
5. leggi n
6. per i=1 a n esegui
7. ciclo 1
8. per j=1 a 8 esegui
9. ciclo 2
10. scrivi “dammi il voto dell’alunno”,i,”-mo”
11. leggi voti(i,j)
12. fine ciclo 2
13. fine ciclo 1
14. per i=1 a n esegui
15. ciclo 1
16. per j=1 a 8 esegui
17. ciclo 2
18. somma=somma+voti(i,j)
19. fine ciclo 2
20. media=somma/8
21. scrivi voti(i,j)
22. somma=0 //queste due righe sono necessarie per ricominciare il calcolo della media//
23. media=0
24. fine ciclo 1
25. fine

Alcuni chiarimenti sulle istruzioni di scrittura come:
scrivi “dammi il voto dell’alunno”,i,”-mo”

questa infatti non fa altro che stampare le stringhe fra virgolette (messaggi) concatenate al valore della

variabile i. Inoltre come si vede nell’algoritmo è necessario chiudere prima il ciclo interno e poi quello

esterno. Questo è solo un esempio di quello che è possibile fare con le matrici. Un esempio molto utile a

chiarire il concetto e l’uso delle matrici può essere dato dal seguente problema:

Siano date 4 ruote del lotto napoli, roma, milano, venezia. Su ogni ruota vengono estratti 5 numeri. Un

giocatore vuole verificare una giocata di € 5 fatta di tre numeri. Se su una ruota è presente un numero il

giocatore vince 5 volte la puntata, 10 per due numeri, e 50 per il terno per ogni ruota. Si chiedano in

input al giocatore i tre numeri e si verifichi se ha vinto e in caso positivo la somma vinta. Questo

algoritmo all’apparenza complesso può essere risolto con l’ausilio delle matrici dando come dimensione

una matrice 4 per 5. ogni riga della matrice costituirà la ruota di una delle quattro città. Ad esempio sulla

prima riga vi sarà la ruota di napoli, sulla seconda roma e così via. Una volta richiesti i tre numeri

bisognerà contare quanti di questi sono usciti su una ruota. La tabella delle variabili è pertanto:

Classe     Nome                      Tipo
Input         lotto                      matrice di 4 righe e 5 colonne di interi contenente i numeri estratti
Input         n1,n2,n3               interi numeri giocati
Interna     i,j                           indici matrice
Interna     cont                       intera numeri di estratti indovinati dal giocatore
Output     somma                  intera somma eventualmente vinta dal giocatore

L’algoritmo consiste in una prima parte ove si carica la matrice con gli estratti, e poi di una parte che

controlla il numero degli estratti indovinati. Alla fine del ciclo si comunicherà la giocatore se ha vinto

oppure no. Pertanto l’algoritmo è:

1. inizio
2. cont=0
3. somma=0
4. per i= 1 a 4 esegui
5. ciclo 1
6. per j=1 a 5 esegui
7. ciclo 2
8. scrivi “dammi i numeri estratti su tutte le ruote”
9. leggi lotto(i,j)
10. fine ciclo 2
11. fine ciclo 1
12. scrvi “dammi i numeri giocati”
13. leggi n1,n2,n3
14. per i=1 a 4 esegui
15. ciclo 1
16. per j=1 5 esegui
17. ciclo 2
18. se lotto(i,j)=n1 o lotto(i,j)=n2 o lotto(i,j)=n3 allora
19. cont=cont+1
20. fine ciclo 2
21. se cont=1 allora
22. somma=somma+5*5
23. se cont=2 allora
24. somma=somma+5*10
25. se cont=3 allora
26. somma=somma +5*50
27. cont=0
28. fine ciclo 1
29. se somma =0 allora
30. scrivi “non hai vinto niente”
31. altrimenti
32. scrivi “hai vinto €” , somma
33. fine

In questo problema due osservazioni la prima è che la puntata è fissa come richiesto dal problema ed è

quindi una costante dell’algoritmo. La seconda invece risiede nell’utilizzo dell’operatore logico “o” nel

confronto per verificare l’uguaglianza dei numeri giocati con ogni singolo estratto. E’ stata fatta questa

scelta per ridurre il numero delle condizioni che altrimenti sarebbero state tre. Per comprendere ancora

l’utilizzo delle matrici sia dato il seguente problema: data una matrice quadrata di dimensione n i cui

elementi sono interi dopo aver inserito i dati calcolare la somma della diagonale principale (per intenderci

gli elmenti che hanno stessa coordinata di riga e di colonna). La tabella dati dell’algoritmo che segue

sara:
classe     nome e descrizione                                      tipo
input             mat matrice di dimensione n                         tipo matrice n per n di interi
input             n numero di righe e colonne della matrice    intero
interne          i,j indici della matrice                                 interi
output          somma                                                        intera

L’algoritmo sarà:

1. Inizio
2. somma=0 // inizializzaizone
3. scrivi “dammi il numero delle righe e delle colonne”
4. leggi n
5. per i=1 a n esegui
6. ciclo 1
7. per j=1 a n esegui
8. ciclo 2
9. scrvi “dammi elemento di riga “,i,” colonna “,j
10. leggi mat(i,j)
11. fine ciclo 1
12. fine ciclo 2
13. per i= 1 a n esegui
14. ciclo 3
15. somma=mat(i,i)+somma
16. fine ciclo 3
17. scrivi “la somma degli elementi della diagonale è:”
18. scrivi somma
19. fine

Come si può notare dall’algoritmo nel calcolare la somma è stato necessario un solo ciclo, perchè gli

elementi di diagonale principale hanno la caratteristica di avere indice di riga e colonna uguali. Nelle

matrici si definisce anche la diagonale secondaria come gli elementi della matrice che partono

dall’elemento di riga 1 e colonna n e arrivano all’elmento di riga n e colonna 1 passando per l’elemento

carattarizzato dall’avere coordinata di riga e colonna uguali. Un algoritmo molto più complesso del

precedente potrebbe essere quello di calcolare la somma degli elementi di diagonale secondaria

attraverso sempre l’uso dei cicli di una matrice di ordine n. In questo caso basta osservare che gli

elementi di diagonale secondaria sono caratterizzati dal fatto che la somma degli indici è pari alla

dimensione della matrice che ricordo essere quadrata aumentata di un’unità.
3     2     0
1     2     6
5     5     7

In questa matrice 3 per 3 sopra rappresentata si nota che i valori 0,2 e 5 sono caratterizzati dal fatto

che la somma dei loro indice è pari sempre a 4, ma se la dimensione della matrice è 3 vuol dire che il

tutto è aumentato di un’unità. L’algoritmo pertanto è:

somma=0

1. Inizio
2. scrivi “dammi la dimensione”
3. leggi n
4. per i = 1 a n esegui
5. ciclo 1
6. per j=1 a n esegui
7. ciclo 2
8. scrivi “dammi gli elementi della matrice”
9. leggi mat(i,j)
10. fine ciclo 1
11. fine ciclo 2
12. se n è pari allora
13. per i= 1 a n esegui
14. ciclo 1
15. per j=n 1 esegui
16. ciclo 2
17. se i+j=n+1 allora
18. somma=somma + mat(i,j)
19. fine ciclo 1
20. fine ciclo 2
21. altrimenti //n è dispari
22. per i= 1 a n esegui
23. ciclo 1
24. per j=n a 1 esegui
25. ciclo 2
26. se i+j=n+1 allora
27. somma=somma + mat(i,j)
28. fine ciclo 1
29. fine ciclo 2
30. scrvi “la somma è”, somma
31. fine

Record e tabelle

Quanto le informazioni da gestire sono di tipo diverso allora è opportuno definire delle strutture di dati

eterogenee dette record. Un record è una variabile strutturata astratta identificata da un nome collettivo i

cui elementi sono di tipo diverso. Ogni componente è detta campo. Un insieme di record raggruppati in

un vettore ovvero un vettore di record è detta tabella. La prima fase di analisi del problema che

coinvolgono i record è la definizione del tracciato record che indica i campi che costituiscono il record la

loro tipologia e dimensione. Ad esempio supponiamo che dato un elenco di alunni di una classe si vuole

visualizzare i dati relativi ai maggiorenni. Possiamo pertanto definire un tracciato record come segue:

Cognome     Nome     Età
Stringa * 16 caratteri     Stringa * 16 Caratteri     Intero
Nome Record A

Abbiamo definito il tracciato record con nome modello A e campi cognome, nome, età con i loro tipi. Si

definisce modello una struttura dati astratta definita dall’utente infatti nella fase di dichiarazione delle

variabili si definisce una variabile di tipo tabella formata da righe di tipo A. Il record così come la tabella

sono variabili ad accesso diretto ovvero la selezione di un elemento avviene indicando direttamente il

nome del campo preceduto dal nome del record separato dal carattere “.”. Quindi A.Nome richiama il

campo nome del record A. Vediamo la tabella delle variabili per il problema posto.
Classe     Nome     Tipo
Input     tabella     vettore di N elementi di tipo A
Input     N     intero
Interno     K,NC,C     Intero, Stringa*16, Stringa*16
Output     tabella     vettore di N elementi di tipo A

L’algoritmo per comodità verrà frammentato in due procedure carica e visualizza.

1. Inizio carica
2. Scrivi “Dammi il numero degli alunni”
3. Leggi N
4. Ciclo 1
5. Per k=1 a N esegui
6. Scrivi “Inserisci il nome”
7. Leggi tabella(k).nome
8. Scrivi “Inserisci il cognome”
9. Leggi tabelle(k).cognome
10. Scrivi “Inserisci età”
11. Leggi tabella(k).eta
12. Fine ciclo 1
13. Fine Carica

1. Inizio Visualizza
2. NC=””
3. C=””
4. Ciclo 1
5. Per k=1 a N esegui
6. Se tabella(k).eta >= 18 allora
7. NC=tabella(k).nome
8. C=tabella(k).coginome
9. Scrivi NC
10. Scrivi C
11. Fine Se
12. Fine Ciclo
13. Fine

Il programma principale è pertanto costituito dalla chiamata delle due procedure.

1. Inizio
2. Carica
3. Visualizza
4. Fine

Un altro esempio può essere dato dall’ordinamento di una tabella secondo un criterio prestabilito

ovvero in ordine alfabetico di nome, cognome o età. Gli algoritmi di ordinamento sono simili a quelli

utilizzati per i vettori ovvero ordinamento sequenziale o a bolle.





Utilizzare Linux per creare una copia di backup integrale del disco rigido

23 09 2008

Uno dei problemi che più di frequente si presenta a chi possiede un computer è l’operazione di formattazione che talvolta si rende necessaria per rimuovere virus, malfunzionamenti software. Questa opereazione molto difficoltosa per gli utenti base oggi con l’innumerevole quantità di software e di configurazione caricate sul proprio computer diventa lunga e tediosa da svolgersi periodicamnete. Senza pensare che di tanto in tanto andrebbere fatte delle copie di backup dei dati.

La formattazione

Il metodo che andiamo ad esporre si compone di una prima parte che riguarda la formattazione che spesso deve essere fatta da qualcuno che ha competenze e capacità.
In questa fase si partiziona il disco, lo si formatta e si installano i sistemi operativi, si caricano gli eventuali driver e i programmi necessari all’uso.
Supponiamo che questa operazione sia stata fartta come fare per effettuare una copia del sistema per un eventuale recupero in sistuazioni di emergenza.
Si suppone di aver sul proprio computer due sistemi operativi Windows e Linux e 4 partizioni:

Partizione 1 Windows con 60 gigabyte
Partizione 2 Linux con 30 gigabyte
Partizione 3 swap per Linux di 2 gigabyte
Partizione 4 fat32 di 28 gigabyte con i dati utente.

Creare la copia integrale del disco su usb
Si vuole peratnto effettuare una copia del disco su un disco usb o su un altro pc in rete.
In entrambi i casi si può utilizzare un cd live autopartente chiamato system rescue cd scaricabile da http://www.sysresccd.org/Main_Page. Ora dobbiamo annotare la dimensione delle partizioni su un foglio o in file di testo e come sono organizzate. Per fare questo procediamo come segue:

  • Avviamo il pc da cd con la live di system rescue cd con il disco usb collegato se si  vuole effettuare un backup su di esso;
  • Segliere la tastiera italiana dopo l’avvio opzione 21;
  • Al login lanciamo startx e andiamo in ambiente grafico;
  • Apriamo dal menù con il tasto sinistro del mouse Gparted e vediamo la configurazione delle nostre partizioni nel nostro caso avremo sda1, sda2, sda3, sda4;
  • Verifichiamo come si chiama l’altro disco usb ad esempio sdc;
  • Bene ora usciamo da Gparted e nel terminale creiamo una directory in /tmp/backup con mkdir /tmp/backup
  • Supponiamo che il disco usb sia formattato in ntfs allora diamo il comando
    ntfs-3g /dev/sdc1 /tmp/backup se si tratta della prima partizione ntfs, se il disco usb ha la partizione n.2 in formato fat32 allora diamo mount /dev/sdc2 /tmp/backup;
  • Sempre da terminale apriamo partimage si apre una finestra simile a questa (qui il disco ha configurazione diverso)
  • Andiamo a selezionare la partizione da salvare poi andiamo sul nome file e scegliamo il nome del file inserendo anche il percorso di salvataggio in questo caso /tmp/backup;
  • Scegliamo Save Partition per attivare il backup
  • Premiamo F5 e andiamo a scegliere nella schermata successiva gzip come compressione,  e di splittare il files in dimensione ad esempio di 2 gigabyte. Teniamo presente che se salviamo su partizione fat32 o fat16 conviene mettersi in una dimensione minore di 2 ggabyte.
  • Premiamo F5 e viene chiesto una descrizione della partizione;
  • Al passo successivo andiamo ad eseguire il backup;
  • Ripertiamo l’operazione per tutte le partizioni;

Creare una copia di backup sulla rete

Se abbiamo un altro computer in rete disponibile possiamo utilizzarlo per salvare i dati delle partizioni. Conviene creare una condivisione anonima a lettura/scrittura che chiameremo bacup. Supponiamo che il computer si chiami pc. Mediante il programma samba possiamo mappare la condivisione in un punto di mount sul nostro computer. Allo scopo supponiamo che la rete abbia una classe di indirizzi IP 192.168.1.x e maschera 255.255.255.0 (se non abbiamo nella rete un server dhcp come un router che assegna gli indirizzi) . Diamo in sequenza i comandi per attivare la rete e creare la mappatura alla condivione in rete:

  1. ifconfig eth0 192.168.1.200 netmask 255.255.255.0 up (assicuriamoci che tale IP sia libero);
  2. mkdir /tmp/backup (creo la cartella);
  3. mount -t smbfs ‘\\pc\backup’ /tmp/backup

Se tutto è andato a buon fine eseguiamo partimage come descritto sopra.
Se invece è presente un server dhcp la sequenza dei comandi è:

  1. ifconfig eth0 up;
  2. dhclient;
  3. mkdir /tmp/backup (creo la cartella);
  4. mount -t smbfs ‘\\pc\backup’ /tmp/backup

Ripristino della copia di backup da disco usb

Vediamo ora come ripristinare una copia di backup da disco usb. Avviamo da cd con systemrescue cd poi scegliamo il layout della tastiera italiana.
In seguito da console innanzitutto creiamo una cartella in /tmp che sarà la cartella che conterrà il contenuto del disco usb montato; quindi:

mkidr /tmp/disco

poi monto il disco usb supponendo che sia il primo con la prima partizione ntfs dando:

ntfs-3g /dev/sda1/tmp/disco

se invece la partizione è in formato fat32 do il comando

mount -t vfat /dev/sda1 /tmp/disco

Una domanda potrebbe sorgere spontanea come fare per capire il nomi dei dischi e le sue partizioni posso lancriare cfidsik che mi visualizza l’elenco dei dischi installati o accessibili al sistema e le relative partizioni. Scelgo quit dopo aver annotato i nomi ed esco.
Ora avvio l’interfaccia grafica scrivendo

startx

e dal menù avvio Gparted per partizionare il disco. Il programma è molto intuitivo.
Innanzitutto dal menù Partition scelgo delete e cancello le partizioni del disco che ospiterà il ripristino. Poi creo delle partizioni di dimensione maggiore o uguale a quelle di cui ho effettuato il backup e dello stesso tipo.  Applico e esco dal programma che impiegherà qualche minuto per effettuare il partizionamento.
A questo punto lancio partimage e ripristino da /mnt/disco/nome_file_backup, scelgo il bottone restore e poi premendo F5 alcune volte avvio il ripristino.

Ripristino da un una cartella in rete

Come nel caso dell’operazione di backup devo montare la cartella condivisa in rete con i comandi:

  1. ifconfig eth0 192.168.1.200 netmask 255.255.255.0 up (assicuriamoci che tale IP sia libero);
  2. mkdir /tmp/backup (creo la cartella);
  3. mount -t smbfs ‘\\pc\backup’ /tmp/backup

se non ho dhcp attivo (sono senza router o server dhcp); se invece posso effettuare l’aasegnazione dinamica uso la sequenza di comandi:

  1. ifconfig eth0 up;
  2. dhclient;
  3. mkdir /tmp/backup (creo la cartella);
  4. mount -t smbfs ‘\\pc\backup’ /tmp/backup

Una volta montata la cartella in rete procedo come descritto nel paragrafo precedente.

Ripristino del boot loader grub

Il vero problema nell’utilizzare questo metodo è che alla fine dell’operazione devo ripristinare il boot loader sul sistema.
Mettiamoci nel caso in cui il boot loader sia grub ormai è quello più diffuso.
Allora devo montare la partizione linux contenente il sistema con i comandi:

mkdir /tmp/pc
mount -t ext3 /dev/hda2 /tmp/pc suppongo che linux sia sulla seconda partizione del disco;
cd /tmp/pc/boot

poi digito i comandi

mount -o bind /dev /tmp/hda2/dev in questo modo dico a linux che la cartella device da ricostruire è quella nella partizione ripristinata. Se posso lancio

chroot /tmp/pc/dev in alcuni sistemi non è disponibile server per cambiare la cartella root del sistema (quella indicata con /)

In seguito lancio grub si apre il prompt dei comandi e digito
root (hd0,1)
setup (hd0)
quit

A questo punto riavvio la macchina e dovrebbe visualizzarsi il boot loader che chiede quale sistema avviare.





Visual Basic lezione 2

13 03 2008

Il Linguaggio Visual Basic

II linguaggio Visual Basic è stato progettato dalla Microsoft per scrivere i programmi e le applicazioni che dapprima venivano progetta in Ms-Dos e poi in ambiente Windows. L’ambiente Visual Basic si carattetizza per un ambiente integrato di sviluppo grafico in cui il programmatore oltre che scrivere il programma progetta l’interfaccia con cui gli utenti devono intergire con il programma. L’interfaccia grafica detta anche GUI può essere costituita da una o più finestre dette form sul quale sono posizionati i controlli attraverso l’utente inserisce i dati comanda il programma, attraverso’ il quale legge i risultati. Ora di controlli ve ne sono molti ma i più comuni sono quì sottoelencati.

Nome
  controllo
Descrizione
Casella di testo Inserimento di testo e
  dati in formato alfanumerico
Pulsante di Comando Esegue azione tipo
  pulsante “Ok”, ecc.
Casella Lista Elenco di scelte in
  formato alfanumerico fisse
Casella Combinata Elenco di scelte fisse e
  di una casella di testo semplice
Casella di cotrollo Scelta che può
  essere attiva o disattiva
Pulsante Radio Obbliga l’utente ad una
  scelta fra N
Etichetta Inserimento di testo sul
  form
Casella File Seleziona File

Nome controllo

Descrizione

Casella di testo Inserimento di testo e dati in formato alfanumerico

Pulsante di Comando Esegue azione tipo pulsante “Ok”, ecc.

Casella Lista Elenco di scelte in formato alfanumerico fisse

Casella Combinata Elenco di scelte fisse e di una casella di testo semplice

Casella di cotrollo Scelta che può essere attiva o disattiva

Pulsante Radio Obbliga l’utente ad una scelta fra N

Etichetta Inserimento di testo sul form

Casella File Seleziona File

Un’applicazione in visual basic (da oggi useremo l’abbreviazione vb) è composta da un progetto ch può essere costitutio da finestre dette form ove sono posizionati i contrll, moduli (codifiche di algoitmi generali), e altri controlli e librerie esterne che permettono al programmatore di interfacciarsi con molti programmi. Nella scrittura d programmi in vb è fondamentale comprendere le nozioni fondamentalidel linguaggio di programmazione. 

Variabili e costanti

In vb la dichiarazione delle variabili non è obbligatoria ma è consigliabile quando si iniziano a scrivee programmi. Per rendere obbligatoria la dichiarazione il programmatore inserisce la clausola: OPTION EXPLICIT. In questo modo il programmatore deve scrivere i programma dichiarando all’inizio le variabili che deve utilizzare. Nel modulo di vb è possibile effettuare dichiarazione di variabili attraverso il costrutto:

Dim nome variabile as Tipo

Tipo può essere Integer per variabili intere, Boolean per variabili logiche (variabili che hanno valori vero e falso), Double (reali in doppia precisione), string per variabili alfanumeriche (di lunghezza variabile e fissa), e variant per variabili di tipo speciale (il tipo di dati della variabili viene definito nella prima operazione di assegnazione o calcolo). Nella tabella sotto riportata sono mostrati alcuni esempi di variabili e la loro dichiarazione in vb.

Tipo dati da dichiarare

Dichiarazione in Visual Basic

cognome variabile di 20 caratteri

Dim cognome as String*20

numero reale

Dim numero as Doubke

quantità intero

Dim quantità as Integer

Trovato booleana

Dim trovato as Boolean

La dichiarazione delle variabili in vb come vedremo più avanti avrà ulteriori varianti a seconda del tipo di visibilità della variabile. Per anticipare diciamo che se il progetto di vb è costituito da un form e un modulo per rendere una variabile del modulo utilizzabile nel form è oportuno dichiararla con la clausola public.

Assegnazione e Cacolo e Operatori

Sono istruzioni utilizzati negli algoritmi per assegnare dei valori ad una variabili o per effettuare il calcolo di una variabile. Tale calcolo non sempre è prettamente numerico, ma può essere anche su stringhe o su variabili logiche.

  Gli operatori aritmetici fondamentali con le regolo fondamentali per le variabili numeriche sono:

+ per la somma

– per la differenza

* per il prodotto

/ per la divisione

^ per l’elevamento a potenza

mod per il resto della divisione intera

\ per la divisione intera ad esempio 5 \ 2 da 2 come quoziente

Ad esempio totale = a*(b mod c) effettua un’assegnazione alla variabile totale del prodotto di a per il resto della divisione intera fra b e c sia essi che sono reali o interi. Come altro esempio potenza = a^b eleva il numero a all’esponente b.

Gli operatori e le funzioni più importani per le stringhe in vb sono:

& unisce due stringhe

str (numero) converte un numero in una sequenza di cifre

val(stringa) converte in numero una sequenza di cifre ad esempio val(0123) da come risultato il numero 123.

len(stringa) restituisce il numero dei caratteri di una stringa.

Per le variabili logiche invece sono disponibili gli operatori logici AND, OR, NOT, EOR. Le tabelle di verità degli operatori sono state precedentemente esposte nella parte generale.

Vediamo la codifica di un algoritmo in Vb

Inizio

Leggi b e h

Calcola l’ipotenusa i=Radice quadrata(h2+b2)

Calcola il perimetro p=i+h+b

Calcola l’area A=(b*h)/2

Scrivi i A e p

Fine

In questo problema viene esguito il calcolo dell’area, del perimentro e dell’ipotenusa di un triangolo rettangolo, nota la misura dell’altezza e della base. La codifica in Visual Basic utilizzando il modulo è:

Option Explicit (Rende obbligatoria la dichiarazione delle variabili)

  Dim h,b,A,p,i as Double (dichiara le variabili come reali)

  Sub Main () (Inizia il programma)

  h=Inputbox(“Dammi l’altezza del triangolo”) (Visualizza una finestra che permette di inserire l’altezza)

  b=Inputbox(“Dammi la base del triangolo”) (Come sopra ma per la base)

  i=sqr(h^2+b^2) (calcola la radice quadrata con la funzione sqrt della somma dei quadrati dell’ipotenusa e dell’altezza)

  A=b*h/2 (Calcola l’area)

  P=i+h+b

  Msgbox (“Area triangolo è:”&str(A)) (Stampa una finestra con il valore dell’area convertito in stringa)

  Msgbox(“Il perimetro del triangolo è: “&str(P))

  End Sub

Per provare il programma apri il link calcolo area e perimentro

  Per vedere il sorgenmte in VB aprire anche con Blocco Note il link sorgente calcolo area e perimetro

Istruzioni di Condizione semplice

In vb la condizione semplice si traduce con la serie di istruzioni:

If condizione then

  [istruzioni]

  else

  [istruzioni]

  End if

Sia la le istruzioni sotto if che sotto else sono facoltative. Come algoritmo di esempio da cui prendere spunto esaminiamo la codifica del massimo di tre numeri. L’algoritmo risolutivo è:

Inizio

Leggi a,b,c

Se a < b allora

Max=b

altrimenti

Max=a

Se Max<c allora

Max=c

Scrivi Max

Fine

La codifica sarà pertanto:

Option Explicit

Dim a,b,c,max as Integer

Sub Main()

a=val(inputbox(“Dammi il primo numero”)

b=val(inputbox(“Dammi il secondo numero”)

c=val(inputbox(“Dammi il terzo numero”)

if a<b then

max=a

else

max=b

end if

  iif max<c then

  max=c

end if

msgbox(str(max))

end sub

Condizione multipla

Quando è opportuno verificare se una variabile assume più valori, e in base alla condizione che si verifica eseguire un gruppo di istruzioni allora si può utilizzare la condizione multipla la cui struttura in linguaggio naturale è:

Scelta variabile

valore 1 istruzione 1

valore 2 istruzione 2

valore 3 istruzione 3

…..

valore n istruzione n

  altrimenti

  istruzione

Fine Scelta

In Visual Basic tale gruppo di istruzioni si codifica con

Select Case variabile

Case valore 1 istruzione 1

Case valore 2 istruzione 2

Case valore 3 istruzione 3

Case valore 4 istruzione 4

…………..

Case valore n istruzione n

Else Case

istruzione

Allo scopo si consideri il seguente problema. Sul prezzo di un prodotto si applica uno sconto in proporzione della quantità acquistata. Lo sconto applicato è riportato nella tabella di seguito:

Quantità Sconto
<10 10%
<50 15%
>50 20%

A questo si deve aggiungere una tassa di 20% pari all’Iva del prodotto. Dato il prezzo e la quantità calcolare quanto deve spendere l’acquirente.

Svolgimento

La tabella dati è:

Classe Nome Tipo
Input prezzo reale
Input Q Intero
Interno Sconto,iva Reale
Output Tot Reale

Vediamo l’algoritmo (per aprire il flow-chart

Diagramma di Flusso su condizione Multipla

Inizio

Tot=0

  Sconto=0

  iva=0

  scrivi “dammi prezzo”

  leggi prezzo

  scrivi “dammi quantità”

  leggi q

  scelta su q

  caso q<10 sconto=(q*prezzo)*10/100

  caso q<50 sconto=(q*prezzo)*15/100

  altrimenti

  sconto=(q*prezzo)*20/100

  Fine scelta

  iva=(q*prezzo-sconto)*20/100

  tot=q*prezzo-sconto+iva

  scrivi “devi pagare”

  scrivi tot

  Fine

La codifica in VB è:

option explici

dim prezzo,iva,sconto,tot as Double

dim q as integer

Sub Main()

prezzo=val(inputbox(“Dammi il prezzo”)

q=val(inputbox(“Dammi la quantità”)

select case q

q<10 sconto=q*prezzo)*10/100

q<50 sconto=q*prezzo)*15/100

else case

q<10 sconto=q*prezzo)*10/100

End Select

iva=(q*prezzo-sconto)*20/100

tot=q*prezzo-sconto+iva

msgbox(“Devi pagare “)

msgbox(str(tot))

end sub,





SQL parte I

6 03 2008

Introduzione

Il linguaggio SQL è un linguaggio standard adottato nell’uso con i Database. E’ un linguaggio semantico basato su Linguaggio di definizione dei dati, Linguaggio di Modifica dei dati, Linguaggio di Interrogazione dei dati.

La sua sintassi è molto semplice. Per approfondire suntio il discorso precisiamo alcune regole fondamentali:

  • Ogni frase SQL deve terminare con “;”
  • Ogni attributo deve essere preceduto dal nome della tabella nelle operazioni che coinvolgono più tabelle separate dal carattere “.”
  • Ogni stringa e data sono indicati fra all’interno dei caratteri ” ‘ ‘ “
  • Ogni frase SQL può contenere una serie operatori di relazione più l’operatore Like che significa “Simile”. Indicando ad esempio “f*” indica tutte le parole che iniziano con la lettera “f”, ma con una sequenza di caratteri qualsiasi. Con il simbolo “?” indichiamo un solo carattere qualunque. Ad esempio “quadr?” può essere “quadro”, “quadrr”, ecc.
  • Nelle frasi SQL fra parentesi quadre si indica un Input atteso dall’utente durante l’esecuzione delle query
  • Esistono delle funzioni di conteggio COUNT, somma SUM, media AVG, MAX che permette di calcolare il massimo di N valori che permettono di effettuare delle elaborazioni sui dati di tipo matematico.

Tipi di dati di SQL

Il lingauggio SQL ammette diversi tipi di dati citeremo quelli più importanti:

  • Interi piccolissimi ovvero TINYINT fra -127 a +128, o fra 0 e 255 senza segno “UNSIGNED”;
  • Interi piccoli ovvero SMALLINT fra -32767 a + 32768 o fra 0 e 65535 senza segno “UNSIGNED”;
  • Interi grandi INT a 4 byte;
  • Interi Enormi BIGINT a 8 byte;
  • Reali in precisione M,D ovvero FLOAT(M,D) ovvero M cifre intere e D dopo la virgola, o anche REAL(M,D);
  • Decimali in precisione X,Y ovvero DECIMAL(X,Y) cioè quante cifre X sono significative, e quante cifre Y dopo la virgola
  • Stringhe CHAR(n) o VARCHAR(n) ovvero stringhe di lunghezza fissa di n caratteri o di lunghezza massima fino a n caratteri;
  • Stringhe grandi di tipo LONGTEXT, MEDIUMTEXT, BIGTEXT in formato ASCII;
  • Stringhe binarie di tipo BLOB, MEDIUMBLOB, LONGBLOB per immagazinare immagini, file ecc.
  • Date in vari formati: DATE “aaaa-mm-dd”, oppure DATETIME “aaaa-mm-dd hh:mm:ss”;

Definizione Tabelle

In SQL per creare una tabella si usa la frase CREATE TABLE.

La sintassi della CRETE TABLE è:

CREATE TABLE nome tabella (nome campo 1 tipo 1, nome campo 2 tipo 2, nome campo 3 tipo 3, .., nome campo n tipo n,)

Nella dicitura nome campo 1 tipo 1 posso scrivere anche nome campo 1 tipo PRIMARY KEY NOT NULL, per dire che è chiave primaria della tabella, oppure nome campo 1 tipo 1 REFERENCES tabella(nome campo collegato) per collegare due tabelle mediante chiave esterna. SI può anche utilizzare una frase del tipo nome campo 1 tipo 1 DEFAULT valore indicando un valore iniziale per il campo.

Come esempio creiamo una tabella dei conti correnti bancari di una banca si ha:

CREATE TABLE CONTI (COD_CONTO CHAR(10) PRIMARY KEY NOT NULL, INTESTATARIO VARCHAR(50) NOT NULL, DATA_NASCITA DATE NOT NULL DEFAULT ‘1950-01-01’, SALDO DECIMAL(10,2));

Si osservi che il codice conto è chiave primaria con lunghezza fissa di 10 caratteri, mentre l’intestatario ha un campo stringa variabile, la data di nascita ha un valore predefinito, mentre il saldo del conto viene messo in 10 cifre intere e 2 decicmali.

Inserimento dati nelle tabelle

A questa classe appartiene l’istruzione INSERT

La sintassi completa è INSERT INTO nome tabella VALUES (valore campo1, valore campo2, …, valore campoN); con la distinzione che i valori dei campi sono fra apici se stringhe e dati, e che si deve ricordare l’ordine dei campi nella tabella. Infatti la sintassi completa è:

INSERT INTO nome tabella (campo1, campo2, …, campoN) VALUES (valore campo1, valore campo2, …, valor ecampoN);

Supponendo di voler inserire i dati nella tabelle precedente si ha:

INSERT INTO CONTI VALUES (‘000000sp001’, ‘DE RITIS ANTONIO’, ’02/10/1959”, 3000);.

Modifica dei dati

A questa categoria appartengono le istruzioni UPDATE, DELETE, la prima permette di aggiornare dati, la seconda di cancellarli. La sintassi completa è:

UPDATE nome tabella SET nome campo1=valore1, nome campo2=valore, .., nome campoN = valore;

Ovviamente è possibile cambiare anche solo un attributo ad esempio nella tabella conti si vuole impostare il saldo a 5000 euri, allora si ha:

UPDATE CONTI SET saldo=5000;

Per cancellare la tabella si può effettuare la cancellazione completa con DELETE * FROM nome tabella; oppure in modo selettivo con l’istruzione:

DELETE FROM nome tabella WHERE condizione;

Ad esempio è possibile cancellare dalla tabella conti tutti quelli con saldo < 0. In questo caso si ha:

DELETE FROM CONTI WHERE saldo<0;

Istruzioni di modifica struttura alla tabella

Modificare la struttura della tabella è sempre possibile anche se è consigliabile di creare la tabella già con tutti i campi necessari alla soluzione del problema posto. Spesso viene però utilizzata per estendere le tabelle con nuove richieste per la gestione. In questo caso la frase SQL è:

ALTER TABLE nome tabella ADD COLUMN nome campo tipo BEFORE | AFTER nome campo esistente;

Ad esempio aggiungiamo alla tabella CONTI, il campo CODICE FISCALE dopo il cognome si ha:

ALTER TABLE CONTI ADD COLUMN codice_fiscale AFTER cognome;

Per cancellare un campo si ha:

ALTER TABLE nome tabella DROP COLUMN nome campo;.

File di Access rinomina da .txt a .mdb Esercizio pag 93 n 15





Database Parte 1

25 02 2008

Capitolo 1

In informatica quando è necessario gestire una grande quantità di informazioni omogenee ovvero della stessa tipologia, come elenco delle persone di un comune, elenco dei libri di una biblioteca, ecc due sono le possibili modalià di gestione o con i file o con i database. La differenza nella realizzazione e risoluzione di problemi connessi alla gestione di enormi quantià di dati risiede nel fatto che con la gestione con i file la velocità di esecuzione e di consultazione delle operazioni sui file sono molto più rapide che nella gestione con i database in quanto si sfruttano attraverso un linguaggio di programmazione istruzioni che agisocno direttamente sui dati, mentre con i database si passa attraverso un gestore chiamato DBMS. Per poter gestire le grandi quantità di dati nella prima modalità gli utenti devono saper programmare e realizzare quindi le procedure che gestiscono i dati. Invece nella gestione a livello di database l’utente deve conoscere al più ma non in modo obbligatorio un linguaggio semantico e informativo ovvero che svolge delle semplici operazioni sulle informazioni. Parlano di informazione e dati si deve però precisare una differenza.
Per dato si intende un fatto raccolto mediante osservazione diretta misurazione. Per informazione si intende una raccolata di dati che si riferiscono in modo univoco e non ambiguo ad un oggetto o ad un soggetto. Un aggregrato di dati relativi ad un’informazione si chiama record logico e le sue componenti che possono essere di tipo diverso si chiamano campi. Un insieme di record logici possono essere memorizzate in una tabella che risiede in memoria centrale (vettore di record) oppure essere memorizzati su una memoria permanente come un’unità a disco e in questo caso si parla di file. Nella gestione a livello di programmazione il programma si deve interessare della memorizzazione dei dati sui supporti e quindi del passaggio da una struttura logica ad una fisica. Nella gestione mediante Database l’utente si disinteressa di questo passaggio occupandosi solo del livello logico del problema da risolvere. Inoltre nel primo caso l’utente si deve interessare anche dei meccanismo di accesso ai file da parte di più applicazioni e utenti andando incontro alle problematiche di condivisione dei file. Tutto questo se gestito dai database viene automaticamente soddisfatto dal DBMS.
La definizione di Database è pertanto una collezione di dati strutturati e organizzati alla quale accedono diversi utenti da differenti applicazioni.
Nella gestione a database la situazione che si presenta schematicamente può essere rappresentata dal diagramma sottostante.

Modello Ansi Sparc

Nello schema si evidenzia il fatto che ogni utente interagisce con la base di dati tramite un’applicazione e tale applicazione passa le richieste dell’utente al DBMS che trasforma le richieste delle applicazioni di tipo logiche in operazioni di i/o tramite il sistema operativo sull’archivio fisico. In questo modo l’utente si disinteressa del tutto di quest’ultima gestione. Lo schema proposto non è l’unico possibile anche perchè le applicazioni possono interagire fra di loro per scambiarsi dati. Tale scambio però avviene sempre passando attraverso il DBMS. Lo svantaggio di questo approccio risiede nel fatto che sull’elaboratore su cui girano le applicazioni deve essere presente il software di DBMS. Nella realizzazione invece di programmi diretti per la gestione degli archivi invece viene garantita una buona portabilità da elaboratori differenti a sistemi differenti mentre però la flessibilità ovvero la possibilità di modificare parte del programma comporta un grosso sforzo in termini d tempo e di ridefinizione delle strutture dati. Le peculiarità principali di un DBMS e quindi dei database che essi gesticono sono:

Grantisce l’integrità dei dati, la cosistenza, e elimina la ridondanza degli stessi

Gestice in modo sicuro gli accessi contemporanei ai dati

Gestisce le utenze in livelli di credenziali

Permette all’utente di eliminare le ridondanze

Facilità la gestione di archivi distribuiti

Permette la realizzazione di basi dati relazionali

Per ridondanza si intende la duplicazione di dati in più parti dell’archivio ad esempio se si deve gestire l’archivio degli elettori di un comune in questo archivio possono essere presenti i dati anagrafici degli stessi che però sono anche ripetuti nell’archivio anagrafico del comune. Eliminare le ridondanze non significa però cancellare del tutto i dati duplicati ma tenere solo quelli strettamente necessari. Per eliminare queste ridondanze nel database si ricorre all’instaurazioni di relazioni fra le grandezze informative in gioco. La consistenza è la carateristica che garantisce ai dati che si propagano nelle varie grandzze informative di avere lo stesso valore. L’integrità nei database garantisce che i dati che sono inseriti all’inertno degli archivi sono coerenti ad esempio nell’inserimento di campi obbligatori e nel corretto formato degli stessi.
La gestione sicura dell’accesso ai dati riguarda la protezione dei dati. In generale non è possibile effettuare delle modifiche contemporanee ai dati e quindi il DBMS implementa dei meccanismi di protezione dell’accesso in scrittura sui dati inserendo durante un operazione di scrittura il bit di locking un valore che indica ad altre applicazione che vogliono nello stesso momento accedere agli stessi dati che è possibile effettuare solo operazioni di lettura.
La gestione degli utenti attraverso un sistema di credenziali indica diversi livelli di accesso al database infatti si definiscono gli utenti amministratori che creano e modificano i permessi degli utenti del livello inferiore, modificano le strutture dei dati, dei database nello specifico, effettuano operazioni di backup (copia di sicurezza), ecc.

Fasi di progettazione di un Database (Modellazione dei Dati)

Per poter progettare e realizzare concretamente un Database si deve prima realizzare la modellazione dei dati che si vuole gestire e poi scegliere un software DBMS che consenta di tradurre in procedure e applicativi la gestione e la realizzazione del modello proposto. All’uopo si deve dire che la modellazione dei dati passa attraverso tre passi:

Progettazione concettuale o esterna in questa fase chi deve organizzare il database e realizzarlo esegue un’indagine sulle informazioni che dovrà contenere il database e quali saranno le funzioni richieste. In questa fase si deve avvalere della collaborazione dei lavoratori dell’azienda che decide di realizzare il database e di tutti i settori coinvolti. Il progettista organizza il modello secondo contenuti informativi e sceglie uno dei modelli concettuali, Di modelli concettuali ne esistono alcuni i più importanti sono il modello Entità-Relazioni, il modello Gerarchico, e il modello a Grafo. COme realizzare tali modelli lo si vedrà in seguito.

Progettazione logica in questa fase si deve decidere la realizzazione logica del modello concettuale creato in precedenza e si realizzano e si costruiscono le tabelle che conterranno le informazioni secondo i contenuti informativi descritti nella fase concettuale; Inoltre qui si definiscono le relazioni logiche fra i dati e i vincoli di inetegrità a cui essi devono soddisfare.

Nella progettazione fisica si deicde la dislocazione della base di dati, la sua distribuibilità e i supporti di memorizzazione richiesti.

Modelli concettuali

In ogni modello è opportuno definire le grandezze informative in gioco e le relazione che intercorrono fra esse evidenziando anche il significato della relazioe..

Modello Gerarchico

In questo modello si assegna una gerarchia alle grandezze informative in gioco ogranizzandola in una struttura ad albero in cui ogni grandezza informativa che chiameremo d’ora in poi entità può accedere alle informazioni dei livelli sottostanti ma non di quelle sopra di esse. Un esempio è rappresentato dallo schema sottostante.

Esempio di Modello Gerarchico

In questo esempio si vuole evidenziare l’organizzazione del patrimonio informativo di un’azienda. Ogni grandezza informativa ad esempio il Dipartimento Tecnico accede alle informazioni del settore Produzione e Progettazione ma non alle informazioni dell’Azienda (livello superiore potrebbero essere i dati sulle vendite, sul personale ecc.). In questo modo le applicazioni e il Database che ne scaturisce da questo modello sarà molto vincolato alla non comunicazione ( o non accesso) alle informazioni dei livelli superiori.

Modello a grafo

In questo modello concettuale le informazioni sono collegate attraverso delle relazioni di dipendenza con percorso obbligato. In altri termini le informazioni sono organizzate in strutture a lista dove ciascun elemento può accedere all’elemento precedente e successivo della lista ma non a quello di altra lista. Tale modello si presta bene per la realizzazioni di viste specifiche sui dati. Un esempio è riportato nello schema sottostante.

Modello a Grafo

In questo esempio si vogliono organizzare le informazioni relative ai cantanti e ai loro dischi con un criterio di raggruppamento dei cantanti per casa discografica. Ogni rettangolo rappresentano dati sulle case discografiche, i loro cantanti e i dischi che hanno inciso e quindi venduto. In questo modello a grafo la casa discografica consulta i dati dei cantanti e dei loro dischi secondo una struttura a lista ovvero una volta scelto un cantante potrò visualizzare solo i dati dei dischi che esso ha prodotto.