Sei sulla pagina 1di 12

INFORMATICA 3^ ANNO

D I S P E N S A
INDICE
Premesse fondamentali

funzioni logiche in VBA

Rappresentazione e codifica delle


informazioni nel calcolatore

rappresentazione numeri reali in BCD

Concetti fondamentali della


programmazione

fasi della creazione di un programma

Paradigmi di programmazione e
lunguaggio C#:

stili di programmazione strutturata,


funzionale, ad oggetti

Tipi di dati strutturati:

selection/insertion/bubble sort, ricerca


binaria con complessit; matrici
(trattazione esaustiva); i record in C#

PREMESSE FONDAMENTALI

Funzioni logiche in VBA (visual basic)


Dim a, b, c, d, e, f, g As Boolean
a = Not ( 23 > 14 And 11 > 8 )
b = 14 > 23 And 11 > 8
' The preceding statements set a to False and b to False.
c = 23 > 14 Or 8 > 11
d = 23 > 67 Or 8 > 11
' The preceding statements set c to True and d to False.
e
f
g
'

= 23 > 67 Xor
= 23 > 14 Xor
= 14 > 23 Xor
The preceding

11 > 8
11 > 8
8 > 11
statements set e to True, f to False, and g to False.

RAPPRESENTAZIONE DELLE INFORMAZIONI NEL CALCOLATORE


Rappresentazione di numeri reali BCD
Il codice BCD (Binary Coded Decimal) si basa sulla codifica delle 10 cifre decimali
mediante la codifica binaria naturale, e sulla loro giustapposizione per la
rappresentazione dei valori. Pi precisamente, poich le cifre da rappresentare sono
{0,1,...9} necessario utilizzare log2(10)=4 bit bit, come mostrato in Tabella.

Cifra decimale

Codice BCD

0000

0001

0010

0011

0100

0101

0110

0111

1000

1001

Volendo rappresentare il valore numerico 2510 nel codice BCD si giustappone la


codifica della cifra 210=0010BCD a quella della 510=0101BCD ottenendo
00100101BCD. Questo codice, per quanto possa sembrare poco efficiente poich
richiede la manipolazione delle singole cifre, trova applicazione nella rappresentazione
di valori razionali con un numero fisso di cifre decimali, ove non si possa tollerare
un'approssimazione. Un esempio di utilizzo costituito dalla memorizzazione di
importi monetari che fanno uso di centesimi (come per esempio l'euro o il dollaro), in
cui il numero di cifre decimali fisso.

CONCETTI FONDAMENTALI DELLA PROGRAMMAZIONE


Un programma eseguibile un file contenente i bit necessari per istruire la macchina
ad eseguire le operazioni desiderate dal programmatore. Il programma, usualmente
scritto in un linguaggio simbolico (es. C, Java ecc.), necessita di essere tradotto in
linguaggio macchina prima di essere caricato in memoria. Questa traduzione
2

eseguita dai tre programmi compilatore, assemblatore e linker. Un programma


inizialmente composto da codice sorgente suddiviso in moduli (es. file .c, .cpp, .java), i
quali devo essere compilati singolarmente dal compilatore. I moduli sono
interdipendenti, in quanto hanno almeno una variabile o una funzione (dette esterne)
che li lega a due a due (un modulo A legato ad un modulo B se A utilizza una
variabile o una funzione definita in B ). Il compilatore traduce prima i moduli in
linguaggio assembler, successivamente l'assemblatore effettua la traduzione in
linguaggio macchina, producento il codice oggetto. Il linker collega i vari moduli
oggetto risolvendo i legami simbolici (cio di variabili e di funzioni), ed unendo i codici
dei moduli in un solo codice eseguibile.
Un programma, risiedente in memoria sotto forma di file, viene eseguito da uno
speciale programma chiamato loader, che svolge tutte le operazioni necessarie per
permettere alla macchina di iniziare l'elaborazione (creazione spazio in memoria, copia
istruzioni in memoria, copia dati in memoria, inizializzazione registri macchina).
PARADIGMI DI PROGRAMMAZIONE E LINGUACCIO C#
In informatica, un paradigma di programmazione uno stile fondamentale
di programmazione, ovvero
un insieme di
strumenti
concettuali
forniti
da
un linguaggio di programmazione per la stesura del codice sorgente di un programma,
definendo dunque il modo in cui il programmatore concepisce e percepisce il
programma stesso. Diversi paradigmi si differenziano per i concetti e le astrazioni
usate per rappresentare gli elementi di un programma (come ad esempio le funzioni,
gli oggetti, le variabili, vincoli, ecc.) e per i procedimenti usati per l'esecuzione delle
procedure di elaborazione dei dati (assegnazione, calcolo, iterazione, data flow, ecc).
Programmazione strutturata (C, Pascal, Ada, ALGOL)
La programmazione strutturata un paradigma di programmazione emerso fra gli anni
sessanta e gli anni settanta nel contesto della programmazione procedurale. I concetti
introdotti dalla programmazione strutturata sono alla base di numerosi altri paradigmi
procedurali successivi, non ultimo quello orientato agli oggetti. Le idee chiave della
programmazione strutturata si possono ricondurre alla critica della struttura di
controllo del salto incondizionato (o goto, "vai a"), che rappresentava, negli anni
sessanta, lo strumento fondamentale per la definizione di algoritmi complessi nel
software. La nuove strutture di controllo introdotte dal paradigma sono sequenza
(priva di costrutti di tipo GOTO), selezione (costrutto IF) e ciclo (costrutti FOR, WHILE,
ecc..).
Teorema di Bohm-Jacopini
Il teorema di Bhm-Jacopini, enunciato nel 1966[1] dagli informatici
Corrado Bhm e Giuseppe Jacopini, un teorema di informatica
teorica che afferma che qualunque algoritmo pu essere
implementato in fase di programmazione (in diagramma di flusso,
pseudocodice o codice sorgente) utilizzando tre sole strutture dette
strutture di controllo: la sequenza, la selezione ed il ciclo (iterazione),
da applicare ricorsivamente alla composizione di istruzioni elementari
(ad es. di istruzioni eseguibili con il modello di base della macchina di
Turing).
Programmazione funzionale (Lisp, Mathematica)

In informatica la programmazione funzionale un paradigma di programmazione in cui


il flusso di esecuzione del programma assume la forma di una serie di valutazioni di
funzioni matematiche. Solitamente questo approccio viene usato maggiormente in
ambiti accademici piuttosto che industriali. La programmazione funzionale pone
maggior accento sulla definizione di funzioni, rispetto ai paradigmi procedurali e
imperativi, che invece prediligono la specifica di una sequenza di comandi da
eseguire.
Programmazione ad oggetti (Java, C#)
La programmazione orientata agli oggetti un paradigma di programmazione che
permette di definire oggetti software in grado di interagire gli uni con gli altri
attraverso lo scambio di messaggi. particolarmente adatta nei contesti in cui si
possono definire delle relazioni di interdipendenza tra i concetti da modellare
(contenimento, uso, specializzazione). Un ambito che pi di altri riesce a sfruttare i
vantaggi della programmazione ad oggetti quello delle interfacce grafiche.

Esempi di programmazione procedurale, strutturata e ad oggetti.

TIPI DI DATI STRUTTURATI


Insertion sort
L'Insertion sort, in italiano ordinamento a inserimento, un algoritmo relativamente
semplice per ordinare un array. Non molto diverso dal modo in cui un essere umano,
4

spesso, ordina un mazzo di carte. Esso un algoritmo in place, cio ordina l'array
senza doverne creare una copia, risparmiando memoria. Pur essendo molto meno
efficiente di algoritmi pi avanzati, pu avere alcuni vantaggi: ad esempio, semplice
da implementare ed efficiente per insiemi di partenza che sono quasi ordinati.
Complessit algoritmica
Il caso ottimo per l'algoritmo quello in cui la sequenza di partenza sia gi
ordinata. In questo caso, l'algoritmo ha tempo di esecuzione lineare, ossia
(N). Infatti, in questo caso, in ogni iterazione il primo elemento della
sottosequenza non ordinata viene confrontato solo con l'ultimo della
sottosequenza ordinata. Il caso pessimo invece quello in cui la sequenza di
partenza sia ordinata al contrario. In questo caso, ogni iterazione dovr
scorrere e spostare ogni elemento della sottosequenza ordinata prima di poter
inserire il primo elemento della sottosequenza non ordinata. Pertanto, in
questo caso l'algoritmo di insertion sort ha complessit temporale quadratica,
ossia (N^2).
Psegudocodice:
procedureinsertionSort(arrayA)
fori1tolength[A]do
valueA[i]
ji1
whilej>=0andA[j]>valuedo
A[j+1]A[j]
jj1
A[j+1]value
Selection sort
L'algoritmo seleziona di volta in volta il numero minore nella sequenza di partenza e lo
sposta nella sequenza ordinata; di fatto la sequenza viene suddivisa in due parti: la
sottosequenza ordinata, che occupa le prime posizioni dell'array, e la sottosequenza
da ordinare, che costituisce la parte restante dell'array.
Dovendo ordinare un array A di lunghezza n, si fa scorrere l'indice i da 1 a n-1
ripetendo i seguenti passi:
si cerca il pi piccolo elemento della sottosequenza A[i..n];
si scambia questo elemento con l'elemento i-esimo.
Complessit algoritmica
Il ciclo interno un semplice test per confrontare l'elemento corrente con il
minimo elemento trovato fino a quel momento (pi il codice per incrementare
l'indice dell'elemento corrente e per verificare che esso non ecceda i limiti
dell'array). Lo spostamento degli elementi fuori dal ciclo interno: ogni
scambio pone un elemento nella sua posizione finale quindi il numero di
scambi pari a N-1 (dato che l'ultimo elemento non deve essere scambiato).
Il tempo di calcolo determinato dal numero di confronti. L'ordinamento per
selezione effettua N(N-1)/2 confronti e, nel caso peggiore/migliore/medio,
(n-1) scambi. La complessit di tale algoritmo dell'ordine di (n^2).

Pseudocodice:
procedureSelectionSort(a:listadeinumeridaordinare);
fori=1ton1
posmini
forj=(i+1)ton
ifa[j]<a[posmin]
posminj
ausa[i]
a[i]a[posmin]
a[posmin]aus
Bubble sort
Il Bubble sort o bubblesort (letteralmente: ordinamento a bolle) un algoritmo di
ordinamento dei dati. Il suo funzionamento semplice: ogni coppia di elementi
adiacenti della lista viene comparata e se sono nell'ordine sbagliato vengono invertiti
di posizione. L'algoritmo scorre poi tutta la lista finch non vengono pi eseguiti
scambi, situazione che indica che la lista ordinata.
Complessit algoritmica
Il bubble sort effettua all'incirca N^2/2 confronti ed N^2/2 scambi sia in media
che nel caso peggiore. Il tempo di esecuzione dell'algoritmo (N^2).
Pseudocodice:
procedureBubbleSort(A:listadeglielementidaordinare)
scambiotrue
whilescambiodo
scambiofalse
fori0tolength(A)2do
ifA[i]>A[i+1]then
swap(A[i],A[i+1])
scambiotrue
Ricerca binaria
La ricerca binaria un algoritmo di ricerca che individua l'indice di un determinato
valore presente in un insieme ordinato di dati. La ricerca dicotomica richiede un
accesso casuale ai dati in cui cercare. L'algoritmo simile al metodo usato per trovare
una parola sul dizionario: sapendo che il vocabolario ordinato alfabeticamente, l'idea
quella di iniziare la ricerca non dal primo elemento, ma da quello centrale, cio a
met del dizionario. Si confronta questo elemento con quello cercato. Se corrisponde,
la ricerca termina indicando che l'elemento stato trovato; se superiore/inferiore, la
ricerca viene ripetuta sugli elementi precedenti/successivi.
Complessit algoritmica
La ricerca binaria non usa mai pi di O(log_2 N) confronti per una search hit o
una search miss. Tuttavia, a meno che non si controllino ad ogni iterazione i
valori dei due indici estremi, la ricerca binaria impiega effettivamente sempre
6

lo stesso tempo su uno stesso array per cercare elementi anche in posizioni
diverse; la ricerca sequenziale invece passa da O(N) come caso peggiore a
O(N/2) nel caso medio, fino a O(1) se l'elemento si trova in prima posizione.
Matrici
Una matrice una tabella ordinata di elementi.
Ad esempio:

Le matrici sono ampiamente usate in matematica e in tutte le scienze per la loro


capacit di rappresentare in maniera utile e concisa diversi oggetti matematici, come
valori che dipendono da due parametri o anche sistemi lineari, cosa, quest'ultima, che
le rende uno strumento centrale dell'analisi matematica.
Le righe orizzontali di una matrice sono chiamate righe, mentre quelle verticali
colonne. Ad esempio, la matrice mostrata sopra ha due righe e tre colonne. In
generale, una matrice mXn una matrice con m righe e n colonne, dove m e n
sono interi positivi fissati. Una matrice mXn generica descritta come in figura sopra
oppure anche nel modo seguente (che viene considerata pi proficua come notazione
per il fatto di non dover differenziare nelle operazioni l'elemento dalla matrice stessa) :

indicando con [A]_{i,j} l'elemento posizionato alla riga i -esima.


La riga i -esima viene indicata con Row_i(A) , oppure pi ambiguamente A_i, mentre
colonna j-esima con Col_j(A) , oppure pi ambiguamente A^j.
Gli elementi [A]_{i,i} costituiscono la diagonale principale della matrice.
I vettori possono essere considerati matrici molto semplici, aventi una sola riga o una
sola colonna. Pi precisamente, una matrice con una sola riga, di dimensione 1X n ,
detta matrice riga o vettore riga, mentre una matrice con una sola colonna, di
dimensione mX1 , detta matrice colonna o vettore colonna.
Qui sotto sono mostrati in ordine una matrice 4X3 , una matrice colonna ed una
matrice riga.

Come mostrato negli esempi, i valori presenti nella matrice possono essere di vario
tipo: interi, reali o anche complessi.
Algebra delle matrici
Sulle matrici si possono definire numerose operazioni: due matrici (aventi dei numeri
opportuni di righe e colonne) possono essere sommate, sottratte, moltiplicate fra loro,
e moltiplicate per un numero (detto scalare).
Somma
Due matrici A e B , entrambe di tipo mX n , possono essere sommate. La loro
somma A+B definita come la matrice mXn i cui elementi sono ottenuti
sommando i corrispettivi elementi di A e B . Formalmente:
[A + B]_{i, j} := [A]_{i,j} + [B]_{i,j}
Per esempio:

Moltiplicazione per uno scalare


La moltiplicazione per uno scalare un'operazione che, data una matrice A ed
un numero c (detto scalare), costruisce una nuova matrice cA , il cui
elemento ottenuto moltiplicando l'elemento corrispondente di A per c ; gli
elementi della matrice e lo scalare in questione devono appartenere allo stesso
campo. Formalmente:
[cA]_{ij} := c[A]_{i,j}
Per esempio:

Prodotto
La moltiplicazione tra due matrici A e B un'operazione pi complicata delle
precedenti. A differenza della somma, non definita moltiplicando
semplicemente gli elementi aventi lo stesso posto. La definizione di
moltiplicazione che segue motivata dal fatto che una matrice modellizza una
applicazione lineare, e in questo modo il prodotto di matrici corrisponde alla
composizione di applicazioni lineari.
La moltiplicazione definita soltanto se le matrici A e B sono rispettivamente di
tipo mXp e pXn: in altre parole, il numero p di colonne di A deve coincidere con
il numero p di righe di B. Il risultato una matrice C di tipo mXn.

Esempio: siano A e B due matrici rispettivamente 3X4 e 4X2: tra queste si pu


effettuare la moltiplicazione AXB ed ottenere una matrice 3X2. Le stesse
matrici, per, non possono essere moltiplicate nel modo BXA, poich le colonne
di B non sono tante quante le righe di A.
Il prodotto di A di m righe e p colonne e B di p righe e n colonne la matrice C =
AXB di dimensione mXn, il cui elemento di posizione (i,j) dato dalla somma

Quest'ultimo viene detto prodotto riga per colonna.


Esempio:

Determinante
Il determinante di una matrice quadrata (nXn) A un numero che descrive alcune
propriet algebriche e geometriche della matrice. Esso viene generalmente indicato
con det(A) ed a volte con |A|, quest'ultima notazione pi compatta ma anche pi
ambigua, in quanto utilizzata talvolta per descrivere una norma della matrice. Vale la
seguente formula di Leibniz:

Nella

formula,

l'insieme

numerico
e
denota
una permutazione pari, 1 se dispari).

di

tutte
il segno

le permutazioni
della

dell'insieme

permutazione (

se

Il determinante di una matrice 2X2 :

Il determinante di una matrice 3x3 :

Matrici invertibili
Una matrice quadrata detta invertibile o regolare se esiste un'altra matrice tale che
il prodotto matriciale tra le due restituisce la matrice identit. Una matrice invertibile
se e solo se il suo determinante uguale a 0.
Generazione di matrici a spirale in C
#include <stdio.h>
#include <stdlib.h>

/* verso il basso */
while (i <= j)

#define N 10

m[i++][j] = k++;
i--;

void riempi_a_spirale (int m[N][N], int


n);

j--;

void visualizza_matrice (int m[N][N], int


r, int c);

/* verso sinistra */
while (j >= n - i - 1)

int main()

m[i][j--] = k++;

j++;
int matrice [N][N], size;

i--;

printf ("dimensione della matrice


(quadrata max 10x10): ");

/* verso l'alto */

scanf ("%d", &size);

while (i > j)
m[i--][j] = k++;

riempi_a_spirale (matrice, size);

i++;

visualizza_matrice (matrice, size,


size);

j++;

return EXIT_SUCCESS;

return;
}

10

void riempi_a_spirale (int m[N][N], int n)


{

void visualizza_matrice (int m[N]


[N], int r, int c)
int i, j, k;

k = 0;

int i, j;

i = j = 0; /* punteranno sempre alla


prossima cella da riempire */

for (i = 0; i < r; i++)

while (k < n*n)

for (j = 0; j < c; j++)


/* verso destra */

printf ("%d\t", m [i][j]);

while (j < n - i)

printf ("\n");

m[i][j++] = k++;

j--;
i++;

return;
}

Record
Un record un oggetto di una banca dati strutturata in dati compositi, che
contengono un insieme di campi o elementi, ciascuno dei quali possiede nome e tipo
di dato propri.
I record devono molto alle tradizionali schede cartacee delle biblioteche, da cui
riprendono in gran parte la struttura.
Nella formalizzazione delle basi di dati relazionali l'elemento corrispondente al record
chiamato tupla.
Di seguito un programma in C# definisce un nuovo tipo classe Record,
rappresentante un record che memorizza Identificativo, Nome, Indirizzo, Telefono,
Cellulare ed E-Mail di un cliente (Customer) di unazienda, per poi assegnare il nome
Simone al primo elemento di un array customers di Record.
publicclassRecord
{
publicstringID{get;set;}
publicstringName{get;set;}
publicstringAddress{get;set;}
publicstringPhone{get;set;}
publicstringCell{get;set;}
publicstringEmail{get;set;}
}
Record[]customers=newRecord[50];
RecordcurrentCustomer=customers[1];
currentCustomer.Name="Simone";
11

12

Potrebbero piacerti anche