Crea sito

Category Archives: C ++

La programmazione orientata agli oggetti

Object Oriented Programming

La programmazione orientata agli oggetti (OOP, Object Oriented Programming) è un paradigma di programmazione che prevede di raggruppare in un’unica entità (la classe descrizione astratta di un tipo di dato) sia le strutture dati che le procedure che operano su di esse, creando un oggetto (istanza della classe) software dotato di proprietà (dati) e metodi (procedure) che operano sui dati dell’oggetto stesso.
Nel linguaggio C++ è possibile scrivere programmi secondo uno stile di programmazione che può essere orientato agli oggetti.

La differenza tra classe e oggetto è la stessa che c’è tra tipo di dato e dato.

Si è detto che un oggetto è definito da:

  • attributi che rappresentano le sue caratteristiche e proprietà fisiche utili a definire il suo stato (variabili e costanti);

  • metodi che rappresentano i comportamenti ammissibili o le azioni, le proprietà dinamiche, cioè le funzionalità dell’oggetto stesso e chi usa l’oggetto può attivarli. I metodi vengono realizzati con le funzioni contenenti le istruzioni che implementano le azioni dell’oggetto e possono avere parametri e fornire valori di ritorno (funzioni e procedure).

Esempio

Prima di implementare un’applicazione occorre innanzitutto individuare il contesto nel quale si deve operare, per formalizzare il dominio applicativo. Si supponga di gestire i prodotti di un grande magazzino che vende elettrodomestici e che elenchi le caratteristiche e funzionalità di essi.  Formalizzando gli oggetti del dominio applicativo si ha un diagramma di classe (Class Diagram) che fornisce una notazione grafica per la formalizzazione delle classi e le relazioni che intercorrono tra di esse. Ad esempio:

Esempi vari:

Un linguaggio ad oggetti, per essere definito tale, deve supportare le proprietà di incapsulamento, information hiding, ereditarietà e polimorfismo.

La funzione ricorsiva

La ricorsione è una tecnica di programmazione, che sfrutta l’idea di suddividere un problema da risolvere in sottoproblemi simili a quello originale, ma più semplici. Un esempio è l’elevamento a potenza, infatti si avrà:
xn = x * xn-1. Ma se n = 0 allora x0 = 1. Pertanto avremo la seguente funzione ricorsiva all’interno del programma:

Altri esempi sono dati dai seguenti esercizi

1.Scrivere una funzione che calcoli il fattoriale di un numero
2.Scrivere una funzione ricorsiva che calcoli, ricorsivamente, la somma di tutti i numeri compresi tra 0 ed x
3.Si scrivano le versioni ricorsiva di una funzione: f(a,n); che calcoli il seguente valore

4.Scrivere una funzione ricorsiva (in C) che calcoli la somma degli elementi di un array a[1..n] di n ≥ 1 interi

Soluzione 1.
int fatt(int n)
{
if (n>1) return n*fatt(n-1);
else return 1;
}
Soluzione 2.
int somma(int x)
{
if (x == 0) return 0;
else return x + somma(x-1);
Soluzione 3.
float f(float a, int n)
{
if (n==1) return a – 1/a;
else return a – n/a + f(a, n-1);
}
Soluzione 4.
int somma(int a[]; int n)
{
if (n==0) return 0;
else return a[n] + somma(a, n-1);
}

La gestione delle stringhe

I comandi essenziali

#include <string> è la libreria per il riconoscimento delle stringhe e dei comandi per la gestione.
Esempio di dichiarazione di una stringa:
string nome, cognome, sesso, anni;
const char eta=12;
nome =’’Mario’’;
cognome = nome;
sesso = ’f’;
anni=eta;
è possibile inizializzare una variabile stringa all’inizializzazione
string saluto=”Salve”, saluto2=saluto;
non é possibile inizializzazione con caratteri o interi
string s=’c’;  oppure saluto1=3;
non é possibile andare a capo in un’assegnazione a costante stringa
string sbagliata=> “stringa veramente troppo,
                                lunga “;
cosí peró va bene…
string corretta=> “stringa veramente troppo, \n “
”lunga “;
\n –> si puó inserire il carattere ritorno carrello (o il tab).

OUTPUT DI STRINGHE
Una stringa si puó visualizzare inserendolo su uno stream di output
string saluto=”salve mondo!!”;
cout«saluto«endl;
Attenzione a inserire gli spazi….
string saluto=”salve”;
cout«saluto«”mondo”«endl;
pertanto la visualizzazione sarà ==>  “salvemondo”

INPUT DI STRINGHE
Si può usare l’operatore di estrazione da stream
string indirizzo;
cin » indirizzo;

la lettura ignora gli spazi iniziali e poi estrae tutti i caratteri fino ad uno spazio bianco. La quantità di memoria allocata viene automaticamente adattata.

La funzione getline fornisce un maggiore controllo (ad es. carattere terminatore della stringa)
L’istruzione cin, usata nell’esempio precedente per acquisire una stringa, presenta il problema che non acquisisce stringhe contenenti al proprio interno degli spazi. Per esempio volendo acquisire la stringa “Viale Ofanto 150” con cin>>indirizzo;
alla fine indirizzo conterrebbe solo “Viale” poiché l’acquisizione termina automaticamente in corrispondenza del primo spazio. Il problema può essere risolto in C++ usando la funzione getline nel seguente modo: getline(cin, indirizzo);

La sintassi è abbastanza semplice: getline(cin, nome_stringa_da_acquisire)
E’ importante non confondere la funzione getline con la cin.getline usata per acquisire stringhe rappresentate come vettori di char (cioè nel modo “tradizionale” del linguaggio C).

Nota: Potrebbero vericarsi anomalie nell’acquisizione di stringhe contestalizzate in variabili strutturate (array e/o matrici di stringhe), pertanto prima di acquisire la stringa con il comando di getline, si scrive la funzione fflush(stdin).

Metodi
Titolo: Metodi (0 click)
Etichetta:
Filename: metodi.pdf
Dimensione: 257 KB

Funzioni
Titolo: Funzioni (0 click)
Etichetta:
Filename: funzioni.pdf
Dimensione: 172 KB

Il passaggio dei parametri

Il passaggio dei parametri in C++

Per valore

Quando il passaggio dei parametri avviene per valore, alla funzione viene in effetti passata solo una copia dell’argomento. Grazie a questo meccanismo il valore della variabile nel programma chiamante non viene modificato.
Esempio: supponiamo di voler caricare un vettore vet di dimensione dim e successivamente vogliamo visualizzarne il contenuto, lo script sarà il seguente

Mentre, nel passaggio di parametri per indirizzo, alla funzione viene passato l’indirizzo e non il valore dell’argomento. Nel nostro esempio la variabile dim cambierebbe il suo valore qualora essa venisse letta all’interno della procedura carica. Pertanto la variabile dim (parametro) dovrà essere passata per indirizzo e non per valore.
Lo script sarà il seguente:

Creiamo ora la procedura visualizza:

Aggiungiamo una funzione che effettui la somma degli elementi con l’introduzione del parametro s che memorizzerà il valore della somma

E infine sostituiamo la funzione somma con una ricorsiva

Il grassetto evidenziato nel prototipo della funzione è dovuto al fatto che gli elementi del vettore occupano le posizioni da 0 a n-1 e pertanto la posizione dim-1 è uguale all’ultima posizione all’interno del vettore.
N.B. Se avessimo scritto la funzione nel seguente modo:

Il C++ consente un nuovo passaggio dei parametri per riferimento: il reference.
Un reference è sempre un contenitore di indirizzi, ma si può adoperare come una normale variabile. Il nuovo costrutto richiede l’uso dell’operatore & (e commerciale) che non ha più il significato di “indirizzo di” ma quello di “riferimento a”. Il reference non è una copia della variabile, ma la stessa variabile sotto un  altro nome (alias) ovvero un sinonimo.

Supponiamo di voler creare una funzione di nome minimo in grado di determinare il valore più piccolo tra due interi.

Vediamo il codice:

#include<iostream>
#include<cstdlib>
using namespace std;
void minimo (int a,int b,int& c)
{
if (a<=b) c=a;
else        c=b;
}
main()
{
int x,y,m;
cout<<“Primo numero: “;
cin>>x;
cout<<“Secondo numero: “;
cin>>y;
//passaggio per reference
minimo(x,y,m);
cout<<“Il minimo tra “<<x<<” e “<<y<<” risulta “<<m<<endl;
system(“pause”);
}

Archivi

Aprile: 2019
L M M G V S D
« Gen    
1234567
891011121314
15161718192021
22232425262728
2930