Traduction des arbres programmatiques en C Table des matières 1 Premier exemple : helloworld.c 1 2 Méthode de programmation 2 3 Déclaration de variables 2 4 Structures de contrôle 3 5 Opérateurs C 5 6 Tableaux 6 7 Tableaux 2D 7 8 Fonctions 8 9 Procédures 9 10 Enregistrements 11 A Le fichier ulco_algo.h 12 1 Premier exemple : helloworld.c // initialisations # include " ulco_algo . h " // programme principal int main () { // affiche un message a l ’ ecran AfficherTexte ( " Hello world ! " ) ; // affiche un retour a la ligne AfficherSaut () ; // fin du programme principal return 0; } Formulaire_AP_C page 1/ 12 2 Méthode de programmation 1. ouvrir geany 2. créer un nouveau fichier et l’enregistrer intelligemment (par exemple, exo1.c dans le répertoire TP1) 3. écrire le code C d’un programme principal vide 4. traduire progressivement l’arbre programmatique en C : (a) traduire la première fonction/procédure et l’appeler dans le programme principal, pour la tester (b) construire le programme (menu, barre d’outils ou touche F9) (c) s’il y a des erreurs de compilation, les corriger et revenir à l’étape (b) (d) exécuter le programme (menu, barre d’outils ou touche F5) (e) vérifier que le programme fonctionne correctement (sinon revenir à l’étape (a)) (f) recommencer avec la fonction/procédure suivante, jusqu’à ce que tout l’arbre programmatique soit traduit 3 Déclaration de variables Arbre Programmatique C Remarque a : booléen int a; (faux si 0, vrai sinon) b, c : entier int b, c; d : reel float d; e : caractère char e; En C, les noms de variable peuvent contenir des lettres (sans accent), des chiffres et le caractère "_". Un nom ne doit pas commencer par un chiffre. Le compilateur distingue les majuscules des minuscules. Choisissez vos noms de façon cohérente : par exemple des noms en minuscules avec des "_" pour les variables (moyenne_ponderee) et des verbes en notation dromadaire pour les fonctions (CalculerMoyennePonderee). Formulaire_AP_C page 2/ 12 4 Structures de contrôle Arbre Programmatique C int main () { int resultat_ok ; resultat_ok = 1; return 0; } pas de traduction, écrire les instructions à la suite Saisir(x) SaisirEntier (& x ) ; SaisirReel (& x ) ; SaisirCaractere (& x ) ; Afficher("hello") Afficher(12) Afficher(2.4) Afficher(’F’) AfficherSaut() AfficherTabulation() AfficherTexte ( " hello " ) ; AfficherEntier (12) ; AfficherReel (2.4) ; Affic herCarac tere ( ’F ’) ; AfficherSaut () ; Af fi ch erT ab ul ati on () ; if ( cond ) { actionV ; } if ( cond ) { actionV ; } else { actionF ; } for ( i =0; i <= N ; i = i +1) { action ; } while ( cond ) { action ; } Formulaire_AP_C page 3/ 12 Exemple : moyenne de 3 nombres # include " ulco_algo . h " int main () { // declare les variables float a , b , c ; float moyenne ; // saisit les 3 nombres AfficherTexte ( " Entrez a : " ) ; SaisirReel (& a ) ; AfficherTexte ( " Entrez b : " ) ; SaisirReel (& b ) ; AfficherTexte ( " Entrez c : " ) ; SaisirReel (& c ) ; // calcule la moyenne moyenne = ( a + b + c ) / 3.0; // affiche la moyenne calculee AfficherTexte ( " La moyenne est " ) ; AfficherReel ( moyenne ) ; return 0; } Exemple : saisir un nombre positif # include " ulco_algo . h " int main () { // variable contenant le nombre saisi int n ; // premiere saisie AfficherTexte ( " Entrez un nombre positif : " ) ; SaisirEntier (& n ) ; // recommence la saisie tant que le nombre n ’ est pas valide while ( n < 0) { AfficherTexte ( " Pas positif . Entrez un nombre positif : " ) ; SaisirEntier (& n ) ; } return 0; } Formulaire_AP_C page 4/ 12 5 Opérateurs C Liste non exhaustive. En cas de doute sur les priorités entre opérateurs, utiliser des parenthèses. Opérateurs arithmétiques Opérateur Signification Exemple + addition 12 + 3 // resultat : 15 - soustraction 12 - 3 // resultat : 9 * multiplication 12 * 3 // resultat : 36 / division 7 / 2 // resultat : 3 !!! - opposée -(1+2) // resultat : -3 % modulo 12 % 5 // resultat : 2 Signification Exemple == égalité 12 == 3 // faux != différence 12 != 3 // vrai < infériorité stricte 12 < 3 // faux > supériorité stricte 12 > 3 // vrai <= infériorité 12 <= 3 // faux >= supériorité 12 >= 3 // vrai Signification Exemple ! NON logique ! (12 < 3) // vrai && ET logique 12 < 3 && 12 > 3 // faux || OU logique 12 < 3 || 12 > 3 // vrai Opérateurs de comparaison Opérateur Opérateurs logiques Opérateur Formulaire_AP_C page 5/ 12 6 Tableaux Arbre Programmatique C T : tableau de 5 entiers int T[5]; for ( i =0; i <=4; i = i +1) { SaisirEntier (& T [ i ]) ; } Exemple : initialiser à 0 un tableau de 20 entiers # include " ulco_algo . h " int main () { // declarations int i ; int T [20]; // parcourt et remplit le tableau for ( i =0; i <=19; i = i +1) { T [ i ] = 0; } // affiche le tableau for ( i =0; i <=19; i = i +1) { AfficherEntier ( T [ i ]) ; Af fi ch erT ab ul ati on () ; } return 0; } Formulaire_AP_C page 6/ 12 7 Tableaux 2D Arbre Programmatique C M : tableau de 3 × 4 réels float M[3][4]; for ( i =0; i <=2; i = i +1) { for ( j =0; j <=3; j = j +1) { M [ i ][ j ] = 0; } } Exemple : matrice identité 4 × 4 # include " ulco_algo . h " int main () { // declarations int i , j ; float M [4][4]; // parcourt et remplit la matrice for ( i =0; i <=3; i = i +1) { for ( j =0; j <=3; j = j +1) { if ( i == j ) { M [ i ][ j ] = 1.0; } else { M [ i ][ j ] = 0.0; } } } return 0; } Formulaire_AP_C page 7/ 12 8 Fonctions Arbre Programmatique C int CalculerMax2 ( int x , int y ) { // ... } max = CalculerMax2 (12 , 3) ; Exemple : max de 2 entiers # include " ulco_algo . h " // retourne le plus grand de 2 entiers int CalculerMax2 ( int x , int y ) { int m ; if ( x > y ) { m = x; } else { m = y; } return m ; } int main () { // declarations int a , b , max ; // saisit les 2 nombres AfficherTexte ( " Entrez a : " ) ; SaisirEntier (& a ) ; AfficherTexte ( " Entrez b : " ) ; SaisirEntier (& b ) ; // calcule et affiche le plus grand max = CalculerMax2 (a , b ) ; AfficherTexte ( " Le max est " ) ; AfficherEntier ( max ) ; return 0; } Formulaire_AP_C page 8/ 12 9 Procédures Arbre Programmatique C void CalcMax2 ( int x , int y , int * m ) { // ... * m = ... } CalcMax2(12, 3, &max) Remarque 1 : sortie. En C, il n’y a pas de distinction entre les paramètres d’entrée/sortie et les paramètres de Remarque 2 : En C, les tableaux sont automatiquement passés en entrée/sortie. Il ne faut donc pas utiliser le "*" et le "&" pour passer un tableau en paramètre (voir l’exemple 2). Exemple 1 : max de 2 entiers # include " ulco_algo . h " void CalculerMax2 ( int x , int y , int * m ) { if ( x > y ) { *m = x; } else { *m = y; } } int main () { int a , b , max ; // ... CalculerMax2 (a , b , & max ) ; // ... return 0; } Formulaire_AP_C page 9/ 12 Exemple 2 : multiplier un tableau par un entier # include " ulco_algo . h " // attention : pas de "*" pour passer // un tableau en entree / sortie void Multip lierTabl eau ( int k , int V [5]) { int i ; for ( i =0; i <=4; i = i +1) { V[i] = V[i] * k; } } int main () { int i ; int T [5]; // remplit le tableau : 0 , 1 , ... 4 for ( i =0; i <=4; i = i +1) { T[i] = i; } // multiplie les elements du // tableau par 3 // attention : pas de "&" pour // un tableau Multi plierTab leau (3 , T ) ; // affiche le tableau multiplie for ( i =0; i <=4; i = i +1) { AfficherEntier ( T [ i ]) ; Af fi ch erT ab ul ati on () ; } return 0; } Formulaire_AP_C page 10/ 12 10 Enregistrements Arbre Programmatique Complexe : type enregistrement partie_reelle : réel partie_imaginaire : réel C typedef struct { float partie_reelle ; float par tie_imag inaire ; } Complexe ; c1 : Complexe Complexe c1 ; c1.partie_reelle c1 . partie_reelle Exemple : nombre complexe # include " ulco_algo . h " // declare un enregistrement typedef struct { float partie_reelle ; float pa rtie_ima ginaire ; } Complexe ; // dans cette procedure , // l ’ enregistrement est passe // en entree / sortie void I n it i a li s er C o mp l ex e ( Complexe * c ) { (* c ) . partie_reelle = 0; (* c ) . parti e_imagin aire = 0; } int main () { Complexe c1 ; // enregistrement en entree / sortie I ni t i al i se r C om p le x e (& c1 ) ; // ... return 0; } Formulaire_AP_C page 11/ 12 A Le fichier ulco_algo.h # include < stdio .h > # include < math .h > void AfficherTexte ( char t []) { printf ( " % s " , t ) ; } void AfficherEntier ( int e ) { printf ( " % d " , e ) ; } void AfficherReel ( float r ) { printf ( " % f " , r ) ; } void Affich erCaract ere ( char c ) { printf ( " % c " , c ) ; } void AfficherSaut () { printf ( " \ n " ) ; } void A ffi ch er Tab ul at ion () { printf ( " \ t " ) ; } void SaisirReel ( float * r ) { scanf ( " % f " , r ) ; } void SaisirEntier ( int * e ) { scanf ( " % d " , e ) ; } void SaisirCaractere ( char * c ) { scanf ( " % c " , c ) ; } void SaisirTexte ( char t []) { scanf ( " % s " , t ) ; } Formulaire_AP_C page 12/ 12