uni 27/09/2023
Basi:
È un linguaggio Case Sensitive, ovvero distingue fra maiuscole e minuscole.
Ogni statement seguito da ;
diventa una istruzione espressiva.
Codice:
#include
include le librerie, seguita poi <xx>
per le librerie interne e "xx.h"
per le librerie esterne ma contenute nel progetto.
Con using namespace std;
indichi al compilatore che tutti i nomi usati nel programma si riferiscono allo standard ANSI-C++.
int main() {}
dichiarazione della funzione main, il periodo base.
cout<< xxx;
stampa xxx nella console (output)
<<endl;
finisce la riga corrente e si usa con cout<< xx << endl;
cin>>;
invece prende input
Variabili
bool
= booleano, 1 bit, assume come valori solo vero o falsoshort int
= short integer, 16 bit, numero interoint
= integer, 32 bit, numero interolong int
= long integer, 64 bit (non sempre), numero interodouble
= floating point number, 64 bit, numero decimalechar
= single character, 8 bit, carattere singolo, circondato da virgolette singolestring
= frase, ? bit, frase, circondato da doppie virgolettestruct
= è un contenitore di variabili diversi, definito dal programmatore di volta in volta. Questa può essere definita al di fuori di funzioni ma non alloca memoria.
Operatori
++a;
incremento prefisso
restituisce la variabile già aumentata.a++;
incremento postfisso
restituisce la variabile e POI la aumenta.(a) ? b : c;
Operatore ternario
sea
allorab
altrimentic
.
Calcolo delle espressioni
Ordine del calcolo delle espressioni:
Per primi vengono valutati i fattori (prima postfissi e poi prefissi), il NOT (!
) logico, il meno unario (-
) ed il più unario (+
). Le parentesi fanno diventare il contenuto un fattore.
- Operatori parentesi ()
- Operatori di accesso ai membri . e →
- Operatori di post-incremento ++ e post-decremento —
- Operatori di pre-incremento ++ e pre-decremento —
- Operatori di moltiplicazione * e divisione /
- Operatori di addizione + e sottrazione -
- Operatori di spostamento a sinistra << e spostamento a destra >>
- Operatori di confronto <, ⇐, >, >=
- Operatori di uguaglianza == e di non uguaglianza !=
- Operatori logici & (AND) e | (OR)
- Operatore di assegnazione =
Associatività
Gli operatori aritmetici sono associativi a sinistra. Gli operatori unari e di assegnamento sono assiociativi a destra.
Gli operatori && e || sono associativi a sinistra ed il calcolo di un’espressione contenente questi operatori termina appena si può decidere se sia vera o falsa, questa si chiama Regola del Corto Circuito.
Istruzioni Ripetitive
- while
while (condizione) {statement;}
Se la condizione è vera, esegue lo statement e torna a verificare la condizione, esegue lo statement finché la condizione è vera, se è falsa esco dal ciclo. Dentro lo statement quindi ci deve essere qualcosa che influisce sulla condizione, per evitare di comicniare un ciclo infinito. - do
- for
Struttura di un programma
basic main program
int main ()
compound statement
compound statement
{
statement sequence }
statement
- declaration statement
- definition statement
- expression statement
expr | opt ; Esempi:
5; - structured statement
- compound statement
Attraverso la coppia di delimitatori{ e }
si trasforma una sequenza di istruzioni in una unica istruzione. - selection-statement
- if
- switch
- iteration statement
- while
- do
- for
- compound statement
- jump statement
- break;
- continue;
- goto;
- return;
- labeled statement
Arrays/Vettori
Una array è un gruppo di variabili che possono essere chiamate attraverso l’aggiunta di un indice al nome del gruppo
tipo nomeArray[numero di elementi] = {elemento1, elemento2, ecc};
nomeArray[numero dell'elemento] = valore da assegnare;
Array Multidimensionali / Matrici
tipo nomeArray[dimensione1][dimensione2][dimensione3] = {
{ { {} , {} , ecc} , { {} , {} , ecc} , ecc } ,
{ {} , {} , ecc } ,
ecc
}
nomeArray[indice1][indice2][indice3] = valore;
Vettori Dinamici
Prima di c++ ‘13 non si poteva scrivere int vettore[size]
, si doveva usare una allocazione manuale della memoria:
size = 7;
int *array = new int[size]{3,5,8,12, ecc};
delete[] array;
RICORDA di usare il delete[]
per deallocare la memoria.
Istruzione if
if (condizione) {statement}
else if (condizione) {statement}
esle {statement}
Istruzione switch e break
switch (indice: int, char, enum...) {
case 1:
statement
break;
case 2: case 5:
statement
default:
statement
}
attenzione, se non è presente il break vengono anche eseguite le istruzioni successive, anche se il case non è giusto.
Istruzioni ripetitive
While
while (condizione) { statement }
Do-While
do {statement} while (condizione)
Qui viene prima eseguito lo statement e poi, se la condizione è vera, viene ripetuto.
For
for (inizializzazione; condizione; statement) { step }
Istruzioni di Salto
Break
Salta all’istruzione immediatamente successiva al corpo del ciclo o dello switch che contiene il break.
Continue
Termina l’iterazione del ciclo che la contiene e passa a rivalutare la condizione.
Gli Stream
Gli stream predefiniti sono cin, cout e cerr. Si trovano in <iostream>
.
cin
cin >> variabile;
, è definito per caratteri, numeri interi, numeri reali e sequenze di caratteri.
Quando viene incontrato un cin
il programma si arresta in attesa di dati.
Col comando di esecuzione del programma, lo stream cin
può essere ridiretto su un file file.in residente su memoria di massa con il seguente comando Linux/DOS/Windows: programma.exe < file.in
.
Il cin
non preleva niente finché non incontra qualcosa che non sia uno spazio bianco e si ferma appena ne trova uno, se vuoi che prelevi solo un carattere e questo carattere deve poter essere anche uno spazio bianco, usa cin.get(variabile);
La lettura di interi e reali invece continua fino a che non incontra qualcosa di non assegnabile al tipo di variabile voluto.
cin
è associativo a sinistra e produce come risultato cin
quindi è possibile fare cin >> a >> b
.
Se la cin
è in stato di errore si può utilizzare cin.clear();
. Inoltre può costituire una condizione, vera se non è in stato di errore, falsa altrimenti. while (!(cin>>a>)) { cin.clear(); }
Se il programma sta leggendo dati da un terminale, per emettere la marca di fine stream l’utente deve utilizzare ctrl+d
in Unix-Linux e ctrl+z
in Dos-Windows.
cout
cout << espressione
Viene calcolata l’espressione e convertita in una sequenza di caratteri.
Possono essere scritti interi, reali, caratteri e sequenze di caratteri. Gli enum e bool vengono implicitamente convertiti ad interi.
Analogamente alla cin
, possono essere concatenate diverse cout
poiché cout << blah blah;
restituisce cout
.
Può avere i seguenti parametri:
1. ampiezza del campo, ovvero il numero totale di caratteri impiegati.
2. lunghezza della parte frazionaria.
Col comando di esecuzione del programma, lo stream cout
può essere ridiretto su un file file.out residente su memoria di massa con il seguente comando Linux/DOS/Windows: programma.exe < file.out
.
Concetto di Funzione
Una variabile dichiarata all’interno di una funzione si dice locale ed è visibile solo all’interno di essa. Lo stesso nome usato su variabili in funzione diverse si riferisce ad oggetti diversi. La memoria per queste variabili locali viene assegnata alla chiamata di una istanza di uan funzione e viene deallocata alla fine della medesima istanza, le variabili locali infatti non mantengono il valore tra le diverse istanze della stessa funzione.
Una funzione può chiamare altre funzioni, ma se una funzione chiama un’altra istanza di se stessa, si dice ricorsiva.
La struttura di una funzione è la seguente: tipo nome(parametri) {corpo}
Argomenti di Default:
La funzione può avere argomenti di default che entrano in gioco quando la funzione viene chiamata omettendo argomenti che hanno un valore di default: tipo nome(int intero, int intero2, int intero3 = 6) {corpo}.
Gli argomenti di default devono essere gli ultimi e durante la chiamata i dati omessi devono trovarsi in ultima posizione.
Overloading:
Uno stesso identificatore (nome) può definire due o più funzioni diverse a patto che abbiano argomenti diversi.
Stringhe
Una stringa è una sequenza di caratteri. In c++ non esiste il tipo stringa, sono invece delle array di caratteri, che memorizzano stringhe (un carattere per elemento) e il carattere nullo '\0'
finale. Gli operatori di ingresso ed uscita accettano stringhe come argomento: l’operatore di ingresso legge i caratteri dallo stream di ingresso, saltando eventuali spazi bianchi in testa e li memorizza in sequenza fino a che non incontra un carattere spazio, che viene registrato come carattere nullo ed indica la fine della stringa.
Librerie
Una libreria è un insieme di funzioni precompilate. Ogni libreria è formata da coppie di file, in uno vi è la dichiarazione delle funzioni (.h) e nell’altro vi è il corpo delle funzioni (.cpp).
Per includere una libreria bisogna usare la direttiva #include
.
Queste sono le componenti della libreria std.
- cstdlib
abs(n)
rand(), casuale tra zero e RAND_MAX
srand(n) inizializza la funzione rand() - cctype
isalnum(c)
isalpha(c)
isdigit(c)
islower(c)
isprint(c)
isspace(c)
isupper(c) - cmath (x è double)
sin(x)
cos(x)
tan(x)
asin(x)
acos(x)
atan(x)
exp(x)
log(x)
log10(x)
fabs(x)
ceil(x)
floor(x)
pow(x,y) //x^y
sqrt(x)
Libreria <cstring>
strlen(const char str)
restituisce un intero che è il numero di caratteri (length). Non conta il carattere nullo.strcpy(char dest, const char sorg)
copia una stringa dentro un’altra stringa destinazione.strcmp(const char str1. const char str2)
è una sorta di operatore confronto, restituisce un numero positivo, negativo, oppure 0.tolower(char str)
rende tutti i caratteri minuscoli.toupper(char str)
rende tutti i caratteri maiuscoli.strcat(char dest, const char sorg)
concatena due stringhe in una sola.strchr(const char str, char c)
restituisce un puntatore alla prima occorrenza dic
instr
oppure0
se non ne trova.