Universit´e Cadi Ayyad Ann´ee 2019−2020
Facult´e polydisciplinaire Langage C et Matlab
Safi SMC (S4)
S´ erie 2
Exercice 1
1◦) Pourquoi utiliser puts() alors que printf() est moins restrictive ?
2◦) Pourquoi faut-il inclure le fichier stdio.h quand on veut utiliser printf(), puts(), ou scanf() ? 3◦) Que se passe-t-il si j’oublie l’op´erateur d’adresse (&) d’une variable de la fonction scanf() ? Exercice 2
Quels seront les r´esultats fournis par ce programme:
#include<stdio.h>
main() {
int n=543;
int p=5;
float x=34.5678;
printf(”A : %d %f\n”, n, x);
printf(”B : %4d %10f\n”, n, x);
printf(”C : %2d %3f \n”, n, x);
printf(”D : %10.3f %10.3e\n”, x, x);
printf(”E : %-5d %f\n”, n, x);
}
Remarque: Le signe moins (-), plac´e imm´ediatement apr`es le symbole % (comme dans %-4d ou %-10.3 f), demande de cadrer l’affichage `a gauche au lieu de le cadrer (par d´efaut) `a droite ; les ´eventuels espaces suppl´ementaires sont donc plac´es `a droite et non plus `a gauche de l’information affich´ee.
Exercice 3
1◦) Ecrire un programme qui lit deux nombres au clavier et les affiche `a l’´ecran.
2◦) Ecrire un programme qui calcule la somme de quatre nombres du type int entr´es au clavier et affiche le r´esultat obtenu.
Exercice 4
Ecrire un programme qui :´
1◦) lit deux entiers n1 et n2 au clavier ; 2◦) affiche la partie enti`ere de leur quotient ;
3◦) affiche la partie fractionnaire frac de leur quotient ;
4◦) calcule la partie enti`ere du produit de l par frac modulo 256, puis convertit le r´esultat en caract`ere ; 5◦) affiche le caract`ere obtenu.
Exercice 5
1◦) Ecrire un programme qui affiche la r´esistance ´equivalente `a trois r´esistances R1,R2,R3 (type double),
• si les r´esistances sont branch´ees en s´erie:
Rser =R1+R2+R3
• si les r´esistances sont branch´ees en parall`ele:
Rpar = R1R2R3
R1R2+R1R3+R2R3
2◦) Ecrire un programme qui calcule le prix TTC (type double) d’un article `a partir du prix net (type int) et du pourcentage de TVA (type int) `a ajouter. Utilisez la formule suivante en faisant attention aux priorit´es et aux conversions automatiques de type:
P T T C =P N ET +P N ET ·T V A 100
3◦) Ecrire un programme qui calcule et affiche la distance DIST (type double) entre deux points A et B du plan dont les coordonn´ees (XA, YA) et (XB, YB) sont entr´ees au clavier comme entiers.
Correction
Rappel : Le corrig´ e n’a d’int´ erˆ et que si l’exercice a ´ et´ e cherch´ e.
Exercice 1
1◦) La fonction printf() ´etant plus compl`ete, elle consomme plus de ressources. Quand vos programmes vont se d´evelopper, les ressources vont devenir pr´ecieuses. Il sera alors avantageux d’utiliser puts() pour du texte.
En r`egle g´en´erale, utilisez plutˆot la ressource disponible la plus simple.
2◦) Le fichier stdio.h contient le prototype des fonctions standards d’entr´ee/sortie ; printf(), puts() et scanf() en font partie.
3◦) Si vous oubliez cet op´erateur, le r´esultat est totalement impr´evisible. Au lieu de stocker la valeur re¸cue dans la variable, scanf() va la stocker `a un autre endroit de la m´emoire. Les cons´equences peuvent ´etre insignifi- antes ou entraˆıner l’arrˆet total de l’ordinateur.
Exercice 2 A : 543 34.567799 B : 543 34.567799 C : 543 34.567799
D : 34.568 3.457e+01 E : 543 34.567799
Exercice 3 1◦)
#include<stdio.h>
main() { int i, j;
printf(”\n donner deux nombre entier\n ”);
puts(”s´epar´es par un espace”);
scanf(”%d %d”, &i, &j);
printf(”Vous avez saisie %d et %d”, i, j);
} 2◦)
#include<stdio.h>
main() { int i, j, k, l;
printf(”\n donner quatres nombre entier s´epar´es chaqu’une par un espace\n ”);
scanf(”%d %d %d %d”, &i, &j, &k, &l);
printf(”La somme de ces quatres nombres est %d:”, i+j+k+l);
}
Exercice 4
#include<stdio.h>
main()
{ int n1, n2; int quotient; float frac, l; char c; printf(”Entrez deux nombres entiers : ”); scanf(”%d %d”, &n1,
&n2); quotient = n1 / n2; printf(”Partie enti`ere du quotient : %d\n”, quotient);
frac = (n1 / (float) n2) - quotient;
printf(”Partie fractionnaire du quotient : %f\n”, frac);
printf(”Entrez un r´eel : ”);
scanf(”%f”, &l);
c = (char) ((int) (l * frac) % 256);
printf(”Caract`ere : %c\n”, c);
}
Exercice 5 1◦)
#include<stdio.h>
main()
{ double R1, R2, R3, RRES;
printf(”Introduisez les valeurs pour R1, R2 et R3 : ”);
scanf(”%f %f %f”, &R1, &R2, &R3);
RRES=R1+R2+R3;
printf(”Resistance resultante serielle : %f\n”, RRES);
RRES=(R1*R2*R3)/(R1*R2+R1*R3+R2*R3);
printf(”Resistance resultante parall`ele : %f\n”, RRES);
} 2◦)
#include<stdio.h>
main() {
int PNET, TVA;
double PTTC;
printf(”Entrez le prix net de l’article : ”);
scanf(”%d”, &PNET);
printf(”Entrez le taux de la TVA (en %) : ”);
scanf(”%d”, &TVA);
PTTC = PNET+(double)PNET*TVA/100;
printf(”Le prix TTC est %.2lf Francs\n”,PTTC);
}
Lors du calcul de PTTC (type double), nous divisons le produit du PNET (type int) et de la TVA (type int) par 100. Pour ne pas perdre de la pr´ecision lors de la division et pour ´eviter un d´epassage du domaine lors du calcul du produit, il faut forcer l’utilisation du type double.
En utilisant l’op´erateur de la conversion forc´ee, il faut respecter la suite de l’´evaluation de l’expression. Il ne suffirait donc pas d’´ecrire:
PTTC = (double)PNET+PNET*TVA/100;
Parce que la multiplication et la division ont la priorit´e sur l’addition; la conversion se ferait trop tard, c.-`a-d.:
`
a la fin du calcul.
Il existe plusieurs possibilit´es de r´esoudre ce probl`eme:
• utiliser la conversion (double) lors des premi`eres op´erations effectu´ees:
PTTC = PNET+(double)PNET*TVA/100;
• utiliser une constante du type double lors de la division:
PTTC = PNET+PNET*TVA/100.0;
• d´eclarer PNET et/ou TVA comme double :
double PNET, TVA, PTTC;
2◦)
#include<stdio.h>
#include<math.h>
main()
{ int XA, YA, XB, YB;
double DIST;
printf(”Entrez les coordonn´ees du point A : XA,YA ”);
scanf(”%d,%d”, &XA, &YA);
printf(”Entrez les coordonn´ees du point B : XB,YB ”);
scanf(”%d,%d”, &XB, &YB);
DIST=sqrt(pow(XA-XB,2)+pow(YA-YB,2));
printf(”La distance entre A(%d,%d) et B(%d, %d) est %.2f\n”, XA, YA, XB, YB, DIST);
}