Sei sulla pagina 1di 11

IL LINGUAGGIO C++

C++ (1983) un linguaggio


- orientato agli oggetti, cio fornisce i costrutti per gestire oggetti, classi, ereditariet
- ibrido, poich esistono anche tipi di dati che non sono oggetti (es. i tipi int, float, char)
- case-sensitive, cio distingue le lettere minuscole da quelle maiuscole.
alcune caratteristiche:
main() { }
void main() { }
/* commento */
// commento
sizeof()

programma principale
programma principale: la funzione main non restituisce nulla
commento su pi righe
commento su una sola riga (anche al termine di unistruzione)
funzione che restituisce il n di bytes occupati dallargomento

formattazione delloutput:
\t

\t\t
\n
dec, oct, hex
endl
\0
ends
flush
setw(n)
setfill(m)
setprecision(p)

in una stringa: tabulazione, doppia tabulazione


in una stringa: fine linea
per usare, rispettivamente, la base decimale, ottale, esadecimale
fuori dalla stringa: fine linea
in una stringa: fine stringa
fuori dalla stringa: fine stringa
per emettere loutput eventualmente rimasto in coda
per impostare la larghezza a n battute (default = 0)
per usare un carattere di riempimento diverso dalla spazio
per visualizzare i valori reali con p-1 cifre dopo la virgola

operatori aritmetici:
=
+ - / *
%
++
-+= valore
-= valore
*= valore
/= valore

assegnazione
addizione, sottrazione, divisione, moltiplicazione
resto della divisione tra interi
incremento unario (se precede la variabile lincremento avviene
prima dellutilizzo della variabile, viceversa se segue la variabile)
decremento unario
incremento di un valore specificato
decremento di un valore specificato
moltiplicatore per un valore specificato
divisore per un valore specificato

operatori di relazione:
==
!=
<
>
<=
>=
332318218.docAPPUNTI

uguaglianza
disuguaglianza
minore di
maggiore di
minore o uguale di
maggiore o uguale di
Emi 2007

pag.

operatori logici:
&&
||
!
&
|
^

congiunzione o prodotto logico (AND)


alternativa o somma logica (OR)
negazione (NOT)
congiunzione (AND)
bit per bit
alternativa (OR)
alternativa esclusiva (XOR)

typedef il comando che permette allutente di definire tipi di dati


es.
typedef unsigned short int ushort
dichiarazione di costanti:
[const] tipo nomeCostante = valore
es.

double piGreco = 3.14 ;


const char lettera = a ;
const char aCapo =\n ;

# define la direttiva che permette di definire una costante simbolica ( una dichiarativa di
precompilazione).
es.

#define aCapo \n; // N.B. non c il simbolo =


#define base 10;
#define piGreco 3.14

# include la direttiva che indica al preprocessore (un programma) di includere nel codice le
librerie specificate ( unaltra dichiarativa di precompilazione).
es.

#include <iostream.h>
// include nel codice lheader file (.h), o file di intestazione, che contiene le
// descrizioni delle funzioni e dichiarazioni necessarie per gestire lI/O.

costanti enumerative:
es.

enum {}

enum giorno {luned, marted,, domenica}


// e le costanti avranno valori intrinseci 0, 1, , 6

oppure:
enum giorno {luned=1, marted=2,, domenica=7}
// e le costanti avranno valori stabiliti 1, 2, , 7
332318218.docAPPUNTI

Emi 2007

pag.

funzioni definite dal programmatore


formato generale:
tipo di valore restituito nome della funzione (elenco parametri con tipo e nome)
{
variabili locali
istruzioni

return valore restituito


}

Note:
-

tipo di valore restituito per default int


i parametri elencati accanto al nome della funzione sono i parametri formali
se la funzione non d risultati di ritorno, il tipo restituito void (ed in tal caso si parla pi
propriamente di procedura ndr) e return non seguito dal valore restituito, anzi return pu
essere omesso
se la funzione non riceve parametri tra parentesi si pu scrivere void oppure non scrivere
niente
Main una funzione, ed la prima ad essere eseguita allavvio del programma. Tra
parentesi indica i parametri che pu ricevere dalla riga di comando del S.O. Alla fine, dopo
return si specifica il valore da restituire eventualmente al S.O. (di solito 0).

Per richiamare una funzione:


nome della funzione

(elenco dei valori da passare ai parametri);

in questo caso i parametri sono parametri attuali (o parametri reali).


Il passaggio dei parametri alla funzione pu avvenire:
- per valore
- per indirizzo: in questo caso i cambiamenti dei valori dei parametri formali durante
lesecuzione della funzione influenzano i valori dei parametri attuali. Per indicare il
passaggio di parametri per indirizzo si usano i simboli & e *:
o & si specifica nel parametro attuale: il puntatore al dato, quindi il suo indirizzo
o * si specifica nel parametro formale (ne indica il valore).
N.B. Un vettore viene sempre passato ad una funzione per indirizzo, poich il nome del vettore ,
in realt, il puntatore al primo elemento del vettore (lindirizzo dellelemento di indice 0).

Le librerie disponibili in C prevedono una serie di funzioni predefinite di utilit generale: spesso per
utilizzarle necessario utilizzare gli header (files con estensione .h) che le contengono.
332318218.docAPPUNTI

Emi 2007

pag.

funzioni per la manipolazione di stringhe (string.h):


strcpy(s1, s2)
strncpy(s1, s2, n)
strcmp(s1, s2)
stricmp(s1, s2)
strcat(s1, s2)

permette di copiare una stringa in unaltra


permette di copiare una stringa in unaltra, specificando il n. di
caratteri
restituisce valore 0 se le due stringhe sono uguali,
1 se la prima maggiore della seconda,
-1 se la prima minore della seconda
come strcmp(), ma ignora le differenze tra maiuscole e minuscole
concatena due stringhe (--> s1 = s1 + s2, ndr)

funzioni matematiche (math.h):


pow(base, esponente)
exp(esponente)
sqrt(argomento)
pow(argomento, (1./x))
log(argomento)
log10(argomento)

calcolo della potenza


calcolo di eesponente
calcolo della radice quadrata
calcolo della radice con indice x (se x>2)
logaritmo naturale
logaritmo in base 10

array
vettori:
es.

int numeri[20];

// dichiarazione

int valori[5] = {100, 2000, 400, 50, 870}

// dichiarazione e inizializzazione

char frase[15] = testo di prova

// dichiarazione di una stringa (che un


// vettore di caratteri) con inizializzazione

char nomi[15][25]

// dichiarazione di un array di stringhe


// (15 elementi di 25 caratteri ciascuno)

N.B. la lunghezza della stringa deve essere tale da contenere


la costante di fine stringa (\0), anche se sottintesa.
matrici:
es.

int matrice [4][10];


C++ non effettua controlli sullassegnazione di un valore a un array:
bisogna perci controllare di
non assegnare mai
un valore ad unarea di memoria non definita

Il nome dellarray un puntatore, cio contiene lindirizzo del primo elemento dellarray.
Un array pu essere passato ad una funzione solo per referenza (= per indirizzo)

332318218.docAPPUNTI

Emi 2007

pag.

Strutture ( o record)
struct NomeStruttura
{
tipo1 campo1;
tipo2 campo2;
tipo3 campo3;

};
esempio:
struct Data
{
int giorno;
char mese[4];
int anno;
};

oppure
(meglio):

struct Data oggi;

struct Data
{
int giorno;
char mese[4]
int anno;
};
typedef struct Data giorno;
giorno oggi

assegno alla variabile oggi (con struttura Data) il valore 5 set 2007:

fase 1:
DEFINIZIONE
DELLA
STRUTTURA

struct Persona
{
int matricola;
char nome[20];
char indirizzo[15];
int annoNascita;
};
1) definizione di un nuovo tipo

fase 2:
typedef struct Persona Anagrafica
NUOVO
TIPO DI DATO
fase 3:
DICHIARAZIONE
VARIABILI

(1)

(2)

(3)

Anagrafica Dipendente;
Anagrafica Docente;
Anagrafica Studente;

UTILIZZO DATI
332318218.docAPPUNTI

2) riferimento alla struttura Persona definita nella fase 1


3) Nuovo tipo di dato (, a tutti gli effetti, un tipo di dato:
come int, char, float, )

Dichiarazione di tre variabili di tipo Anagrafica

if Studente.annoNascita < 1990

printf (%d, Dipendente.matricola)

fase 4:

oggi.giorno = 5;
oggi.mese[0] = s;
oggi.mese[1] = e;
oggi.mese[2] = t;
oggi.mese[3] = \0;
oggi.anno = 2007;

Emi 2007

pag.

esempio di struttura complessa (che contiene al suo interno una struttura):


struct Giorno {
int g;
int m;
int a;
};
typedef struct Giorno data // definizione del nuovo tipo data
struct Persona {
int matricola;
int nome[30];
data dataNascita;
};
typedef struct Persona anag // definizione del nuovo tipo anag
anag dipendente // dichiarazione del dato dipendente, di tipo anag (struttura complessa)

if dipendente.dataNascita.a < 1980 // utilizzo dellanno di nascita del dipendente

Tabelle
Una tabella un array di record (definiti come struttura).
es.

struct Persona {
int matricola;
char nome[30];
int livello;
};
typedef struct Persona anag;
anag dipendenti[200]; // definisce un array di 200 dipendenti,
// ciascuno con: numero di matricola, nome e livello.

Struttura dinamica di dati = struttura alla quale viene assegnato lo spazio di memoria centrale
necessario. Durante lesecuzione del programma tale spazio pu essere aumentato o ridotto,
secondo le esigenze.

332318218.docAPPUNTI

Emi 2007

pag.

Puntatori
Una variabile puntatore (un puntatore) contiene lindirizzo di memoria di unaltra variabile. Il
puntatore deve essere dello stesso tipo della variabile cui si riferisce. Nella dichiarazione il nome di
un puntatore inizia sempre con un asterisco.
es.

int *puntatore

Per conoscere lindirizzo di memoria di una variabile, lo si assegna al puntatore utilizzando il


carattere & (= indirizzo di).
es.

int num = 5;
int *puntatore;
...
puntatore = &num;

Per accedere alla memoria puntata da un puntatore si usa loperatore *.


es.

int a, b;
int *puntatore;

a = 5;
puntatore = &a; // indirizzo di a
(equivale a b = a) b = *puntatore; // assegno alla variabile b lindirizzo della variabile a
printf (%d, b); // visualizzo il valore di b (avendo lo stesso indirizzo
// di a, vale 5 come a)
specificatori di formato per i puntatori:
decimale
esadecimale
esadecimale minuscolo
esadecimale maiuscolo

%d
%p (formato puntatore)
%x
%X

Utilizzo dei puntatori nelle funzioni con passaggio di parametri per indirizzo:
esempio:

void Ordina (int *x, int *y) {


int comodo ;
if (*x > *y) {
comodo = *x;
*x = *y;
*y = comodo ;
}
return;

DICHIARAZIONE
DELLA FUNZIONE

}
RICHIAMO
DELLA
FUNZIONE

Ordina (&a, &b);

N.B. Esiste anche lARITMETICA DEI PUNTATORI (vedere pag. 145)


332318218.docAPPUNTI

Emi 2007

pag.

Archivi di dati
Il file una struttura di dati che realizza in memoria di massa la struttura della tabella.
Operazioni fondamentali: apertura, lettura, scrittura, chiusura.
I file trattati dal file system del S.O. si distinguono, in base allorganizzazione dei dati in essi
contenuti, in:
file di testo o ASCII (che contengono il carattere di fine riga per fornire unimpaginazione
delle informazioni in essi contenute e in cui ciascun byte corrisponde a un carattere ASCII)
file binari (flussi continui di bit raggruppati in byte ma non necessariamente distinti luno
dallaltro).
Useremo i file binari per gli archivi con record a lunghezza costante e i file di testo per gli archivi
con record a lunghezza variabile.
esempio:
struct Persona {
int Matricola;
char Nome[40];
char Indirizzo[40];
int Livello;
float Stipendi[13];
};
typedef struct Persona anag;

indica il buffer di I/O contenente i dati


di una persona che devono essere
registrati nel file o che vengono letti
dal file

anag Dipendente ;
FILE *fp ;

file pointer: rappresenta il riferimento interno del programma


per le operazioni sul file. E il nome interno che deve essere
usato nelle operazioni di lettura e scrittura.
E un puntatore ad una struttura che contiene informazioni sul
file utilizzato (locazione del buffer di I/O in MC, oppure
posizione corrente del carattere nel buffer durante la lettura o
la scrittura).

Accesso ai record di un file: sequenziale o diretto (se i record hanno lunghezza fissa).

332318218.docAPPUNTI

Emi 2007

pag.

Operazioni sul file


fp = fopen (nomefisico, modo);
Apertura

esempi:
fp = fopen(anag.dat, w);
fp = fopen (anag.dat, wb);

Chiusura

fclose (fp);
fread (&buffer, dimensione, numero_elementi, fp);

Lettura

esempio:
fread (&Dipendente, sizeof(struct Persona), 1, fp);
fwrite (&buffer, dimensione, numero_elementi, fp);
esempio:

Scrittura

fwrite (&Dipendente, sizeof(struct Persona), 1, fp);


feof (fp)
FineFile
la funzione vale 0 se non stata raggiunta la fine del file,
altrimenti un valore diverso da 0.
fseek (fp, posizione, inizio)
N.B. largomento posizione long

Posizionamento
(se laccesso
random)

Posizione
corrente del
puntatore

posizionamento allinizio del file: inizio = 0


nella posizione corrente del puntatore: inizio = 1
posizionamento a fine file: inizio = 2
ftell (fp)
N.B. il valore restituito dalla funzione long
esempio:
posiz = ftell(fp);

file
binari

file di
testo

Modi di apertura dei files:

rb

sola lettura

se il file non esiste messaggio di errore

wb

sola scrittura

se il file non esiste, viene creato;


se esiste viene ricreato

r+b

r+

lettura e scrittura

w+b

w+

scrittura e lettura

ab

scrittura in append

a+b

a+

scrittura in append e lettura

332318218.docAPPUNTI

Emi 2007

se il file non esiste, viene creato;


se esiste viene effettuata la scrittura in append

pag.

File ad accesso sequenziale


esempio:

#include <stdio.h>
#include <stdlib.h>
// ------------------------------ //
// procedura REGISTRA //
// ------------------------------ //

// -------------------------------- //
// PARTE DICHIARATIVA //
// -------------------------------- //
// dichiarazione della struttura merce
struct merce {
char descrizione[20];
float prezzo;
};
// dichiarazione del tipo Merce
typedef struct merce Merce;
// dichiarazione di articolo
Merce articolo;
FILE *fp;
// dichiarazione dei prototipi delle funzioni
void Registra(void);
void Stampa(void);
// -------------------------------------- //
// PROGRAMMA PRINCIPALE //
// -------------------------------------- //
int main(void)
{
// generazione dell'archivio
fp = fopen ("Listino.dat", "wb");
Registra();
fclose (fp);
// elenco degli articoli
fp = fopen ("Listino.dat", "rb");
Stampa();
fclose (fp);
system("PAUSE");
return 0;
}

332318218.docAPPUNTI

10

Emi 2007

void Registra(void) {
int risposta;
do {
// input da tastiera
printf ("Inserimento di un articolo \n");
printf ("Descrizione: ");
scanf ("%s", articolo.descrizione);
printf ("Prezzo: ");
scanf ("%f", &articolo.prezzo);
// scrittura del record
fwrite (&articolo, sizeof(Merce), 1, fp);
// controllo del ciclo
do {
printf ("Elenco finito (0 = no, 1 = si)? ");
scanf ("%d", &risposta);
} while (risposta != 0 && risposta != 1);
} while (risposta == 0);
return;
}
// -------------------------- //
// procedura STAMPA //
// -------------------------- //
void Stampa(void) {
printf ("Listino articoli \n");
fread (&articolo, sizeof(Merce), 1, fp);
while (!feof(fp)) {
printf ("%-25s ",
articolo.descrizione);
printf ("%12.2f \n",
articolo.prezzo);
fread (&articolo, sizeof(Merce),
1, fp);
}
return;
}

pag.

File ad accesso diretto


esempio:

332318218.docAPPUNTI

11

Emi 2007

pag.