Tutto quello che riguarda i giochi online ma soprattutto War Rock!
 
IndiceRetailFamasFREERegistrarsiAccedi
Benvenuto Su WarHax!

Condividere | 
 

 Corso Accellerato C++

Vedere l'argomento precedente Vedere l'argomento seguente Andare in basso 
AutoreMessaggio
Admin
Founder
Founder


Messaggi : 261
Data d'iscrizione : 15.07.10
Località : Torino

MessaggioOggetto: Corso Accellerato C++   Gio Lug 15, 2010 6:38 pm

Ecco un corso sul c++ suddivisa in 6 lezioni.

Questo corso è a cura di AlexMark. QUI troverete la versione originale.


- Lezione 1 - Introduzione rapida al linguaggio C++
- Lezione 2 - Operazioni basilari di I/O e operatori fondamentali
- Lezione 3 - L'istruzione If e il ciclo For
- Lezione 4 - I tipi di dati e gli Operatori
- Lezione 5 - Altre Istruzioni di controllo del programma
- Lezione 6 - Array, stringhe e puntatori

Lezione 1: Introduzione rapida al linguaggio C++

A cura di AlexMark


Programmazione in C++

Questo corso ha come obiettivo il far acquisire all’aspirante programmatore conoscenze di base della programmazione e dare alcune nozioni di base come interagire con i file, interfacce grafiche, processi, finestre e vedremo come opera un piccolo virus a livello molto semplice.



Storia rapidissima del linguaggio C++

Il c++ nasce dal linguaggio c, è però più completo del c, inoltre è stato inventato nel 1979 da Bearne Stroupstroup. Passiamo subito alla parte più pratica.



Java, C# e C++ cosa c’entrano?

Su questo è bene spendere un pò di parole.
C++ è il papà sia di Java che di C#. La sintassi di questi linguaggi è infatti molto simile. Se sai uno di questi linguaggi, è relativamente semplice imparare gli altri due.
I programmi Java e C# sono più compatibili del C++, poiché questo è stato progettato per “girare” soprattutto su macchine Intel Pentium con sistemi Windows, mentre C# e Java vanno anche su altri sistemi, mentre sono a proprio agio con software Internet.
Però la compatibilità costa: Java e C# sono più lenti del C++.

C++ è meno compatibile con altri sistemi perché produce direttamente un linguaggio macchina che viene eseguito direttamente dalla CPU, mentre Java e C# producono uno pseudo-codice intermedio. Dunque un programma C++, per essere compatibile con vari sistemi, deve essere prodotto in più versioni. Invece un programma Java o C#, utilizzano lo stesso codice intermedio, basta che la macchina sulla quale vengano eseguiti abbia l’apposito “traduttore” per questi pseudo-linguaggi. Per il Java di solito il linguaggio intermedio è detto bytecode e viene eseguito da un sistema runtime del quale penso che tutti abbiano prima o poi sentito parlare: JVM cioè Java Virtual Machine. Per C# invece è il CLR, Common Language Runtime. Allora Java e C# sono più compatibili, ma la decodificazione dello pseudo-codice richiede più tempo da parte del sistema, dunque C++ è il più veloce nel suo ambiente.

Ereditarietà, polimorfismo e incapsulazione

Sono le caratteristiche principali di C++. Ma sono un po’ complesse perciò le capirete in seguito. Basta per ora, al codice.

Il Primo Programma in C++


Ecco il vostro primo programma in C++:



/*
Questo programma è orrendo !
*/

#include // Il programma parte dall’istruzione “main”


void main()
{

printf(“Ciao Mondo!”);

}



Bene, cosa notiamo? Innanzitutto vediamo che i colori del testo sono piuttosto brutti, poi cos'altro?
Secondo voi, l'istruzione "Questo programma è orrendo !" verrà eseguita?
E l'istruzione "Il programma parte dall’istruzione “main”" ?

La risposta è no, perché in C++, tutto ciò che è racchiuso tra /* e */ non viene eseguito ! Allo stesso modo funzionano le cose per // . Questi sono i cosiddetti "Commenti", quasi tutti i linguaggi hanno ormai questa capacità.
A cosa servono? Servono per facilitare la vita al programmatore, in modo da poter individuare subito una istruzione importante nel programma o a ricordarsi di cosa fa una precisa istruzione.

L'unica differenza da tenere a mente nell'uso di questi commenti è che i commenti con /* devono necessariamente finire con */ , altrimenti tutto il codice sarebbe preso per commento, e il compilatore non compilerebbe nulla. Infatti /* e */ è un commento "multiriga", cioé potremmo anche scrivere la divina commedia tra questi due segni, poiché il compilatore se ne fregherebbe altamente. Con // le cose sono simili fatta eccezione per una cosa: se andiamo a capo, il commento non vale più. Quindi ecco come si usano i commenti:


/*
Commento Multiriga.
Che bella giornata è oggi, mi sento contento
Credo che andrò a fare una passeggiata

:-)
*/

codice che viene eseguito...

codice che viene eseguito...
// Qui io non sono eseguito !!!

qui sì...

Bene. Ora analizziamo il resto del codice. La riga di interesse successiva è

#include

Cosa succede qui? Il linguaggio C++ definisce vari Header, ovvero dei file in formato .h che contengono informazioni utili e necessarie per il corretto svolgimento del programma. In base alle funzioni che utilizziamo, dobbiamo "dichiarare", ovvero mettere in cima al programma nella sintassi #include , l'header che permette l'utilizzo di quelle funzioni. In questo programma vediamo che vi sono due funzioni: main e printf, la prima è la funzione che viene eseguita per prima dal compilatore, è dunque un'istruzione simile al "begin" dello scabroso linguaggio Pascal (non delphi, intendo proprio pascal non-object oriented), mentre la seconda, printf, serve a visualizzare un testo sullo schermo. Ogni funzione, come ad esempio main, ha una struttura basilare che è più o meno la seguente:

// Questo è lo schema di una funzione

int MyFunction(int nVal)
{

// Istruzioni varie...

return 0;
}


Spiegando questa struttura possiamo osservare che nella prima riga della funzione vi sono già quasi tutte le informazioni sul tipo della funzione: int MyFunction(int nVal) ci comunica infatti che la funzione ha nome "MyFunction", che per utilizzarla devo passarle una variabile o un numero di tipo int cioé intero ( MyFunction(25) ) , e che la funzione restituirà un valore di tipo int, ( int MyFunction(int nVal) ) tramite una chiamata finale all'istruzione return "valore di tipo int" . Ogni funzione ha poi il suo "corpo centrale", cioé il codice dove esegue le operazioni, racchiuso tra parentesi graffe. (Le parentesi graffe si fanno con il tasto per la parentesi quadra, tenendo premuti assieme ad esso "Alt Gr" e "Shift" (maiuscolo); oppure attivando il tasto "Bloc Num" e, tenendo premuto "Alt", premere in successione 0 - 1 - 2 - 3 oppure 0 - 1 - 2 - 5. La nostra funzione main, non restituisce nulla e non ha nemmeno una istruzione finale "return". Questo perché la funzione è di tipo void, cioé "nessun valore restituito". Infatti a cosa servirebbe restituire un valore se il programma è ormai finito ? (Si potrebbe anche dichiarare la funzione come "int main()", ma alla fine dovremmo restituire un qualsiasi valore intero, come per esempio "return 1234;"). printf è anch'essa una funzione, ma è già stata dichiarata, cioé non dobbiamo scrivere una cosa di questo genere:

int printf(const char*,...)
{

// Istruzioni varie...

return 0;
}


perché la funzione ha già un corpo simile a questo; dove?, nell'header che abbiamo dichiarato: . Dunque noi ci limitiamo a richiamarla normalmente dalla funzione principale main. A printf, dopo aperta la parentesi, passiamo un valore di tipo "char*", per ora lasciamo perdere di che tipo sia, sarà approfondito nella lezione sui tipi di dati e sugli operatori, limitiamoci a dire che possiamo usare printf in questo modo: printf(“testo che vogliamo visualizzare ”); Inoltre, inserendo nel bel mezzo del nostro testo " \\\\\\\\n " oppure " \\\\\\\\t ", potremo rispettivamente andare a capo (\\\\\\\\n) e tabulare il testo (\\\\\\\\t).

Compilare il programma

Per compilare, cioé creare il file ".exe" per eseguire l'applicazione, dobbiamo utilizzare un compilatore. In Internet se ne trovano tanti. Se volete avere il meglio, trovate il famoso compilatore della Microsoft Visual C++, (io uso il 6.0 in questo tutorial), oppure l'altrettanto famoso Borland C++ Builder. Ma va bene uno qualsiasi.

Purtroppo non posso fornire informazioni adeguate su come compilare il programma, perché molti compilatori offrono diversi modi di compilazione. In Visual C++ per esempio si può scrivere il programma in un file .cpp e poi semplicemente premere il tasto "Build" o premere F7 (ambiente di sviluppo integrato IDE), oppure utilizzare la compilazione a riga di comando. Quindi è fondamentale che leggiate tutta la documentazione relativa alla compilazione allegata al vostro compilatore scaricato, comprato, trovato su cd oppure rubato.

Nota: L'utilizzo a riga di comando è ovvio a tutti, no? Se non sapete cos'é, leggete le ultime righe qui sotto.

Compilazione a riga di comando

E' la classica compilazione da dos. Ammettiamo che abbiate scaricato un compilatore qualsiasi. Trovate il file eseguibile del compilatore (nel nostro esempio è un file con nome cl.exe). Andate su "start" poi su "Tutti i programmi" poi su "Accessori" e "Prompt dei Comandi". Ecco il dos. Cercate la directory dove è installato il file cl.exe tramite i comandi "dir" per elencare i file e le cartelle in una directory e "cd nomecartella" per accedere ad una cartella specifica. Trovata la cartella dove sta cl.exe, digitate cl.exe . Dovrebbe apparirvi una serie di comandi che vi indicheranno come compilare il programma. Ad esempio con Visual C++, a riga di comando funziona così:

Click

Quella riga "usage: cl [option...] filename... [/link linkoption...]" ci fornisce tutte le indicazioni necessarie per compilare il nostro programma. Digitiamo allora "cl.exe -GX C:\\\\\\\\Ezempia.cpp" per compilare il file .cpp scritto anche con il blocco note (l'importante è che sia salvaro in formato .cpp) situato in C:\\\\\\\\. L'opzione -GX è opzionale, in Visual C++ serve a migliorare la compilazione.

Click

Perfetto. Questo ci dice che ha compilato il file "Ezempia.exe". Di solito in Visual C++ il file viene messo nella directory creata nella stessa cartella del file .cpp "Debug". Assieme al file .exe troveremo qualche altro file di costruzione .obj. Lasciamoli stare, servono solo al compilatore. Fatto


Lezione 2: operazioni basilari di I/O e operatori fondamentali

A cura di AlexMark


Il Secondo Semplice Programma in C++

Bene, eccoci per la seconda lezione. Adesso impareremo ad utilizzare una variabile, il costrutto fondamentale della programmazione. Cos'é una variabile ? Una variabile è un'area di memoria contrassegnata da un nome e alla quale può essere assegnato un valore che può essere cambiato durante il corso del programma. Nel seguente listato, dichiariamo delle variabili, assegniamo ad esse dei valori, e poi utilizziamo gli operatori fondamentali per interagire



/*
Anche questo programma fa schifo
*/

#include

void main()
{
int length; // qui si dichiara la variabile 'lenght' di tipo int (numero intero)
int width; // qui si dichiara la variabile 'width' di tipo int (numero intero)
int area; // qui si dichiara la variabile 'area' di tipo int (numero intero)

length = 7; //a 'length' asssegno il valore 7
width = 5; //a 'width' asssegno il valore 5

area = length * width; // calcola l'area con l'operatore di moltiplicazione

printf("L'area e': %d", area);
}




Questo programma è semplicissimo. Si dichiarano 3 variabili di tipo intero: 'length', 'width' e 'area' e si assegna alla prima il valore 7, alla seconda il valore 5. La terza, 'area', è ottenuta moltiplicando la prima variabile per la seconda. L'operatore di moltiplicazione in C++ è ' * ' , affianco ad esso c'é quello di addizione ' + ', di sottrazione ' - ', e di divisione ' / '. L'ultima riga ha bisogno di una spiegazione. Come abbiamo già visto, printf stampa una scritta a video, ma qui non fa solo quello. Qui tra le parentesi tonde, vi sono 2 parti separate da una virgola, (le parti dentro le parentesi di una funzione separate da virgola sono dette 'argomenti'). Il primo argomento è "L'area e' : %d", questo indica al compilatore di stampare a video le parole "L'area e' : ". Il "%d" non viene stampato a video, perché è un carattere composto jolly, vale a dire che il "%d" è sostituito dal compilatore con il valore dell'argomento successivo nella funzione. Allora qui l'output prodotto sarà "L'area e' : 35". printf comunque non accetta solo "%d" come carattere composto jolly, ma molti altri. Bisogna ricordarsi che dopo il carattere '%', 'd' indica che la variabile è di tipo 'int', numero intero non decimale. Per stampare stringhe, bisogna specificare il tipo stringa con "%­s", per un altro tipo un altro ancora, ecc.. Per ora teniamo solo a mente printf("Numero Intero %d", numint); e printf("Stringa %­s", str); , per ora questi ci bastano.




Lettura dell'Input dalla tastiera

Nel programma precedente, le variabili avevano un valore fisso assegnato dal programma stesso. Dall'utente non era richiesta azione creativa. Ora invece vediamo come possiamo far inserire le misure dall'utente.



#include
using namespace std; //Il namespace necessario per 'cin'

void main()
{

int length;
int width;
int area;

printf("\\\\\\\\nInserire l'altezza: ");
cin >> length; //Legge un numero da tastiera di tipo intero

printf("\\\\\\\\nInserire la base: ");
cin >> width; //Legge un numero da tastiera di tipo intero

area = length * width;

printf("L'area e': %d", area);

}


Bene, cosa c'é di nuovo? Innanzitutto vediamo che abbiamo aggiunto la riga "using namespace std;" questo indica al compilatore di utilizzare la libreria (namespace) 'std', cioé standard. Questa è indispensabile per utilizzare funzioni come "cin", che significa Console INput, e il suo contrario "cout", Console OUTput. "Cout" ha funzionamento analogo a printf, ma non lo useremo di frequente.. cout << width; Per ora occupiamoci di "cin", come possiamo vedere, "cin" è seguito da un'operatore poco usato: ">>" che indica il verso dell'input. "cout" infatti ha come operatore "<<", il verso contrario. Non credo ci sia bisogno di ulteriori spiegazioni.

Dati in formato "double" e "float"

Introduciamo un nuovo tipo di dati, giusto per comodità e per fare qualche programma non del tutto scandaloso: il tipo "double" (e di conseguenza il tipo "float"). Una variabile di tipo "int", può contenere 18, ma non 18.3 , allora come si risolve il problema? Si usa una variabile in virgola mobile, il linguaggio C++ definisce due tipi di numeri in virgola mobile: float e double, che rappresentano rispettivamente valori a precisione semplice e doppia. Dei due, il più utilizzato è double. Per dichiarare una variabile double, si usa la seguente istruzione:

double ;

Dove è il nome della variabile, come per esempio "risultato" (senza apici). Poiché la variabile con double è in virgola mobile, può contenere valori come 88.56, 0.034 oppure 107.03 . Chiudiamo questa lezione con un programma di esempio che converte da piedi a metri. Una cosa da tener presente è che printf utilizza "%f" per stampare a video una variabile di tipo decimale come una variabile di tipo "double".


/*
Questo programma orrendo
esegue una conversione da piedi a metri.

FtoM.cpp
*/
#include
using namespace std;

void main()
{
double f; //memorizza la lunghezza in piedi
double m; //memorizza la lunghezza in metri

printf("\\\\\\\\nInserire la lunghezza in piedi: ");
cin >> f;

m = f / 3.28; //Converte i piedi in metri

printf("\\\\\\\\n%f piedi equivalgono a %f metri.", f, m); //Mostra il risultato

}


L'unica cosa da precisare è che printf può anche mostrare più variabili contemporaneamente. Come in questo caso. L'importante è separare tutte le variabili con una virgola e assicurarsi che i caratteri jolly siano esatti per la conversione (%d per interi, %­s per stringhe, %f per decimali, ecc...).

Ecco un esempio di output:

Click

Bene, per ora è tutto. So che è noioso e che vi frega poco per ora, ma una parte teorica è indispensabile per capire i programmi più complessi che andremo a fare in seguito.


Lezione 3: l'istruzione If e il ciclo For

A cura di AlexMark


L' istruzione condizionale "if"

Questa lezione sarà piuttosto veloce, perché è relativamente semplice. Iniziamo con l'istruzione "if". If in inglese significa "se", dunque già dovreste aver capito, (no eh?), vediamo un esempio pratico



/*
Uso dell'istruzione If
*/

#include

void main()
{
int variabile;
variabile = 8;

int altravariabile;
altravariabile = 10;

//costrutto If
if(variabile > altravariabile)
{

printf("Ciao !"); //questa istruzione non sarà eseguita
}
else
{
printf("8 < 10 !"); //questa istruzione sarà eseguita
}
}



Ecco come si usa il costrutto "if": la sintassi è


if (condizione) istruzione


nel caso dell'esempio sopra, siccome "variabile" era 8 e "altravariabile" era 10, la prima non era maggiore della seconda, perché 8 non è maggiore di 10. Allora l'output sarà "8 < 10 !". L'altra istruzione "else", serve a specificare un'ulteriore istruzione al costrutto "if", nel caso la condizione sia falsa, come in questo caso. Se l'istruzione dopo "if" o "else" è una sola riga, si può scrivere anche così:


if (8>2)
printf("ciao");
else
printf("io non vengo eseguita");

Altrimenti bisogna mettere le parentesi graffe, come fosse una funzione. Gli
operatori condizionali che possono essere utilizzati sono i seguenti:

Operatore Significato
< Minore di
<= Minore o uguale a
> Maggiore di
>= Maggiore o uguale a
== Uguale a
!= Diverso da



Attenzione: l'operatore di uguaglianza, è un doppio segno uguale, non uno
solo ! Se scrivessimo


if ( variabile1 = variabile2)
istruzione....


allora la condizione sarebbe sempre vera perché il compilatore assegnerebbe a "variabile1" il valore di "variabile2" !!



Il ciclo "For"

Per eseguire ripetutamente una sequenza di codice, si usano i cicli. Il più famoso in C++ è il ciclo "For". Questa è la sintassi:


for (da dove parto ; finché devo durare ; incremento ogni volta )
istruzione;


Oppure, se l'istruzione non è una sola, come per il costrutto "if" :


for (da dove parto ; finché devo durare ; incremento ogni volta )
{
istruzione1;
istruzione2;
ecc..
}


Ecco un esempio di un programma che visualizza sullo schermo i numeri da 1 a 300:


#include

void main()
{

int count;

for(count = 1; count <= 300; count++)
printf("%d\\\\\\\\n", count);

}


Spieghiamo cosa c'é di nuovo..

Il ciclo for inizia da count = 1, cioé da 1, e continua per tutto il tempo che count <= 300, cioé dura finché la variabile count è minore oppure uguale a 300. Nel momento che la variabile raggiunge i 301, l'istruzione non viene eseguita più ed il programma esce. Il count++ è una caratteristica del linguaggio C++. In circostanze normali, l'incremento della variabile count, dovrebbe essere ogni volta di 1, cioé ogni volta che un ciclo finisce, count dovrebbe aumentare di 1 il suo valore, dunque a rigor di logica il costrutto dovrebbe essere riscritto così:


for(count = 1; count <= 300; count = count + 1)
printf("%d\\\\\\\\n", count);


Dove vediamo chiaramente che ogni volta che il ciclo finisce, a count è assegnato il valore count stesso aumentato di 1. In sostanza, count = count + 1 e count++ sono equivalenti. Perché in C++ l'incremento di una unità si realizza semplicemente aggiungendo "++" attaccato alla fine della variabile. Allo stesso modo il decremento di una unità si realizza così: count-- .Utilizzeremo perciò sempre questi operatori speciali : "++" e "--", quando possibile, perché sono più veloci e più pratici.


Esempio di chiusura

Chiudiamo la lezione con un programma che crea una tabella di conversione da piedi a metri. Inoltre, ogni 10 righe scritte lascia una riga vuota.



/*
Questo programma orrido
visualizza una tabella di conversione da piedi a metri.

FtoMTable.cpp
*/

#include

void main()
{

double f;
double m;
int counter;

counter = 0;

for(f = 1.0; f <= 100.0; f++)
{
m = f / 3.28;
printf("%f piedi equivalgono a %f metri\\\\\\\\n", f, m);
counter++;

if (counter == 10)
{
printf("\\\\\\\\n"); //Se counter == 10, lascia una riga vuota
counter = 0;
}
}


}



L'output sarà come il seguente (l'ho tagliato per ragioni di spazio..)

Click

Bene, abbiamo esaurito gli argomenti per questa lezione. Nella prossima vedremo i tipi di dati supportati dal linguaggio C++ e come utilizzarli.



Lezione 4: I tipi di dati e gli operatori

A cura di AlexMark


I Tipi di dati offerti dal linguaggio C++

Ok, sarà un pò noioso, ma alla fine se non avrete letto le lezioni di teoria introduttiva, non capirete nulla dei programmi. Vi limiterete a copiare il codice e a farlo funzionare, magari cambiando il nome dell'autore nel vostro?? Brutta cosa :/
Invece, con una conoscenza basilare del linguaggio, potrete modificare i programmi a vostro piacimento e crearne di vostri. Detto ciò fate come vi pare. Io inizio..

C++ definisce vari tipi di dati che vanno dai numeri interi (6), ai valori cosiddetti "booleani" (Vero o Falso), ai caratteri ('D'), ai numeri in virgola mobile (6.54), alle stringhe ("Ciao io sono paolo."), e così via...

Esistono 7 tipi standard:

Tipo Significato
char Caratteri
wchar_t Caratteri estesi
int Numeri interi
float Numeri in virgola mobile
double Numeri in virgola mobile a precisione doppia
bool Valori booleani
void Non-valori



Inoltre il linguaggio C++ consente di impiegare vari "modificatori" dei tipi base detti sopra. Un "modificatore" altera il significato del tipo base e lo rende più adatto alla situazione del programma. I modificatori sono:

signed
unsigned
long
short



Al tipo int per esempio, possono essere applicati tutti. Al tipo char invece solo "signed" e "unsigned". Al tipo double solo il modificatore "long", e così via... Per utilità, vi riporto una tabella che mostra tutte le combinazioni valide di tipi e modificatori assieme al loro intervallo minimo garantito.

- Tutti i tipi di dati numerici definiti dal linguaggio C++ con i valori minimi garantiti dallo standard ANSI / ISO



TIPO INTERVALLO MINIMO
char da -127 a 127
unsigned char da 0 a 255
signed char da -127 a 127
int da -32 767 a 32 767
unsigned int da 0 a 65 535
signed int come int
short int da -32 767 a 32 767
unsigned short int da 0 a 65 535
signed short int come short int
long int da -2 147 483 647 a 2 147 483 647
signed long int come long int
unsigned long int da 0 a 4 294 967 295
float da 1E-37 a 1E+37, con sei cifre di precisione
double da 1E-37 a 1E+37, con dieci cifre di precisione
long double da 1E-37 a 1E+37, con dieci cifre di precisione

Non spaventatevi di questa tabella, perché non serve a molto. Tenete presente che comunque se scrivete un programma che sfora di poco questi valori, molte volte il programma non subisce nessun errore. Infatti la vera ampiezza dell'intervallo dati, dovrebbe essere riportata nella documentazione del compilatore. Inoltre dipendono dall'ambiente dove si lavora (ad esempio su Windows 2000 si va a 32 bit), ma a voi questo non interessa troppo per ora.

Gli Interi (int)

Come già visto, le variabili "int" possono contenere numeri interi senza componenti frazionari. Le variabili di tipo int vengono spesso utilizzate per contare i cicli (come abbiamo visto nel ciclo "for") o le istruzioni condizionali ("if"). Inoltre i tipi "int" possono essere con segno o senza segno ("signed" o "unsigned"). Per default, (cioé per impostazione predefinita), gli int sono presi per numeri con segno "signed", dunque scrivere


signed int var;


è considerato ridondante, cioé ripetitivo e inutile. Un intero con segno può dunque essere positivo o negativo. Un intero senza segno invece, "unsigned", può essere solo positivo. La differenza tra "signed" e "unsigned" è piuttosto complessa perché si basa sull'interpretazione dei bit di ordine più elevato. Siccome vi complicherei solo la vita, non ve lo spiegherò, tanto non vi servirebbe a nulla oltre che per conoscenza personale. Ricordate solo che un valore "signed" e uno "unsigned" sono diversi. Giusto un solo esempio:



#include

void main()
{

short int i; //Intero short con segno
short unsigned j; //Intero short senza segno

j = 60000;
i = j;

printf("%d", i);
printf("\\\\\\\\n");
printf("%d", j);

}

Questo programma dà come output

-5536

60000

perché il numero 60000 rientra nell'intervallo di un "unsigned short int", ma non nell'intervallo di un "signed short int". Pertanto nell'assegnamento a ' i ' verrà interpretato come un valore negativo. Tutto questo solo per dirvi che una conversione da un intero senza segno ad uno con segno, può generare errori. Stateci attenti.

I Caratteri

Le variabili di tipo char contengono caratteri interi ASCII a 8 bit come A, Z o G o qualsiasi altra quantità a 8 bit. Per specificare un carattere, questo deve essere racchiuso tra apici:


char letter;

letter = 'X';

printf("%c", letter);


L'output di questo pezzo di codice è X. Notare che per stampare a video un carattere singolo si usa il flag " %c ". Anche il tipo char può essere modificato con "signed" o "unsigned". Nella maggior parte dei compilatori un valore char è dotato di segno. Ecco un esempio di utilizzo del tipo char per stampare a video tutte le lettere dell'alfabeto:



//Stampa a video tutto l'alfabeto

#include

void main()
{

char letter;

for(letter = 'A'; letter <= 'Z'; letter++)
printf("%c\\\\\\\\n", letter);

}



In queso codice, il ciclo "for" può sembrare un pò strano, ma in verità è del tutto normale. Le lettere sono rappresentate ciascuna da un numero (vedi il codice ASCII ). La lettera 'A' è il 65, mentre la 'B' il 66, la 'C' il 67 e così via. Dunque il ciclo "for" interpreta le lettere come interi con segno da 65 a 90 ( 'Z' ) ed esegue l'operazione senza problemi.

Il tipo wchar_t contiene caratteri di un set molto esteso. Infatti questo tipo è stato aggiunto al linguaggio C++ per integrare gli insufficienti 8 bit per altre lingue come il cinese, che definiscono un gran numero di caratteri. Non parleremo del tipo wchar_t perché non credo che dobbiate scrivere programmi in cinese.


I tipi in virgola mobile

I tipi float e double vengono utilizzati ogni qualvolta devono essere definiti numeri con componenti frazionari. Una variabile double conserva numeri 10 volte più grandi di una di tipo float. Inoltre il tipo più utilizzato è il double poiché quasi tutte le funzioni matematiche definite nella libreria del C++, usano valori double. Ecco un semplice esempio del Teorema di Pitagora:


/*
Uso del teorema di Pitagora per trovare la
lunghezza dell'ipotenusa data la lunghezza
dei due lati opposti.
*/

#include
#include //Header necessario per "sqrt"

void main()
{

double x, y, z;

x = 3;
y = 4;

z = sqrt(x*x + y*y);

printf("L'ipotenusa e' %­g", z);

}


L'output del programma è : "L'ipotenusa e' 5". Poiché "sqrt" fa parte della libreria di funzioni matematiche, richiede l'utilizzo dell'header . Il tipo long double consente di far lavorare con numeri estremamente grandi o piccoli. Di solito si usa per applicazioni scientifiche, come l'analisi di dati astronomici.


Il tipo bool "booleano"

Il tipo bool è relativamente recente per il linguaggio C++. Questo definisce due costanti booleane: true (vero) e false (falso) che sono gli unici due valori che può assumere una variabile bool. Ogni valore diverso da 0, in C++ viene interpretato come true, ogni valore pari a 0, come false. Ecco un programma di esempio:


//Uso dei valori booleani

#include

void main()
{

bool b;

b = false;
printf("b e' %d", B );

printf("\\\\\\\\n");//A capo

b = true;
printf("b e' %d", B );

printf("\\\\\\\\n");//A capo

//Controllo dell'istruzione "if" con un valore booleano
if (B )
printf("Questa istruzione e' eseguita");

b = false;
if (B )
printf("Questa istruzione non e' eseguita");

printf("\\\\\\\\n");//A capo

//Risultato di un operatore relazionale: vero o false
printf("10 > 9 e' %d", (10 > 9));

printf("\\\\\\\\n");//A capo

}


L'output sarà:

b e' 0
b e' 1
Questa istruzione e' eseguita
10 > 9 e' 1

Per il controllo di una variabile booleana, con l'istruzione "if", non è necessario scrivere


if (b == true)...



Basta scrivere solo if (B ) ... poiché la variabile di tipo bool basta da sola.



Il tipo void

Per ora non dico molto perché potrebbe complicare le cose inutilmente. Il tipo void specifica un'espressione senza valore, come una funzione che per esempio chiude il programma e non vogliamo nessun valore di ritorno, cioé non ce ne frega se è andata a buon fine o se ha fallito.



I letterali stringa

C++ supporta le stringhe. Una stringa è un insieme di caratteri racchiuso tra doppi apici. Ad esempio "Ciao io sono paolo". Già abbiamo visto vari esempi di stringhe nei programmi fatti fin qui. Alcune sequenze di caratteri hanno un significato particolare per il compilatore, (ad esempio \\\\\\\\n fa tornare a capo la riga), allo stesso modo alcuni caratteri specifici, (se noi volessimo inserire dei doppi apici all'interno della stringa?). Per questo esistono delle sequenze di escape per caratteri. Ecco l'elenco di queste sequenze:

CODICE SIGNIFICATO
\\\\\\\\b Backspace (cancella carattere precedente)
\\\\\\\\f Form Feed
\\\\\\\\n New Line
\\\\\\\\r Carriage Return
\\\\\\\\t Tabulazione Orizzontale
\\\\\\\" Doppi apici
\\\\\\\' Apice
\\\\\\\\\\\\\\\\ Barra Inversa
\\\\\\\\v Tabulazione Verticale
\\\\\\\\a Segnale acustico
\\\\\\\\? Punto interrogativo
\\\\\\\\N Costante ottale (dove N è una costante ottale)
\\\\\\\\xN Costante esadecimale (dove N è una costante esadecimale)



Nota bene: una stringa di un carattere, non è uguale ad un tipo carattere: "K" non è uguale a 'K'. Forse in sostanza le due cose possono produrre simili risultati, ma il per il compilatore, sono due tipi totalmente diversi.

Gli operatori aritmetici

Gli operatori aritmetici sono i seguenti:

OPERATORE SIGNIFICATO
+ Somma
- Sottrazione (e meno unario)
* Moltiplicazione
/ Divisione
% Modulo
++ Incremento
-- Decremento



Gli operatori +, -, * e / sono normali operatori algebrici e possono essere utilizzati per qualsiasi tipo di dati numerico, compreso il tipo char. L'operatore di modulo % fornisce il resto di una divisione intera. Quando si fa una divisione con un numero intero, il resto viene troncato. Per esempio 10 / 3 è 3. Per ottenere il resto di una divisione si usa %. 10 % 3 sarà uguale a 1. Attenzione: % può essere applicato solo agli operandi interi, non ai tipi in virgola mobile. Gli operatori di incremento e decremento li abbiamo già visti, unica cosa da aggiungere è che possono essere scritti sia così:


y = x++;


sia così:


y = ++x;


Infine la precedenza degli operatori aritmetici è questa :

Più elevata ++ --
- (meno unario)
* / %
Meno elevata + -

Gli operatori aventi lo stesso livello di precedenza sono valutati da sinistra a destra. Naturalmente si possono usare delle parentesi.



Operatori Logici

Credo che a scuola abbiate fatto tutti gli operatori logici, in caso contrario questa parte vi creerà qualche problema. Gli operatori logici sono usati per supportare le operazioni logiche di base e sono AND, OR e NOT. Questi funzionano secondo la seguente tabella delle verità:

p q p AND q p OR q NOT p
False False False False True
False True False True True
True True True True False
True False False True False



La sintassi degli operatori logici è la seguente:

OPERATORI LOGICI SIGNIFICATO
&& AND
|| OR
! NOT





//Uso degli operatori logici

#include

void main()
{

bool a;
bool b;

a = true;
b = false;

if(a && B )
printf("a && b = true");
else
printf("a && b = false");

printf("\\\\\\\\n");

if(a || B )
printf("a || b = true");
else
printf("a || b = false");

printf("\\\\\\\\n");

if(!(a && B ))
printf("!(a & B ) = true");
else
printf("!(a & B ) = false");

}



L'output del programma è

Click

Gli operatori logici hanno una precedenza più bassa di quelli aritmetici. Un'espressione come 10 > 1 + 12 verrà valutata come 10 > (1 + 12). Il risultato è dunque falso. La precedenza degli operatori logici è la seguente:

Più elevata !
> >= < <=
== !=
&&
Meno elevata ||



Conversioni Cast


E' possibile infine forzare una espressione trasformandola in un altro tipo. Una conversione cast è appunto una conversione esplicita di tipo. Anche queste conversioni sono considerate degli operatori. Eco un esempio di conversione cast:


//Conversioni cast

#include

void main()
{

int i;

for (i = 1; i <= 10; ++i)
printf("%d / 2 e' uguale a: %­g\\\\\\\\n", i, (float)i / 2 /*conversione !*/);

}



L'output del programma è

Click

Questa lezione è stata abbastanza prolissa, ma adesso ne sono rimaste veramente poche di lezioni teoriche. Giusto qualche altro approfondimento e poi partiamo.




 Lezione 4: I tipi di dati e gli operatori

A cura di AlexMark


I Tipi di dati offerti dal linguaggio C++

Ok, sarà un pò noioso, ma alla fine se non avrete letto le lezioni di teoria introduttiva, non capirete nulla dei programmi. Vi limiterete a copiare il codice e a farlo funzionare, magari cambiando il nome dell'autore nel vostro?? Brutta cosa :/
Invece, con una conoscenza basilare del linguaggio, potrete modificare i programmi a vostro piacimento e crearne di vostri. Detto ciò fate come vi pare. Io inizio..

C++ definisce vari tipi di dati che vanno dai numeri interi (6), ai valori cosiddetti "booleani" (Vero o Falso), ai caratteri ('D'), ai numeri in virgola mobile (6.54), alle stringhe ("Ciao io sono paolo."), e così via...

Esistono 7 tipi standard:

Tipo Significato
char Caratteri
wchar_t Caratteri estesi
int Numeri interi
float Numeri in virgola mobile
double Numeri in virgola mobile a precisione doppia
bool Valori booleani
void Non-valori



Inoltre il linguaggio C++ consente di impiegare vari "modificatori" dei tipi base detti sopra. Un "modificatore" altera il significato del tipo base e lo rende più adatto alla situazione del programma. I modificatori sono:

signed
unsigned
long
short



Al tipo int per esempio, possono essere applicati tutti. Al tipo char invece solo "signed" e "unsigned". Al tipo double solo il modificatore "long", e così via... Per utilità, vi riporto una tabella che mostra tutte le combinazioni valide di tipi e modificatori assieme al loro intervallo minimo garantito.

- Tutti i tipi di dati numerici definiti dal linguaggio C++ con i valori minimi garantiti dallo standard ANSI / ISO



TIPO INTERVALLO MINIMO
char da -127 a 127
unsigned char da 0 a 255
signed char da -127 a 127
int da -32 767 a 32 767
unsigned int da 0 a 65 535
signed int come int
short int da -32 767 a 32 767
unsigned short int da 0 a 65 535
signed short int come short int
long int da -2 147 483 647 a 2 147 483 647
signed long int come long int
unsigned long int da 0 a 4 294 967 295
float da 1E-37 a 1E+37, con sei cifre di precisione
double da 1E-37 a 1E+37, con dieci cifre di precisione
long double da 1E-37 a 1E+37, con dieci cifre di precisione

Non spaventatevi di questa tabella, perché non serve a molto. Tenete presente che comunque se scrivete un programma che sfora di poco questi valori, molte volte il programma non subisce nessun errore. Infatti la vera ampiezza dell'intervallo dati, dovrebbe essere riportata nella documentazione del compilatore. Inoltre dipendono dall'ambiente dove si lavora (ad esempio su Windows 2000 si va a 32 bit), ma a voi questo non interessa troppo per ora.

Gli Interi (int)

Come già visto, le variabili "int" possono contenere numeri interi senza componenti frazionari. Le variabili di tipo int vengono spesso utilizzate per contare i cicli (come abbiamo visto nel ciclo "for") o le istruzioni condizionali ("if"). Inoltre i tipi "int" possono essere con segno o senza segno ("signed" o "unsigned"). Per default, (cioé per impostazione predefinita), gli int sono presi per numeri con segno "signed", dunque scrivere


signed int var;


è considerato ridondante, cioé ripetitivo e inutile. Un intero con segno può dunque essere positivo o negativo. Un intero senza segno invece, "unsigned", può essere solo positivo. La differenza tra "signed" e "unsigned" è piuttosto complessa perché si basa sull'interpretazione dei bit di ordine più elevato. Siccome vi complicherei solo la vita, non ve lo spiegherò, tanto non vi servirebbe a nulla oltre che per conoscenza personale. Ricordate solo che un valore "signed" e uno "unsigned" sono diversi. Giusto un solo esempio:



#include

void main()
{

short int i; //Intero short con segno
short unsigned j; //Intero short senza segno

j = 60000;
i = j;

printf("%d", i);
printf("\\\\\\\\n");
printf("%d", j);

}

Questo programma dà come output

-5536

60000

perché il numero 60000 rientra nell'intervallo di un "unsigned short int", ma non nell'intervallo di un "signed short int". Pertanto nell'assegnamento a ' i ' verrà interpretato come un valore negativo. Tutto questo solo per dirvi che una conversione da un intero senza segno ad uno con segno, può generare errori. Stateci attenti.

I Caratteri

Le variabili di tipo char contengono caratteri interi ASCII a 8 bit come A, Z o G o qualsiasi altra quantità a 8 bit. Per specificare un carattere, questo deve essere racchiuso tra apici:


char letter;

letter = 'X';

printf("%c", letter);


L'output di questo pezzo di codice è X. Notare che per stampare a video un carattere singolo si usa il flag " %c ". Anche il tipo char può essere modificato con "signed" o "unsigned". Nella maggior parte dei compilatori un valore char è dotato di segno. Ecco un esempio di utilizzo del tipo char per stampare a video tutte le lettere dell'alfabeto:



//Stampa a video tutto l'alfabeto

#include

void main()
{

char letter;

for(letter = 'A'; letter <= 'Z'; letter++)
printf("%c\\\\\\\\n", letter);

}



In queso codice, il ciclo "for" può sembrare un pò strano, ma in verità è del tutto normale. Le lettere sono rappresentate ciascuna da un numero (vedi il codice ASCII ). La lettera 'A' è il 65, mentre la 'B' il 66, la 'C' il 67 e così via. Dunque il ciclo "for" interpreta le lettere come interi con segno da 65 a 90 ( 'Z' ) ed esegue l'operazione senza problemi.

Il tipo wchar_t contiene caratteri di un set molto esteso. Infatti questo tipo è stato aggiunto al linguaggio C++ per integrare gli insufficienti 8 bit per altre lingue come il cinese, che definiscono un gran numero di caratteri. Non parleremo del tipo wchar_t perché non credo che dobbiate scrivere programmi in cinese.


I tipi in virgola mobile

I tipi float e double vengono utilizzati ogni qualvolta devono essere definiti numeri con componenti frazionari. Una variabile double conserva numeri 10 volte più grandi di una di tipo float. Inoltre il tipo più utilizzato è il double poiché quasi tutte le funzioni matematiche definite nella libreria del C++, usano valori double. Ecco un semplice esempio del Teorema di Pitagora:


/*
Uso del teorema di Pitagora per trovare la
lunghezza dell'ipotenusa data la lunghezza
dei due lati opposti.
*/

#include
#include //Header necessario per "sqrt"

void main()
{

double x, y, z;

x = 3;
y = 4;

z = sqrt(x*x + y*y);

printf("L'ipotenusa e' %­g", z);

}


L'output del programma è : "L'ipotenusa e' 5". Poiché "sqrt" fa parte della libreria di funzioni matematiche, richiede l'utilizzo dell'header . Il tipo long double consente di far lavorare con numeri estremamente grandi o piccoli. Di solito si usa per applicazioni scientifiche, come l'analisi di dati astronomici.


Il tipo bool "booleano"

Il tipo bool è relativamente recente per il linguaggio C++. Questo definisce due costanti booleane: true (vero) e false (falso) che sono gli unici due valori che può assumere una variabile bool. Ogni valore diverso da 0, in C++ viene interpretato come true, ogni valore pari a 0, come false. Ecco un programma di esempio:


//Uso dei valori booleani

#include

void main()
{

bool b;

b = false;
printf("b e' %d", B );

printf("\\\\\\\\n");//A capo

b = true;
printf("b e' %d", B );

printf("\\\\\\\\n");//A capo

//Controllo dell'istruzione "if" con un valore booleano
if (B )
printf("Questa istruzione e' eseguita");

b = false;
if (B )
printf("Questa istruzione non e' eseguita");

printf("\\\\\\\\n");//A capo

//Risultato di un operatore relazionale: vero o false
printf("10 > 9 e' %d", (10 > 9));

printf("\\\\\\\\n");//A capo

}


L'output sarà:

b e' 0
b e' 1
Questa istruzione e' eseguita
10 > 9 e' 1

Per il controllo di una variabile booleana, con l'istruzione "if", non è necessario scrivere


if (b == true)...



Basta scrivere solo if (B ) ... poiché la variabile di tipo bool basta da sola.



Il tipo void

Per ora non dico molto perché potrebbe complicare le cose inutilmente. Il tipo void specifica un'espressione senza valore, come una funzione che per esempio chiude il programma e non vogliamo nessun valore di ritorno, cioé non ce ne frega se è andata a buon fine o se ha fallito.



I letterali stringa

C++ supporta le stringhe. Una stringa è un insieme di caratteri racchiuso tra doppi apici. Ad esempio "Ciao io sono paolo". Già abbiamo visto vari esempi di stringhe nei programmi fatti fin qui. Alcune sequenze di caratteri hanno un significato particolare per il compilatore, (ad esempio \\\\\\\\n fa tornare a capo la riga), allo stesso modo alcuni caratteri specifici, (se noi volessimo inserire dei doppi apici all'interno della stringa?). Per questo esistono delle sequenze di escape per caratteri. Ecco l'elenco di queste sequenze:

CODICE SIGNIFICATO
\\\\\\\\b Backspace (cancella carattere precedente)
\\\\\\\\f Form Feed
\\\\\\\\n New Line
\\\\\\\\r Carriage Return
\\\\\\\\t Tabulazione Orizzontale
\\\\\\\" Doppi apici
\\\\\\\' Apice
\\\\\\\\\\\\\\\\ Barra Inversa
\\\\\\\\v Tabulazione Verticale
\\\\\\\\a Segnale acustico
\\\\\\\\? Punto interrogativo
\\\\\\\\N Costante ottale (dove N è una costante ottale)
\\\\\\\\xN Costante esadecimale (dove N è una costante esadecimale)



Nota bene: una stringa di un carattere, non è uguale ad un tipo carattere: "K" non è uguale a 'K'. Forse in sostanza le due cose possono produrre simili risultati, ma il per il compilatore, sono due tipi totalmente diversi.

Gli operatori aritmetici

Gli operatori aritmetici sono i seguenti:

OPERATORE SIGNIFICATO
+ Somma
- Sottrazione (e meno unario)
* Moltiplicazione
/ Divisione
% Modulo
++ Incremento
-- Decremento



Gli operatori +, -, * e / sono normali operatori algebrici e possono essere utilizzati per qualsiasi tipo di dati numerico, compreso il tipo char. L'operatore di modulo % fornisce il resto di una divisione intera. Quando si fa una divisione con un numero intero, il resto viene troncato. Per esempio 10 / 3 è 3. Per ottenere il resto di una divisione si usa %. 10 % 3 sarà uguale a 1. Attenzione: % può essere applicato solo agli operandi interi, non ai tipi in virgola mobile. Gli operatori di incremento e decremento li abbiamo già visti, unica cosa da aggiungere è che possono essere scritti sia così:


y = x++;


sia così:


y = ++x;


Infine la precedenza degli operatori aritmetici è questa :

Più elevata ++ --
- (meno unario)
* / %
Meno elevata + -

Gli operatori aventi lo stesso livello di precedenza sono valutati da sinistra a destra. Naturalmente si possono usare delle parentesi.



Operatori Logici

Credo che a scuola abbiate fatto tutti gli operatori logici, in caso contrario questa parte vi creerà qualche problema. Gli operatori logici sono usati per supportare le operazioni logiche di base e sono AND, OR e NOT. Questi funzionano secondo la seguente tabella delle verità:

p q p AND q p OR q NOT p
False False False False True
False True False True True
True True True True False
True False False True False



La sintassi degli operatori logici è la seguente:

OPERATORI LOGICI SIGNIFICATO
&& AND
|| OR
! NOT





//Uso degli operatori logici

#include

void main()
{

bool a;
bool b;

a = true;
b = false;

if(a && B )
printf("a && b = true");
else
printf("a && b = false");

printf("\\\\\\\\n");

if(a || B )
printf("a || b = true");
else
printf("a || b = false");

printf("\\\\\\\\n");

if(!(a && B ))
printf("!(a & B ) = true");
else
printf("!(a & B ) = false");

}



L'output del programma è

Click

Gli operatori logici hanno una precedenza più bassa di quelli aritmetici. Un'espressione come 10 > 1 + 12 verrà valutata come 10 > (1 + 12). Il risultato è dunque falso. La precedenza degli operatori logici è la seguente:

Più elevata !
> >= < <=
== !=
&&
Meno elevata ||



Conversioni Cast


E' possibile infine forzare una espressione trasformandola in un altro tipo. Una conversione cast è appunto una conversione esplicita di tipo. Anche queste conversioni sono considerate degli operatori. Eco un esempio di conversione cast:


//Conversioni cast

#include

void main()
{

int i;

for (i = 1; i <= 10; ++i)
printf("%d / 2 e' uguale a: %­g\\\\\\\\n", i, (float)i / 2 /*conversione !*/);

}



L'output del programma è

Click

Questa lezione è stata abbastanza prolissa, ma adesso ne sono rimaste veramente poche di lezioni teoriche. Giusto qualche altro approfondimento e poi partiamo.
Tornare in alto Andare in basso
http://warhax.forumattivo.com
Server21
Founder
Founder


Messaggi : 115
Compleanno : 23.07.89
Data d'iscrizione : 16.07.10
Età : 27
Località : Benevento

MessaggioOggetto: Re: Corso Accellerato C++   Sab Lug 17, 2010 6:43 pm

bene!! gente imparate anche voi così create subito hack =)
Tornare in alto Andare in basso
Admin
Founder
Founder


Messaggi : 261
Data d'iscrizione : 15.07.10
Località : Torino

MessaggioOggetto: Re: Corso Accellerato C++   Dom Lug 18, 2010 5:39 am

[S.Mod]server21 ha scritto:
bene!! gente imparate anche voi così create subito hack =)
Tornare in alto Andare in basso
http://warhax.forumattivo.com
DjsantiX
Grafico
Grafico


Messaggi : 49
Compleanno : 26.03.96
Data d'iscrizione : 19.07.10
Età : 20
Località : Baaria

MessaggioOggetto: Re: Corso Accellerato C++   Mar Lug 20, 2010 9:58 pm

otttiima guida Razz
Tornare in alto Andare in basso
xxcesaxx
Utente
Utente


Messaggi : 21
Data d'iscrizione : 20.07.10

MessaggioOggetto: Re: Corso Accellerato C++   Gio Lug 29, 2010 4:35 pm

Complimenti guida fatta per bene con ogni particolare ^^ Anche se gia queste cose so farle +1 va lo stesso per impegno bravo! Very Happy
Tornare in alto Andare in basso
Server21
Founder
Founder


Messaggi : 115
Compleanno : 23.07.89
Data d'iscrizione : 16.07.10
Età : 27
Località : Benevento

MessaggioOggetto: Re: Corso Accellerato C++   Gio Lug 29, 2010 8:20 pm

allora datti da fare così magari riesci a diventare anche coder!
Tornare in alto Andare in basso
Contenuto sponsorizzato




MessaggioOggetto: Re: Corso Accellerato C++   Oggi a 4:04 pm

Tornare in alto Andare in basso
 
Corso Accellerato C++
Vedere l'argomento precedente Vedere l'argomento seguente Tornare in alto 
Pagina 1 di 1
 Argomenti simili
-
» Corso Di Numerologia
» CENTENARI IN CORSO
» Offro servizio di pittura miniature warhammer
» Un benvenuto alla Ricevitoria "Cigno Nero" (Rovato)
» [FLF] ESTRAZIONE 30 OTTOBRE 2014. Il 90 ruggisce con 1 ambo soltanto. Segnali fortissimi per due ambi in corso.

Permesso di questo forum:Non puoi rispondere agli argomenti in questo forum
 :: C - C++-
Andare verso: