1 1. Eléments de base du langage C • Généralités • Programme et sous-programme • Fonction C • Structure d’un programme C • Vocabulaire de base et syntaxe • Exemples 2 Généralités • Crée en 1972 par D. Ritchie pour écrire des systèmes d’exploitation. • Histoire liée à celle d’UNIX (1973 D. Ritchie - K. Thompson) • Langage à la fois de : • ‘‘ haut niveau ’’ : définition de types et des structures de données complexes • ‘‘ bas niveau’’ : opérations binaires et manipulations de bas niveau • Portabilité en fait son succès (PC et station de travail) • Normalisation ANSI en 1989 3 Caractéristiques du langage • Langage d’usage général : haut niveau et assembleur • Efficacité (plus de 80% de l’efficacité de l’assembleur) • Pas d’instructions d’E/S mais existence de fonctions regroupées dans la bibliothèque standard ( ex: printf() pour afficher à l’écran ) • Littérature : • ‘‘The C reference manual’’ D. Ritchie et B. Kernigham • ‘‘C - A software engineering approach’’ P. Darnell et P. Margolis 4 Critiques usuelles • Permissif , contrairement au PASCAL • Prévu pour des programmeurs confirmés • Tout est lié, il faut tout savoir • MAIS : Qualité de ses défauts 5 Programme • Suite d’instructions rangées séquentiellement en mémoire • Elles s’exécutent (normalement) les unes après les autres - meilleure lisibilité - mise à jour plus facile Programmation structurée (découpage en modules) 6 Sous-programmes Intérêt d’un sous-programme : – quand un programme nécessite plusieurs fois l’exécution d’une même séquence – quand plusieurs programmes utilisent une même séquence utilisation d’un sous-programme (bibliothèque) ... appel ... ... appel ... ... ... ... 7 Sous-programmes • Définitions • un sous-programme est un élément de programme qui possède un nom qui permet à un programme de l’appeler • une instruction d’appel • un sous-programme doit être capable de : • traiter les données fournies par le programme appelant • renvoyer des données au programme appelant • transformer des données du programme appelant • manipuler ses propres données (variables locales) 8 Sous-programmes Fonction mathématique : f(x,y) = x + xy + y Définition Utilisation - d’un nom - de ce qu’elle fait - de variables muettes - on y fait appel par son nom - on fournit des valeurs effectives f(2,3) = 2 + 2x3 + 3 ou f(3, f(5,3)) = 3 + 3x(5 + 5x3 +3) + (5 + 5x3 +3) 9 Fonctions dans un programme C • Sous-programmes en C = fonctions • procédures en PASCAL, subroutines en FORTRAN • Une fonction C est définie par : • un nom • liste d’arguments formels (nombre, types et noms) • opérations à réaliser (écrites en C) • résultat rendu • Fonctions peuvent avoir leurs objets propres (variables locales) • Une fonction est utilisée avec : • une instruction d’appel (le nom de la fonction) • liste d'arguments effectifs 10 Exemple de fonction C Type de la fonction: type de la valeur de retour Nom de la fonction int { somme (int a , int b) Nom et type des arguments int resultat ; Variables locales resultat = a+b ; Instructions return(resultat); } Argument de return(): valeur à retourner Note: return() est lui-même une fonction 11 Autres Fonctions : fonction d’Entrée/Sortie • E/S : entrée/sortie vers les périphériques (I/O: input/output) • le clavier, l’écran (console), autres… • Accessible par tout programme via des fonctions • définies et codées dans la bibliothèque standard du langage C • Nécessite la directive en début de programme (sinon erreur !): • #include <stdio.h> (stdio: standard input output library) 12 Fonction E/S : printf (’’ ’’,…) • Affiche à l’écran la chaine de caractères entre ’’ ’’ (guillemets) : • tel quel, pour les caractère ordinaires (dont ceux de mise en forme : \n (retour ligne) ) • après remplacement par l’argument suivant de printf, si le caractère % est présent. printf(’’%d puissance %d = %d\n’’, i , j , res); donne ainsi à l’écran : 2 puissance 3 = 8 (+ retour à la ligne) si i=2, j=3 et res=8. • Spécificateurs de format d’affichage : • %d ou %i : un entier • %f • %c • %x • %s %u: unsigned int, entier non signé : un nombre réel (float, double) : un caractère : un nombre sous forme hexadécimal : une chaîne de caractère 13 Fonction E/S : printf (’’ ’’,…) #include <stdio.h> Sortie à l’écran : void main() { int a=67; //a integer(entier) //0100 0011 in memory a= 67 a= 43 a= C a= 0.000000 printf("a= %i \n",a); printf("a= %x \n",a); printf("a= %c %f ",a); Affiche a considérant qu’il contient un nombre à virgule (float) ! Résultat aberrant. (un avertissement est donné par le compilateur) } 67 : code ASCII de ‘C’ 14 Fonction E/S : scanf (’’ ’’, &…) • Lit le flot de caractère du clavier • tant qu’il n’a pas trouvé le nombre d’arguments nécessaire (plus un appui sur ↵ pour indiquer la fin de saisie) • Stocke la valeur lue dans les variables en arguments • un & (notion de pointeurs) devant le nom de la variable est nécessaire !! • scanf(’’ %d %f ’’, &i , &t); • scanf (), ne vérifie pas que l’utilisateur entre des valeurs cohérentes ! • Exemple: il accepte un caractère pour un entier ou un float. Au programmeur d’implémenter des vérifications. 15 Fonction E/S : scanf (’’ ’’, &…) Ecran à l’exécution: #include <stdio.h> 2 3.4 ↵ (↵ : touche return) a= 2 b=3.400000 void main(void) { int a; float b; //b réel, virgule flottante 2 3.4 5 ↵ a= 2 b=3.400000 scanf ("%d %f",&a, &b); printf("a= %d b=%f \n",a,b); } 2 ↵ (attend 2ème argument) 3.4 ↵ a= 2 b=3.400000 2 t ↵ a= 2 b=27679303629726023680.0 16 Structure d’un programme C • Un programme C : un ensemble de fonctions réunies en 1 ou plusieurs fichiers. • Les fonctions sont déclarées dans n’importe quel ordre dans le fichier source. • Une fonction joue un rôle particulier : programme). main (point d’entrée du 17 Structure de bloc {var a,b {var c,d • Délimité par { et } } • Une fonction est un bloc d’instruction. {var d,e • Un bloc peut contenir des sous-blocs • Un bloc d’instruction est assimilable à une seule instruction Ø 1 instruction = ou } } ... ... … 1 bloc 1 instruction élémentaire (expl: a=b+1;) • Les variables définies dans un bloc sont locales à ce bloc. • Exemple: les variables locales à une fonction pour des calculs intermédiaires 18 Vocabulaire et syntaxe • Format libre du source: • espace, retour à la ligne à la discrétion du programmeur • pour la lisibilité, mieux d’indenter le code avec des tabulations (ou utiliser l’auto-indentation d’un éditeur de texte) • Mais Délimiteur d’instruction : ; • chaque instruction doit se terminer par un ‘ ; ’ • Commentaires dans le code : • Sur une ligne : /*..ceci est un commentaire……*/ // cette ligne est un commentaire (Mr Colin n’aime pas) • Sur plusieurs lignes : /* Ceci est un commentaire sur plus d’une ligne */ 19 Vocabulaire et syntaxe #include <stdio.h> void main() { int a=67; /*a integer(entier) 0100 0011 in memory*/ printf("a= %i \n",a); } 1 tabulation #include <stdio.h> void main(){ int a= 67; printf("a= %i\n", //a integer(entier) a); //100 0011 in memory } • ou #include <stdio.h> void main(){int a=67;/*a integer(entier)0100 0011 in memory*/printf("a= %i\n",a);} Corrects mais peu lisibles = Mauvais ! 20 Vocabulaire et syntaxe • Identificateurs des variables et fonctions: • noms composés de caractères alphanumériques et _ • doit commencer par une lettre ou _ (underscore) • minuscules - majuscules : TOTO différent de toto ! • ne pas faire partie de la liste des mots réservés (vocabulaire du c : les types, structure de contrôle …) Bond_007 007_Bond $toto int _007 abc=bca • Choisir des noms explicites pour la lisibilité : • prix, pixel, somme plutôt que a, b, c, toto, titi 21 Vocabulaire et syntaxe • Identificateurs des variables et fonctions: • noms composés de caractères alphanumériques et _ • doit commencer par une lettre ou _ (underscore) • minuscules - majuscules : TOTO différent de toto ! • ne pas faire partie de la liste des mots réservés (vocabulaire du c : les types, structure de contrôle …) Bond_007 007_Bond $toto int _007 abc=bca • Choisir des noms explicites pour la lisibilité : • prix, pixel, somme plutôt que a, b, c, toto, titi 22 Vocabulaire et syntaxe • Constantes • Entières • Réelles : - suite de chiffres ( + ou - ) ne commençant pas par 0 - commence par 0 : octal - commence par 0x : hexadécimal : • Caractères : • Chaînes (strings) : ’ A’ 65 - virgule fixe : 3.33 - virgule flottante : -53e2 - valeur du code dans la table ASCII - entre apostrophes : ’A’ - tableaux de caractères terminés par \0 - entre guillemets : ’’ ZUT’’ est différent de ’’A’’ 65 \0 (délimiteur spécial) 23 Exemple récapitulatif #include <stdio.h> int { somme (int a , int b) int resultat ; resultat = a+b ; return(resultat); } void main(void) { int x=3245; int b=2879456, res=0; res=somme(x,b) ; printf("resultat: %d \n",res); } Ecran à l’exécution: resultat: 2882701