C Corrige Exercices

Embed Size (px)

Citation preview

Med EL Assad

PROGRAMMATION EN C CORRIGES EXERCICES

Anne universitaire 2007-2008

1/139

Med EL Assad Chapitre 2: NOTIONS DE BASE Exercice 2.1En Pascal, il existe des fonctions et des procdures En C, il existe seulement des fonctions. (Les fonctions fournissant le rsultat void correspondent aux procdures de Pascal.)

il existe une structure spciale program pour la fonction principale main est excute automatiquement la dfinition du programme principal lors de l'appel du programme les blocs d'instructions sont dlimits par les blocs d'instructions sont dlimits par

begin ... endles commentaires sont dlimits par (* ... *) ou { ... } les points-virgules sparent les instructions simples l'intrieur d'un bloc d'instructions

{ ... }les commentaires sont dlimits par

/* ... */les points-virgules marquent la fin de toutes les instructions simples

Exercice 2.2fonction-1pas accept (contient le caractre spcial '-' )

_MOYENNE_du_MOIS_ accept 3e_jour pas accept (chiffre au dbut de l'identificateur) limite_inf. lim_suprieure __A_ _ a 3pas accept (contient le caractre spcial '.' ) pas accept (contient le caractre spcial '' ) accept accept accept pas accept (chiffre au dbut de l'identificateur)

Exercice 2.3Voici une des solutions possibles:

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

Exercice 2.4sq. d'chapp. descr. anglaise descr. franaise

\n \t

new line tabulator

passage la ligne tabulation

Anne universitaire 2007-2008

2/139

Med EL Assad\b \r \" \\ \0 \a backreturn back-slash NUL attention (bell) curseur arrire retour au dbut de la ligne trait oblique fin de chane signal acoustique

quotation marks guillemets

Exercice 2.5#include /* Ce programme calcule la somme de 4 nombres entiers introduits au clavier. */ main() { int NOMBRE, SOMME, COMPTEUR; /* Initialisation des variables */ SOMME = 0; COMPTEUR = 0; /* Lecture des donnes */ while (COMPTEUR < 4) { /* Lire la valeur du nombre suivant */ printf("Entrez un nombre entier :"); scanf("%i", &NOMBRE); /* Ajouter le nombre au rsultat */ SOMME += NOMBRE; /* Incrmenter le compteur */ COMPTEUR++; } /* Impression du rsultat */ printf("La somme est: %i \n", SOMME); return 0; }Solution: - Commande au compilateur: #include pour pouvoir utiliser les fonctions printf et scanf. - Fonction main n'a pas de paramtres (la liste des paramtres est vide) et fournit par dfaut un rsultat du type int ( l'environnement). - Commentaires (mis en italique). - Variables utilises: NOMBRE, SOMME, COMPTEUR dclares comme entiers (type int). - Fonctions utilises: printf, scanf de la bibliothque . - Oprateurs: += oprateur arithmtique d'affectation ++ oprateur arithmtique < oprateur de comparaison = oprateur d'affectation - Structure de contrle: while() { ... } rpte le bloc d'instructions aussi longtemps que la est remplie. - L'instruction return 0;

Anne universitaire 2007-2008

3/139

Med EL Assadretourne la valeur zro comme code d'erreur l'environnement aprs l'excution du programme Ajoutes : - la fonction scanf est appele avec deux paramtres: le format de saisie de la donne (ici: "%i" pour lire un entier du type int) l'adresse de la variable destination (ici: l'adresse de NOMBRE). - la fonction printf est appele avec un respectivement avec deux paramtres: le premier paramtre est une chane de caractres, qui peut contenir une information pour le format d'affichage des variables indiques dans la suite (ici: "%i" pour afficher la valeur du type int contenue dans SOMME). les paramtres qui suivent la chane de caractres indiquent les noms des variables afficher. (ici: SOMME)

Anne universitaire 2007-2008

4/139

Med EL Assad Chapitre 3: TYPES DE BASE, OPRATEURS ET EXPRESSIONS Exercice 3.1#include /* Ce programme calcule la somme de 4 nombres entiers introduits au clavier. */ main() { int NOMBRE, SOMME, COMPTEUR; /* Initialisation des variables */ SOMME = 0; COMPTEUR = 0; /* Lecture des donnes */ while (COMPTEUR < 4) { /* Lire la valeur du nombre suivant */ printf("Entrez un nombre entier :"); scanf("%i", &NOMBRE); /* Ajouter le nombre au rsultat */ SOMME += NOMBRE; /* Incrmenter le compteur */ COMPTEUR++; } /* Impression du rsultat */ printf("La somme est: %i \n", SOMME); return 0; }Solution: - Commande au compilateur: #include pour pouvoir utiliser les fonctions printf et scanf. - Fonction main n'a pas de paramtres (la liste des paramtres est vide) et fournit par dfaut un rsultat du type int ( l'environnement). - Commentaires (mis en italique). - Variables utilises: NOMBRE, SOMME, COMPTEUR dclares comme entiers (type int). - Fonctions utilises: printf, scanf de la bibliothque . - Oprateurs: += oprateur arithmtique d'affectation ++ oprateur arithmtique < oprateur de comparaison = oprateur d'affectation - Structure de contrle: while() { ... } rpte le bloc d'instructions aussi longtemps que la est remplie. - L'instruction return 0; retourne la valeur zro comme code d'erreur l'environnement aprs l'excution du programme Ajoutes : - la fonction scanf est appele avec deux paramtres: le format de saisie de la donne (ici: "%i" pour lire un entier du type int) l'adresse de la variable destination (ici: l'adresse de NOMBRE).

Anne universitaire 2007-2008

5/139

Med EL Assad- la fonction printf est appele avec un respectivement avec deux paramtres: le premier paramtre est une chane de caractres, qui peut contenir une information pour le format d'affichage des variables indiques dans la suite (ici: "%i" pour afficher la valeur du type int contenue dans SOMME). les paramtres qui suivent la chane de caractres indiquent les noms des variables afficher. (ici: SOMME)

Exercice 3.2Traduisez les dclarations suivantes en C, sachant que vous travaillerez dans les ensembles de nombres indiqus. Choisissez les types les plus conomiques, sans perdre en prcision. Solution:

(1) entier COMPTEUR {0 ,..., 300} int COMPTEUR; (2) entier X,Y char X,Y; (3) entier MESURE int MESURE; (4) rel SURFACE1 (5) rel SURFACE2 (6) entier N1 int N1; (7) entier N2 int N2; (8) entier N3 long N3; (9) entier N4 double N4; (10) boolen TROUVE int TROUVE; {-1280 ,..., 1285} = {-1 ,..., 3.4*1010} 11 positions significatives {vrai, faux} par convention {0 ,..., 326} = {0 ,..., 1 073 741 824} {-47 ,..., 47} = {-16384 ,..., 16384} {0.5 ,..., 150075} {-12 ,..., 1500750.5} {0 ,..., 210} = {0 ,..., 1024} float SURFACE1; 6 positions significatives double SURFACE2; 8 positions significatives {-10 ,..., 104} {-120 ,..., 100}

Exercice 3.3base dcimale base octale base hexadcimale reprs. binaire

1016 8100 43690 585 51966 10000 156

01770 017644 0125252 01111 0145376 023420 0234

0X3F8 0X1FA4 0XAAAA 0X249 0XCAFE 0X2710 0X9C

1111111000 1111110100100 1010101010101010 1001001001 1100101011111110 10011100010000 10011100

Exercice 3.4 Anne universitaire 2007-2008 6/139

Med EL AssadDonne Type (si correct) Valeur / Erreur

12332 23.4 345lu 34.5L -1.0 0xeba 0123l '\n'

int double long double double int long char

12332 23.4 dclaration correcte: 345ul 34.5 -1.0 10+11*16+14*256 = 3770 3+2*8+1*64 = 83 val. dpend de la machine (ASCII: 10) 'unsigned' seulement pour des entiers -0.1 0 => octal; 'FE' seulement pour hexa. 40000 40000 10 val. dpend de la machine (ASCII: 48) apostrophes manquent valeur en gnral zro valeur zro val. dpend de la machine (ASCII: 79) 67 apostrophes manquent 1+0*8+0*64+1*512 = 513 0

1.23ul -1.0e-1 double 0FE0 40000 long

40000u unsigned int 1e1f '0' o '\0' 0 'O' 67e0 \r 01001 0.0l 0XEUL float char char int char double int long double

70000u unsigned long 70000

unsigned long 14

Exercice 3.5Evaluer les expressions suivantes en supposant

A=20 B=5 C=-10 D=2 X=12 Y=15 (1) (5*X)+2*((3*B)+4) -> 98 (2) (5*(X+2)*3)*(B+4) (3) A == (B=5) (4) A += (X+5) (5) A != (C *= (-D)) (6) A *= C+(X-D) (7) A %= D++ (8) A %= ++D (9) (X++)*(A+C) (10) A = X*(B 0 -> 37 -> 0 -> 0 -> 0 -> 2 -> 120 -> 0+15 = 15 -> !0||1 = 1

/ / B=5 A=37 C=20 A=0 D=3 A=0 D=3 A=2 X=13 A=15 /

Anne universitaire 2007-2008

7/139

Med EL Assad(12) A&&B||!0&&C&&!D (13) ((A&&B)||(!0&&C))&&!D -> 1||1&&1&&0 = 1 -> (1||1)&&0 = 0 / /

(14) ((A&&B)||!0)&&(C&&(!D)) -> (1||1)&&(1&&0) = 0 /

Exercice 3.6(1) (5*X) + 2*((3*B)+4) (2) (5*(X+2)*3)*(B+4) (3) A == (B=5) (4) A += (X+5) (5) A != (C *= (-D)) (6) A *= C + (X-D) (7) A %= D++ (8) A %= ++D (9) (X++) * (A+C) (11) !(X-D+C)||D (12) A&&B||!0&&C&&!D (13) ((A&&B)||(!0&&C))&&!D 5*X + 2*(3*B+4) 5*(X+2)*3*(B+4) / A += X+5 A != (C *= -D) A *= C + X-D / / X++ * (A+C) / / (A&&B||!0&&C)&&!D

(10) A = X*(BB) printf ("premier choix \n"); else if (A>10) printf ("deuxime choix \n"); if (BB) if (A>10) printf ("premier choix \n"); else if (BB) et (A>10)

"deuxime choix" apparat pour (10 A>B) "troisime choix" apparat pour (10 A>B 10) et (A=B)10>10 impossible A>B et A=B impossible => "troisime choix" n'apparat jamais

"quatrime choix" apparat pour (10 A>B 10) et (A B)10>10 impossible => "quatrime choix" n'apparat jamais c) On n'obtient pas de rponses pour (A B). Si (A>B) alors la construction if - else if - ... - else garantit que toutes les combinations sont traites et fournissent un rsultat.

Exercice 5.3a) if - else et une variable d'aide MAX

#include main() { int A, B, C; int MAX; printf("Introduisez trois nombres entiers :"); scanf("%i %i %i", &A, &B, &C); if (A>B) MAX=A; else MAX=B; if (C>MAX) MAX=C; printf("La valeur maximale est %i\n", MAX); return 0; }b) if - else if - ... - else sans variable d'aide

int A, B, C; printf("Introduisez trois nombres entiers :"); scanf("%i %i %i", &A, &B, &C); printf("La valeur maximale est "); if (A>B && A>C) printf("%i\n",A); else if (B>C) printf("%i\n",B); else printf("%i\n",C);c) oprateurs conditionnels et une variable d'aide MAX

int A, B, C; int MAX;

Anne universitaire 2007-2008

16/139

Med EL Assadprintf("Introduisez trois nombres entiers :"); scanf("%i %i %i", &A, &B, &C); MAX = (A>B) ? A : B; MAX = (MAX>C) ? MAX : C; printf("La valeur maximale est %i\n", MAX);d) oprateurs conditionnels sans variable d'aide

int A, B, C; printf("Introduisez trois nombres entiers :"); scanf("%i %i %i", &A, &B, &C); printf("La valeur maximale est %i\n", (A>((B>C)?B:C)) ? A : ((B>C)?B:C));

Exercice 5.4#include main() { /* Tri par ordre dcroissant de trois entiers en changeant les valeurs */ int A, B, C, AIDE; printf("Introduisez trois nombres entiers :"); scanf("%i %i %i", &A, &B, &C); printf("Avant le tri : \tA = %i\tB = %i\tC = %i\n", A, B, C); /* Valeur maximale -> A */ if (A