Seance2 C
Seance2 C
Seance2 C
EN
LANGAGE C
PARTIE1
Eric Ziad-Forest
[email protected]
Séance de cours 2
du 11/09/2017
Eric Ziad-Forest
• Résultats produits :
Entrez une durée en seconde (entier positif) :12
Entrez un prix minimum et un prix maximum : 2.41 5.47
12 2.4 5.4700
3
Détails sur le scanf
• De la même façon que pour printf, la fonction scanf utilise différents types de données en entrée :
– %d : pour les nombres entiers signées
– %u : pour les nombres entiers non signées
– %f : pour les nombres flottant
– …
• Attention, il faut faire la différence entre les différentes tailles d’un même type :
4
Calculs de base en C
5
Opérateur modulo (%)
6
Incrémentation (pré et post)
x = 5, valeur = 6
x = 7, valeur = 7
7
Autres écritures réduites
• a += b correspond à a = a + b
• a -= b correspond à a = a - b
• a *= b correspond à a = a * b
• a /= b correspond à a = a / b
• a %= b correspond à a = a % b
Exemples :
float a = 113.45, b = -2.0e3;
int c = 10, d = -3, e = 7;
a+=b; b-=a;
c*=2; c/=d;
d+=6; e%=d;
printf("%.2f %.1e %i %i %i\n", a, b, c, d, e);
-1886.55 -1.1e+002 -6 3 1
8
Problèmes de déplacement et valeurs limites
• Attention au problème de débordement lors d’un calcul. Si le résultat d’un calcul dépasse la valeur minimale ou
maximale représentable, il n’y aura pas d’erreur de produite à l’exécution.
• Pour obtenir les valeurs minimales et maximales des différents types numériques, il faut exploiter les constantes
définies dans le fichier limits.h avec un include.
short a = 32700;
short b = a + 100; Constantes définies dans le
unsigned short c = a +100; fichier limits.h
printf("%d %d %d \n", a, b, c);
printf("%d %d %u\n", SHRT_MIN, SHRT_MAX, USHRT_MAX);
printf("%ld %ld %lu\n",LONG_MIN,LONG_MAX,ULONG_MAX);
9
float, double et problèmes
• La même constante représentée par un float ou double ne correspond pas à la même représentation (valeur) en mémoire
• Les conversions d’un type vers l’autre produisent des effets d’arrondi 0 0 0
• Il existe un format long double avec la plus grande précision
• La division de deux entiers dont un entier et non un nombre à virgule. 1 1 1 1
– Pour avoir un nombre à virgule, il faut convertir l’un des entiers en float, double, …
#include <stdlib.h>
#include <stdio.h> 1.192093e-07 2.220446e-16 1.084202e-19 3.141500e+00
#include <float.h>
int main(){
double pi1 = 3.1415; /* Nombre en double précision dans un double */ 4 8 16
double pi2 = 3.1415f; /* Nombre en simple précision converti en double */
float pi3 = 3.1415; /* Nombre en double précision converti en simple */
float pi4 = 3.1415f; /* Nombre en simple précision dans un simple */
unsigned short res1 = pi1 == pi2, res2 = pi1 == pi3, res3 = pi1 == pi4;
printf("%u %u %u \n", res1, res2, res3);
unsigned short res4 = pi2 == pi3, res5 = pi2 == pi4, res6 = pi3 == pi4, res7 = pi4 == pi4;
printf("%u %u %u %u \n", res4, res5, res6, res7);
long double v = 3.1415l; /* Dernier symbole un L en minuscule */
// EPSILON : Ecart entre 1 et la plus petite valeur supérieur à 1 qui soit représentable
float vminf = FLT_EPSILON;
double vmind = DBL_EPSILON;
long double vminld = LDBL_EPSILON;
printf("%e %e %Le %Le \n", vminf, vmind, vminld, v);
printf("%lu %lu %lu\n",sizeof(float),sizeof(double),sizeof(long double));
return 0;
}
10
Opérateurs binaires
• Le langage C propose un ensemble d’opérateurs binaires pour agir directement sur les bits des entiers.
unsigned short a = 0xFFF0; // Utilisation des opérateurs
unsigned short b = 0x0FFF; // bits à bits : & | ^ ~
unsigned short c = a & b; // a and b
unsigned short d = a | b; // a or b
unsigned short e = a ^ b; // a xor b 1111 1111 1111 0000
unsigned short f = ~e; // not e & 0000 1111 1111 1111
printf("%X %X %X %X \n", c, d, e, f); = 0000 1111 1111 0000
unsigned short g = e >> 2 ; // décalage de 2 bits à droite
unsigned short h = e << 2; // décalage de 2 bits à gauche
printf("%X %X \n", g, h);
11
Bibliothèque mathématique
12
Exemple d’utilisation de math.h
#include <stdio.h>
#include <stdlib.h>
#include <math.h> Une des constantes de la librairie
mathématique
int main(){
double angle = M_PI/3.0; /* angle en radian */
double vx = cos(angle);
double vy = sin(angle);
double r = sqrt(pow(vx,2.0)+pow(vy,2.0)) ;
printf("%.3f %.3f %.3f %.3f\n", angle, vx, vy, r);
printf("%.12f\n",M_PI);
return 0;
La compilation doit de faire avec l’option –lm :
}
gcc -Wall -o exemple_math exemple_math.c -lm
13
Instructions conditionnelles
• Les mots cles if et else permettent d’exécuter certaines instructions seulement si une condition est (ou non) vérifiée.
• Opérateurs de test : == (est égale à), != (est différent de), >, <, >=, <=
Attention = est une affectation, alors que == est un test d’égalité !
double x;
printf("Entrez la valeur de x : ");
scanf("%lf",&x);
if (x>=0.0) printf("La valeur est positive");
else printf("La valeur est négative");
printf(", x = %f\n",x);
14
Block d’instructions
• Plusieurs instructions peuvent être regroupées ensembles grâce à l’utilisation des accolades {}
• Exemple d’utilisation avec une conditionnelle :
int valeur, resultat = 0;
const int seuil = 100;
printf("Entrez une valeur : ");
scanf("%d",&valeur);
if (valeur>seuil){
printf("la valeur est plus grande que %d\n",seuil);
resultat = valeur*3-seuil;
}
else{
printf("la valeur est plus petite que %d\n",seuil);
resultat = valeur+seuil;
}
printf("Resultat = %d\n",resultat);
15
Exploitation du else if
• L’exemple ci-dessous illustre l’exploitation de deux conditions, dont la seconde ne sera évaluée que si la première
est fausse :
char code;
int val;
printf("Entrez un caractère : ");
scanf("%c",&code);
if (code=='o'){ Le nombre de else if consécutifs n’a pas de
printf("oui\n"); val = +1; limite .
} if (code='a') …
else if (code=='n'){ else if (code=='b') …
printf("non\n"); val = -1; else if (code=='c') …
} else if (code=='d') …
…
else {
else …
printf("???\n"); val = 0;
}
printf("val = %d (%c)",val,code);
16
Conditions avec : et, ou, négation
17
Instructions if imbriquées
18
Valeur 0 et autre avec un if
• Si la valeur d’une condition est 0, le test est faux, sinon pour toute autre valeur il est vrai !
double x;
printf("Entrez la valeur de x : ");
scanf("%lf",&x);
if (x) printf("Le test est vrai!");
else printf("le test est) faux!");
19
Utilisation du switch
• Permet de produire un code plus lisible et compact qu’un ensemble de else if.
int choix;
scanf("%d",choix);
switch (choix){ Attention, sans break,
case 1 : les instructions suivants sont exécutées.
printf("Entrez votre nom.");
break;
case 2 : Par exemple le code ci-dessous :
switch (choix){
printf("Entrez votre prénom.");
case 1 :
break;
printf("Entrez votre nom.");
case 3 : /* pas de break ici ! */
printf("Entrez votre age."); case 2 :
break; printf("Entrez votre prénom.");
// … break;
case 10 : Affichera avec choix = 1 :
printf("Entrez votre email."); Entrez votre nom.
break; Entrez votre prénom.
default :
printf("Choix non répertorié");
}
// suite des instructions du programme
20
Conditions condensées
• L’opérateur ternaire : condition ? action si vrai : action si faux ; permet une écriture
condensée d’un test conditionnel.
• Si l’action produit un résultat, il peut directement être affecté à une variable.
• Les opérateurs ternaires conditionnels peuvent être imbriqués.
21
Les boucles
• Une boucle est une structure qui permet de répéter une instruction ou un block d’instructions plusieurs
fois.
• L’utilisation des boucles pour la réalisation de programme est un élément essentiel en programmation.
– La grande majorité des programmes comportent des processus itératifs
• Le langage C utilise deux types de boucle identifiable à partir des mots clés :
– while (et la variante do … while)
– for
• Pour éviter de répéter les instructions indéfiniment, il est indispensable de définir une condition d’arrêt.
– C’est une condition booléen définit avec la même syntaxe que pour le cas du if.
22
La boucle while
Syntaxes :
– while (/* condition *) /*instruction à répéter*/
– while (/* condition*) {
/* block d’instruction à répéter */
}
Exemples : A vous de deviner ce qui
int i = 10; sera affiché si l’utilisateur
while (--i>0) printf("valeur de i = %d\n",i); saisi respectivement :
int valeur = -1;
while (valeur<0){
-12, -27, 45
printf("Entrez une valeur positive : ");
scanf("%d",&valeur);
i++;
if (valeur<0) printf("Essai i=%d, la valeur n'est pas
positive, recommencez !\n",i);
}
printf("Ok pour la valeur : %d\n",valeur);
23
Boucle infinie et cas du break
24
La boucle do … while
Par rapport à la boucle while, la boucle do … while garantie que le block d’instructions sera répétée au minimum
une fois, car la condition est testée après dans le second cas au lieu d’avant dans le premier.
25
La boucle for
• La boucle for n’est pas indispensable puisqu’elle peut être réalisée avec une boucle while, cependant elle a une
écriture condensée plus rapide à saisir.
• Syntaxe : for(initialisation; condition, incrémentation) …
int i;
i=0;
while(i<10){
printf("%d ",i); Affichera :
i++; 0123456789
} 0123456789
printf("\n");
26
La boucle for suite
• Les parties : initialisation et incrémentation, peuvent contenir plusieurs instructions séparées par des
virgules.
int i,j, sum;
i = -100, j = 100, sum=0; Affichera dans les 2 cas:
while(i<0 && j>0){ i=-100, j=100
printf("i=%d, j=%d\n", i, j); Sum=0
if (i%2 == 0) printf("Sum=%d",sum); i=-97, j=98
i+=3; i=-94, j=96
j-=2;
Sum=3
sum+=i+j;
i=-91, j=94
}
i=-88, j=92
// Equivalent avec un for Sum=10
for(i=-100, j=100, sum=0; …
i<0 && j>0; i=-7, j=38
i+=3 , j-=2, sum+=i+j){ i=-4, j=36
printf("i=%d, j=%d\n", i, j); Sum=528
if ( i%2 ==0) printf("Sum=%d\n",sum); i=-1, j=34
}
27
MERCI