Universit´e Cadi Ayyad Ann´ee 2019−2020
Facult´e polydisciplinaire Langage C et Matlab
Safi SMC (S4)
S´ erie 1
Exercice 1
1. Les commentaires ont-ils une influence sur le d´eroulement du programme ? 2. Quelle est la diff´erence entre une instruction et un bloc ?
3. Pourquoi ne pas toujours utiliser les variables long int qui peuvent contenir de grands nombres plutˆot que des variables int ?
4. Que se passera-t-il si j’essaye de stocker un nombre d´ecimal dans un entier ?
5. Que se passera-t-il si j’essaye de stocker un nombre dans un type trop petit pour le recevoir ? 6. Que se passera-t-il si je mets un nombre n´egatif dans une variable non sign´ee (=variable≥0 ) ? Exercice 2
Lesquels des identificateurs suivants sont accept´es par C ?
Fonction-1 limite inf MOYENNE du MOIS lim-sup´erieure Ondelette break
Exercice 3
Soient les d´eclarations:
char c=’E’;// le nombre entier associ´e a la lettreE est 69.
short int p=2;
Quels sont le type et la valeur de chacune des expressions suivantes:
1. p+5 2. c+1 3. p+c 4. 2*c+ 3*p
Exercice 4
Eliminer les parenth`eses non n´ecessaires dans les expressions suivantes:
1. a=(x+5) 2. a=(x=y)+2 3. a=(x==y) 4. (a<b) && (c<d) 5. (i++)*(n+p)
Exercice 5
Soient les d´eclarations:
char c=’♣’;// Le nombre entier associ´e a ♣est 5.
int n=5;
long p=1000;
float x=1.25;
double z=5.5
Quels sont le type et la valeur de chacune des expressions suivantes:
1. n+c+p 2. 2*x+c 3. (char) n+c 4. (float) z+n/2
Exercice 6
Soient les d´eclarations:
int n=5, p=9;
int q;
float x;
Quelle est la valeur affect´ee aux diff´erentes variables concern´ees par chacune des instructions suivantes:
1. q=n<p;
2. q=n==p;
3. q = p % n + p>n ; 4. x = p / n ;
5. x = (float) p / n ; 6. x = (p + 0.5) / n ; 7. x = (int) (p + 0.5) / n ; 8. q = n * (p>n ? n : p) ; 9. q = n * (p<n ? n : p) ;
0.0.1 Rappel
Les op´erateurs conditionnels:
<expr1>?<expr2> : <expr3>
Si <expr1> fournit une valeur diff´erente de z´ero, alors la valeur de <expr2> est fournie comme r´esultat. Si
<expr1> fournit la valeur z´ero, alors la valeur de <expr3>est fournie comme r´esultat.
Les r`egles de conversion de types s’appliquent aussi aux op´erateurs conditionnels ? : Ainsi, pour un entier N du type int et un rationnel F du type float, l’expression
(N>0) ? N : F
va toujours fournir un r´esultat du type float, n’importe si N est plus grand ou plus petit que z´ero.
Correction
Rappel : Le corrig´ e n’a d’int´ erˆ et que si l’exercice a ´ et´ e cherch´ e.
Exercice 1
1. Les commentaires sont destin´es aux programmeurs. Lorsque le compilateur converti le code source en code objet, il supprime tous les blancs et commentaires. Ils n’ont donc aucune influence sur l’´ex´ecution du programme. Les blancs et commentaires permettent simplement de clarifier le code source pour faciliter la lecture et la maintenance du programme.
2. Un bloc est constitu´e d’un groupe d’instructions entre accolades ({}).
3. Une variable long int peut ˆetre plus gourmande en m´emoire. Cela ne fait pas de diff´erence dans un petit programme, mais plus il sera gros, plus il deviendra important de bien g´erer la m´emoire utilis´ee.
4. On peut stocker un nombre avec une d´ecimale dans une variable int. Mais La valeur stock´ee va perdre sa partie d´ecimale. Par exemple, si on affecte la valeur 3.14 `a la variable enti`ere pi, pi ne contiendra que la valeur 3.
5. Lorsqu’on affecte un nombre dans un type trop petit pour le recevoir, il y a une perte d’information et le compilateur ne signale pas cette erreur, il faut faire attention.
6. Rappel: Un type entier non sign´e est un type entier qui n’accepte que des valeurs positives ou nulles : il ne peut pas stocker de valeurs n´egatives. Pour d´eclarer des variables d’un type non sign´e, il suffit de faire pr´ec´eder le nom du type entier du mot-cl´eunsigned.
Comme pour la question pr´ec´edente, le compilateur ne signalera pas cette erreur et l’information sera p´erdu.
Exercice 2
Nom de la variable Validit´e
Fonction-1 Incorrect: contient le caract`ere sp´ecial -
limite inf Correct
MOYENNE du MOIS Incorrect: contient espace lim-sup´erieure Incorrect: contient le caract`ere sp´ecial -
Ondelette Correct, mais d´econseill´e break Incorrect : break est un mot cl´e
Exercice 3
On rappelle i¸ci les R`egles de conversions automatiques lors d’une op´eration avec,
• 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’´echelle suivante:
int, unsigned int, long, unsigned long
• un entier et un rationnel: Le type entier est converti dans le type du rationnel.
• deux rationnels:
L’ordinateur choisit le plus large des deux types selon l’´echelle suivante:
float, double, long double
• affectations et op´erateurs d’affectation:
Lors d’une affectation, le r´esultat est toujours converti dans le type de la destination. Si ce type est plus faible, il peut y avoir une perte de pr´ecision.
1. p est d’abord soumis `a la conversion implicite short−→int, avant d’ˆetere ajouter `a 5 (int). Le r´esultat 7 est de type int.
2. c est d’abord soumis `a la conversion implicite char−→int ce qui aboutit `a la valeur 69(int) avant d’ˆetre ajout´e `a la valeur 1(int). Le r´esultat 70 est de type int.
3. p est d’abord soumis `a la conversion implicite (automatique) short−→int, tandis que c est soumis `a la conversion sys´ematique char−→int; les r´esultats sont alors additionn´es pour aboutir `a la valeur 71 de type int.
4. p et c sont d’abord automatiquement en int; le r´esulat 144 est de type int.
Remarque: Le code minimale qui permet d’afficher le nombre entier associ´e `a la lettre ’E’ est:
#include<stdio.h>
main() {
printf(”%d”,’E’) ; }
Exercice 4
1. a=x+5 car l’op´erateur + est prioritaire sur l’op´erateur d’affectation =.
2. a=(x=y)+2 ici l’op´erateur + ´etant prioritaire sur =, les parenth`eses sont indispensables.
3. a=x==y car l’op´erteur == est prioritaire sur =.
4. a<b&&c<d ici l’op´erateur && est priotaire sur l’op´erateur <.
5. i++*(n+p) en effet l’op´erateur ++ est prioritaire sur *; en revanche, * est prioritaire sur +; de sorte qu’on ne peut ´eliminer les derni`eres parenth`eses.
Exercice 5
1. c est tout d’abord converti en int, avant d’ˆetre ajout´e `a n. Le r´esultat (10), de type int, est alors converti en long, avant d’ˆetre ajout´e `a p. On obtient finalement la valeur 1010, de type long.
2. On ´evalue d’abord la valeur de 2*x, en convetissant 2(int) en float, ce qui fournit la valeur 2.5 (de type float). Par ailleurs, c est conveti en int (convertion automatique). Pour effectuer l’addition, on convertit la enti`ere 5 de c en float, avant de l’ajouter au r´esultat pr´ec´edent. On obtient finalement la valeur 7.75, de type float.
3. n est tout d’abord convertit en char (`a cause de l’op´erateur de ”cast”), tandis que c est converti (conversion implicite) en int. Puis pour proc´eder `a l’addition, il est n´ecessaire de reconvertir la valeur de (char) n en int. Finalement, on obtient la valeur 10, de ce type int.
4. z est d’abord convertit en float, ce qui fournit la valeur 5.5. Par ailleurs, on proc`ede `a la division enti`ere de n par 2, ce qui fournit la valeur enti`ere 2. Cette derni`ere est ensuite convertie en float. Avant d’ˆetre ajout´ee `a 5.5, ce qui fournit la r´esultat 7.5, de type float.
Exercice 6
1. 1 2. 0
3. 5 (p%n vaut 4, tandis que p>n vaut 1).
4. 1 (p/n est d’abord ´evalu´e en int, ce qui fournit 1; puis le r´esultat est converti en float, avant d’ˆetre affect´e
` a x).
5. 1.8 (p est converti en float, avant d’ˆetre divis´e par le r´esultat de la conversion de n en float).
6. 1.9 (p est converti en float, avant d’ˆetre ajout´e `a 0.5; le r´esultat le r´esultat est divis´e par le r´esultat de la conversion de n en float).
7. 1 (p est convertit en float, avant d’ˆetre ajout´e `a 0.5; le r´esultat (5.5) est alors converti en int avant d’ˆetre divis´e par n).
8. 25 9. 45