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