Université Sultan Moulay Slimane
École Nationale des Sciences Appliquées de Khouribga
Département Mathématiques Informatique
Projet-Informatique | Programmation en langage C
• Réalisateurs
Pr. Mostafa SAADI Enseignant-Chercheur à ENSA Khouribga, USMS ENCADRANT
Mr. Youssef ISLAHI Élève-Ingénieur d'État - SECTION II, GROUPE 4 AUTEUR
• Remerciement
Avant de passer au corps du projet, il est tellement indispensable d'exprimer les sincères remerciements
à notre Professeur du cours : Prof. M. SAADI, ainsi qu'aux Enseignants responsables aux Travaux
Pratiques : Prof. S. MHAMMEDI - Prof. H. EL MASSARI suite à leurs eorts qui étaient faits
pendant toutes les sessions théoriques et toutes les séances des Travaux Pratiques relatifs au module
de la programmation en langage C.
• Introduction
La notion d'informatique qu'on la dénit comme une théorie de traitement rationnel des données
par l'exécution automatique des machines, est devenue de nos jours un outil énorme de progrès et
de développement. Ainsi qu'elle pourrait être précisée comme le support de nos connaissances et
nos communications quel que soit le domaine (scientique,technique,sociales ou économique) ; où le
changement qui a été vu au niveau du monde entier devient de l'apparition de celle-ci puisqu'elle nous
a permis de faciliter la vie et d'avoir une autre vision aux compétences humaines, surtout aux gens qui
avaient pris la recherche comme étant le bon chemin permettant de découvrir les secrets du cerveaux
humaines et sa puissance incroyable. Ces personnes ont choisi le nom des informaticiens comme leur
représentant qui est en fait nous signale des exemples qui méritent vraiment un grand remerciement
suite à leur rôle joué pour la gradation croissante de l'univers. Celle-là, est décomposé en pas mal de
branche qui sont toutes d'une haute importance notamment la programmation qui permettait de
résoudre nombreux problèmes qui ont été considérés comme obstacles devant l'amélioration de notre
communauté, ainsi que la réorganisation de méthodologie de recherche scientique.
La programmation, que l'on peut même appeler codage est spéciée par l'ensemble des instruc-
tions qui servent à former les programmes informatiques voulu. Ceci ne pourra jamais être réalisé
sans avoir un langage de programmation par lequel l'écriture se traite. On en déduit donc que la
programmation n'est rien autre que la rédaction du text représentant les activités composant un code
créé qui se matérialise sous la forme des chiers dont les contenus sont des caractères codés en code
ASCII par exemple, et ils sont reconnus en informatique par les chiers texte.
Actuellement, parmi les langages qui sont fortement utilisés est le langage C qui a été inventé au
début des années 1970 pour réécrire le système d'exploitation UNIX, par ses créateurs à savoir Dennis
Ritchie et Ken Thompson.
1
• Résumé :
La réalisation des activités scientiques est considérée comme étant un outil essentiel pour mettre en
pratique la partie théorique ; où elle est vraiment la main guidant à la participation au développement
en partageant celles-là qui pourront être des articles concernant des sujets de recherche, des synthèses
ou autres. Pour cela, nous avons pris l'initiative d'en introduire en ce qui concerne les structures et
les tableaux par le langage C en faisant appel à toutes les notions qui lui correspondent.
Vu le rôle important de la rédaction du rapport expliquant le projet en question, on a choisi comme
éditeur du texte un langage professionnel au traitement des documents scientique, à savoir langage
LATEX. Pour que l'écriture de celui-là soit réalisée d'une façon purement professionnelle. le chier
d'extension .tex (texte source) est mis à la disposition des lecteurs, et il pourra se récupérer en
contactant les réalisateurs.
• Mots Clés :
• Structure • Champ • Polynôme • Point • Pointeur • Variable • Fonction
• Tableau
EXERCICE 1 : MANIPULATION DES POLYNÔMES
• Analyse du problème :
Il s'agit de créer des procédures dont l'objectif consiste à manipuler les polynôme en utilisant le
langage C. C'est-à-dire que nous allons dénir et déclarer des fonction sans valeur de retour et
qui ont les traitements suivants :
une procédure NulPoly renvoyant en paramètre le polynôme nul.
une procédure SaisiePoly permettant d'entrer au clavier le degré et les coecients
d'un polynôme P passé en paramètre.
une procédure VoirPoly achant l'expression de P(x), P étant un polynôme donné en
paramètre.
une fonction EvalPoly calculant la valeur de P(x), le réel x et le polynôme P étant
passés en paramètres. (Il ne s'agit pas d'une procédure dans ce cas)
une procédure AddPoly calculant la somme de deux polynômes P et Q.
une procédure MultPoly calculant le produit de deux polynômes P et Q.
• Question 1 :
Solution du problème :
La manipulation du problème en question, pourra être faite en suivant le procédé suivant :
• Il faut d'abord mettre le prototype de la fonction en signalant le mot clé " void " puisqu'il s'agit
d'une procédure,puis nous mettons son identicateur, ainsi que son paramètre formel.
• Après avoir fait deux accolades, l'une ouvrante et l'autre fermante, on passe au corps de la
fonction qui contient les traitements souhaités. Pour ce faire, nous aectons a priori le degré dont la
valeur vaut -1 dans ce cas-là. Par suite, on construit les coecients qui sont tous nuls, tout en
faisant appel à une structure répétitive.
2
Figure 1 Code du programme 1
• Question 2 :
Solution du problème :
L'écriture de la procédure demandée, peut être réalisée en suivant cet algorithme :
• Nous devons d'abord faire la déclaration de celle-ci, ça veut dire que l'on met " void " car elle ne
retourne aucune valeur, et puis nous signalons son identicateur en y joignant par l'argument qui
sera elle passé.
• En suite, on passe à la dénition de la fonction qui contient les instructions ramenant au
traitement souhaité, à savoir : permet l'utilisateur de saisir un polynôme. Pour ce faire, nous allons
lui demander la saisie du degré au premier temps. Par la suite, on fera appel à une structure
répétitive " for " pour lui permettre d'entrer tous les coecients du polynôme qu'il a choisi.
• Finalement, il ne reste que la lecture des données en utilisant la fonction prédénie "scanf".
Figure 2 Code du programme 2
3
• Question 3 :
Solution du problème :
Le procédé que nous utiliserons est donné ainsi :
• Comme nous avons dit, il faut toujours commencer par la mise du prototype de la fonction traitée.
Tout en respectant ses éléments qui sont : type de retour (C'est " void " dans ce cas-là), le nom et
les arguments.
• Par la suite, il est évident qu'il faut mettre le corps de la fonction, qui sert à l'achage de
l'expression d'un polynôme P(x) ; où P est un polynôme passé en paramètre. Alors ceci nous pousse
à utiliser la fonction "printf" en tenant compte de la gestion d'achage, c'est-à-dire que nous allons
déclarer un indice courant "i" associé à la boucle servant de parcourir tous les coecients qui seront
achés, et on leur accède par l'opérateur . en écrivant p->coe[i]. Cependant, il faut remédier au
problème de l'achage du signe "+" à la n, donc nous devrons traiter le dernier coecient à part.
• En n, on ache le résultat en faisant appel à la fonction dite auparavant. ("printf")
Figure 3 Code du programme 3
• Question 4 :
Solution du problème :
Une méthode pour résoudre le problème dont on veut écrire un code, est donnée comme suit :
• La déclaration de la fonction en mettant la syntaxe suivante : void voirPoly2_(pol p)
• Après avoir fait deux accolades, pour signaler le passage au corps de la fonction. On met les
instructions du traitement voulu qui sont : la déclaration d'une variable intermédiaire qui vert de
calculer la somme, ceci devient du fait que le calcul de l'image P(x) d'un réel x, revient à faire une
somme. D'où, c'est celle-là qui va contenir l'achèvement qu'on devra montrer à l'utilisateur.
• Il en découle une valeur nale qui est en fait la valeur P(x) à acher à l'aide de l'outil "printf"
4
Figure 4 Code du programme 4
• Question 5 :
Solution du problème :
Ci-joint un chemin à suivre pour coder le programme voulu :
• Tout d'abord, on doit mettre le prototype de la fonction suivant la syntaxe du langage C,
c'est-à-dire : void AddPoly(pol p1, pol p2, pol* p) Il donc évident que notre procédure a trois
éléments comme des arguments, ainsi qu'elle n'a pas de valeur à retourner. Son identicateur étant
précisé par le mot : "AddPoly"
• Puis, il vient alors la deuxième partie contenant le traitement dont on a besoin. Pour ce faire, il
faudra revenir à la dénition de la somme de deux polynôme. En eet, le degré du polynôme
résultant est caractérisé par la formule mathématique : deg(P+Q) <= Max(deg(P),deg(Q)). Alors,
la meilleure solution pour remédier à ce problème est de choisir le plus grand degré en faisant
l'instruction suivante : int degremax = (p1.degre>p2.degre) ?p1.degre :p2.degre ; qui permettra
d'aecter le champ- premier degré en y accédant par l'opérateur "." s'il est le plus grand, et elle
aecte l'autre champ sinon. A ce moment-là, il nous reste les coecients qui sont obtenus en
sommant élément par élément.
• la dernière étape consiste à acher le polynôme-somme en faisant appel à une fonction qui a déjà
été déclarée.
Figure 5 Code du programme 5
5
• Question 6 :
Solution du problème :
Pour remédier au problème en question, nous proposons l'algorithme suivant :
• On commence toujours par le prototype de la fonction avec la syntaxe dite auparavant.
• Après avoir mis deux accolades, l'une ouvrante et l'autre fermante, nous faisons la dénition de la
fonction souhaitée qui nous pousse à faire un rappel mathématique à propos du produit des
polynôme ; où on a une formule explicite qui va nous aider à écrire le code de notre programme. En
eet, si P et Q sont deux polynôme dont les degrés sont respectivement n et p, alors :
n+p
X k
X
( ai bk−i )X k
k=0 i=0
.
Figure 6 Code du programme 6
• Question 6 :
Fonction Principale :
Il s'agit d'écrire une fonction principale " main " dont nous testerons les fonctions qu'on a
programmé. On en déduit donc qu'il faudra déclarer un pointeur noté "P" qui pointe vers le type
"pol". Autrement dit, *P est une variable de type structure "pol", par suite on l'initialise en lui
aectant l'adresse d'une variable déclarée comme étant une structure de deux champs. Puis, nous
faisons encore une déclaration deux autres variables du même type que celle-là puisque nous aurons
besoin de les utiliser comme des paramètres formels de certaines fonctions. Ci-joint un exemple
illustrant tout ce qu'on a dit :
6
Figure 7 Code de la Fonction Principale
Figure 8 Suite du code précédent
Si l'on veut démarrer le teste de ces programmes, on aurait le résultat ci-dessous :
7
Figure 9 Résultat des Codes
EXERCICE 2 : CALCUL SUR LES POINTS DANS LE PLAN
• Question 1 :
On ne peut pas utiliser un tableau parce que les informations descriptives d'un point ne sont pas du
même type. En eet, la première est de type caractère (char). Par contre, les deux restant sont des
réels (oat)
• Question 2 :
Analyse du problème :
Dans cette question, on désire écrire une fonction ayant une valeur de retour de type réel (oat)
et elle a comme but, le calcul de la distance entre deux points passés en paramètres. Ce qui
peut être fait aisément en mettant en pratique une propriété mathématique tout en utilisant
8
les coordonnées de chaque point qui sont en fait modélisées par les champs des structures
correspondantes à ceux-ci.
Solution du problème :
En eet, on sait que s'il y a deux points A(x,y) et B(x',y') alors la distance entre eux est
donnée par : p
(x − x0 )2 + (y − y 0 )2
Dans notre cas, x = p1.x, x' = p2.x, y = p1.y et y' = p2.y
Or, nous avons besoin d'appeler deux fonctions prédénies, à savoir : "pow" "sqrt" Alors, il
obligatoire d'inclure la bibliothèque <math.h> pour qu'on puisse les proter.
Figure 10 Code du programme 1_EX : 2
• Question 3 :
Analyse du problème :
On se propose coder une fonction par laquelle, on détermine la nouvelle position d'un point qui
se déplace dans le plan. Sachant que celui-ci, fait une translation de dx sur l'axe des abscisses
et une autre de dy sur des ordonnés.
Solution du problème :
Pour faire la traitement souhaité, on déclare la fonction discutée, puis on passe à son corps ;
où nous allons changer les cordonnées du point qui a été passé en paramètre par l'utilisateur,
et pour qu'on puisse faire ce changement correctement, nous devrons forcément utiliser le
passage par adresse, ça veut dire qu'il faudra le passer comme étant un pointeur. Ceci, devient
du fait qu'une fonction en langage C n'a pas le droit de réagir sur les variables d'une autre
fonction !
Figure 11 Code du programme 2_EX : 2
9
• Question 4 :
Analyse du problème :
Cette fois-ci, il est demander d'écrire une fonction dont l'objectif consiste de calculer le produit
scalaire de deux vecteurs en les donnant en paramètres de celle-ci. Ça revient donc à proter
du fait que le produit scalaire est obtenu en multipliant leurs coordonnées une par une, par
suite, nous ferons leur somme
Solution du problème :
Il ne reste que l'accès aux coordonnées de chaque vecteur qui sont des champs de deux
structures. Du coup, on utilisera l'opérateur "." à n de les récupérer.
Figure 12 Code du programme 3_EX : 2
• Question 5 :
Analyse du problème :
Il s'agit de programmer une fonction permettant de vérier la colinéarité de trois point passés
en paramètres par l'utilisateur. Alors, on se ramène dans le cas d'un problème mathématique
que nous pouvons résoudre en se rappelant la fait que trois points A, B et C sont colinéaires
si et seulement si le vecteur engendré par A et B est proportionnel au vecteur engendré par A
et C ; avec un coecient de proportionnalité égal à : AB/AC
Solution du problème :
On commence par déclarer une variable auxiliaire jouant le rôle du coecient signalé aupara-
vant. Puisque ce dernier est obtenu en divisant deux normes ou bien deux distance, alors c'est
le bon moment de faire appel à la fonction que nous avions déjà créé, à savoir : celle reconnue
par l'identicateur "distance". Mais, il faut également tenir compte de la valeur nulle qui ne
doit pas être au niveau du dénominateur ! Ensuite, on distingue deux cas en faisant appel à une
structure conditionnelle ; où notre fonction retournera la valeur 1 s'il y a la proportionnalité,
et la valeur 0 sinon.
10
Figure 13 Code du programme 4_EX : 2
• Question 6 :
Analyse du problème :
On vise établir un programme qui sert à donner l'équation cartésienne d'une droite passant
par deux points connus et passés en paramètres de la fonction que on va écrire. Certes, une
droite est caractérisée par l'équation suivant y = ax + b ; avec : a et b sont des réels qui
peuvent être déterminés en appliquant quelques règles mathématiques.
Solution du problème :
Dans un premier temps, on détermine le coecient directeur en accédant aux champs des
structures en question. Par suite, on trouve immédiatement l'autre élément. Il en résulte donc
l'équation cartésienne a bien été déterminée, et il ne reste que l'acher à l'utilisateur.
Figure 14 Code du programme 5_EX : 2
• Question 7 :
Analyse du problème :
11
Nous sommes arrivés à une fonction par laquelle, on vérie qu'un triangle est rectangle en un
point ou pas. Alors, on sait déjà qu'un triangle est rectangle si est seulement sin le théorème
de Pythagore reste valable si l'on y applique.
Solution du problème :
Trois cas sont à distinguer, en utilisant la structure conditionnelle " if ". La propriété dont
on a besoin ne peut jamais utilisée sans calclu des distance, d'où nous devrons faire appel à
une autre fonction servant de faire ce traitement. Dans le cas où le théorème est vérié, le
programme va nous donner la valeur 1, s'il ne sera pas le cas, alors il retourne la valeur nulle.
Figure 15 Code du programme 6_EX : 2
12
• Question 8 :
Analyse du problème :
On désire coder une fonction qui a un rôle n'est pas loin à celui du programme qu'on vient
de réaliser. Il s'agit en fait de créer un code permettant de tester est-ce que le triangle fournit
par l'utilisateur est isocèle en deuxième point ou pas.
Solution du problème :
Pour ce faire, il sut de vérier l'égalité des distances, ce qui nous ramène encore une fois
à appeler la fonction "distance". De même, la structure " if " est indispensable dans ce cas.
Ainsi, la fonction va acher la valeur 1 dans le cas où la condition est vériée, et la valeur 0
sinon.
Figure 16 Code du programme 7_EX : 2
• Question 9 :
On souhaite déterminer deux points dont on aura pu reproduire le schéma S, sachant qu'on connaît
le rayon r. En fait, le schéma on peut le faire en se basant sur étapes suivantes :
D'abord, On réalise le dessin du petit cercle en utilisant son rayon, ainsi que son centre X(x,y) ;
où : x et y pourront être récupéré par le point B Car, on a :
xX = xB − r
yX = yB − r
Nous passons maintenant au dessin du grand cercle qui le même centre que celui qu'on
vient de dessiner. Par contre, son rayon noté R est obtenu par la formule : R = r + d ;
avec :
d = xE − xB
D'où, le besoin du point E.
Il ne nous reste que le dessin de deux droite, l'une passe par les points G et E, et l'autre elle
est tangente au cercle au point F.
On en déduit donc qu'il sut de connaitre le point B, le point E et le rayon r pour refaire
le schéma S.
13
• Question 10 :
Analyse du problème :
On vise établir une fonction servant de calculer la surface d'un triangle. Alors, un théorème
mathématique à utiliser est donné par : S = b x h/2 ; avec :
h : hauteur ; b : base du triangle
Solution du problème :
D'après ce que nous venons de conrmer, le fait de remédier au problème en question revient
à déterminer la hauteur et la base du triangle GEF. En eet, on a :
h = r + (yE − yB )
b = 2r + 2x(xE − xB )
il sura donc de remplacer chaque élément par son expression pour obtenir la surface. Ça se
traduit en langage C en accédant aux champs des structures par l'opérateur ".".
Figure 17 Code du programme 9_EX : 2
• Question 11 :
Analyse du problème :
il s'agit d'écrire un programme en langage C qui permet de trier ce tableau selon la distance
des points à l'origine O du repère, par exemple si on prend les deux points D et G, D est plus
proche à O.
Solution du problème :
Pour ce faire, on propose d'utiliser la fonction qui sera à calculer la distance entre deux points
distincts. Cependant, on fera aussi appel à une structure conditionnelle " if " pour comparer
les distances entre elles. Mais, il faut a priori déclarer une constante et un tableau dont on fait
le traitement voulu.
14
Figure 18 Code du programme 10_EX : 2
• Question 12 :
Analyse du problème :
Nous sommes arrivés à la dernière fonction qui sert à appliquer les programme qui déjà été
codés. Plus précisément, nous allons établir un code qui a comme objectif le trace du schéma
à partir des points P, Q et le rayon r.
Solution du problème :
En eet, la résolution du problème nous met dans le cas des problèmes mathématiques ; où le
dessin de toutes les gures composant le schéma à acher, pourra être fait en se ramenant
aux équations mathématiques. C'est-à-dire, le petit cercle étant l'ensemble des points M(x,y)
vériant que le produit scalaire du vecteur engendré par les points M et G, et celui formé par
M et F est nul. On procède de la même manière pour tracer le deuxième cercle. Sinon, on
pourra utiliser directement l'équation cartésienne d'un cercle. Il en découle qu'il ne reste que
l'achage de deux droites telles que la première passe par les points G et F qu'on la retrouve
en appelant la fonction numéro 6, et la deuxième elle est tangente au point F ça veut dire
qu'elle se détermine immédiatement en utilisant les coordonnées des points E et F.
Tout cela sera réalisé en mettant en pratique la fonction servant de faire le trace : void
tracerPoint(oat x, oat y)
15
Figure 19 Code du programme 11_EX : 2
Figure 20 Suite du code précédent_EX : 2
16
FIN DU RAPPORT - MERCI POUR VOTRE LECTURE !
17