Appunti sul C++

I miei appunti collezzionati durante lo studio di questo linguaggio

Tipi di dati

*
In questo articolo approfondiremo i tipi di dati esistenti nel C++.

Tipo intero.
Il primo tipo che abbiamo utilizzato (e che verrà largamente utilizzato) è il tipo int (intero). Questo tipo di variabile non è altro che la trasposizione informatica dei numeri interi della matematica, ovvero i numeri “senza parte dopo la virgola”. Gli interi possono essere con segno (signed, opzione di default) o senza segno (unsigned), inoltre possono essere di lunghezza normale (short) o lunghi (long); per capire come utilizzare questi suffissi facciamo un esempio: supponiamo di voler creare una variabile num intera senza segno e “lunga”, allora scriveremo
unsigned long int num.
E' naturale che un numero long prende più memoria di uno short, i valori tra i quali oscillano i numeri possibili e la loro lunghezza in bit sono nella Tabella a fine articolo. L'unica cosa nuova che c'è da imparare è l'utilizzo di questi suffissi: se sappiamo di dover lavorare con numeri piccoli conviene sfruttare il suffisso shortper risparmiare memoria, inoltre spesso un tipo unsigned short int è sufficiente per tutte le esigenze di programmazione con numeri interi positivi.

Tipo carattere.
Il tipo carattere (che molti probabilmente aspettavano) è denotato dal nome char, ma non permette la memorizzazione di stringhe di testo ma di solo una lettera (in generale sono 256 simboli del codice ASCII), e la sua dimensione in memoria è di 8bit. Il suo utilizzo è identico a quello degli interi, i double ecc (alla fine è una variabile!), ecco un programma che memorizza e stampa a video una lettera
#include <iostream>
using namespace std;
int
main()
{

char
letter;
letter = 'a';
cout << "la lettera inserita e':" << lettera << endl;
cin.get();
return
0;
}
Semplice no? L'unico accorgimento è nell'assegnamento dell valore, che va messo tra apici (altrimenti senza apici vorrebbe dire "dai a letter il valore della variabile a").

Una variabile di tipo char, in sostanza, contiene al suo interno un numero che viene interpretato secondo la tabella del codice ASCII qui di seguito riportata (il valore è quello della colonna DEC):
Fonte: http://www.asciitable.it/ascii.asp
Cosa vuol dire? Vuol dire che una variabile char può essere interpretata come un "piccolo intero" con valori da 0 a 127! Ad esempio, se scriviamo
char prima, seconda;
prima = '*';
seconda = 'A';
char
risult = prima + seconda;
cout << "prima + seconda fa " << risult << endl;
A video verrà stampata la scritta * + A fa k, infatti * corrisponde a 42 in codice ASCII, A corrisponde a 65, e 42+65 fa 107, che corrisponde a k nel codice ASCII (vedi tabella sopra).
Questa particolarità delle variabili di tipo char le rende altamente versatili! Ad esempio, se vogliamo scrivere l'alfabeto a video possiamo sfruttare un ciclo for in questo modo:
#include <iostream>
using namespace std;
int
main()
{

for
(char lettera = 'a'; lettera <= 'z'; lettera++) cout << lettera;
cin.get();
return
0;
}
E' importantissimo imparare a ragionare vedendo i caratteri come numeri. A loro potete applicare tutto quello che avete imparato (ed imparerete) sugli interi: potete applicare gli operatori di relazione (in C++ è vero che a<b), fare operazioni aritmetiche ecc...

Memoria occupata ed intervallo di valori per i tipi di dati del C++
Legenda: Tipo Intervallo Memoria(in bit)

[long] [signed] int -2.146.438.648 <-> 2.146.438.648 32
[long] unsigned int 0<->4.294.967.295 32
short [signed] int -32.768<->32.768 16
short unsigned int 0<->65.535 16
float 1,8x10-38<->3,4x1038 32
double 2,2x10-308<->1,8x10308 64


Esercizi:
1. Creare un programma che dato un numero stampi a video il corrispondente carattere ASCII

2. Creare un programma che, una volta digitata una password 3 caratteri in successione (quindi si inserisce un primo carattere, si preme invio, si inserisce il secondo, si preme invio, ecc...) permette, qualora i 3 caratteri inseriti siano quelli giusti in ordine giusto, di stampare a video un messaggio segreto a vostro piacere





Ti è piaciuto questo articolo? Collegati ai feed RSS per restare sempre aggiornato sugli ultimi articoli pubblicati. Se hai suggerimenti o idee lascia un commento
Leggi tutto...

[Off-Topic] - Notizie su Linux Feed

Ciao a tutti!!
Da oggi le notizie di questo blog verranno pubblicate anche su linuxfeed.org!!

Ringrazio lo staff del sito per avermi dato questa possibilità.

Spero di riuscire sempre a soddisfare i miei lettori proponendo conenuti sempre chiari, e ricordo che per qualsiasi richiesta di aiuto, consiglio o critica basta postare un commento!

cout << "Grazie!!";

Ti è piaciuto questo articolo? Collegati ai feed RSS per restare sempre aggiornato sugli ultimi articoli pubblicati. Se hai suggerimenti o idee lascia un commento
Leggi tutto...

[Off-Topic] CPiuPiu sul Bloggatore

"Ma chi è questo bloggatore? Forse state immaginando un tizio grande 2 metri x 2 che blogga davanti ad un PC, divorando chili e chili di patatine e tutto quello che trova in cucina? E che quando entra in “fase digestiva” emette strani versi del tipo: “blog…. blog….”?

Beh, Il Bloggatore non è proprio questo, anche se noi ce l’immaginiamo più o meno così.

In realtà, si tratta di un aggregatore di feed on line, orientato a tutti quei blog che trattano argomenti legati al mondo dell’informatica! L’obiettivo fondamentale è la divulgazione e la diffusione di informazioni utili per gli appassionati di Linux, Windows, Mac, Sicurezza, Grafica, ecc.!"

Così si presenta il sito web ilbloggatore.com, e sono molto entusiasta di affermare l'avvenuta iscrizione di questo blog su quest'ottimo aggregatore di feed :) Da oggi, quindi, potrete trovare le novità di cpiupiu anche in questo sito.

cout << "Buona lettura!";


Ti è piaciuto questo articolo? Collegati ai feed RSS per restare sempre aggiornato sugli ultimi articoli pubblicati. Se hai suggerimenti o idee lascia un commento
Leggi tutto...

Funzioni (di libreria)

Scrivere tutto di un programma in C++ può essere facile finchè si tratta di poche righe, ma quando cominciamo ad avanzare come complessità allora cercare di ridurre al minimo le digitazioni è essenziale.
Supponiamo infatti di voler calcolare la distanza D tra due punti (a,b) e (x,y), la formula che ci permette questo è

Per fare somme, divisioni e quadrati non abbiamo alcun problema, ma nel fare la radice quadrata si! A questo proposito, o inventiamo un algoritmo bello complesso e lo scriviamo tutto, oppure vediamo se esiste una qualche funzione in una qualche libreria che fa al caso nostro.

Utilizzo di una funzione.
Supponendo che la funzione funz() sia nella libreria lib.h, allora per poterla sfruttare dovremo richiamare tale libreria, ovvero dovremo scrivere all'inizio del nostro codice
#include <lib.h>
(ecco perchè utilizzavamo alcuni include sempre, servivano a farci usare cout, endl ecc...).

Dobbiamo ora capire come utilizzare la funzione funz(). All'interno delle parentesi (spesso) va inserito un argomento (o più di uno) del quale dobbiamo conoscere in precedenza la natura (ad esempio una funzione può richiedere un intero, o un double, o un intero ed un double!).

Supponiamo che la nostra funzione funz() richieda un intero, allora possiamo farla “funzionare” scrivendo
int a = 7;
funz(a);
Supponendo invece che una seconda funzione funz2() presente sempre in lib.h richieda un intero ed un double (è importante l'ordine) allora andrà scritto qualcosa del tipo
double b = 30.0;
funz2(6, b);
Alcune funzioni, infine, restituiscono come risultato un valore: supponendo ad esempio che la funzione funz3() richieda un intero e dia come risultato un double possiamo scrivere
double risultato;
int a = 4;
risultato = funz3(4);
E la variabile risultato prenderà il valore corrispondente.

Applichiamo ciò che sappiamo al problema precedente. Vogliamo conoscere la radice quadrata di un dato numero, sappiamo che nella libreria math.h esiste la funzione sqrt() che richiede un double e da come risultato un altro double che è la radice quadrata dell'argomento immesso. Possiamo allora trovare la radice quadrata di un numero inserito da tastiera in questo modo:
#include <iostream>
#include <math.h>
using namespace std;

int
main()
{

double
numero;
cout << "Inserire un numero" << endl;
cin >> numero;
double
res = sqrt(numero);
cout << "La radice di " << numero << " e' " << res << endl;
cin.get();
return
0;
}
Comprendere il funzionamento del codice è estremamente elementare: la variabile res prende il valore tornato dalla funzione sqrt().

Alcuni errori frequenti sono il mancato inserimento della libreria necessaria (in questo caso la mancata scrittura di
#include <math.h>
).
Un altro errore che spesso accade è nell'inserimento dell'argomento: bisogna fare attenzione a che tipo di valore inseriamo come argomento, in questo caso la funzione accetta solo double e float. Provate ad inserire un intero come argomento per vedere il risultato.

Esercizi.
1. Sfruttare la funzione time() presente nella libreria ctime, dandogli 0 (zero) come argomento, per conoscere il tempo del vostro orologio di sistema (La funzione restituisce il tempo trascorso, in secondi, dal 1 gennaio 1970.)

2. Sfruttare la funzione abs() (che da il valore assoluto di un numero, accetta come argomento interi, float e double) presente nella libreria cstdlib per trovare il numero con il valore assoluto maggiore tra 5 numeri inseriti da tastiera.

3. Far calcolare ad un programma la distanza euclidea tra due punti con la formula vista in apertura dell'articolo

4. Difficile. Scrivere un programma che calcoli le due soluzioni di un equazione di secondo grado con coefficienti a, b e c dati da tastiera. La formula risolutiva di un equazione di secondo grado è
Suggerimento: Fare attenzione: quando il discriminante (l'argomento sotto radice) è minore di zero la radice non si può fare e quindi non ci sono soluzioni; quando è uguale a zero invece le due soluzioni sono coincidenti, ovvero c'è una sola soluzione. Sfruttare molto l'if



Ti è piaciuto questo articolo? Collegati ai feed RSS per restare sempre aggiornato sugli ultimi articoli pubblicati. Se hai suggerimenti o idee lascia un commento
Leggi tutto...

Booleani

Oltre ai tipi intero e a virgola mobile, introduciamo un altro tipo di dato che è il booleano (bool). Tale dato ha solo due possibili valori: vero (true) o falso (false). Dichiarare una variabile booleana si fa sempre allo stesso modo
bool variabile;
Idem per dare un valore alla variabile (in questo caso vero):
variabile = true;

Bisogna ricordare che C++ interpreta come vero qualsiasi valore diverso da 0, e come falso lo 0; per cui se scriviamo
int a = 2;
bool
b = a;

Il valore di b sarà true. Possiamo inoltre definire il valore di un booleano utilizzando un operatore relazionale, se ciò che viene scritto è vero allora la variabile avrà valore true, se è falso avrà valore false. Nell'esempio seguente il valore della variabile verita è false:
bool verita = (12 < 4);
Esercizio guidato.
Proviamo adesso a scrivere un ciclo un pò più complicatino, sfruttando anche l'if. Vogliamo un programma che ci stampi a video tutti i numeri primi fino a 200. Ricordiamo che si possono utilizzare le istruzioni annidate, quindi posso mettere un if dentro un for ecc.

Come farebbe un buon programmatore cerchiamo di analizzare il problema:

1. Dobbiamo creare un ciclo for che ci dia tutti i numeri fino al valore massimo richiesto

2. Dobbiamo creare un ciclo che verifichi che il numero attuale non sia divisibile per i precedenti (caratteristica necessaria perchè un numero sia primo)

3. Ci servono un paio di funzioni if che, nel caso in cui il numero risulti non divisibile per nessun numero precedente tranne 1 lo stampi a schermo (Un numero a non è divisibile b se il resto della loro divisione è diverso da 0, quindi tiriamo di nuovo fuori “%”).

Provate a risolvere da soli il problema: sfruttate tutto quello studiato fin ora, non sperate in una soluzione immediata, ragionateci sopra. Potete verificare che il vostro programma dia i risultati giusti confrontandolo con questa tabella.
La soluzione al "problema" è la seguente:
#include <iostream>
#include <stdlib.h>
using namespace std;

int
main()
{

for
(int num = 1; num <= 200; num++)
{


bool
primo = true;
for
(int divisore = 2; divisore < num; divisore++)
{


if
(num%divisore == 0) primo = false;
}


if
(primo) cout << num << endl;
}

cin.get();

return
0;
}
Questa volta non analizzerò il codice dividendolo ma preferirò un analisi lineare del codice, che a mio avviso può in questo caso spiegare meglio cosa accade.

C'è un ciclo for che mi crea tutti i numeri da 1 a 200.
All'interno di questo ho inizializzato una variabile primo a true: l'ho fatto fuori dal secondo ciclo for poichè in questo modo non scompaia una volta completato quest'ultimo, questa variabile inoltre viene inizializzata ad ogni ciclo, quindi anche se precedentemente (a causa di un numero non primo) era impostata su false, tornerà ad essere true.
Successivamente apro un ciclo for che ha come condizione l'elencarmi (nella variabile divisore) tutti i numeri precedenti num fino al valore 2.
All'interno del ciclo ho un if che, nel caso in cui il resto della divisione tra num e divisore sia 0 (quindi num è divisibile per divisore, ovvero per un numero precedente!) mi imposta il valore primo su false.
Infine l'ultimo if mi stampa il numero num solo se questi è primo, ovvero quando la variabile primo è vera (true).

Naturalmente questo è uno dei metodi con cui si può risolvere il problema, ce ne saranno sicuramente di migliori: se ne avete trovato qualcuno scrivetelo nei commenti, provvederò a pubblicarlo :)

Esercizi.

1. Scrivere un programma che crei un loop, ovvero un ciclo infinito, che come risultato stampa infinitamente numeri diversi sullo schermo (effetto Matrix :D)

2. Scrivere un programma che, dato un numero da tastiera, chieda all'utente (tramite un menù come quello visto precedentemente nella sezione Double e float, esercizio 3) se vuole conoscere i numeri precedenti, i successivi 20, i suoi divisori (e se non ce ne sono compaia la scritta “non ha divisori”) o il suo cubo, e agisca di conseguenza.

3. Richiamo sull'if. Scrivere un programma che legga da tastiera i coefficienti a, b e c di un polinomio del tipo e ne calcola il discriminante e a seconda dei casi informa l'utente che ci sono due radici reali distinte (quando ), due radici reali coincidenti () o nessuna radice reale (minore di 0)

4. Un pò difficile. Implementare un programma che trasformi i numeri in base 10 in numeri in base binaria. Suggerimento: http://www.itg-rondani.it/dida/Matem/ipermonica/numeri/sist_num/dauna.htm

Ti è piaciuto questo articolo? Collegati ai feed RSS per restare sempre aggiornato sugli ultimi articoli pubblicati. Se hai suggerimenti o idee lascia un commento
Leggi tutto...

Il ciclo for

Supponiamo di voler creare un programma che scriva a video tutti i numeri da 1 a 100; scrivere 100 volte
cout << 1; cout << 2; ...
sarebbe quantomeno noioso ed inefficiente (nonchè dissipatore di risorse). A questo proposito possiamo sfruttare il cosiddetto ciclo for che è dato da una struttura di questo tipo
for(inizializzazione; condizione; operazione) istruzione;
Quello che fa un ciclo for è così schematizzabile

1. Inizializzo una data variabile
2. Faccio le seguenti cose
----2.aVerifico la condizione: se è verificata allora eseguo l'istruzione, altrimenti passo al punto 3
----2.b Compio l'operazione e torno al punto 2.a
3. Esco dal ciclo e continuo con il codice

Probabilmente capirlo in questo modo può essere difficile, quindi propongo un esempio: supponiamo di voler creare un programma che mostri tutti i numeri da 1 a 100 come detto prima. Il codice sarà il seguente (utilizzo endl che è equivalente a \n, e serve ad andare a capo):
#include <iostream>
#include <stdlib.h>
using namespace std;

int
main()
{

for
(int num = 1; num <= 100; num++) cout << num << endl;

cin.get();
return
0;
}
Analisi codice.
for(
Apre il ciclo for e permette l'inserimento dell'inizializzazione di variabili, della condizione e dell'operazione

int
num = 1
Inizializza un intero chiamato num e lo pone uguale ad 1. Bisogna fare attenzione, poichè questa variabile num sarà presente soltanto all'interno del ciclo for, ed una volta usciti dal ciclo scomparirà: per provare provate a scrivere cout << num; fuori dal ciclo e vedrete che vi apparirà un errore di compilazione. Se vogliamo renderla visibile al di fuori del ciclo dobbiamo inizializzarla esternamente al ciclo, e lasciare vuoto il campo inizializzazione

num <= 100
La condizione. Il suo significato è “fai l'istruzione finchè il valore di num è minore o uguale a 100”.

num++)
Ad ogni ciclo aumenta num di uno, equivale a scrivere num = num + 1;. La cosa importante da ricordare è che ciò che c'è scritto in questo campo viene eseguito sempre alla fine di ogni ciclo.

Esercizi.
1. Scrivere un programma che mostri tutti i numeri pari fino a 200

2. Scrivere un programma che dato un numero da tastiera scriva i successivi 60 numeri

Ti è piaciuto questo articolo? Collegati ai feed RSS per restare sempre aggiornato sugli ultimi articoli pubblicati. Se hai suggerimenti o idee lascia un commento
Leggi tutto...

Double e Float

Fino ad ora abbiamo utilizzato variabili di tipo intero (int). Questo tipo naturalmente non è che uno dei tipi di variabile che C++ ci offre. Nondimeno è insufficiente per la maggior parte delle operazioni di cui necessitiamo durante la programmazione.

A tal proposito introduciamo le variabili a virgola mobile, float (a precisione singola) e double (a precisione doppia). Questi sono ottimi per rappresentare numeri con precisione (specialmente il tipo double). Nel dare un valore ad uno di questi due tipi però dobbiamo stare attenti a ricordare di specificare anche la parte con la virgola (che si scrive usanto di punto :P), ad esempio per avere un double chiamato numero che vale 3 dobbiamo scrivere:
double numero = 3.0;
Stessa cosa se inseriamo i numeri da tastiera.
Bisogna ricordare un paio di cose quando si utilizzano questi tipi di variabili:

1. Sono sconvenienti quando si vogliono fare confronti del tipo ==, in quanto (per via della loro natura) si tratta di numeri approssimati, e quindi scrivere qualcosa come
double a=10.0;
double
b;

b = a/2;
if
(b == 5) cout << “B vale 5;
Non farà comparire la scritta “B vale 5”, in quanto b non vale esattamente 5, ma un numero che per approssimazione si può pensare uguale a 5.

2. Scrivere
int a = 5;
double
b = a/2;
Non darà a b il valore 2.5 ma il valore 2, in quanto l'operatore di divisione è stato utilizzato su di un numero intero e quindi ha prodotto una divisione intera col resto. Impareremo poi come trasformare un intero in un numero a virgola mobile (e non solo).

Proviamo, a titolo illustrativo, a scrivere un programmino che trasforma i gradi sessaggesimali in radianti.
Sappiamo (ad esempio) che , quindi possiamo dire per un generico angolo x in gradi sessaggesimali, il suo equivalente r in radianti sarà dato da . Infine, wikipedia ci dice che .
Possiamo quindi scrivere il nostro programma
#include <iostream>
#include <stdlib.h>
using namespace std;

//Resto incremento e decremento
int main()
{

double
gradosess;
cout << "Inserire l'angolo in gradi sessaggesimali:";

cin >> gradosess;
cout << "L'equivalente in radianti e':"
<< (
3.14159*gradosess)/180 << endl;
cin.get();
return
0;
}
Adesso sarete sicuramente in grado di svolgere questi esercizi.

Esercizi:

1. Scrivere un programma che trasforma una data temperatura in gradi celsius (C), nell'equivalente in gradi Kelvin (K) e Farenith (F). Suggerimento: K=C+276,15; F=(9/5)*C + 32

2. Scrivere un programma che calcoli la velocità di un satellite geostazionario a distanza x (inserita da tastiera) dalla terra (raggio terrestre = 19.000km, velocità di una particella sulla superficie terrestre 1,38 km/s)

3. Scrivere un programma che crei un menù (del tipo sotto), e permetta (a seconda della scelta): di calcolare il valore medio tra due punti x e y, di trovare le soluzioni x di un equazione del tipo ax + b = c (con a, b e c inseriti da tastiera) o di sommare due numeri a e b inseriti da tastiera.
### Benvenuto nel programma di analisi dati ###
Inserisci 1 per calcolare la media di due valori
Inserisci 2 per calcolare le soluzioni di un equazione ax + b = c
Inserisci 3 per sommare due numeri
Scelta: _

Ti è piaciuto questo articolo? Collegati ai feed RSS per restare sempre aggiornato sugli ultimi articoli pubblicati. Se hai suggerimenti o idee lascia un commento
Leggi tutto...

Il caro vecchio IF

Solitamente un programma in C++, procede “leggendo” il codice dall'alto verso il basso, senza mai tornare indietro, e senza mai ripetere la stessa porzione di codice; questa funzione, però, potrebbe farci comodo.

Ad esempio se chiediamo all'utente di inserire un numero pari, ma lui inserisce un numero dispari, dobbiamo “dirgli” «Hey! Dovevi inserire un numero pari!» e dobbiamo far ripetere l'operazione di immissione dati al programma. Altre volte potrebbe essere necessario ripetere una funzione fino ad un dato limite.

Per questi problemi necessitiamo delle cosiddette istruzioni di controllo, e più specificatamente in questo articolo impareremo l'if (“se”).

L'istruzione if ci permette di eseguire una data istruzione solo nel caso che una data condizione sia soddisfatta. La sua struttura è la seguente:
if(condizione)istruzione;
Che praticamente significa “se condizione è soddisfatta allora esegui istruzione”. Ma noi ancora non sappiamo imporre una condizione: per fare ciò necessitiamo dei cosiddetti operatori di relazione che riassumo in questa tabella
<  Minore
>=
Minore o uguale
<
Maggiore
<=
Maggiore o uguale
==
Uguale
!=
Diverso
Quindi una possibile condizione è
a>b
per cui il comando
if(a>b) cout << “a e' più grande di b”

scriverà a video la frase a è maggiore di b solo se sarà effettivamente così.

Ecco un piccolo programma che ci permette di capire, dati due numeri da tastiera, in che relazione si trovano tra loro. Verranno naturalmente sfruttati l'istruzione if e alcuni operatori di relazione
#include <iostream>
#include <stdlib.h>
using namespace std;

int
main()
{

int
a, b;
cout << "Inserire due numeri interi A e B \n";
cin >> a;
cin >> b;

//Valutazione della relazione tra i numeri
if (a > b) cout << "A e' maggiore di B\n";
if
(a < b) cout << "B e' maggiore di A\n";
if
(a == b) cout << "A e' uguale a B\n";

cin.get();
return
0;
}
Analisi Codice:
E' semplicissimo capire il funzionamento del programma (volendo basta un attimo compilarlo ed eseguirlo per testarlo). Le uniche novità sono le istruzioni if:
  • if (a > b) cout << "A e' maggiore di B\n";
    scrive “A e' maggiore di B” solo se la relazione a > b è verificata.
  • Similmente
    if (b > a) cout << "B e' maggiore di A\n";
    scrive a video “B e' maggiore di A” nel solo caso in cui b è maggiore di a
  • Infine stessa cosa per
    if (a == b) cout << "A e' uguale a B\n";
    che valuta se i due numeri sono uguali.
Attenzione! E' errore frequente scrivere a = b per imporre la condizione di uguaglianza, ma bisogna fare molta attenzione in quanto un solo uguale assegna ad a il valore b, mentre due uguali confrontano i due valori.
Esercizi

1. Scrivere un programma che legga tre numeri da tastiera e dica se sono stati scritti in ordine crescente o no.

2. Scrivere un programma che dica se un blocco di massa m (inserita da tastiera) sfonderà un blocco di marmo capace di reggere una forza massima di 500N (Aiuto: Forza = [massa x accelerazione di gravità], accelerazione di gravita = 10m/s)

Sfruttiamo le parentesi graffe.
Per adesso l'if sembra (anzi, è) una struttura fantastica, ma se dobbiamo far eseguire due comandi sotto la stessa condizione dovremo riscrivere due volte if(condizione) comando1; if (condizione) comando2;... E per 3 comandi? E per settordici comandi? Bruceremo i tasti Ctrl+C e Ctrl+V

In nostro aiuto vengono le parentesi graffe, che ci permettono di inserire blocchi di codice da far eseguire ad una data struttura di controllo. La sintassi e' di questo tipo (supponendo di voler eseguire n istruzioni se la condizione dell'if è verificata, ma si può fare con qualsiasi altra struttura di controllo)
if(condizione) {
istruzione_1;
istruzione_2;
......

istruzione_n;
}
Ma qualcosa del genere l'abbiamo già vista: ricordate ogni vostro programma? :D Ecco, se ci pensate subito dopo la funzione main() c'è una graffa aperta, che si chiude solo a fine programma: indica proprio il blocco di codice della funzione main()! (le funzioni verranno approfondite in seguito).

Possiamo quindi creare facilmente un programma (esercizio) che, dati due numeri a e b, ci dica quale tra i due è il numero maggiore, e di questo ci dia il quadrato, il cubo e la sua “tabellina”


Ti è piaciuto questo articolo? Collegati ai feed RSS per restare sempre aggiornato sugli ultimi articoli pubblicati. Se hai suggerimenti o idee lascia un commento
Leggi tutto...

Operatori Matematici

Una altro importante strumento che (quasi) ogni linguaggio di programmazione offre, sono gli operatori numerici, i quali permettono di utilizzare, manipolare e modificare gli elementi con cui lavoriamo. Alcuni di questi sono gli operatori matematici, che non sono altro che la trasposizione informatica delle 4 operazioni

+ Addizzione
- Sottrazione
* Moltiplicazione
/ Divisione
% Resto
++ Incremento
-- Decremento


L'utilizzo è molto semplice ed intuitivo. L'unica avvertenza deriva dall'eventuale utilizzo della divisione con variabili di tipo intero, il cui problema esporremo in seguito. Proviamo a creare un calcolatore che ci da automaticamente le 4 operazioni effettuate su due numeri interi dati:
#include <iostream>
#include <stdlib.h>
using namespace std;

//Programma calcolatore di interi
int main()
{

int
a, b;
cout << "inserisci il primo numero A: \n";
cin >> a;
cout << "inserisci il secondo numero B: \n";
cin >> b;
cout << "La nostra magica calcolatrice ci dice che:\n";
cout << "A + B fa " << a+b << "\n";
int
differenza = a-b;
cout << "A - B fa " << differenza << "\n";
cout << "A*B fa " << a*b << "\n";
cout << "La divisione con resto di A diviso B fa " << a/b << "\n";
cin.get();
return
0;
}
Analisi codice.
Compiliamo ed eseguiamo il programma per vederne l'output, e dopo averne capito il risultato analizziamo le novità del codice rispetto a ciò che abbiamo già visto:

cout << "A + B fa " << a+b << "\n";
Abbiamo sfruttato l'operatore matematico di addizione direttamente dentro cout. Questo è possibile non solo con questo operatore ma con qualsiasi altro, ricordando che gli operatori di moltiplicazione e divisione hanno priorità maggiore di quelli di addizione e sottrazione, per sicurezza è possibile usare le parentesi: ad esempio possiamo scrivere
cout << ((a+2b)-b)
per ottenere a+b. Lo stesso sistema è stato sfruttato per calcolare e stampare a*b, nella stringa
cout << "A*B fa " << a*b << "\n".


int differenza = a-b;

cout << "A - B fa " << differenza << "\n";

Qui abbiamo assegnato creato una variabile intera chiamata differenza e le abbiamo assegnato il valore di a-b, e successivamente stampata a video. E' un alternativa al metodo precedente, spesso conveniente perchè “conserva” il dato (in questo caso la differenza). E' importante però non abusare nel creare variabili, perchè queste vengono salvate nella RAM, quindi un numero eccessivo causa un rallentamento del programma.

cout << "La divisione con resto di A diviso B fa " << a/b << "\n";

Come si è facilmente potuto notare ho utilizzato le parole “divisione con resto di A diviso B”. Il motivo è che stiamo sfruttando variabili di tipo int (intere), quindi la divisione verrà troncata della sua parte decimale (come facilmente riscontrabile inserendo nel programma due numeri in modo tale che a non sia divisibile per b); inserendo ad esempio a=15 e b=4, otterremo come risultato a/b=3. Per ovviare a questo problema introdurremo il terzultimo operatore matematico.

Resto, incremento e decremento.
Restano tre operatori da analizzare.
Il primo è l'operatore di resto (%) che ci permette di ottenere il resto della divisione tra due numeri interi. Scrivendo quindi 15%4 otterremo come risultato 3. Il secondo è l'operatore di incremento: supponendo che a=4, scrivendo a++ otterremo che a vale 5, in pratica è come scrivere a=a+1. Stessa cosa per l'operatore di decremento, in questo caso a-- equivale a scrivere a= a-1. Proviamo a mostrare l'utilizzo di questi operatori in un miniprogramma
#include <iostream>
#include <stdlib.h>
using namespace std;

//Resto incremento e decremento
int main()
{

int
a, b;
cout << "inserisci il primo numero A: \n";

cin >> a;
cout << "inserisci il secondo numero B: \n";
cin >> b;

cout << "Il resto della divisione tra A e B e' :" << a%b << "\n";
a = a++;

cout << "Il numero dopo A e' " << a << "\n";
cout << "B adesso vale " << b << endl;

b--;
cout << "Adesso applicando b--, il valore di B e' diventato " << b << "\n";

cin.get();
return
0;
}
Esercizi
1. Scrivere un programma che da come risultato, inserendo due numeri a e b da tastiera, il seguente output (esempio)
20 diviso 7 fa 2 con il resto di 6
2.Scrivere, sfruttando l'operatore di incremento, un programma che ha come output di esempio (sempre con numeri inseriti da tastiera) il seguente:
inserire A:10
10,11,12,13,14,15,16,17,18,19,20
3. Strutturare un programma che fornisca il volume di un cubo e l'area di un quadrato di lato inserito da tastiera


Ti è piaciuto questo articolo? Collegati ai feed RSS per restare sempre aggiornato sugli ultimi articoli pubblicati. Se hai suggerimenti o idee lascia un commento
Leggi tutto...

Immissione dati tramite Tastiera

Una delle cose più importanti di un programma è l'interazione con l'utente, e lo strumento principale di interazione (almeno per i programmi in terminale) è la tastiera.

Per permettere la lettura di un dato da tastiera dobbiamo innanzitutto definire una variabile in cui quel dato andrà memorizzato, e successivamente sfrutteremo la funzione cin presente sempre nella libreria iostream. L'utilizzo è molto simile all'utilizzo di cout, l'unica differenza è che vengono utilizzati gli operatori di ingresso (>>) anzichè quelli di uscita (<<) e va specificata la variabile in cui salvare il dato immesso. E' importante ricordare che tale dato deve essere coerente con il tipo di variabile scelta, cioè se la variabile è un intero non bisogna immettere un carattere. Proviamo ad esempio una funzione che ci mostra il numero da noi inserito:
#include <iostream>
#include <stdlib.h>
using namespace std;

//Programma “inserimento numero"
int main()
{

int
num;
cout << "inserisci un numero: \n";

cin >> num;
cout << "Il numero da te inserito e' " << num << "\n"

cin.get();
return
0;
}
Come risultato otterremo la richiesta di inserire un numero nella variabile num, tale numero poi (una volta premuto invio) verrà mostrato a video, a conferma dell'avvenuto inserimento all'interno di num.

Esercizi
  1. Creare un programma che chiede l'inserimento dell'età di un individuo. Il risultato deve essere il seguente: supponendo di aver inserito 23 come età, il programma deve scrivere “hai gia' sprecato 23 anni della tua vita!”
  2. Creare un programma che richiede l'inserimento di età, altezza e peso per Antonio, Carmen e Spipper, e successivamente li stampa a video in questo modo (i valori sono puramente indicativi):
Antonio: eta 18 anni, altezza 180cm, peso 70kg
Carmen: eta 20, altezza 170cm, peso 50kg
Spipper: eta 1, altezza 20cm, peso 1kg

Ti è piaciuto questo articolo? Collegati ai feed RSS per restare sempre aggiornato sugli ultimi articoli pubblicati. Se hai suggerimenti o idee lascia un commento
Leggi tutto...
Blog Widget by LinkWithin

Lettori fissi