Programmation C
Modularité - Correction des exercices
|
|

|
|

|
Exercice 1
long long factoriel(int n);
|
09-Exercice1-Module.h
|
#include "09-Exercice1-Module.h"
long long factoriel(int n) {
if (n == 0) {
return 1;
}
else {
return n * factoriel(n - 1);
}
}
|
09-Exercice1-Module.c
|
#include <stdio.h>
#include "09-Exercice1-Module.h"
int main(void) {
for (int i = 0; i < 20; i++) {
printf("%2d! = %18lld\n", i, factoriel(i));
}
return 0;
}
|
09-Exercice1-Main.c - 09-Exercice1-Main.exe
|
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
|
|
- Placement de la signature de la fonction factoriel dans le fichier .h du module
Absence de #indef ou de #pragma once -> non protection contre les inclusions multiples -> solution pas recommandée mais qui marche dans le cadre de cet exercice très simple
- Placement de la définition de la fonction factoriel dans le fichier .c du module
Inclusion par prudence du fichier .h du module pour éviter une éventuelle incohérence entre signature et définition
- Placement de la fonction main dans le fichier .c ad hoc
Inclusion obligatoire du fichier .h du module pour que la fonction factoriel ait été déclarée avant sa première utilisation (son premier appel)
|
Exercice 2
#ifndef ____EQUATIONSECONDDEGRE____
#define ____EQUATIONSECONDDEGRE____
typedef struct {
double a;
double b;
double c;
} equationSecondDegre;
double calculerY(equationSecondDegre e, double x);
void afficherEquationSecondDegre(equationSecondDegre e);
int calculerRacines(equationSecondDegre e, double* r1, double* r2);
#endif
|
09-Exercice2-EquationSecondDegre.h
|
#include <stdio.h>
#include <math.h>
#include "09-Exercice2-EquationSecondDegre.h"
double calculerY(equationSecondDegre e, double x) {
return e.a * x * x + e.b * x + e.c;
}
void afficherEquationSecondDegre(equationSecondDegre e) {
printf("f(x) = %lf x2 + %lf x + %lf", e.a, e.b, e.c);
}
static double calculerDelta(equationSecondDegre e) {
return e.b * e.b - 4.0 * e.a * e.c;
}
int calculerRacines(equationSecondDegre e, double* r1, double* r2) {
double delta = calculerDelta(e);
if (delta < 0.0) {
return 0;
}
if (delta < 0.0) {
*r1 = -e.b / (2.0 * e.a);
return 1;
}
double sqrtDelta = sqrt(delta);
*r1 = (-e.b - sqrtDelta) / (2.0 * e.a);
*r2 = (-e.b + sqrtDelta) / (2.0 * e.a);
return 2;
}
|
09-Exercice2-EquationSecondDegre.c
|
#include <stdio.h>
#include "09-Exercice2-EquationSecondDegre.h"
int main(void) {
equationSecondDegre eq = { 1.2,-2.3,-6.4 };
afficherEquationSecondDegre(eq);
printf("\n");
printf("\n");
printf("Pour x = %lf, f(x) = %lf\n", 2.3, calculerY(eq, 2.3));
printf("\n");
double r1;
double r2;
int nbRacines = calculerRacines(eq, &r1, &r2);
switch (nbRacines) {
case 0: {
printf("La fonction f n'a pas de racine reelle\n");
break;
}
case 1: {
printf("La fonction f a une racine reelle : %lf\n", r1);
printf("Pour x = %lf, f(x) = %lf\n", r1, calculerY(eq, r1));
break;
}
case 2: {
printf("La fonction f a deux racines reelles : %lf et %lf\n", r1, r2);
printf("Pour x = %lf, f(x) = %lf\n", r1, calculerY(eq, r1));
printf("Pour x = %lf, f(x) = %lf\n", r2, calculerY(eq, r2));
break;
}
}
return 0;
}
|
09-Exercice2-Main.c - 09-Exercice2-Main.exe
|
f(x) = 1.200000 x2 + -2.300000 x + 6.400000
Pour x = 2.300000, f(x) = 7.458000
|
|
- Fichier .h du module
- Placement du typedef définissant le type equationSecondDegre dans le fichier .h
- Placement des signatures des trois fonctions utilisées dans la fonction main
- Fichier .c du module
- Inclusion obligatoire du fichier .h car le typedef doit être connu
- Placement des trois fonctions dont la signature est dans le fichier .h
- Placement de la fonction calculerDelta en static car il ne s'agit pas d'une fonction explicitement destinée à être publique
- Fichier .c du programme principal
- Inclusion obligatoire du fichier .h du module
- Plus de nécessité d'inclure math.h
|
Exercice 3
#ifndef ____SOMMET____
#define ____SOMMET____
typedef struct {
double x;
double y;
double z;
} sommet;
double calculerDistance(sommet s1, sommet s2);
void afficherSommet(sommet s);
#endif
|
09-Exercice3-Sommet.h
|
#include <stdio.h>
#include <math.h>
#include "09-Exercice3-Sommet.h"
double calculerDistance(sommet s1, sommet s2) {
return sqrt(pow(s2.x - s1.x, 2.0) +
pow(s2.y - s1.y, 2.0) +
pow(s2.z - s1.z, 2.0));
}
void afficherSommet(sommet s) {
printf("(");
printf("%.3lf", s.x);
printf(",");
printf("%.3lf", s.y);
printf(",");
printf("%.3lf", s.z);
printf(")");
}
|
09-Exercice3-Sommet.c
|
#ifndef ____TRIANGLE____
#define ____TRIANGLE____
#include "09-Exercice3-Sommet.h"
typedef struct {
sommet s1;
sommet s2;
sommet s3;
} triangle;
double calculerPerimetre(triangle t);
double calculerAire(triangle t);
void afficherTriangle(triangle t);
#endif
|
09-Exercice3-Triangle.h
|
#include <stdio.h>
#include <math.h>
#include "09-Exercice3-Triangle.h"
#include "09-Exercice3-Sommet.h"
double calculerPerimetre(triangle t) {
return calculerDistance(t.s1, t.s2) +
calculerDistance(t.s2, t.s3) +
calculerDistance(t.s3, t.s1);
}
double calculerAire(triangle t) {
double s = calculerPerimetre(t) / 2.0;
double a = calculerDistance(t.s1, t.s2);
double b = calculerDistance(t.s2, t.s3);
double c = calculerDistance(t.s3, t.s1);
return sqrt(s * (s - a) * (s - b) * (s - c));
}
void afficherTriangle(triangle t) {
printf("(");
afficherSommet(t.s1);
printf(",");
afficherSommet(t.s2);
printf(",");
afficherSommet(t.s3);
printf(")");
}
|
09-Exercice3-Triangle.c
|
#include <stdio.h>
#include "09-Exercice3-Triangle.h"
int main(void) {
triangle t = { { -2.2,-0.3,6.4 },
{ 3.1,-2.3,4.1 },
{ 3.6, 2.7,0.4 } };
afficherTriangle(t);
printf("\n");
printf("Perimetre = %lf\n", calculerPerimetre(t));
printf("Aire = %lf\n", calculerAire(t));
printf("\n");
return 0;
}
|
09-Exercice3-Main.c - 09-Exercice3-Main.exe
|
((-2.200,-0.300,6.400),(3.100,-2.300,4.100),(3.600,2.700,0.400))
Perimetre = 21.222031
Aire = 19.067194
|
|
- Développement de deux modules
- sommet
- triangle
- Placement dans chacun des modules des fonctions dédiées à ces types
- Inclusion des fichiers .h nécessaires
|
Exercice 4
#pragma once
typedef struct {
double x;
double y;
double z;
} position;
|
09-Exercice4-Position.h
|
#pragma once
#include "09-Exercice4-Position.h"
typedef struct {
double rayon;
position centre;
} sphere;
|
09-Exercice4-Sphere.h
|
#include <stdio.h>
#include "09-Exercice4-Sphere.h"
int main(void) {
sphere sp = { 2.3,{ 1.1,-2.9,-4.8 } };
printf("%lf : %lf %lf %lf\n", sp.rayon, sp.centre.x, sp.centre.y, sp.centre.z);
return 0;
}
|
09-Exercice4-Main.c - 09-Exercice4-Main.exe
|
2.300000 : 1.100000 -2.900000 -4.800000
|
|
- Fichiers .c des deux modules inutiles car on n'implante que des déclarations sans jamais réaliser de définition
- Utilisation du #pragma once pour se prémunir des inclusions multiples
#pragma once
typedef struct {
double x;
double y;
double z;
} position;
double calculerDistance(position p1, position p2);
|
09-Exercice4-Position2.h
|
#include <stdio.h>
#include <math.h>
#include "09-Exercice4-Position2.h"
double calculerDistance(position p1, position p2) {
double dx = p2.x - p1.x;
double dy = p2.y - p1.y;
double dz = p2.z - p1.z;
return sqrt(dx * dx + dy * dy + dz * dz);
}
|
09-Exercice4-Position2.c
|
#pragma once
#include <stdbool.h>
#include "09-Exercice4-Position2.h"
typedef struct {
double rayon;
position centre;
} sphere;
bool testerExistenceIntersection(sphere sp1, sphere sp2);
|
09-Exercice4-Sphere2.h
|
#include <stdio.h>
#include <stdbool.h>
#include "09-Exercice4-Sphere2.h"
#include "09-Exercice4-Position2.h"
bool testerExistenceIntersection(sphere sp1, sphere sp2) {
return (calculerDistance(sp1.centre, sp2.centre) <= sp1.rayon + sp2.rayon);
}
|
09-Exercice4-Sphere2.c
|
#include <stdio.h>
#include <stdbool.h>
#include "09-Exercice4-Sphere2.h"
int main(void) {
sphere sp1 = { 2.3,{ 1.1,-1.9,-2.8 } };
sphere sp2 = { 3.3,{ 3.1, 2.9,-1.8 } };
sphere sp3 = { 4.1,{ 3.1, 2.9, 4.8 } };
printf("sp1 : %lf : %lf %lf %lf\n", sp1.rayon, sp1.centre.x, sp1.centre.y, sp1.centre.z);
printf("sp2 : %lf : %lf %lf %lf\n", sp2.rayon, sp2.centre.x, sp2.centre.y, sp2.centre.z);
printf("sp3 : %lf : %lf %lf %lf\n", sp3.rayon, sp3.centre.x, sp3.centre.y, sp3.centre.z);
if (testerExistenceIntersection(sp1, sp2) == true) {
printf("Les spheres sp1 et sp2 ont une intersection\n");
}
else {
printf("Les spheres sp1 et sp2 n'ont pas d'intersection\n");
}
if (testerExistenceIntersection(sp1, sp3) == true) {
printf("Les spheres sp1 et sp3 ont une intersection\n");
}
else {
printf("Les spheres sp1 et sp3 n'ont pas d'intersection\n");
}
return 0;
}
|
09-Exercice4-Main2.c - 09-Exercice4-Main2.exe
|
sp1 : 2.300000 : 1.100000 -1.900000 -2.800000
sp2 : 3.300000 : 3.100000 2.900000 -1.800000
sp3 : 4.100000 : 3.100000 2.900000 4.800000
Les spheres sp1 et sp2 ont une intersection
Les spheres sp1 et sp3 n'ont pas d'intersection
|
|
- Création d'un fichier .c pour sphere car il faut développer une fonction de test de l'intersection de deux sphères
- Création d'un fichier .c pour position car il faut développer une fonctio de calcul de la distance existant entre deux positions
- Ajout des signatures des fonctions aux fichiers .h
|
Exercice 5
#pragma once
typedef struct {
unsigned char r;
unsigned char v;
unsigned char b;
} couleur;
extern const couleur NOIR;
extern const couleur ROUGE;
extern const couleur VERT;
extern const couleur BLEU;
extern const couleur CYAN;
extern const couleur MAGENTA;
extern const couleur JAUNE;
extern const couleur BLANC;
|
09-Exercice5-Couleur.h
|
#include "09-Exercice5-Couleur.h"
const couleur NOIR = { 0x00,0x00,0x00 };
const couleur ROUGE = { 0xFF,0x00,0x00 };
const couleur VERT = { 0x00,0xFF,0x00 };
const couleur BLEU = { 0x00,0x00,0xFF };
const couleur CYAN = { 0x00,0xFF,0xFF };
const couleur MAGENTA = { 0xFF,0x00,0xFF };
const couleur JAUNE = { 0xFF,0xFF,0x00 };
const couleur BLANC = { 0xFF,0xFF,0xFF };
|
09-Exercice5-Couleur.c
|
#include <stdio.h>
#include "09-Exercice5-Couleur.h"
int main(void) {
printf("%02X %02X %02X\n", NOIR.r, NOIR.v, NOIR.b);
printf("%02X %02X %02X\n", JAUNE.r, JAUNE.v, JAUNE.b);
return 0;
}
|
09-Exercice5-Main.c - 09-Exercice5-Main.exe
|
|
- Utilisation de déclarations extern dans le fichier .h
|
Exercice 6
#pragma once
typedef enum {
ROI = 1,
REINE = 2,
FOU = 3,
TOUR = 4,
CAVALIER = 5,
PION = 6
} codePiece;
|
09-Exercice6-CodePiece.h
|
#include <stdio.h>
#include "09-Exercice6-CodePiece.h"
int main(void) {
codePiece roster[16] = { ROI, REINE, FOU, FOU, TOUR, TOUR, CAVALIER, CAVALIER,
PION, PION, PION, PION, PION, PION, PION, PION };
for (int i = 0; i < 16; i++) {
printf("%2d",roster[i]);
}
printf("\n");
return 0;
}
|
09-Exercice6-Main.c - 09-Exercice6-Main.exe
|
1 2 3 3 4 4 5 5 6 6 6 6 6 6 6 6
|
|
|
Exercice 7
#pragma once
typedef struct {
char *nom;
int numeroMaillot;
char* licence;
} joueur;
|
09-Exercice7-Joueur.h
|
#pragma once
#include "09-Exercice7-Joueur.h"
typedef struct {
char *nom;
int nbJoueurs;
joueur* joueurs;
} equipe;
|
09-Exercice7-Equipe.h
|
#pragma once
typedef struct {
int jour;
int mois;
int annee;
} date;
|
09-Exercice7-Date.h
|
#pragma once
#include <stdbool.h>
typedef struct {
int minute;
int numeroMarqueur;
int numeroEquipe;
bool csc;
} but;
|
09-Exercice7-But.h
|
#pragma once
#include "09-Exercice7-But.h"
typedef struct {
int nombreButsEquipe1;
int nombreButsEquipe2;
but* butsEquipe1;
but* butsEquipe2;
} resultat;
|
09-Exercice7-Resultat.h
|
#pragma once
#include "09-Exercice7-Equipe.h"
#include "09-Exercice7-Date.h"
#include "09-Exercice7-Resultat.h"
typedef struct {
equipe equipe1;
equipe equipe2;
date dateMatch;
resultat resultatMatch;
} feuilleDeMatch;
|
09-Exercice7-FeuilleDeMatch.h
|
#include <stdio.h>
#include "09-Exercice7-FeuilleDeMatch.h"
int main(void) {
feuilleDeMatch fdm;
printf("%zu octets\n",sizeof(fdm));
return 0;
}
|
09-Exercice7-Main.c - 09-Exercice7-Main.exe
|
|
|
Exercice 8
#include <stdio.h>
#include <stdlib.h>
#include "09-Exercice8-FileDeDouble.h"
int main(void) {
fileDeDouble* f = creerFileDeDouble();
if (f != NULL) {
printf("Ajout : ");
for (int i = 0; i < 6; i++) {
double v = (rand() % 100) / 10.0;
printf("%4.1lf", v);
if (!faireEntrer(v, f)) {
printf("!");
}
}
printf("\n");
printf("Retrait : ");
for (int i = 0; i < 4; i++) {
double v;
if (faireSortir(&v, f) == true) {
printf("%4.1lf", v);
}
}
printf("\n");
printf("Ajout : ");
for (int i = 0; i < 6; i++) {
double v = (rand() % 100) / 10.0;
printf("%4.1lf", v);
if (!faireEntrer(v, f)) {
printf("!");
}
}
printf("\n");
printf("Retrait : ");
for (int i = 0; i < 5; i++) {
double v;
if (faireSortir(&v, f) == true) {
printf("%4.1lf", v);
}
}
printf("\n");
printf("Ajout : ");
for (int i = 0; i < 9; i++) {
double v = (rand() % 100) / 10.0;
printf("%4.1lf", v);
if (!faireEntrer(v, f)) {
printf("!");
}
}
printf("\n");
printf("Retrait : ");
for (int i = 0; i < 5; i++) {
double v;
if (faireSortir(&v, f) == true) {
printf("%4.1lf", v);
}
}
printf("\n");
printf("Retrait : ");
while (!etreVide(f)) {
double v;
if (faireSortir(&v, f) == true) {
printf("%4.1lf", v);
}
}
printf("\n");
printf("Ajout : ");
for (int i = 0; i < 9; i++) {
double v = (rand() % 100) / 10.0;
printf("%4.1lf", v);
if (!faireEntrer(v, f)) {
printf("!");
}
}
printf("\n");
detruireFileDeDouble(f);
printf("\n\n");
}
return 0;
}
|
09-Exercice8-Main.c - 09-Exercice8-Main.exe
|
|
|