Langage C - TP 3: Fonctions et Pointeurs

1. Fonctions

Cette section illustre l'utilisation de fonctions en langage C.

Exercice 1.1.

Ecrire un programme tp3-ex11.c contenant une fonction int pgcd(int a, int b) qui calcule et retourne le plus grand commun diviseur (PGCD) de deux nombres entiers a et b donnés. Le programme doit contenir une fonction main qui permet de saisir deux nombres et d’en afficher le PGCD.

Exemple d’exécution

Entrer le nombre a : 
221

Entrer le nombre b : 
782

Le PGCD de 221 et 782 est: 17

Exercice 1.2.

Ecrire un programme tp3-ex12.c contenant une fonction int ppcm(int a, int b) qui calcule et retourne le plus petit commun multiple (PPCM) de deux nombres entiers a et b donnés. Le programme doit contenir une fonction main qui permet de saisir deux nombres et d’en afficher le PPCM. La réutilisation de fonctions déjà écrites durant ce travail est recommandée.

Exemple d’exécution

Entrer le nombre a : 
221

Entrer le nombre b : 
782

Le PPCM de 221 et 782 est: 10166

2. Combinatoire

Cette section illustre l'utilisation de fonctions en langage C pour réaliser des calculs combinatoires.

Exercice 2.1.

Ecrire un programme tp3-ex21.c contenant une fonction int factorielle(unsigned int n) qui calcule et retourne la factorielle d’un nombre entier positif n donné. Le programme doit contenir une fonction main qui permet de saisir un nombre et d’en afficher la factorielle.

Rappel: Soit un nombre n, la factorielle de n, notée n!, est définie par:

$$
n!\ =\ \begin{cases}
&\prod\limits_{i=0}^{n-1}n-i,\ si\ n\ >\ 0 \\
& \\
&1,\ si\ n\ =\ 0
\end{cases}
$$

Exemple d’exécution

Entrer un nombre entier : 
5

La factorielle de 5 est : 120

Exercice 2.2.

Ecrire un programme tp3-ex22.c contenant une fonction int puissance(unsigned int x, unsigned int n) qui calcule et retourne le nombre $x^{n}$, avec $x$ et $n$ étant des entiers positifs. Le programme doit contenir une fonction main qui permet de saisir un nombre entier positif $x$, un nombre entier positif $n$ et d’en afficher la valeur de $x^{n}$.

Rappel: Soit $x$ et $n$ deux entiers positifs, la valeur de $x$ à la puissance $n$, notée $x^{n}$ est définie par:

$$
x^{n}\ =\ \begin{cases}
&\prod\limits_{i=1}^{n}x,\ si\ n\ >\ 0 \\
& \\
&1,\ si\ n\ =\ 0
\end{cases}
$$

Exemple d’exécution

Entrer un nombre x : 5

Entrer un exposant : 3

5^3 = 125

Exercice 2.3.

Ecrire un programme tp3-ex23.c contenant une fonction unsigned int arrangement(unsigned int n, unsigned int k) qui calcule et retourne le nombre d’arrangements, noté $A_{n}^{k}$,  de $k$ éléments depuis un ensemble de $n$ éléments. Le programme doit contenir une fonction main qui permet de saisir une taille d’ensemble n, une dimension de vecteur k et d’afficher le nombre d’arrangements possibles. La réutilisation de fonctions déjà écrites durant ce travail est recommandée.

Rappel: Soit $E$ un ensemble de $n$ éléments. On appelle arrangement de $k$ éléments de $E$ tout vecteur de dimension $k$ composé d'éléments distincts de $E$. Le nombre d’arrangements de $k$ éléments de $E$, noté $A_{n}^{k}$ est défini par :

$$
A_{n}^{k}\ =\ \frac{n!}{(n-k)!}
$$

Exemple d’exécution

Nombre total d'elements (n) : 5

Nombre d'elements a arranger (k) : 3

Le nombre d'arrangements de 3 elements parmi 5 est : 60

Exercice 2.4.

Ecrire un programme tp3-ex24.c contenant une fonction unsigned int combinaison(unsigned int n, unsigned int k) qui calcule et retourne le nombre de combinaisons de $k$ éléments depuis un ensemble de $n$ éléments. La réutilisation de fonctions déjà écrites durant ce travail est recommandée.

Rappel: Soit $E$ un ensemble de $n$ éléments. On appelle combinaison de $k$ éléments de $E$ tout ensemble de $k$ éléments distincts de $E$. Le nombre de combinaisons de $k$ éléments de $E$, noté $\binom{n}{k}$, est défini par :

$$
\binom{n}{k}\ =\ \frac{n!}{k!(n-k)!}\ =\ \frac{A_{n}^{k}}{k!}
$$

avec $A_{n}^{k}$ le nombre d'arrangements de $k$ éléments pour un ensemble de taille $n$.

Exemple d’exécution

Nombre total d'elements (n) : 5

Nombre d'elements a combiner (k) : 3

Le nombre de combinaisons de 3 elements parmi 5 est : 10

3. Formule du binôme de Newton

La formule de Newton est une formule mathématique donnée par Isaac Newton pour trouver le développement d’une puissance entière quelconque d’un binôme.

Soit un binôme composé des nombres réels $x$ et $y$ et un entier naturel $n$, La valeur $(x\ +\ y)^{n}$ est donnée par :

$$(x\ +\ y)^n=\sum_{k=0}^{n}c_{k}x^{n-k}y^k$$

avec:

$$c_{k}\ =\ \binom{n}{k}\ =\ \frac{n!}{k!\left(n-k\right)!}$$

$n!$ représente la factorielle de $n$ définit telle que $n!\ =\ n\times\left(n-1\right)\times\cdots\times1$.

Par exemple, en utilisant la formule du binôme de Newton, ont peut écrire:

$$(x\ +\ y)^{7}\ =\ x^{7}\ +\ 7x^{6}y\ +\ 21x^{5}y^{2}\ +\ 35x^{4}y^{3}\ +\ 35x^{3}y^{4}\ +\ 21x^{2}y^{5}\ +\ 7xy^{6}\ +\ y^{7}$$

Exercice 3.1.

Ecrire un programme tp2-ex31.c qui affiche le polynôme correspondant au binôme $\left(x\ +\ 1\right)^{n}$, $n$ étant un entier positif saisit au clavier. La réutilisation de fonctions déjà écrites durant ce travail est obligatoire.

Rappel: L’écriture polynomiale d’un binôme $\left(x+1\right)^n$ est de la forme $c_nx^n\ +\ \ c_{n-1}x^{n-1}\ +\ \cdots\ +\ c_{k}x^{n-k}\ +\ \cdots\ +\ c_1x\ +\ c_0$ où $c_{k}$ est le coefficient d’ordre $k$ du polynôme.

Exemple d'exécution:

Entrer une valeur pour n: 

7

(x+1)^7 = x^7 + 7x^6 + 21x^5 + 35x^4 + 35x^3 + 21x^2 + 7x + 1

4. Pointeurs

Exercice 4.1.

Ecrire un programme tp3-ex41.c contenant une fonction void inverse(float* a) qui remplace la valeur pointée par a par son inverse (on considère que l’inverse de 0 est 0). Le programme doit contenir une fonction main qui permet de saisir un nombre réel et d’afficher son inverse.

Exemple d'exécution:

Entrer un nombre : 4

Son inverse est 0.250000

Exercice 4.2.

Ecrire un programme tp3-ex42.c contenant une fonction croissant prenant deux paramètres a et b représentant des nombres réels et s’assurant qu’à sa sortie a contient la plus petite des deux valeurs et b la plus grande des deux valeurs. Le programme doit contenir une fonction main qui permet de saisir deux valeurs et d’afficher celles-ci triées par ordre croissant.

Exemple d'exécution:

Entrer a: 5

Entrer b: 3

Apres tri, a = 3 et b = 5

5. Dates

La gestion de dates est une fonctionnalité très répandue dans les programmes informatiques. Cette section illustre la saisie et l'utilisation de dates en langage C.

Une date est définie par un triplet (jour, mois année) et est relative à un calendrier spécifique. Par construction, chaque année est composée de mois, eux mêmes composés de jours.

Il existe plusieurs types de calendriers. Les calendriers solaires (calendrier Gégorien, Julien, ...) définissent une année comme une révolution complète de la terre autour du soleil. Les calendriers lunaires (calendrier Hégirien, Samaritain, Chinois, ...) basent leurs mois sur les périodes de la lune (lunaisons) et en construisent les années en fonction. Les calendriers luni-solaire (calendrier Hebraique, Hindou, ...) conservent la durée d'une année par rapport au soleil mais structure les mois en fonction de la lune. 

La suite de ce travail utilise le calendrier Grégorien comme référence. Dans celui-ci, la durée standard d'une année est fixée à 365 jours. Cependant, à cause de la longueur de la période de révolution de la terre autour du soleil et afin de conserver une cohérence entre les jours de l'année et les saisons, tous les 4 ans l'année comporte non plus 365 jours mais 366. Ce type d'année est appelé année bissextile.

Année bissextile: Une année est bissextile (comportant 366 jours) seulement si elle respecte l’un des deux critères suivants :

  • l'année est divisible par 4 sans être divisible par 100 (cas des années qui ne sont pas des multiples de 100) ;
  • l'année est divisible par 400 (cas des années multiples de 100).

Autrement dit, pour être bissextile, une année doit dans tous les cas être divisible par 4; mais si c’est une année de centenaire (comme 1800, 1900, etc.), elle doit également être divisible par 400 (source wikipedia). 

Exercice 5.1.

Ecrire un programme tp3-ex51.c contenant une fonction unsigned char bissextile(unsigned int a) prenant le nombre entier non signé a comme paramètre et qui retourne 1 si l’année représentée par a est une année bissextile et 0 sinon. Le programme doit contenir une fonction main qui permet de saisir une année et de vérifier si elle est bissextile ou non.

Exemple d'exécution:

Entrer une annee: 2100

2100 n'est pas bissextile

Dans le calendrier Grégorien, une année est composée de 12 mois (Janvier, Février, Mars, Avril, Mai, Juin, Juillet, Aout, Septembre, Octobre, Novembre, Décembre). La composition des mois est dictée par les règles suivantes:

  • Les mois de janvier, mars, mai, juillet, aout, octobre et décembre ont 31 jours.
  • Les mois d’avril, juin, septembre, novembre ont 30 jours.
  • Le mois de février comporte 28 jours sauf les année bissextiles pour lesquelles il comporte 29 jours.

Exercice 5.2.

Ecrire un programme tp3-ex52.c contenant une fonction unsigned char nb_jours(unsigned int m, unsigned int a) prenant en paramètre le numéro d’un mois de l’année, noté m, et l’année, notée a et retournant le nombre de jours du mois correspondant. Si l'année ou le le mois donnés sont incorrect, la fonction retournera 99. Le programme doit contenir une fonction main qui permet de saisir un mois et une année et affiche le nombre de jours de ce mois. La réutilisation de fonctions déjà écrites durant ce travail est recommandée.

Exemple d'exécution:

Entrer une annee: 2004

Entrer un mois: 2

Le mois 2 de l'année 2004 possede 29 jours.

Exercice 5.3.

Ecrire un programme tp3-ex53.c contenant une fonction int saisie_date(unsigned int* j, unsigned int* m, unsigned int* a) qui lit au clavier une date sous la forme "jj/mm/aaaa" et qui affecte le jour à la variable j, le mois à la variable m et l’année à la variable a. La fonction retourne 0 si la date est correctement saisie (mois ayant un numéro valide, jours ayant un numéro valide, jour donné cohérent avec le mois donné) et 1 sinon. Le programme doit contenir une fonction main qui permet de saisir une date sous la forme "jj/mm/aaaa" et qui affiche:

  • "La date jour, mois, année est valide" si la date est valide
  • "La date jour, mois, année est invalide" si la date est invalide

La réutilisation de fonctions déjà écrites durant ce travail est recommandée.

Exemple d'exécution:

Saisir une date (jj/mm/aaa): 22/10/2014

La date 22, 10, 1979 est valide

Autre exemple d'exécution:

Saisir une date (jj/mm/aaa): 42/10/1980

La date 42, 10, 1980 est invalide