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
Documents similaires










-
28
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Apv 21, 2022
- Catégorie Literature / Litté...
- Langue French
- Taille du fichier 1.5493MB