Langage C: Notions de Bases et Rappels Master : ME / OM 18/19 Pr. Chaabelasri G

Langage C: Notions de Bases et Rappels Master : ME / OM 18/19 Pr. Chaabelasri Généralité Caractéristiques • Structuré • Modulaire: peut être découpé en modules qui peuvent être compilés séparément. • Universel: n'est pas orienté vers un domaine d'application particulier. particulier. • Typé: tout objet C doit être déclaré avant d’être utilisé. • Portable: sur n'importe quel système en possession d'un compilateur C. Pour les scientifiques, C ou Fortran ? Fortran et C, sont les langages les plus demandés et utilisés pour le calcul intensif Outils de développements • Editeur de texte, compilateur en même temps ( IDE ) => Dev-C++ • Y a-t-il autre méthode ? Compilation en ligne • Y a-t-il autre méthode ? Compilation en ligne de commande ( c’est la méthode la plus utilisée ). – Compilation et édition de lien de façon rapide. – Possibilité de travailler à distance. – … etc Fortran VS C Les bases de C Comment créer un programme « exécutable » ? prog_principal.c sous_prog1.c sous_prog2.c prog_principal.o sous_prog1.o sous_prog2.o 1) Compilation 2) Edition des liens prog_executable 2) Edition des liens 0) Ecriture des fichiers sources *.c 1) Compilation : cc -c prog_principal.c (idem pour les sous programmes) 2) Liens : cc prog_principal.o sous_prog1.o sous_prog2.o -o prog_executable 3) Reste à lancer prog_executable … La procédure de compilation est souvent automatisée à l ’aide d ’un fichier nommé Makefile Le programme principal • La fonction « main » contient le programme principal • Le programme exécutable binaire commence • Le programme exécutable binaire commence par exécuter les instructions de ce programme principal • Sans fonction main, il est impossible de générer un programme exécutable Qu’est-ce qu’un bloc d ’instructions ? • Un bloc débute par une accolade ouvrante et se termine par une accolade fermante • Il contient des déclarations de variables • Il contient des déclarations de variables internes au bloc et des instructions • Les instructions peuvent être elles aussi des blocs ou des commandes du langage C. Structure d ’un programme • Un programme est composé de plusieurs fonctions qui échangent et modifient des variables • Chaque fonction, y compris la fonction main, comprend les éléments suivants : comprend les éléments suivants : – Directives du préprocesseur – Déclaration d ’objets externes (variables, fonctions) – Interface de la fonction – Bloc d ’instructions Directives du préprocesseur • #include <math.h> : insère les interfaces des fonctions mathématiques comme par exemple fabs() qui évalue la valeur absolue d ’un réel • #include <stdio.h> : entrées sorties standard • #include <stdio.h> : entrées sorties standard • #define chaine1 chaine2 : remplacement littéral de la chaîne de caractères chaine1 par chaine2 Exemple 1 Exemple 2 : Directives de la bibliothèque OpenMP Types de variables manipulées en C • Toutes les variables doivent être explicitement typées (pas de déclaration implicite comme en fortran) • Il y a globalement trois (quatre?) types de variables : – Les entiers : int, short int, long int – Les réels : float, double, long double – Les caractères : char – Rien … : void • exemples : short int mon_salaire; double cheese; char avoile; NB : la présence d ’une ou plusieurs étoiles devant le nom de la variables indique un pointeur, dans nos applications il s ’agira en général de tableaux. Ex : double **mat permet de définir une matrice Interface d ’une fonction • Syntaxe générale : type_retourné nom_de_fonction (paramètres); Le type retourné ainsi que le type des paramètres définit l ’interface ou le prototype de la fonction. Exemples : • void main(void); • void sauve(double *rho,long int imax,char filename,long int num); • int somme(int a, int b); int somme(int a, int b); – NB : Si une fonction f1 fait appel à une fonction f2, f1 doit avoir connaissance de l’interface de f2. Ceci se fait en rappelant l’interface de f2 dans le fichier contenant f1 (voir le code d ’advection linéaire) Opérateurs et expressions • Opérateurs arithmétique: – *,/,+,- – % modulo 19 Opérateurs et expressions • Opérateurs relationnels: – <,>,<=,=> • Opérateurs d’égalité: • Opérateurs d’égalité: – ==, != • Opérateurs logiques: – && et – || ou 20 Opérateurs et expressions • Opérateur conditionnel: – result = mode > 0 ? 1 : 0; if mode>0 then result=1 else result=0. • Opérateurs d’assignation: – =, *=, /=, %=, +=, -=, <<=, >>=, &=, |=, ^= 21 Fonctions en C • Plusieurs fonctions pré-définies: – printf(), sin(), atoi(), … • Le prototype de ces fonctions sont dans • Le prototype de ces fonctions sont dans fichiers d’entête (header file) – printf() dans stdio.h – sin() dans math.h 22 Boucle et branchement Besoin: Besoin: •Calcul répétitif •Calcul avec condition ( comparaison …) boucle while • La boucle while : while(test) { instructions; } • Exemple … int i; i = 0; i = 0; while (i < 10) { printf(« i = %d \n »,i); i++; } … « Tant que i est inférieur à 10, écrire i à l ’écran, incrémenter i » boucle : do … while • La boucle do … while : do { instructions; } while (test); • permet d ’exécuter au moins une fois les instructions avant d ’évaluer le test Boucle: for • La boucle for : for (initialisation ; test ; instruction) { instructions }; • Exemple : for (i = 0 ; i <= 50 ; i++) { printf(« i = %d\n »,i); printf(« i = %d\n »,i); } « Commencer à i =0, tant que i <= 50 , exécuter l ’instruction printf et incrémenter i » Les tests • Syntaxes : – if (expression_test){ bloc d ’instructions 1 } – if (expression_test){ bloc d ’instructions 1 – if (expression_test){ bloc d ’instructions 1 }else{ bloc d ’instructions 2 } Tests (suite) • Enchaînement de if : if (expression_test1) bloc_d_instructions_1 else if (expression_test2) bloc_d_instructions_2 else if (expression_test3) bloc_d_instructions_2 else if (expression_test3) bloc_d_instructions_3 ... else bloc_d_instructions_final Choix multiple: « switch case » /* Utilisation de switch case */ main() { char choix; … switch(choix) { 29 { case ‘a’ : fonctionA(); case ‘b’ : fonctionB(); case ‘c’ : fonctionC(); default : erreur(3); } } Expressions évaluées dans les tests • if (a = b) : erreur fréquente, expression toujours vraie ! • if (a == b) : a égal à b • if (a != b) : a différent de b • if (a > b) : a supérieur à b • if (a > b) : a supérieur à b • if ((a >=b)&&(a>0)) : a supérieur ou égal à b et a positif • if ((a<=b)||(a>0)) : a inférieur ou égal à b ou a positif • ... Les tableaux L ’allocation dynamique de mémoire (les tableaux) • Le programme doit disposer d ’un espace mémoire où ranger les éléments d ’un tableau • Il se peut qu ’on ne sache pas le nombre d ’éléments à stocker dans un tableau avant l ’exécution du programme. On a alors deux solutions : – On surdimensionne le tableau en question en évaluant une taille maximale raisonnable de celui-ci – On alloue dynamiquement la mémoire au moment où on en a besoin (on peut aussi ensuite la restituer) : usage de la fonction malloc Allocation de mémoire (suite) #include <stdlib.h> void main(void) { double * tab; /* déclaration d ’un tableau de taille variable (en réalité c ’est un pointeur) */ double tabfixe[50]; /* Tableau de taille fixe, 50 éléments */ tab = malloc( sizeof(double) ); tab[0] = 0.0; tab[10] = 5.0; /* tab[i] est le ième élément du tableau */ Allouer la mémoire à la table ‘tab’ du tableau */ tabfixe[5] = tab[0]; ... } On définit ainsi un tableau 1D nommé tab de variables réelles en double précision. Les indices valides des éléments vont de 0 à imax. Exemples d’application: Génération de maillage dynamique, Estimation des erreurs de calculs…. Déclaration des tableaux à deux dimensions (matrices) Il y a deux manières de déclarer les tableaux 2D : • On connaît a priori la taille du tableau : Ex : double tab[50][40]; définit un tableau nommé tab de 50 par 40 éléments. Les indices vont de 0 à 49 pour la première dimension et de définit un tableau nommé tab de 50 par 40 éléments. Les indices vont de 0 à 49 pour la première dimension et de 0 à 39 pour la seconde • On ne connaît pas la taille du tableau : Ex : double ** tab; /* Il faut ensuite allouer un espace mémoire au tableau */ Déclaration d ’un tableau (suite) Attention ! Le C ne manipule simplement que des tableaux 1D (des vecteurs). Il s’ensuit qu’un tableau 2D (matrice) sera considéré Il s’ensuit qu’un tableau 2D (matrice) sera considéré comme un vecteur dont chaque élément est un vecteur. Ce principe peut être étendu à des tableaux à n entrées. Les entrées sorties : printf, scanf • Le prototype de ces fonctions est dans <stdio.h> • printf permet d ’afficher du texte à l ’écran • scanf permet d uploads/Litterature/ langage-c 2 .pdf

  • 28
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager