Un ou plusieurs fichiers sources
Compilateur
Executable
- preprocessor
- compiler
- linker
/*
premier programme C++
on peut le tester sur le compilateur en ligne
http://cpp.sh/
*/
#include <iostream>
int main()
{
std::cout << "Ia ora na fenua!"<< std::endl;
return 0;
}
commentaires librairie type de donnée, fonction namespace, flux, chaine de caractères retour de fonction
#include <iostream> #include <string> using namespace std; void afficheArguments( int n, char **tableau ) { for( int i=0; i<n; i++ ) { cout << "argument "<< i <<" : "<< tableau[i] << endl; } } int main( int argc, char **argv ) { afficheArguments( argc, argv ); string message; cout << "ton message : "; cin >> message; return message.length(); }
namespace
type de donnée, fonction, pointeur
boucle for
formatage des données
paramètres d'entrée
appel de fonction
classe
flux entrant
fonction membre de classe
La version compilateur en ligne, avec l'exception commentée:
http://cpp.sh/2ax3
La version offline est sur le serveur :
Armada\AGORA\ProgrammationC++\programmeFinal.cpp
montre l'utilisation des classes, tableaux, pointeurs, exception, vector.
Microsoft Visual Studio
projet Visual C++
Win32 Console app
#include "stdAfx.h"
int _tmain( int argc, _TCHAR* argv[] )
{
// ...
}
http://www.cplusplus.com/doc/tutorial/
http://www.tutorialspoint.com/cplusplus/
https://openclassrooms.com/courses/programmez-avec-le-langage-c
https://www.youtube.com/playlist?list=PLAE85DE8440AA6B83
- programme exemple
// mon premier programme
#include <iostream>
int main()
{
std::cout << “Ia ora na fenua !”;
return 0;
}
- commentaires
// commentaire : le reste de cette ligne est ignore
/* un commentaire qui
s’etale sur plusieurs
lignes
*/
- inclure des librairies
#include <librairie_standard> // iostream, string, math, ...
#include "fichier.h"
donne acces a toutes les fonctions disponibles dans ces librairies
- types de donnees
bool, char, int, float, double, void, ...
int8_t, uint8_t, uint64_t, ...
string, ...
auto x = var1; // defini une variable x dont le type est le meme que celui de la variable var1
- fonction
/* pour definir une fonction qui s'appelle maFunction et qui prend un premier parametre de type char et un deuxieme parametre de type float en entree */
int maFunction( char parametre1, float parametre2 ) {
int monInt = 14;
return monInt; // Quand elle a fini, la fonction renvoie un int
}
int main(){
int x = maFunction( 'C', 10.45 );
}
- operations arithmetiques
+, -, * (multiplication), / (division), % (modulo = reste de la division)
var1 = 23 % 7; // = 2
+=, -=, *=, /=, %=
var1 += var2; // equivalent a : var1 = var1 + var2;
var1++; // equivalent a : var1 = var1 + 1;
var1--; // equivalent a : var1 = var1 - 1;
var2 = ++var1 + 2; // equivalent a var1 = var1 + 1; var2 = var1 + 2;
var2 = var1++ + 2; // equivalent a var2 = var1 + 2; var1 = var1 + 1;
- tests de relations
== egal
!= different
> superieur
>= superieur ou egal
< inferieur
<= inferieur ou egal
- operateurs logiques
&& et
|| ou
! non
- si <condition> alors
if( booleen_vrai ) {
// les instructions a faire si la condition est vraie
}
if( var1 == var2 ){
// si var1 est egale a var2, on fait ces instructions ici
// ...
} else if( var1 == var3 ){
// sinon, et si var1 = var3, on fait ces instructions ici
} else {
// sinon, on fait ces instructions
}
switch( var1 ){ // test la valeur de var1
case "OK": // si var1 est egal a "OK", on fait les instructions
// jusqu'au break;
break;
case "PAS BON": // si var1 == "PAS BON" alors ...
break;
case "CORRECT": // si var1 == "CORRECT" alors ...
break;
default: // si var1 est egal a autre chose alors ...
}
- boucles
/* Au debut, on cree une variable i qui prend la valeur 0.
Ensuite, si la condition i<var1 est vraie, on effectue le contenu de la boucle.
A la fin de la boucle, on fait i++ et on recommence le test ...*/
for( int i=0; i<var1; i++ ){
// ...
}
int tab1[6];
for( auto& tt : tab1 ) tt = 0;
modifie toutes les valeurs du tableau tab1. Si on n'a pas besoin de modifier les valeurs du tableau, on utilise "auto tt"
while( var1 != var2 ){ // tant que la condition est vraie,
// on effectue le contenu de la boucle
}
do{ // effectue le contenu de la boucle puis teste si la
// condition est vraie. Si oui, on passe dans la boucle
// ...
} while( var1 > var2 );
- utiliser le namespace std
using namespace std; // evite d’ecrire std::cout, std::string, ...
Certaines fonctions ou elements sont inclus dans un namespace, pour les utiliser, il faut alors les appeler ainsi: nom_du_namespace::nom_fonction( … )
using permet d’ignorer l’appel au nom du namespace
Ex:
#include <iostream>
// …
std::cout << “message”;
-------------------------
#include <iostream>
using namespace std;
// …
cout << “message”;
- afficher et recuperer des valeurs sur la console
cin >> var1; /* lit ce que l'utilisateur a rentre dans la console et le range dans la variable var1. L'utilisateur doit avoir tape la touche entree pour que cin s'execute */
cout << "mon message!"; // affiche un message sur la console
cout << "variable1 : "<< var1 << ", variable2 : "<< var2 << endl;
/* affiche un message et le contenu des variables puis effectue un retour a la ligne (...grace a endl) dans la console */
- pointeurs
int *ptr; // defini un pointeur vers un int. ptr contiendra l'adresse d'une variable de type entier
ptr = &var1; // ptr est initialise avec l'adresse de var1
int var2 = *ptr; // var2 est initialise avec la valeur int qui se
// trouve a l'adresse contenue dans ptr
ptr = &var2; // maintenant ptr pointe vers la valeur de var2
var2 = 12;
int var3 = *ptr; // var3 = 12
cout << ptr; // affiche l’adresse de var2
cout << *ptr; // affiche 12
- modification du type
const int var = 12; // variable dont la valeur n’est plus modifiable
const int * var1 = &var; // var1 est un pointeur vers un int
// non modifiable (var)
int const * var1 = &var; // var1 est un pointeur vers un int
// non modifiable (var)
int * const var1 = &var2; // var1 est un pointeur non modifiable
// vers un int modifiable (var2)
float& vf2 = vf1; // & indique une reference : vf2 correspond a
// la meme valeur que vf1
Attention: & devant le nom d’une variable deja initialisee indique son adresse
- tableaux
int tab0[15]; // cree un tableau contenant 15 int.
// Les valeurs ne sont pas encore initialisees
float tab1[] = {4.2, 5, 9.78}; // tableau contenant 3 float, initialise
// avec les valeurs donnees
tab1[0] = 1.1; // met la valeur 1.1 dans la premiere case de tab1
float x = tab1[2]; // x est initialisee avec la valeur de la
// troisieme case de tab1
char *tab3 = new char[nombreVariable]; /* tableau dont la taille (nombreVariable) n'est connue qu'a l'execution du programme*/
// ...
delete [] tab3; /* tableau initialise avec new doit etre detruit avec delete [ ] lorsqu'on a fini avec */
- exception
try{
/* bloc de code qui va peut etre lancer une exception en cas de probleme */
} catch( int monInt ) {
// une exception de type int a ete lancee! traite le probleme ici
} catch( … ){
// recupere toutes les autres exceptions
}
throw 20; // lance une exception de type int, egal a 20
- classe et structure
class maClasse { // defini une classe appelee maClasse
public:
maClasse(); // constructeur : appelee a l’initialisation
~maClasse(){ delete [] c; }; // destructeur : appele a la destruction
char* uneFonction( float a );
float b;
private:
char uneAutreFonction(){ if( b > 0 ) return 'N'; return 'O'; };
int var1;
protected:
char *c;
};
maClasse::maClasse()
{
var1 = 45;
c = new char[10];
c = "rien";
}
char* uneFonction( float a )
{
b = a;
return c;
}
int main()
{
maClasse mac;
cout << mac.uneFonction( 12 ) <<” - ”<< mac.b;
}
Une Structure est equivalente a une classe mais elle se definie comme suit:
struct maStructure { … };
La principale difference est que les elements d’une structure sont public par defaut alors que les elements d’une classe sont private
- template
template<class T>
T Add(T n1, T n2)
{
T result;
result = n1 + n2;
return result;
}
// …
int a = Add( 5, 12 );
double a = Add( 5.4, 12.8 );
Les templates permettent de definir des fonctions ou classes qui manipulent differents types de parametres. Le compilateur generera des fonctions ou classes differentes a chaque fois qu’elles sont appelees avec des types de donnees differents
template<class T>
class Item {
T Data;
public:
Item() : Data( T() ) {}
void SetData(T nValue) { Data = nValue; }
T GetData() const { return Data; }
void PrintData() { cout << Data; }
};
// …
Item<int> entite;
entite.setData( 23 );
entite.PrintData();
- vector/iterator
#include <vector>
#include <iostream>
//...
std::vector<char> array; // tableau de char, de taille variable
char c = 0;
while( c != 'x' ){
std::cin>>c;
array.push_back( c ); // cree une nouvelle case contenant c a
// la fin du tableau array
}
char deuxiemeElement = array[ 1 ];
char quatriemeElement = array.at( 3 );
vector permet de creer des tableaux dont la taille peut varier automatiquement quand on rajoute ou retire des elements
std::vector<double> a;
a.push_back(1);
a.push_back(2);
a.push_back(3);
a.push_back(4);
a.push_back(5);
std::vector<double>::const_iterator i;
// parcourt tous les elements du tableau a :
for( i = a.begin(); i != a.end(); ++i ){
std::cout<<(*i)<<std::endl; // *i est un element du tableau a
}
Voir aussi list et deque