Cours Programmation I chap 1 et 2 PDF
Document Details
Semlalia-Marrakech
Hajar LAZAR
Tags
Summary
Ce document est un cours de programmation en C, qui couvre les concepts fondamentaux du langage C, tels que les variables, les types de données, les opérateurs et les expressions. Il inclut également un historique du langage et des exemples de traduction de code en langage machine.
Full Transcript
Module Programmation I: Le Langage C Faculté des Sciences Semlalia- Marrakech Pr. Hajar LAZAR [email protected] Plan Introduction Types de base, Opérateurs et Expressions Lecture & écriture des données Structures de contrôle Tableaux & Chaînes de carac...
Module Programmation I: Le Langage C Faculté des Sciences Semlalia- Marrakech Pr. Hajar LAZAR [email protected] Plan Introduction Types de base, Opérateurs et Expressions Lecture & écriture des données Structures de contrôle Tableaux & Chaînes de caractère Pointeurs Fonctions Types structures, unions et synonymes Introduction Langages informatiques Un langage informatique est un outil permettant de donner des ordres (instructions) à la machine A chaque instruction correspond une action du processeur Intérêt : écrire des programmes (suite consécutive d’instructions) destinés à effectuer une tache donnée Exemple: un programme de gestion de comptes bancaires Contrainte: être compréhensible par la machine Langage machine Langage binaire: l’information est exprimée et manipulée sous forme d’une suite de bits Un bit (binary digit) = 0 ou 1 (2 états électriques) Une combinaison de 8 bits= 1 Octet possibilités qui permettent de coder tous les caractères alphabétiques, numériques, et symboles tels que ?,*,&, … Le code ASCII (American Standard Code for Information Interchange) donne les correspondances entre les caractères alphanumériques et leurs représentation binaire, Ex. A= 01000001, ?=00111111 Les opérations logiques et arithmétiques de base (addition, multiplication, … ) sont effectuées en binaire. Langage machine Comment communiquer avec notre processeur sans avoir à apprendre son langage binaire ? La solution retenue a été de créer des langages de programmation plus évolués que le langage machine, plus faciles à apprendre et de fournir le traducteur qui permettra la conversion en langage machine. Langages de programmation évolués Les langages évolués masquent la complexité de la programmation et permettent aux programmeurs d’écrire des programmes clairs et lisibles. Les instructions écrites dans ces langages doivent être compilées pour générer des programmes exécutables et compréhensibles par le processeur. Exemples: les langages procéduraux, les langages orientés objet, etc. Langages de programmation ⚫ Deux types de langages: Langages procéduraux: le processus de programmation est défini comme le développement d'une séquence de commandes qui manipulent des données pour produire le résultat souhaité. Langages orientés objets: Le paradigme orienté objets (OOP) voit les unités de données comme objets "actifs", contrairement aux unités passives vues par le paradigme procédural. ⚫ Exemples de langages: Fortran, Cobol, Pascal, C, … C++, Java, … Langages haut niveau ⚫ Intérêts multiples pour le haut niveau: proche du langage humain «anglais» (compréhensible) permet une plus grande portabilité (indépendant du matériel) Manipulation de données et d’expressions complexes (réels, objets, a*b/c, …) ⚫ Nécessité d’un traducteur (compilateur/interpréteur), exécution plus ou moins lente selon le traducteur Code source Compilateur ou Langage machine en langage évolué interpréteur Compilateur/interpréteur ⚫ Compilateur: traduire le programme entier une fois pour toutes Compilation Exécution Exemple.c Exemple fichier source fichier exécutable +plus rapide à l’exécution +sécurité du code source - il faut recompiler à chaque modification ⚫ Interpréteur: traduire au fur et à mesure les instructionsdu programme à chaque exécution exemple.bas Interprétation+exécution fichier source + exécution instantanée appréciable pour les débutants - exécution lente par rapport à la compilation Exemple de traduction d’un code en C en langage machine int main(void) { return 0; } Et le même en langage machine: 01010101 01001000 10001001 11100101 01001000 11000111 11000000 00000000 00000000 00000000 00000000 11001001 11000011 Historique du C ⚫ Le langage C a été conçu en 1972 dans «Bell Laboratories » par Dennis Ritchie avec l’objectif d’écrire un système d'exploitation (UNIX). ⚫ En 1978, une première définition rigoureuse du langage C (standard K&R-C) a été réalisée par Kernighan et Ritchie en publiant le livre «The C Programming Language ». ⚫ Le succès du C et l’apparition de compilateurs avec des extensions particulières ont conduit à sa normalisation. ⚫ En 1983, l’organisme ANSI (American National Standards Institute) chargeait une commission de mettre au point une définition explicite et portable pour le langage C. Le résultat est le standard ANSI-C. Caractéristiques du C ⚫ Universel : n'est pas orienté vers un domaine d'application particulier (la robotique, finance, la gestion, …) ⚫ Près de la machine : offre des opérateurs qui sont proches de ceux du langage machine (manipulations de bits, d’adresses, …) efficace ⚫ Modulaire: peut être découpé en modules qui peuvent être compilés séparément ⚫ Portable: en respectant le standard ANSI-C, il est possible d'utiliser le même programme sur plusieurs systèmes (hardware, système d'exploitation ) Programme source, objet et exécutable ⚫ Un programme écrit en langage C forme un texte qu’on nomme programme ou code source, qui peut être formé de plusieurs fichiers sources ⚫ Chaque fichier source est traduit par le compilateur pour obtenir un fichier ou module objet (formé d’instructions machine) ⚫ Ce fichier objet n’est pas exécutable tel quel car il lui manque les instructions exécutables des fonctions standards appelées dans le fichier source (printf, scanf, …) et éventuellement d’autres fichiers objets ⚫ L’éditeur de liens réunit les différents modules objets et les fonctions de la bibliothèque standard afin de former un programme exécutable Remarque : la compilation est précédée par une phase de prétraitement (inclusion de fichiers en-tête) réalisé par le préprocesseur Le processus de compilation et d’exécution d’un programme en C 1 Edition du programme en C Fichier source(.C) Traitement par 2 le préprocesseur Fichier temporaire 3 Compilation Fichier objet (.obj) 4 Edition des liens Fichier exécutable (.exe) Composantes d’un programme C Directives du préprocesseur inclusion des fichiers d'en-tête (fichiers avec extension.h) définitions des constantes avec #define déclaration des variables globales définition des fonctions (En C, le programme principal et les sous- programmes sont définis comme fonctions ) Les commentaires : texte ignoré par le compilateur, destiné à améliorer la compréhension du code exemple : #include main(){ printf( "notre premier programme C \n"); } Composantes d’un programme C ⚫ #include fichier d’entête contenant la déclaration des fonctions d’entrées-sorties dont la fonction printf ⚫ La fonction main est la fonction principale des programmes en C: Elle se trouve obligatoirement dans tous les programmes. L'exécution d'un programme entraîne automatiquement l'appel de la fonction main. ⚫ L’appel de printf avec l’argument "notre premier programme C\n" permet d’afficher : notre premier programme C et \n ordonne le passage à la ligne suivante ⚫ En C, toute instruction simple est terminée par un point-virgule ; ⚫ Un commentaire en C est compris entre // et la fin de la ligne ou bien entre Configuration de l’environnement de développement Configuration de l’environnement de développement Variables, types, opérateurs et expressions Les variables ⚫ Les variables servent à stocker les valeurs des données utilisées pendant l’exécution d’un programme ⚫ Les variables doivent être déclarées avant d’être utilisées, elles doivent être caractérisées par : un nom (Identificateur) un type (entier, réel, …) (Les types de variables en C seront discutés par la suite) Les identificateurs Le choix d’un identificateur (nom d’une variable ou d’une fonction) est soumis à quelques règles : ⚫ doit être constitué uniquement de lettres, de chiffres et du caractère souligné _ (Eviter les caractères de ponctuation et les espaces) correct: PRIX_HT, prixHT incorrect: PRIX-HT, prix HT, prix.HT ⚫ doit commencer par une lettre (y compris le caractère souligné) correct : A1, A1 incorrect: 1A ⚫ doit être différent des mots réservés du langage : auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while Remarque : C distingue les majuscules et les minuscules. NOMBRE et nombre sont des identificateurs différents Les types de base ⚫ Le type d’une variable détermine l’ensemble des valeurs qu’elle peut prendre et le nombre d'octets à lui réserver en mémoire ⚫ En langage C, il n’y a que deux types de base les entiers et les réels avec différentes variantes pour chaque type Remarques: ⚫ Un type de base est un type pour lequel une variable peut prendre une seule valeur à un instant donné contrairement aux types agrégés ⚫ Le type caractère apparaît en C comme cas particulier du type entier (un caractère est un nombre entier, il s’identifie à son codeASCII) ⚫ En C il n'existe pas de type spécial pour chaînes de caractères. Les moyens de traiter les chaînes de caractères seront présentés aux chapitressuivants ⚫ Le type booléen n’existe pas. Un booléen est représenté par un entier (un entier non nul équivaut à vrai et la valeur zero équivaut à faux) Types Entier 4 variantes d’entiers : ⚫ char : caractères (entier sur 1 octet : - 128 à 127) ⚫ short ou short int : entier court (entier sur 2 octets : - 32768 à 32767 ⚫ int : entier standard (entier sur 2 ou 4 octets ) ⚫ long ou long int : entier long (4 octets : - 2147483648 à 2147483648) Si on ajoute le préfixe unsigned à la définition d'un type de variables entières, alors la plage des valeurs change: ⚫ unsigned char : 0 à 255 ⚫ unsigned short : 0 à 65535 ⚫ unsigned int : dépend du codage (sur 2 ou 4 octets) ⚫ unsigned long : 0 à 4294967295 Types Réel 3 variantes de réels : ⚫ float : réel simple précision codé sur 4 octets de -3.4*1038 à 3.4*1038 ⚫ double : réel double précision codé sur 8 octets de -1.7*10308 à 1.7*10308 ⚫ long double : réel très grande précision codé sur 10 octets de -3.4*104932 à 3.4*104932 Déclaration des variables ⚫ Les déclarations introduisent les variables qui seront utilisées, fixent leur type et parfois aussi leur valeur de départ (initialisation) ⚫ Syntaxe de déclaration en C ,,...,; ⚫ Exemple: int i, j,k; float x, y ; double z=1.5; // déclaration et initialisation short compteur; char c=`A`; Déclaration des constantes ⚫ Une constante conserve sa valeur pendant toute l’exécution d’un programme ⚫ En C, on associe une valeur à une constante en utilisant : la directive #define : #define nom_constante valeur Ici la constante ne possède pas de type. exemple: #define Pi 3.141592 le mot clé const : const type nom = expression ; Dans cette instruction la constante est typée exemple : const float Pi =3.141592 (Rq: L’intérêt des constantes est de donner un nom parlant à une valeur, par exemple NB_LIGNES, aussi ça facilite la modification du code) Constantes entières On distingue 3 formes de constantes entières : ⚫ forme décimale : c’est l’écriture usuelle. Ex : 372, 200 ⚫ forme octale (base 8) : on commence par un 0 suivi de chiffres octaux. Ex : 0477 ⚫ forme hexadécimale (base 16) : on commence par 0x (ou 0X) suivis de chiffres hexadécimaux (0-9 a-f). Ex : 0x5a2b, 0Xa9f Remarques sur les constantes entières ⚫ Le compilateur attribue automatiquement un type aux constantes entières. Il attribue en général le type le plus économique parmi (int, unsigned int, long int, unsigned long int) ⚫ On peut forcer la machine à utiliser un type de notre choix en ajoutant les suffixes suivants: u ou U pour unsigned int, Ex : 100U, 0xAu l ou L pour long, Ex : 15l, 0127L ul ou UL pour unsigned long, Ex : 1236UL, 035ul Constantes réelles On distingue 2 notations : ⚫ notation décimale Ex : 123.4,.27, 5. ⚫ notation exponentielle Ex : 1234e-1 ou 1234E-1 Remarques : ⚫ Les constantes réelles sont par défaut de type double ⚫ On peut forcer la machine à utiliser un type de notre choix en ajoutant les suffixes suivants: f ou F pour le type float, Ex: 1.25f l ou L pour le type long double, EX: 1.0L Les constantes caractères ⚫ Se sont des constantes qui désignent un seul caractère, elles sont toujours indiquées entre des apostrophes, Ex : ‘b’, ‘A’, ‘?’ ⚫ La valeur d’une constante caractère est le code ASCII du caractère ⚫ Les caractères constants peuvent apparaître dans des opérations arithmétiques ou logiques ⚫ Les constantes caractères sont de type int Expressions et opérateurs ⚫ Une expression peut être une valeur, une variable ou une opération constituée par des valeurs, des constantes et des variables reliées entre eux par des opérateurs exemples: 1, b, a*2, a+ 3*b-c, … ⚫ Un opérateur est un symbole qui permet de manipuler une ou plusieurs variables pour produire un résultat. On distingue : les opérateurs binaires qui nécessitent deux opérandes (ex : a +b) les opérateurs unaires qui nécessitent un seul opérande ( ex:a++) l'opérateur conditionnel ?: , le seul qui nécessite troisopérandes ⚫ Une expression fournit une seule valeur, elle est évaluée en respectant des règles de priorité et d’associativité Opérateurs en C ⚫ Le langage C est riche en opérateurs. Outre les opérateurs standards, il comporte des opérateurs originaux d’affectation, d’incrémentation et de manipulation de bits ⚫ On distingue les opérateurs suivants en C : les opérateurs arithmétiques : +, -, *, /, % les opérateurs d’affectation : =, +=, -=,*=,/=,… les opérateurs logiques : &&, ||, ! les opérateurs de comparaison : ==, !=, , = les opérateurs d’incrémentation et de décrémentation : ++, -- les opérateurs sur les bits : , &, |, ~, ^ d’autres opérateurs particuliers : ?:, sizeof, cast Opérateurs arithmétiques ⚫ binaires : + - * / et % (modulo) et unaire : - ⚫ Les opérandes peuvent être des entiers ou des réels sauf pour % qui agit uniquement sur des entiers ⚫ Lorsque les types des deux opérandes sont différents il y’a conversion implicite dans le type le plus fort ⚫ L’opérateur / retourne un quotient entier si les deux opérandes sont des entiers (5 / 2 ➔ 2). Il retourne un quotient réel si l’un au moins des opérandes est un réel (5.0 / 2 ➔ 2.5) Conversions implicites ⚫ Les types short et char sont systématiquement convertis en int indépendemment des autres opérandes ⚫ La conversion se fait en général selon une hiérarchie qui n'altère pas les valeurs int → long → float → double → long double ⚫ Exemple1 : n * x + p (int n,p; float x) exécution prioritaire de n * x : conversion de n en float exécution de l'addition : conversion de p en float ⚫ Exemple2 : p1 * p2 + p3 * x (char p1, short p2, p3 ; float x) p1, p2 et p3 d'abord convertis en int p3 converti en float avant multiplication Exemple de conversion Exemple : n * p + x (int n ; long p ; float x) n * p + x long conversion de n en long * multiplication par p long n * p de type long float conversion de n * p en float + addition float résultat de type float Opérateur d’affectation simple = ⚫ L’opérateur = affecte une valeur ou une expression à une variable Exemple: double x,y,z; x=2.5; y=0.7; z=x*y-3; ⚫ Le terme à gauche de l’affectation est appelé lvalue (left value) ⚫ L'affectation est interprétée comme une expression. La valeur de l'expression est la valeur affectée ⚫ On peut enchainer des affectations, l’évaluation se fait de droite à gauche exemple : i = j = k= 5 (est équivalente à k = 5, j=k et ensuite i=j) ⚫ La valeur affectée est toujours convertie dans le type de la lvalue, même si ce type est plus faible (ex : conversion de float en int, avec perte d'information) Opérateurs relationnels ⚫ Opérateurs < : inférieur à : supérieur à >= : supérieur ou égal à != : différent de == : égal à ⚫ Le résultat de la comparaison n’est pas une valeur booléenne, mais 0 si le résultat est faux et 1 si le résultat est vrai ⚫ Les expressions relationnelles peuvent donc intervenir dans des expressions arithmétiques ⚫ Exemple: a=2, b=7, c=4 b==3 ➔ 0 (faux) a!=b ➔ 1(vrai) 4*(a=b)➔ 4 Opérateurs logiques ⚫ && : ET logique || : OU logique ! : négation logique ⚫ && retourne vrai si les deux opérandes sont vrais (valent 1) et 0 sinon ⚫ || retourne vrai si l’une des opérandes est vrai (vaut 1) et 0 sinon ⚫ Les valeurs numériques sont acceptées : toute valeur non nulle correspond à vraie et 0 correspond à faux Exemple : 5 && 11 ➔ 1 !13.7 ➔ 0 Évaluation de && et || ⚫ Le 2ème opérande est évalué uniquement en cas de nécessité a && b : b évalué uniquement si a vaut vrai (si a vaut faux, évaluation de b inutile car a && b vaut faux) a b : b évalué uniquement si a vaut faux (si a vaut vrai, évaluation de b inutile car a b vaut vrai) ⚫ Exemples if ((d != 0) && (n / d == 2)) : pas de division si d vaut 0 if ((n >=0) && (sqrt(n) < p)) : racine non calculée si n < 0 ⚫ L’intérêt est d’accélérer l’évaluation et d’éviter les traitements inappropriés