Eléments de base :

 

Qu'est ce que la programmation ?

L'art de transcrire un problème en une suite d'instruction compréhensible par l'ordinateur.

 

Les niveaux de programmation :

            Assembleur : langage constitué du set d'instruction d'un processeur.

                                    particulier à un type de processeur.

            Compilteur :  transformation d'un langage de haut niveau en assembleur

                                    plus facile d'accès, indépendant du processeur.

 

Caractéristiques du C :

            Langage structuré ( en blocs)

            Langage déclaratif

            Format libre (mise en page)

            Langage modulaire

            Langage compilé

 

Point d'entrée d'un programme :

            Fonctiom main()

 

Commentaires : // ligne ; /*lignes*/

 

Instruction élémentaire bloc :

            Syntaxe

                        instruction

                                    commande

            bloc

            {         

                        instruction 1

                        instruction 2

            }

 

Un programme simple :

            #include <iostream> // inclure la libraire E/S

            using namespace std; // necessaire pour les libraires STL

            // affiche hello world

            int main()

            {

                        cout<<"hello world"<<endl;

            }

 

Lecture de données :

            cin >>i >> j ;   

 

 

Les données :

Les nombres :

                        Nombres entiers : suite de chiffre ±

                        Nombre réels : comportent un . ±

                        Notation scientifique : 6.23 107  s'écrit 6.23E+7

           

            Les caractères :

                        Encadré d'apostrophes 'a'

                        3 catégories utilisables : lettres, chiffre, caractères spéciaux

           

            Les chaines de caractères (constantes)

                        Encadré de guillements " String"

 

La notion de variables :

            Associe un nom a chaque valeur,

            doit commencer par une lettre,

            déclarée avant son utilisation

 

Déclaration d'une variable :

            identificateur de type suivit du nom

           

            identificateur :

                        int : variables entières

                        float : variables réelles (simple précision)

                        double : variables réelles (double précision)

                        char : variable de type de caractère

 

Affectation :

            syntaxe : variable = expression;

            stocke dans la variable la valeur de l'expression

                        int x; //déclaration de x

                        x = 3 ; // donne la valeur 3 à x

 

Déclaration et affectation combinées en une seule expression :  int x = 3;

           

Affichage d'une variable :

            int i;

            i = 45 ;

            cout<<"la valeur de i est : "<<i<<endl;

 

 

 

 

 

 

 

 

Une variable spéciale : string

            Type chaine de caractère en C++

            pour l'utiliser il faut une libraire string.

 

            affectation :

                        #include <string>

                        using namespace std;

                        int main()

                        {

                                    string s;  //déclaration de s

                        }

 

                        s = "hello world"

                        char c = S[0] // = h

                        char c = S[4] // = o

 

                        cout<< s <<endl;

 

Les expressions mathématiques :

Expression : combinaison de valeurs numériques (constantes, invocation de fonction), de signes opératoires et parenthèses.

 

Opérateur disponible : +, -, *, /, %

 

Abreviation :

            J = j + 4 à J += 4

            x* = y + 2 à x*(y + 2)

 

Incrémentation :

            Deux opérateurs uniaires : ++ , --  ( j++ à j+1)

 

Autre opération mathématique :

            Diponible en utilisant des bibliothéques mathématique (math)

                                    #include<math.h>

                                    int main()

{

            double x = sqrt(100) ;// racine carrée

            double y = x * sin(0.4) + cos(-0,4);

                                    }

 

 

 

 

 

 

Booléens :

Pas de variables booléennes en C , = 0 est vrai, !=0 est faux

            Résultat de l'opération logique vaut 0 ou 1.

 

            En C++ :

                        Type : bool

           

            Operateurs logiques

                        && : et

                        || : ou

                        ! : non

 

            Expression booléenes : contenant plusieurs opérateurs logiques

 

            Priorité des opérateurs : ! à && à || et de gauche à droite.

 

            Les opérateurs relationnels : >, >=, <, <=, ==, !=

 

            Les expressions booléennes simples : doivent être de même type,

            sinon conversion de type implcite ( qui change le résultat attendue)

 

Nouveaux Types :

            Syntaxe : typedef type_existant nom_type;

            exemple : typedef long int grand_entier_t ;

 

            Type par énumération :

            défini une liste d'identificateur ou labels.

            Associe valeur entière aux labels.

            Par défaut, le 1er label = 0, les suivants sont incrémentés de 1 en 1.

 

            Syntaxe : typedef enum {liste_def_label} nom_type;

 

            ! Les valeurs de la liste sont des entiers et pas des chaines de caractères.

            Impossible de lire ou d'afficher comme chaine de caractères.

            Un même label ne pas figurer dans deux enum différents.

 

 

 

 

 

 

 

 

 

 

Les pointeurs :

             Variable contenant l'adresse mémoire d'une autre variable.

 

            Une variable a 2 attributs :

                        la valeur qui lui est associée

                        l'endroit de la mémoire ou elle est rangée (=adresse mémoire)

 

            Déclaration de pointeur et type :

            syntaxe : type* nom_pointeur

            Type pointeur = type de variable dont il contient l'adresse.        

                        int a =5 ;

                        int*pa;

                        float f =1.23f;

                        float*pf;

                       

                        pa = &a; // pa pointe vers la variable a

                        *pa += 3 // = a + 3 donc a = 8

 

Constante NULL

            valeur particulière pour pointeur ne pointant nulle part.

                        float f =1.23f;

                        float*pf= NULL; //mis en attente, inutilissable

                        pf = &f //ok

                        cout << *pf << endl;

 

Initialisation des pointeurs :

Comme pour les autre variables…

 

Comparaison de pointeur :

            Les opérateurs relationnels restent valides.

 

Erreurs communes :

            Oubli de l'initialisation de l'adresse mémoire avant l'utilisation du pointeur

 

 

 

 

 

 

 

 

 

 

 

 

 

Instruction de contrôle :

 

if()…else :

syntaxe :  if (expression booléenne )

                        {bloc 1}

            else

                        {bloc 2}

 

Teste un condition, effectue sélectivement un bloc d'instructions

peut très bien être imbriquée.

 

switch :

syntaxe : switch(variable_entière)

                        {

 case valeur1 :

                                    //liste d'instructions

                                    break;

                        case valeur 2 :

                                    //liste d'instructions

                                    break;

                        // …

                        default :

                                    // liste d'instructions

                                    break;

                        }

Permet de réaliser un choix multiple,

une action associée aux valeurs de la variable de type int, char, long int, …

L'instruction break peut être omise ou remplacée par return()

en l'absence de break ou return() : les actions associées aux case suivants seraont aussi exécutées.

 

            Cas spécial : default :

            facultatif, emploi similaire aux "case" mais sans valeur.

            figure nécessairememnt après tous les "cases"

            est activé lorsque tous les "cases" échouent.

            Permet générallement d'indiquer un problème.

 

Différence entre if else et switch :

            switch() : ne teste pas les condition l'une après l'autre,

                                    fonctionne avec des variables entières seulement.

 

 

 

 

 

 

 

While :

            syntaxe : while (expressions booléenne)

                        {bloc}

 

            ou  :   do {bloc}

                        while (expressions booléennes);

 

            Le bloc d'instruction est exécuté tant que la condition est vraie.

 

            différence while et Do while :

            Avec Do while : l'expression est au mooins exécutée une fois.

 

For :

            syntaxe : for ( expression initiale ; expression booléenne; expression d'itération)

                                    {bloc a exécuter}

                       

            Evalue l'expression initiale :

                        répète :

                                    le test de l'expression booléenne

                                    l'execution du bloc tant que la condition est vérifiée

                                    l'execution d'itération après chaque bloc

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Fonction et décomposition d'un programme :

 

            Le langage c est un langage modulaire :

                        regroupement de fonctionnalités par module ( décopage en sous problème)

 

            2 types de sous routine :

            fonction : retourne une valeur au programme appelant par l'instruction return()

            procédure : identique aux fonctions mais ne retourne pas de valeur, void.

 

Déclaration, définition, références :

            déclaration : indication du prototype de la fonction (type, parametre)

            définition : indique l'implémentation de la fonction

            Références : appel de la fonction depuis un bloc de contrôle. 

 

 

#include " ou < ?

            Les #include peuvent utiliser 2 types de notations

"fileheader.h" : définie explicitement le chemin ou trouver le fichier fileheader.h

<fileheader.h> : recherche le fichier dans les répertoires systèmes

 

Déclaration de sous-routine : (fonctions ou procédure)

            Similaire au cas des variables, doit se faire avant la référence de la sous-routine

            En utilisant des types existants int,float,void,… ou personnel

                        type nomProcedure();

           

            Exemples :

déclaration d'une procédure :

            void ecrire_message();

 

déclaration d'une fonction retournant un booléen :

            bool ecrire_message();

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Exemple résolution d'une série d'équations du 2nd degré.

            ax2 + bx + c = 0

            On doit lire les coeddicients a,b,c

            Résoudre l'équation et afficher la solution

            La condition d'arrêt : a == 0

 

            Algorithme :

                        Lire les 3 coefficients

                        Tant qu'il y a une équation à trait (a ≠ 0)

                                    Calculer la ou les solutions

                                                Calculer delta = b2 – 4.a.c

                                                en déduire s'il y a 0,1,2 solutions réelles

                                                            si delta < 0 : pas de solution

                                                            si delta = 1 : 1 solution

                                                            si delta = 2 : 2 solutions

                        Lire les 3 coefficients.

 

            Résolution :

            #include<iostream>

            #include<math.h>

            using namespace.std;

 

            int a,b,c;

            void lire_coefs()

                        {

                        cin >>a >> b >>c;

                        }

            bool y_a_equation()

                        {

                        return (a!=0);

                        }

            int calculer_delta()

{

                        return(b*b – 4*a*c);

                        }

            void ecrire_message()

{

                        cout <<"Pas de solution !"<<endl;

                        }         

            void solution_unique(){

                        float x = (-1.0*b)/(2.0*a);

                        cout <<"La solution est :"<<x<<endl;

                        }

 

 

 

            void solution_double()

{

                        float x1 = (-1.0*b – sqrt((double)calculer_delta())) / (2.0*a);

                        float x2 = (-1.0*b + qrt((double)calculer_delta())) / (2.0*a);

                        }

            void calculer_sol

                        {

                        int delta = calculer_delta();

                        if (delta<0)

{

ecrire_message();

}

                        else

                                    {

                                    if(delta == 0)

{

solution_unique();

}

                                   

                                    else

                                                {

                                                solution_double();

                                                }

                                    }

                        }

           

                        void main(){

                                    lire_coefs();

                                    while(y_a_equation()){

                                                calculer_sol();

                                                lire_coefs();

                                    }

                        }

 

Référence ou appel de routine :

            Se fait à l'intérieur d'un bloc de contrôle

            Valide pour une fonction déclarée ou définie précédemment

            Peut être récursif : appel de fonction dans le corps de celle-ci

            Le résultat d'une fonction peut être utilisé :

                        Pour l'affectation d'une variable :

                        int a = calcul();

                        Dans une expression :

                        int a = 3 * calcul();

 

 

Définition d'une routine :

            Rappel : fournit l'implémentation de la routine

            Consisite en : répétition de déclaration identique

                        suivie d'un bloc d'instructions

                        = corps de la fonction

            Peut faire office de déclaration (définiton = déclaration + définition)

 

Instruction return()

            Rappel : retourne la valeur de la fonction au programme appelant

                        return(expression);

            C'est la dernière instruction exécutés dans la sous-routine !

return;  Peut être utilisée dans une procédure pour stopper l'éxecution de celle-ci.

            Valeur retournée par return()

Si le type varaible/expression donnée à return() est ≠ du type défini dans la déclaration de la fonction :

            Soit erreur de compilation

            Soit un type-cast implicite

 

Déclaration des variables :

Rappel :

 Les variables sont valides à l'intérieurs des bloces de contrôle ou elles sont définies. ( = Variable locale)

Il est possible de définir des variables entre les corps des procédures et les fonctions.(=variable globale) à Les variables sont accessibles dans tout le programme après la déclaration globale.

 

Retour de valeur par main()

            Succès _ 0 (0 erreur)

            Erreur : valeur !=o (code erreur)

            Exemple :

            int main()

            {

            return (lire_fichier());                 //retourn 1 si erreur

            return(calculer_delta()); //retourne 2 si erreur

            return 0;                                   //le programme c bien terminé

            }

 

 

 

 

 

 

 

 

 

Structure de données :

 

struct :

Les structures permettent de regrouper des objets(des variables) au sein d'une entité repérée par un seul nom de variable.

Lors de la déclaration de la structure, on indique les champs de la structure, c'est à dite le type et le nom de la variable qui la composent:

            struct Nom_structure

                        {

                        type_1              Nom_var1;

                        type_2              Nom_var2;

                        } ;

 

exemple :

            strucut MaStructure

                        {

                        int Age;

                        char Sexe;

                        char Nom[12];

                        float MoyenneScolaire;

                        struct AutreStructure StructBis ; (si AutreStructure est deja définie)

                        };

 

Définition d'une variable structurée :

La définition d'une variable structurée es une opération qui consiste à créer une variable ayant comme type celui d'une structure que l'on a précédemment déclaré.

                        struct Nom_structuture Nom_Variable_structuree;

           

            Exemple :

            struct Personne

                        {

                        int Age;

                        char Sexe;

                        };

 

            On peut définir plusieurs variables structurées

                       

Struct Personne

Pierre, Paul, …

Strucut Personne

Toto = {5, 'm'};

 

                       

 

 

 

 

 

Déclaration d'un typedef de struct

            But : définir un nouveau type correspondant à une structure

                        typedef struct {…} Nom_type;

 

Accès au champs d'une variable strcuturée :

            Chaque variable de type structure des champs repérés avec des noms uniques.

            Toutefois le nom des champs ne suffit pas pour y accéder étant donné qu'ils n'ont

            de contextee qu'au sein de la variable structurée…

 

Pour accéder aux champs d'une structure on utilise l'opérateur de champs (un simple point) placé entre le nom de la variable strcuturée que l'on définie et le nom champ :

            Nom_variable.Nom_champ;

Ainsi pour affecter des valeurs à la vairables Pierre ( variable de type strut Personne définie précédemment) :

            Pierre.Age = 18;

            Pierre.Sexe = 'M';

 

Passage de paramètres :

            Rappel : variables globales : sont visible de toutes les routines.

            Limitation :

protection d'accès quasi impossible (n'importe qu'elle routine peut les modifier)

Le transfert d'information se fait par nom de variable,

les routine appelante et appelée doivent utiliser le même label de variable.(implicite)

           

            Solution : passage explicite de paramètres : liste d'arguments passés à l'appel

            Déclaration indique la liste des arguments

                        bool exemple (int arg1, float arg2);

            Référence peut passer des variables locales

                        int i;

                        float f;

                        bool résultat = exemple(i,f);

 

Indépendance des labels :

            Définition utilise ses propres lables de variables.

                        bool exemple(int vari, float vraf)

                                    {

                                    if(vari > 0 && varf  >0.0f)

                                                return true;

                                    return false;

                                    }

 

 

 

Appel d'une fonction paramétrée :

            Respect des types de paramètres, sinon erreur ou type-cast implicite

            Respect du nombre de varaible

            Respect de l'ordre des variables

            Rappel : respect du type de valeur retournée

 

            // déclaration

            void rien2special (double d);

            void appelante(void)

                        {

                        int vali = 20;

                        char * valc = NULL;

                        rien2special(vali);          // ok implicitemnet convertit en double

                        rien2special(valc);         //erreur de conversion implicite

 

            Exemple : i Procédure qui affiche n fois 1 caractère c

                        void afficher(char c, int n)

                                    {

                                    int i;

                                    for( i=0; i <n; ++i)

                                    cout << c;

                                    }

 

                        int main()

                                    {

                                    char c;

                                    cin >> c;

                                    afficher(c, 10); //afficher 10 fois le caractère c

                                    afficher('+',5); //afficher 5 fois +

                                    afficher(c, 6); //afficher 6 fois le caractère c

                                    }

 

Manières de passer les paramètres :

            passage par valeur (copie des valeurs)

            passage par référence (passage du pointeur)

 

            Passage par valeur :

                        Les paramètres sont passés par valeur

la valeur de la variable du programme appelant est copiée dans une nouvelle variable locale à la routine à chaque appel.

La durée de vie des variables correspond à la durée de l'exécution de la fonction.

 

 

 

 

Comment modifier un paramètre ?

            En passant son pointeur :

                        void affich(int n); //déclaration

                        affich(numero); //appel

 

                        void affich(int n)

                                    {

                                    n += 10;

                                    cout << "n ="<<n; // N=11

                                    }

                        void main ()

                                    {

                                    int n=1;

                                    affich(n);

                                    cout<<"n="<<n;           // N=1

Pour modifier n dans affich() et obtenir sa nouvelle valeur dans la routine appelante.

                        void affich(int * n); //déclaration

                        affich(&numero); // appel

 

                        void affich(int * nn)

                                    {

                                    *nn += 10;

                                    cout << "n ="<< *nn;                // N=11

                                    }

                        void main()

                                    {

                                    int n = 1;

                                    int* pn = &n;

                                    affich(pn); // *pn // *pn +=10                //N=11

                                    cout << "n ="<< n;

                                    }

 

Passage par référence en c++ :

C++ offre une altérantive au pointeurs : permet de modifier une variable à travers une routine.

Utilisation de & après le type dans la déclaration (indique passage par référence)

            void affich (int & n); // déclaration

            affich (numéro); // appel

 

            void affich(int & n)

                        {

                        n += 10;

                        cout <<"n="<< n;         // N =11

                        }

 

            void main ()

                        {

                        int n=1;

                        affich(n);

                        cout <<"n ="<< n;        // N=11

                        }

 

Les tableaux :

 

Les tableaux unidimensionnels :

            Problème : comment mémoriser un grand nombre de valeurs ?

                        Sans utiliser un grand nombre d'identificateurs de variables ?

            Solution : Nom de variable unique

                        Référencer valeurs par 1 numéro ou 1 adresse.

 

            Définitions :

Tableau ou variable indexée : variable permettant de mémoriser plusieurs valeurs.

Indic ou index : numéro qui permet d'accéder à une vlauer particulière du tableau.

Composante ou entrée du tableau : valeur particulière pour un index donné.

 

Déclaration d'un tableau :

            Préciser : sa dimension = le nombre d'éléments contenus dans le tableau.

                        exemple :

                                    int nb[200];

                                    char tab[10];

                                    float prix[30];

 

Indexage :

            En C, les indices vont de 0 à n-1

            #define NOMBRE 20

            int main()

                        {

                        int i;

                        int nb(NOMBRE);

                        for (i=0; i<NOMBRE; ++i)

                        cin >> nb[i];

                        for(i = NOMBRE-1; i >=0; --i)

                        cout << nb[i]<<endl;

                        }

 

 

 

 

 

Initialisation à la déclaration :

            Donner la liste des valeurs entre {}, séparées par des virgules ,

                        int nb[2] = {29,34};

                        char tab[3] = {'x','y','z'};

                        float prix[1] = {22.0f};

                        string str[2] = {"bon","test"};

 

Pointeurs et tableaux     :

            L'utilisation d'index peut être réalisée sous forme de pointeur.

            Un tableau déclaré : int tab[4];

            Définit un bloc mémoire de 5 entiers rangés consécutivement et nommés :

            tab[0],tab[1],tab[2],tab[3]

            tab[i] désigne l'objet placé à la ième position à partir du début.

 

Relation tableau/pointeur :

            Soit un pointeur pta déclaré par

            int * pta;

            Initialisé à

            pta = tab ; // équivaut à pta=&(tab[0]);

            pta pointe vers le 1er élement du tableau

            int z = *pta; // équivaut à int z =tab[0];

 

            pta+i pointe vers le l'élément en ième position dans le tableau.

                        *(pat+i) correspond au contenu de tab[i]

                        pta+i à l'adresse de tab[i] doit &(tab[i])

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Exemple (exercice 6)

            #inculde <iostream>

            #include <math.h>

            using namespace std;

            typedef struct

                        {

                        float x,y;

                        } point2d;

            float disManathan(point2d a, point 2d b)

                        {

                        return (abs(a.x-b.x)+abs(a.y-b.y));

                        }

            float disEuclidienne(point 2d a, point 2d b)

                        {

                        float dx = a.x – b.x;

                        float dy=a.y-b.y;

                        return ((float)sqrt(dx*dx + dy*dy));

                        }

            float disEchiquier(point2d a, point2d b)

                        {

                        float dx=abs(a.x – b.x);

                        float dy = abs(a.y – b.y);

                        if (dx > dy)

                                    return dx;

                        return dy;

                        }

 

 

 

 

 

int main()

            {

            point 2d p,q;

            cout << "Saisir les coordonnees de p :";

            cin >> p.x >> p.y;

            cout <<"Saisir les coordoonnees de q :";

            cin >>q.x>>q.y;

 

            cout<<endl;<<"Resultats : "<<endl;

            cout <<"Distance de Manathan =" <<disManathan(p,q)<<endl;

            cout<<"Distance d'Euclidienne ="<<disEuclidienne(p,q)<<endl;

            cout<<"Distance de l'echiquier ="<<disEchiquier(p,q)<<endl;

 

 

 

 

Exercice 8 "boite à outils"

            #include<iostream>

            #include<math.h>

            using namespace std;

            typedef struct

{

float x,y,z;

}point3d;

            typedef struct

                        {

                        float dx, dy, dz;

                        float norme;

                        }vecteur;

            //déclarations :

            point3d saisirpoint();

            vecteur vect_construct(point3d P, point3d Q);

            float vect_norme(vecteur V);

            vecteur vect_add(vecteur V, vecteur W);

            void vect_mulScal(vecteur &V, float scal);

 

            //Définition :

            point3d saisirPoint()

                        {

                        point3d P;

                        cin>>P.x>>P.y>>P.z;

                        return(P);

                        }

            vecteur vect_construct(point3d P, point3d Q)

                        {

                        vecteur V;

                        V.dx = abs(P.x –Q.x);

                        V.dy =abs(P.y – Q.y);

                        V.dz =abs(P.z –Q.z);

 

                        V.norme = vect_norme(V) // calcul de la norme

                        return (V);

                        }

            float vect_norme(vecteur V)

                        {

                        return(sqrt(V.dx*V.dx) + (V.dy*V.dy) + (V.dz*V.dz)));

                        }

           

 

 

 

vecteur vect_add(vecteur V, vecteur W)

                        {

                        vecteur Res;

                        Res.dx = V.dx +W.dx;

                        Res.dy = V.dy+W.dy;

                        Res dz = V.dz+W.dz;

                        Res.norme = vect_norme(Res);

                        return(Res);

                        }

            void vect_mulScal(vecteur &V, float scal)

                        {

                        V.dx*=scal;

                        V.dy*=scal;

                        V.dz*=scal;

                        V.norme(V);

                        }

            // Programme Principal

            void main ()

                        {

                        point3d A,B;

                        A = saisirPoint();

                        B = saisirPoint();

                        vecteur V1;

                        V1 = vect_construct(A,B);

                        vecteur_mulsScal(V1, 3);

                        }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Exercicie 9 :

            #include <iostream>

            using namespace std;

            int A[9];

 

            void remplitA()

                        {

                        for (int i=o; i<=9; i++)

                                    {

                                    A[i] = i;

                                    };

                        };

            void impA()

                        {

                        for (int i=0; i<=9; i++)

                                    {

                                    cout <<"A[" << i << "] = "<<A[i]<<"\n";

                                    };

                        cout <<"\n";

                        }

 

            int main()

                        {

                        remplitA();

                        impA();

                        int &b = A[5];

                        b++;

                        impA();

                        int * c=A+7;

                        (*c)++;

                        c++,(*c)++;

                        impA();

 

                        cout<<"b = "<< b <<"adr de b =" << &b <<"\n";

                        cout<<"c ="<<c<<"adr de c="<<&c<<"valeur de c ="<<*c<<endl;

                        return(0);

                        }         

 

 

 

 

 

 

 

 

 

Les tableaux multidimensionnels :

            2 dimensions, ou +, se déclarant de façon similaire aux tableaux unidimensionnels

            en précisamt les dimension de chaque coordonnée entre corchets []

                        int vec[80][20];

                        char tab[10][11];

                        float prix[30][2][50];

 

Initialisation à la déclaration :

            Similaire au cas unidemensionnel, chaque dimension séparée par accolade {}

                        int vect1[2][3] = {{o,1,5},{7,3,2}};

                        int vect2[3][2][4] =

                        {          {{0,1,2,3},{1,2,3,4}},

                                    {{0,1,2,3},{1,2,3,4}},

                                    {{0,1,2,3},{1,2,3,4}}

                        };

 

Accès à un élément :

            vect1[i][j]

 

            exemples :

            vect1[0][1] = 5

            int x = vect1[0][1]*vect[0][0]

 

Attention : il n'existe pas de protection concernat les indices de tableaux, ie il est possible d'écrire ou de lire des cases qui ne sont pas allouées = crash.

 

Tableau et argument de fonction :

            Un tableau de fonction peut être passé comme argument d'une fonction

                        soit par indice

                        soit par pointeur

            2 déclarations différentes possibles

                        void traiter(int*t);

                        void traiter(int t[]);

 

            On peut modifier le contenudes tableaux passés en arguments dans la fonction.

            Les tableaux ne sont pas passés par valeurs, toujours par référence !

 

 

 

 

 

 

 

 

 

 

Boite à truc :

           

Portée d'une variable :

            Définition : région d'un programme ou une variable peut être référencée

 

Variable locales : portée : bloc de contrôle contenant le déclaration

Variable globale : portée : modules ou programme.

Variable temporaire :

            Conserve sa valeur seulement dans la portée de la variable,

            Mémoire associée est

                        Dynamiquement allouée en début de portée

                        Libérée ne fin de portée par le compilateur

            Durée de vie illimitée

Variable statique :

            Conserve sa valeurs hors de sa portée

            Mot clef static lors de sa déclaration :

                        int tempsomme; // variable temporaire

                        static int statsomme; //varialbe statique

            Initialisé qu'une fois.

 

Mots clefs : const

            indique une constante : la valeur ne peut être modifié après l'initialisation.

                        const int n = 2;

                        n = 4; //erreur de compilation

            Utile pour protéger des paramètres de toute modification lors d'appel de fonction.

 

                        void erreur (const string & msg)

                                    {

                                    cerr<<"Erreur : "<< msg << endl;

                                    msg = "C'est pas gagné " //erreur

                                    }

 

Appel en utilisant const

            void erreur (cosnt string& msg);

            void main(void)

                        {

                        string test ="si ca marche";

                        erreur(test);

                        }

 

 

 

 

 

 

 

Exercice 7 "IMC"

            #include <iostream>

            #include <math.h>

            using namespace std;

 

            float calculMC(float poids, float taille)

                        {

                        return(poids/(taille*taille));

                        }

 

            int main()

                        {

                        float p,t;

                        cout<<"saisir votre poids(kg)";

                        cin >>p;

                        cout<<"saisir votre taille(m)";

                        cin>>t;

 

                        cout<<"Votre IMc est de =" calculIMC(p,t)<<endl;

                        return (0);

                        }

 

 

Les algorithmes de tri :

 

La fonction de permutation :

Pour trier les valeurs d'un tableau, il est nécessaire de permuter des valeurs contenues dans différentes cases du tableau.

Pour cela une fonction de permutation, s'appellant echanger doit être écrite

Arguments : un tableau, 2 entier i et j

Focntionnement :

La fonction récupère le contenu de la ième case du tableau, affecte à cette case la valeur contenue dans la jième case, puis affecte à la jième case la valeur initial de la case i.

 

            void echanger(int tab[],int i, int j);

 

 

 

 

 

 

 

Fontion échanger : permuter 2 éléments d'un talbeau

void echanger(int tab[],int i, int j);

            {

            int memoire;

            memoire = tab[i];

            tab[i] = tab[j];

            tab[j] = memoire;

            }

 

Le tri par création :

Le principe de ce tri est de créer un tableau vide de même taille que le tableau à trier, puis de chercher dans le tableau à tgrier le plus petit élément afin de le placer en première position du tableau nouvellement créé.

 

Ensuite l'agorithme recherche successivement les éléments suivants afin de les placer, à la suite, dans le nouveau talbeau.

L'algorithme se termine lorsque tous les éléments du tableau ont été ajoutés.

 

Exemple de tri :

            #defin NBELEM 6

            // Variables gloables

            int tabval[NBELEM] = {5,3,1,2,6,4};

            bool isdone[NBELEM] = {false, fasle, false, false, false, false};

 

            int triCreation_get_index_min()

                        {

                        //l'élément de l'index le plus petit non encore trié -1 si pas trouvé

                        int res =-1;

                        //trouver le 1er index (s'il existe)

                        int i =0;

                        bool found = false;

                        while ((i<NBELEM)&&(!found)

                                    {

                                    if(!isdone[i])

                                                {

                                                found = true;

                                                res = i;

                                                }

                                    i++;

                                    }

                       

 

 

 

 

 

 

                        if (!found) return res;

                        // chercher dans le reste du tableau s'il existe une valeur <

                        while (i<NBELEM)

                                    {

                                    if (!isdone[i] && (tabval[i] < tabval[res]))

                                                res = 1;

                                    i++;

                                    }

                        return (res);

                        }

 

            void triCreation(int input[NBELEM], int output[NBELEM]

                        {

                        //tri le talbeau input -> output

                        int i;

 

                        for(i=0; i < NBELEM;i++)

                                    {

                                    int next_index = triCreation_get_index-min();

                                    if (next_index !=1)

                                                {

                                                isdone[next_index] = true;

                                                output[i] = input [next_index];

                                                }

                                    }

                        }

 

            void inittab(tabtri &t)

                        {

                        for (int i = 0; i < NBELEM; i++)

                                    {

                                    cin >>t.tabval[i];

                                    t.isdone[i] = false;

                                    }

                        }

 

 

 

 

 

 

 

 

 

 

Exemple tri par insertion :

            void triinsertion(int t[], int nbelem)

 

 

Fin- Langage Communication Informatique, Partie 1, 2004-2005, A.Gyger " www.metah.ch "


Pour télécharger ce fichier en format .doc cliquez ici .