Introduction au Langage C et Bases de la Programmation

Institut Supérieur des Études Technologiques
1/21
100%
Rendu du PDF...
Page 1 sur 21Lecteur de document UniversityLib

Introduction au Langage C et Bases de la Programmation

Institut Supérieur des Études Technologiques · Computer Science/Programming · lab

Voir tous les documents en programmation

ISET de Bizerte TI1X

Chapitre1

Petite histoire du C

Introduction au Langage C

Le langage C a été mis au point par D.Ritchie et B.W.Kernighan au début des années 70. Leur but était de permettre de développer un langage qui permettrait d'obtenir un système d'exploitation de type UNIX portable. D.Ritchie et B.W.Kernighan se sont inspirés des langages B et BCPL, pour créer un nouveau langage : le langage C.

La première définition de ce langage a été donnée dans leur livre commun « The C programminglanguage ».

Toutefois, suite à l'apparition de nombreux compilateurs C, l'ANSI (abréviation deAmerican National Standards Institute) a décidé de normaliser ce langage pour donner ce que l'on appelle le C-ANSI. Suite à cette norme, Ritchie et Kernighan ont sorti une deuxième édition du livre en intégrant les modifications apportées par l'ANSI.

Les atouts du C

Le langage C reste un des langages les plus utilisés actuellement. Cela est dû au fait que le langage C est un langage qui comporte des instructions et des structures de haut niveau (contrairement à l'assembleur par exemple) tout en générant un code très rapide grâce à un compilateur très performant.

Un des principaux intérêts du C est que c'est un langage très portable. Un programme écrit en C en respectant la norme ANSI est portable sans modifications sur n'importe quel système d'exploitation disposant d'un compilateur C : Windows, UNIX.

De plus, une des caractéristiques du C est qu'il est un langage « faiblement typé » : les types de données qu'il manipule sont très restreints, et proches de la représentation interne par le processeur : par exemple, le type 'Chaîne de caractères' n'existe pas en C. A l'inverse, comparer un entier et un caractère a un sens en C car un caractère est bien représenté en interne par le processeur par une valeur de type entier (le code ASCII).

Enfin et pour conclure, il est inexact que le C est un langage difficile à apprendre ! Au contraire : le C dispose de peu d'instructions, les structures de données sont limitées, etc.

1

ISET de Bizerte TI1X

Le C++ par rapport au C

Le C++ est un langage basé sur le langage C, auquel on a rajouté des éléments de telle manière à intégrer le concept objet. C'est Bjarne Stroustrup qui a créé la première version de ce langage, appelé C++.

Les bibliothèques de fonctions prédéfinies

Utilisation des bibliothèques de fonctions

La pratique en C exige l'utilisation de bibliothèques de fonctions. Ces bibliothèques sont disponibles dans leur forme précompilée (extension: .LIB). Pour pouvoir les utiliser, il faut inclure des fichiers en-tête (header files - extension .H) dans nos programmes. Ces fichiers contiennent des 'prototypes' des fonctions définies dans les bibliothèques et créent un lien entre les fonctions précompilées et nos programmes.

#include

L'instruction #include insère les fichiers en-tête indiqués comme arguments dans le texte du programme au moment de la compilation.

Identification des fichiers

Lors de la programmation en Borland C, nous travaillons donc avec différents types de fichiers qui sont identifiés par leurs extensions:

fichiers source

*.C *.OBJ fichiers compilés (versions objet) *.EXE fichiers compilés et liés (versions exécutables) *.LIB bibliothèques de fonctions précompilées *.H

fichiers en-tête (header files)

Exemple

Nous avons écrit un programme qui fait appel à des fonctions mathématiques prédéfinies. Pour pouvoir utiliser ces fonctions, le programme a besoin des bibliothèques:

MATHS.LIB

Nous devons donc inclure les fichiers en-tête correspondants dans le code source de notre programme à l'aide des instructions:

#include <math.h> #include <graphics.h>

Après la compilation, les fonctions precompilées des bibliothèques seront ajoutées à notre programme pour former une version exécutable du programme.

2

ISET de Bizerte TI1X

3

ISET de Bizerte TI1X

Chapitre2

Notions de bases

Avant de pouvoir comprendre ou même écrire des programmes, il faut connaître la composition des programmes dans le langage de programmation. Dans ce chapitre, nous allons discuter un petit programme en mettant en évidence les structures fondamentales d'un programme en C.

1. Hello C !

Suivons la tradition et commençons la découverte de C par l'inévitable programme 'hello world'. Ce programme ne fait rien d'autre qu'imprimer les mots suivants sur l'écran:

Comparons d'abord la définition du programme en C avec celle en langage algorithmique.

HELLO_WORLD en langage algorithmique programme HELLO_WORLD | (* Notre premier programme en C *) | écrire "hello, world" fprogramme

HELLO_WORLD en C

#include<stdio.h> |main() |/* Notre premier programme en C */ |{ | printf("hello, world\n"); | return 0; |}

Dans la suite du chapitre, nous allons discuter les détails de cette implémentation.

2. Les composantes d'un programme en C

Programmes, fonctions et variables

Les programmes en C sont composés essentiellement de fonctions et de variables. Pour la pratique, il est donc indispensable de se familiariser avec les caractéristiques fondamentales de ces éléments.

4

ISET de Bizerte TI1X

1. Les fonctions

En C, le programme principal et les sous-programmes sont définis comme fonctions. Il n'existe pas de structures spéciales pour le programme principal ni les procédures (comme en Pascal ou en langage algorithmique).

Le programme principal étant aussi une 'fonction', nous devons nous intéresser dès le début à la définition et aux caractéristiques des fonctions en C. Commençons par comparer la syntaxe de la définition d'une fonction en C avec celle d'une fonction en langage algorithmique:

Définition d'une fonction en langage algorithmique

fonction<NomFonct> (<NomPar1>, <NomPar2>, ...):<TypeRés> | <déclarations des paramètres> | <déclarations locales> | <instructions> ffonction

Définition d'une fonction en C

|<TypeRés><NomFonct> (<TypePar1><NomPar1>, | <TypePar2><NomPar2>, ... ) |{ | <déclarations locales> | <instructions> |}

En C, une fonction est définie par:

* une ligne déclarative qui contient:

<TypeRés> - le type du résultat de la fonction

<NomFonct> - le nom de la fonction

<TypePar1><NomPar1>, <TypePar2><NomPar2>, ...

les types et les noms des paramètres de la fonction

* un bloc d'instructions délimité par des accolades { }, contenant:

<déclarations locales> - les déclarations des données locales (c.-à-d.: des données qui sont uniquement connues à l'intérieur de la fonction)

<instructions> - la liste des instructions qui définit l'action qui doit être exécutée

Résultat d'une fonction

Par définition, toute fonction en C fournit un résultat dont le type doit être défini. Si aucun type n'est défini explicitement, C suppose par défaut que le type du résultat est int (integer).

5

ISET de Bizerte TI1X

Le retour du résultat se fait en général à la fin de la fonction par l'instruction return.

Le type d'une fonction qui ne fournit pas de résultat (comme les procédures en langage algorithmique ou en Pascal), est déclaré comme void (vide).

Paramètres d'une fonction

La définition des paramètres (arguments) d'une fonction est placée entre parenthèses ( ) derrière le nom de la fonction. Si une fonction n'a pas besoin de paramètres, les parenthèses restent vides ou contiennent le mot void.

Instructions

En C, toute instruction simple est terminée par un point-virgule ; (même si elle se trouve en dernière position dans un bloc d'instructions). Par exemple:

printf("hello, world\n");

La fonction main

La fonction main est la fonction principale des programmes en C: Elle se trouve les programmes. L'exécution d'un programme entraîne obligatoirement dans automatiquement l'appel de la fonctionmain.

tous

Dans les premiers chapitres, nous allons simplement 'traduire' la structure programme du langage algorithmique par une définition équivalente de la fonction main :

Définition du programme principal en langage algorithmique

programme<NomProgramme> | <déclarations> | <instructions> fprogramme

Définition de la fonction main en C

|main() |{ | <déclarations> | <instructions> | return 0; |}

Résultat de main

- En principe tout programme devrait retourner une valeur comme code d'erreur à son environnement. Par conséquent, le type résultat de main est toujours int. En général, le type de main n'est pas déclaré explicitement, puisque c'est le type par défaut. Nous allons terminer nos programmes par l'instruction:

6

ISET de Bizerte TI1X

return 0; qui indique à l'environnement que le programme s'est terminé avec succès, sans anomalies ou erreurs fatales.

Paramètres de main

- Si la liste des paramètres de la fonction main est vide, il est d'usage de la déclarer par ().

- Si nous utilisons des fonctions prédéfinies (par exemple: printf), il faut faire précéder la définition de main par les instructions #include correspondantes.

Remarque avancée: Il est possible de faire passer des arguments de la ligne de commande à un programme. Dans ce cas, la liste des paramètres doit contenir les déclarations correspondantes. Dans notre cours, nous n'allons pas utiliser des arguments de la ligne de commande. Ainsi la liste des paramètres de la fonction main sera vide (void) dans tous nos exemples et nous pourrons employer la déclaration suivante qui fait usage des valeurs par défaut:

main() { ... }

Les variables contiennent les valeurs qui sont utilisées pendant l'exécution du programme. Les noms des variables sont des identificateurs quelconques.

2. Les variables

a. Les identificateurs

Les noms des fonctions et des variables en C sont composés d'une suite de lettres et de chiffres. Le premier caractère doit être une lettre. Le symbole '_' est aussi considéré comme une lettre.

* L'ensemble des symboles utilisables est donc:

{0,1,2,...,9,A,B,...,Z,_,a,b,...,z}

* Le premier caractère doit être une lettre (ou le symbole '_')

* C distingue les majuscules et les minuscules, ainsi: 'Nom_de_variable' est différent de 'nom_de_variable'

* La longueur des identificateurs n'est pas limitée, mais C distingue 'seulement' les 31 premiers caractères.

7

ISET de Bizerte TI1X

Exemples

Identificateurs corrects:

Identificateurs incorrects:

nom1

nom_2

1nom

nom.2

_nom_3

-nom-3

Nom_de_variable

Nom de variable

deuxieme_choix

deuxième_choix

mot_francais

Publicité

mot_français

b. Les commentaires

Un commentaire commence toujours par les deux symboles '/*' et se termine par les symboles '*/'

Exemples

/* Ceci est un commentaire correct */

8

ISET de Bizerte TI1X

Chapitre 3: TYPES DE BASE, OPÉRATEURS ET EXPRESSIONS

Récapitulation du vocabulaire

Les variables et les constantes sont les données principales qui peuvent être manipulées par un programme. Les déclarations introduisent les variables qui sont utilisées, fixent leur type et parfois aussi leur valeur de départ. Les opérateurs contrôlent les actions que subissent les valeurs des données. Pour produire de nouvelles valeurs, les variables et les constantes peuvent être combinées à l'aide des opérateurs dans des expressions. Le type d'une donnée détermine l'ensemble des valeurs admissibles, le nombre d'octets à réserver en mémoire et l'ensemble des opérateurs qui peuvent y être appliqués.

Motivation

La grande flexibilité de C nous permet d'utiliser des opérandes de différents types dans un même calcul. Cet avantage peut se transformer dans un terrible piège si nous ne prévoyons pas correctement les effets secondaires d'une telle opération (conversions de type automatiques, arrondissements, etc.). Une étude minutieuse de ce chapitre peut donc aider à éviter des phénomènes parfois 'inexplicables' ...

1. Les types entiers

Avant de pouvoir utiliser une variable, nous devons nous intéresser à deux caractéristiques de son type numérique:

(1) le domaine des valeurs admissibles

(2) le nombre d'octets qui est réservé pour une variable

Le tableau suivant résume les caractéristiques des types numériques entiers de C :

définition

description

domaine min domaine max nombre d'octets

char

caractère

-128

127

short

entier court

-32768

32767

int

entier standard -32768

32767

1

2

2

long

entier long

-2147483648 2147483647 4

- char : caractère

Une variable du type char peut contenir une valeur entre -128 et 127 et elle peut subir les mêmes opérations que les variables du type short, int ou long.

- int : entier standard

Sur chaque machine, le type int est le type de base pour les calculs avec les entiers. Le codage des variables du type int est donc dépendant de la machine. Sur les IBM-PC sous MS-DOS, une variable du type int est codée dans deux octets.

9

ISET de Bizerte TI1X

- short : entier court

Le type short est en général codé dans 2 octets. Comme une variable int occupe aussi 2 octets sur notre système, le type short devient seulement nécessaire, si on veut utiliser le même programme sur d'autres machines, sur lesquelles le type standard des entiers n'est pas forcément 2 octets.

- Les modificateurs signed/unsigned:

Si on ajoute le préfixe unsigned à la définition d'un type de variables entières, les domaines des variables sont déplacés comme suit:

définition

description

domaine min domaine max nombre d'octets

unsigned char caractère

unsigned short entier court

0

0

255

65535

unsignedint

entier standard 0

65535

1

2

2

unsigned long entier long

0

4294967295 4

2. Les types rationnels

En C, nous avons le choix entre trois types de rationnels: float, double et long double. Dans le tableau ci-dessous, vous trouverez leurs caractéristiques:

min et max

représentent les valeurs minimales et maximales

positives. Les valeurs négatives peuvent varier dans

les mêmes domaines.

définition

précision domaine min domaine max nombre d'octets

float

simple 3.4 * 10-38 3.4 * 1038 4

double

double 1.7 * 10-308 1.7 * 10308 8

long double suppl. 3.4 * 10-4932 1.1 * 104932 10

3. La déclaration des variables simples

Maintenant que nous connaissons les principaux types de variables, il nous faut encore la syntaxe pour leur déclaration:

Déclaration de variables en langage algorithmique

<Type><NomVar1>,<NomVar2>,...,<NomVarN>

Déclaration de variables en C

10

ISET de Bizerte TI1X

<Type><NomVar1>,<NomVar2>,...,<NomVarN>;

Exemple :

Int compteur,X,Y; Float hauteur,largeur; Double masse_atomique; char touche; int t_pressee;

Langage algorithmique --> C

En général. Nous avons le choix entre plusieurs types et nous devons trouver celui qui correspond le mieux au domaine et aux valeurs à traiter. Voici quelques règles générales qui concernent la traduction des déclarations de variables numériques du langage algorithmique en C :

- La syntaxe des déclarations en C ressemble à celle du langage algorithmique. Remarquez quand même les points-virgules à la fin des déclarations en C.

entier : Nous avons le choix entre tous les types entiers (inclusivement char) dans leurs formes signed ou unsigned. Si les nombres deviennent trop grands pour unsigned long, il faut utiliser un type rationnel (p.ex.: double)

réel : Nous pouvons choisir entre les trois types rationnels

caractère : Toute variable du type char peut contenir un (seul) caractère. En C, il faut toujours être conscient que ce 'caractère' n'est autre chose qu'un nombre correspondant à un code (ici: code ASCII). Ce nombre peut être intégré dans toute sorte d'opérations algébriques ou logiques ...

chaîne : 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 décrits dans le chapitre chaines de caractères.

booléen : En C il n'existe pas de type spécial pour variables booléennes. Tous les types de variables numériques peuvent être utilisés pour exprimer des opérations logiques:

valeur logique faux

<=> valeur numérique zéro

valeur logique vrai <=> toute valeur différente de zéro

Si l'utilisation d'une variable booléenne est indispensable, le plus naturel sera d'utiliser une variable du type Int.

Les opérations logiques en C retournent toujours des résultats du type Int:

0 pour faux 1 pour vrai

11

ISET de Bizerte TI1X

4. Initialisation des variables

Initialisation

En C, il est possible d'initialiser les variables lors de leur déclaration:

Int MAX = 1023;

Const

En utilisant l'attribut const, nous pouvons indiquer que la valeur d'une variable ne change pas au cours d'un programme:

Const int MAX = 767;

5. Affectation en C

<NomVariable> = <Expression>;

- L'affectation avec des valeurs constantes

- L'affectation avec des valeurs de variables

- L'affectation avec des valeurs d'expressions

Observations

Les opérateurs et les fonctions arithmétiques utilisées dans les expressions seront introduites dans la suite du chapitre. Observons déjà que:

* il n'existe pas de fonction standard en C pour calculer le carré d'une valeur; on peut se référer à la fonction plus générale pow(x, y) qui calcule xy.

* le test d'égalité en C se formule avec deux signes d'égalité == , l'affectation avec un seul = .

6. Les opérateurs connus

Publicité

a. Opérateurs arithmétiques

addition

+

- soustraction

* multiplication

/ division (entière et rationnelle!)

% modulo (reste d'une div. entière)

b. Opérateurs logiques

12

ISET de Bizerte TI1X

et logique (and)

&&

|| ou logique (or)

! négation logique (not)

c. Opérateurs de comparaison

==

!=

égal à

différent de

<, <=, >, >= plus petit que, ...

d. Opérations logiques

Les résultats des opérations de comparaison et des opérateurs logiques sont du type Int:

- la valeur 1 correspond à la valeur booléenne vrai

- la valeur 0 correspond à la valeur booléenne faux

Les opérateurs logiques considèrent toute valeur différente de zéro comme vrai et zéro comme faux:

32 && 2.3

!65.34

1

0

0||!(32 > 12)

0

7. Les opérateurs particuliers de C

 Les opérateurs d'affectation  Opérateurs d'incrémentation et de décrémentation

- Les opérateurs d'affectation

Opérateurs d'affectation

En pratique, nous retrouvons souvent des affectations comme:

i = i + 2

En C, nous utiliserons plutôt la formulation plus compacte:

i += 2

L'opérateur += est un opérateur d'affectation.

13

ISET de Bizerte TI1X

Pour la plupart des expressions de la forme:

expr1 = (expr1) op (expr2)

Il existe une formulation équivalente qui utilise un opérateur d'affectation:

expr1 op= expr2

Opérateurs d'affectation

ajouter à

+=

-= diminuer de

*= multiplier par

/= diviser par

%= modulo

- Opérateurs d'incrémentation et de décrémentation

Les affectations les plus fréquentes sont du type:

I = I + 1 et I = I - 1

En C, nous disposons de deux opérateurs inhabituels pour ces affectations:

I++ ou ++I

pour l'incrémentation

(augmentation d'une unité)

I-- ou --I pour la décrémentation (diminution d'une unité)

Les opérateurs ++ et -- sont employés dans les cas suivants:

incrémenter/décrémenter une variable. Dans ce cas il n'y a pas de différence entre notation préfixe (++I --I) et la notation postfixe (I++ I--).

incrémenter/décrémenter une variable et en même temps affecter sa valeur à une autre variable. Dans ce cas, nous devons choisir entre la notation préfixe et postfixe:

X = I++

passe d'abord la valeur de I à X et incrémente après

X = I-- passe d'abord la valeur de I à X et décrémente après

X = ++I incrémente d'abord et passe la valeur incrémentée à X

X = --I décrémente d'abord et passe la valeur décrémentée à X

Exemple

14

ISET de Bizerte TI1X

Supposons que la valeur de N est égal à 5:

Incrém. postfixe:

X = N++; Résultat: N=6 et X=5

Incrém. préfixe: X = ++N; Résultat: N=6 et X=6

Entre les opérateurs que nous connaissons jusqu'ici, nous pouvons distinguer les classes de priorités suivantes:

8. Priorité des opérateurs

Classes de priorités

Priorité 1 (la plus forte): ()

Priorité 2:

Priorité 3:

Priorité 4:

Priorité 5:

Priorité 6:

Priorité 7:

! ++ --

* / %

+ -

<<= >>=

== !=

&&

Priorité 8: Priorité 9 (la plus faible): = += -= *= /= %=

||

Evaluation d'opérateurs de la même classe

--> Dans chaque classe de priorité, les opérateurs ont la même priorité. Si nous avons une suite d'opérateurs binaires de la même classe, l'évaluation se fait en passant de la gauche vers la droite dans l'expression.

<-- Pour les opérateurs unaires (!,++,--) et pour les opérateurs d'affectation (=,+=,- =,*=,/=,%=), l'évaluation se fait de droite à gauche dans l'expression.

9. Les fonctions arithmétiques standard

Les fonctions suivantes sont prédéfinies dans la bibliothèque standard <math>. Pour pouvoir les utiliser, le programme doit contenir la ligne:

#include<math.h>

Type des données

Les arguments et les résultats des fonctions arithmétiques sont du type double.

Fonctions arithmétiques

COMMANDE C EXPLICATION exp(X)

fonction exponentielle

log(X)

logarithme naturel

LANG. ALGORITHMIQUE eX ln(X), X>0

15

ISET de Bizerte TI1X

log10(X)

logarithme à base 10

pow(X,Y)

X exposant Y

sqrt(X)

fabs(X)

racine carrée de X

valeur absolue de X

floor(X)

arrondir en moins

ceil(X)

Publicité

arrondir en plus

log10(X), X>0 XY pour X>0

|X|

int(X)

fmod(X,Y)

reste rationnel de X/Y (même signe que X) pour X différent de 0

sin(X) cos(X) tan(X) sinus, cosinus, tangente de X asin(X) acos(X) atan(X) arcsin(X), arccos(X), arctan(X) sinh(X) cosh(X) tanh(X) sinus, cosinus, tangente hyperboliques de X

10. Les conversions de type automatiques

Calculs et affectations

Si un opérateur a des opérandes de différents types, les valeurs des opérandes sont converties automatiquement dans un type commun.

Ces manipulations implicites convertissent en général des types plus 'petits' en des types plus 'larges'; de cette façon on ne perd pas en précision.

Lors d'une affectation, la donnée à droite du signe d'égalité est convertie dans le type à gauche du signe d'égalité. Dans ce cas, il peut y avoir perte de précision si le type de la destination est plus faible que celui de la source.

Règles de conversion automatique

Conversions automatiques lors d'une opération avec,

(1) deux entiers:

D'abord, les types char et short sont convertis en int. Ensuite, l'ordinateur choisit le plus large des deux types dans l'échelle suivante:

Int, unsigned int, long, unsigned long (2) un entier et un rationnel:

Le type entier est converti dans le type du rationnel.

(3) deux rationnels:

L'ordinateur choisit le plus large des deux types selon l'échelle suivante:

Float, double, long double (4) affectations et opérateurs d'affectation:

Lors d'une affectation, le résultat est toujours converti dans le type de la destination. Si ce type est plus faible, il peut y avoir une perte de précision.

16

ISET de Bizerte TI1X

11. Les conversions de type forcées (casting)

Il est possible de convertir explicitement une valeur en un type quelconque en forçant la transformation à l'aide de la syntaxe:

Casting (conversion de type forcée)

(<Type>) <Expression>

Exemple

Nous divisons deux variables du type entier. Pour avoir plus de précision, nous voulons avoir un résultat de type rationnel. Pour ce faire, nous convertissons l'une des deux opérandes en float. Automatiquement C convertira l'autre opérande en float et effectuera une division rationnelle:

char A=3; int B=4; float C; C = (float)A/B; La valeur de A est explicitement convertie en float. La valeur de B est automatiquement convertie en float (règle 2). Le résultat de la division (type rationnel, valeur 0.75) est affecté à C.

Résultat: C=0.75

Attention !

Les contenus de A et de B restent inchangés; seulement les valeurs utilisées dans les calculs sont converties !

17

ISET de Bizerte TI1X

Chapitre 4: LIRE ET ÉCRIRE DES DONNÉES

La bibliothèque standard <stdio> contient un ensemble de fonctions qui assurent la communication de la machine avec le monde extérieur. Dans ce chapitre, nous allons en discuter les plus importantes:

printf()

écriture formatée de données

scanf()

lecture formatée de données

putchar() écriture d'un caractère

getchar() lecture d'un caractère

printf()

La fonction printf est utilisée pour transférer du texte, des valeurs de variables ou des résultats d'expressions vers le fichier de sortie standard stdout (par défaut l'écran).

Ecriture formatée en langage algorithmique

écrire<Expression1>,<Expression2>, ...

Ecriture formatée en C

printf("<format>",<Expr1>,<Expr2>, ... ) "<format>" : format de représentation <Expr1>,... : variables et expressions dont les valeurs sont à représenter

La partie "<format>" est en fait une chaîne de caractères qui peut contenir:

* du texte

* des séquences d'échappement

* des spécificateurs de format

* Les spécificateurs de format indiquent la manière dont les valeurs des expressions <Expr1..N> sont imprimées.

* La partie "<format>" contient exactement un spécificateur de format pour chaque expression <Expr1..N>.

* Les spécificateurs de format commencent toujours par le symbole % et se terminent par un ou deux caractères qui indiquent le format d'impression.

* Les spécificateurs de format impliquent une conversion d'un nombre en chaîne de caractères. Ils sont encore appelés symboles de conversion.

18

ISET de Bizerte TI1X

Spécificateurs de format pour printf

SYMBOLE TYPE %d ou %i int

IMPRESSION COMME entier relatif

%u

%o

%x

%c

%f

%e

%s

int

int

int

entier naturel (unsigned)

entier exprimé en octal

entier exprimé en hexadécimal

caractère

int double rationnel en notation décimale double rationnel en notation scientifique char* chaîne de caractères

Largeur minimale pour les entiers

Pour les entiers, nous pouvons indiquer la largeur minimale de la valeur à afficher. Dans le champ ainsi réservé, les nombres sont justifiés à droite.

Exemples

( _ <=> position libre)

printf("%4d", 123); ==> _123 printf("%4d", 1234); ==> 1234 printf("%4u", 0); ==> ___0 printf("%4X", 123); ==> __7B printf("%4x", 123); ==> __7b

Largeur minimale et précision pour les rationnels

Pour les rationnels, nous pouvons indiquer la largeur minimale de la valeur à afficher et la précision du nombre à afficher. La précision par défaut est fixée à six décimales. Les positions décimales sont arrondies à la valeur la plus proche.

Exemples

printf("%f", 100.123); printf("%12f", 100.123); printf("%.2f", 100.123); printf("%5.0f", 100.123); ==> __100 printf("%10.3f", 100.123); ==> ___100.123 printf("%.4f", 1.23456);

==> 100.123000 ==> __100.123000 ==> 100.12

==> 1.2346

19

ISET de Bizerte TI1X

Lecture formatée de données

scanf()

La fonction scanf est la fonction symétrique à printf; elle nous offre pratiquement les mêmes conversions que printf, mais en sens inverse.

Lecture formatée en langage algorithmique

lire<NomVariable1>,<NomVariable2>, ...

Lecture formatée en C

scanf("<format>",<AdrVar1>,<AdrVar2>, ...) : format de lecture des données

"<format>"

<AdrVar1>,... : adresses des variables auxquelles les données seront attribuées

* La fonction scanf reçoit ses données à partir du fichier d'entrée standard stdin (par défaut le clavier).

* La chaîne de format détermine comment les données reçues doivent être interprétées.

* Les données reçues correctement sont mémorisées successivement aux adresses indiquées par <AdrVar1>,... .

* L'adresse d'une variable est indiquée par le nom de la variable précédé du signe &.

Écriture d'un caractère

La commande,

putchar('a');

Exemples

char A = 225; char B = '\a'; int C = '\a'; putchar('x'); /* afficher la lettre x */ putchar('?'); /* afficher le symbole ? */ putchar('\n'); /* retour à la ligne */ putchar(65); /* afficher le symbole avec */ /* le code 65 (ASCII: 'A') */ putchar(A); /* afficher la lettre avec */ /* le code 225 (ASCII: 'ß') */ putchar(B); /* beep sonore */ putchar(C); /* beep sonore */

20

ISET de Bizerte TI1X

Lecture d'un caractère

Type du résultat

Le type résultat de getchar est int. En général, getchar est utilisé dans une affectation:

int C; C = getchar();

getchar lit les données de la zone tampon de stdin. La bibliothèque <conio> contient une fonction du nom getch qui fournit immédiatement le prochain caractère entré au clavier.

21