Vous êtes sur la page 1sur 6

NOM : Prénom : IUT Montpellier - 20 mai 2006

Test d’algorithmique et programmation


Durée : 1h30
Calculatrice et téléphone portable interdits. Ne dégrafez pas les feuilles. Brouillon en dernière page.

Exercice 1 : Détermination de l’âge et du nombre de jours vécus


On souhaite écrire un programme en langage C permettant de calculer votre âge ainsi que le nombre
de jours que vous avez vécus depuis votre naissance. Dans ce programme, on fera appel à une
fonction nommée «longueur_mois(mois,annee)» qui renvoie le nombre de jours que
compte un certain mois d’une certaine l’année (le numéro du mois et de l’année sont transmis en
arguments de cette fonction). Cette fonction permet de tenir compte des années bissextiles.
Les organigrammes de différentes parties de ce programme sont donnés dans les trois annexes situées
à la fin du sujet.
Pour chaque étape du programme compléter les cadres par la ou les lignes de codes correspondant aux
actions indiquées.

Inclusion de la bibliothèque standard des entrées-sorties :


#include <stdio.h>

Déclaration de la fonction « longueur_mois() »:


int longueur_mois(int mois,int annee);

Début du programme principal :


void main(void)
{

Déclaration des variables entières age,jours_vecus,an,mois et jour:

int age,jours_vecus,an,mois,jour;

Déclaration et initialisation des tableaux d’entiers date_naissance (contient votre date de


naissance sous le format (jj,mm,aaaa) ) et date (contient la date du jour 20,5,2006):
int date_naissance[]={22,05,1975};
int date[]={20,05,2006};

1
Initialisation de jours_vecus à 0 :
jours_vecus=0;

Détermination de l’âge (voir algorithme dans l’annexe 1) :


if(date[0]>=date_naissance[0]&&date[1]>=date_naissance[1])

age=date[2]-date_naissance[2];

else age=date[2]-date_naissance[2]-1;

Affichage à l’écran de l’âge :


printf("Ton age = %d ans\n",age);

Détermination du nombre de jours vécus (voir algorithme dans l’annexe 2):

for (an=date_naissance[2];an<=date[2];an++)
{ for (mois=1;mois<=12;mois++)
{ for (jour=1;jour<=longueur_mois(mois,an);jour++)
{
if (an==date_naissance[2] && mois<date_naissance[1]);
else if (an==date_naissance[2] &&
mois==date_naissance[1] && jour<date_naissance[0]);
else if (an==date[2] && mois>date[1]);
else if (an==date[2] && mois==date[1] &&
jour>date[0]);
else jours_vecus++;
}
}
}

2
Affichage à l’écran du nombre de jours vécus :
printf("Jours vecus = %d\n",jours_vecus);

Fin du programme principal :


return;
}

Définition de la fonction « longueur_mois() » (voir algorithme dans l’annexe 3):


int longueur_mois(int mois,int annee)
{
//Déclaration et initialisation de « liste_mois »
int liste_mois[]={31,28,31,30,31,30,31,31,30,31,30,31};

//Calcul du nombre de jours


if (((annee%4==0 && annee%100!=0)||annee%400==0) && mois==2)
return liste_mois[mois-1]+1;
else
return liste_mois[mois-1];

Exercice 2 : Pointeurs
a . Ecrivez un programme dans lequel vous :

Définissez deux variables ‘x’ et ‘y’ de type « int ».


void main(void)
{

Définissez deux pointeurs ‘p’ et ‘q’ de type « pointeur vers un entier ».

Faites pointer ‘p’ vers ‘x’

Faites pointer ‘q’ vers ‘y’.

3
Au moyen du pointeur ‘p’, placez la valeur 5 dans ‘x’.

Au moyen des pointeurs ‘p’ et ‘q’, placez la valeur de ‘x’ dans ‘y’.

Au moyen du pointeur ‘p’, ajoutez 15 à la valeur contenue dans ‘x’.

Incrémentez ‘y’ à l’aide du pointeur ‘q’ et de l’opérateur ++.

return ;
}

b . Citez un des intérêts du passage de variable(s) par pointeur(s) lorsqu’on appelle une fonction ?

Exercice 3 : Question supplémentaire


S’il vous reste du temps, vous pouvez proposer ci-dessous une version personnelle optimisée (vitesse
d’exécution ou nombre de lignes de code) du programme de l’exercice 1 (détermination de l’âge et du
nombre de jours vécus). Toute solution est permise tant qu’elle est rédigée en langage C (norme
ANSI).

4
Annexe 1 : Algorithme de détermination de l’âge
SI (numéro du jour actuel ≥ numéro du jour de naissance ET numéro du mois actuel = numéro
du mois de naissance) OU SI numéro du mois actuel > numéro du mois de naissance
ALORS âge = année actuelle – année de naissance
SINON âge = année actuelle – année de naissance – 1

Annexe 2 : Algorithme de détermination du nombre de jours vécus depuis la


naissance

BOUCLE 1 pour « an » allant de l’année de naissance à l’année actuelle, FAIRE


BOUCLE 2 pour « mois » allant de 1 à 12, FAIRE
BOUCLE 3 pour « jour » allant de 1 à longueur_mois(mois,an), FAIRE

SI an = année de naissance ET mois < n° mois de naissance, FAIRE : RIEN


SINON SI an = année de naissance ET mois = n° mois de naissance ET jour < n° jour de naissance, FAIRE : RIEN
SINON SI an = année actuelle ET mois > n° mois actuel, FAIRE : RIEN
SINON SI an = année actuelle ET mois = n° mois actuel ET jour > n° jour actuel, FAIRE : RIEN
SINON FAIRE : Incrémenter jours_vecus
FIN SI

Incrémenter « jour »
FIN BOUCLE 3
Incrémenter « mois »
FIN BOUCLE 2
Incrémenter « an »
FIN BOUCLE 1

Annexe 3 : Algorithme de détermination du nombre de jours d’un mois en


fonction de l’année (bissextile ou non)
Lors des années bissextiles le mois de février compte 29 jours. Les autres années le mois de février ne
compte que 28 jours. Une année est bissextile, si cette année est un nombre divisible par 4 ( =
lorsqu’on divise ce nombre par 4, le reste de la division vaut zéro) mais pas par 100 ( = reste de la
division par 100 non nul). Les années qui sont des multiples de 400 sont des exceptions et sont
bissextiles.

Exemple 1 : 2004 est divisible par 4 (2004 = 511 x 4), mais pas par 100 (2004 = 20.04 x 100), c’est donc une année
bissextile.
Exemple 2 : 1900 est divisible par 4 (1900 = 475 x 4), mais aussi par 100 (1900 = 19 x100) et elle n’est pas un multiple de
400 (1900 = 4.75 x 400), ce n’est donc pas une année bissextile.
Exemple 3 : 2000 est divisible par 4 et par 100, mais elle est également un multiple de 400, c’est donc une année
bissextile.

Rappel : Pour déterminer le reste d’une division, on utilise l’opérateur %


Ainsi par exemple, si le reste de la division d’un nombre par 4 est égal à zéro, cela signifie que ce
nombre est un multiple de 4.

Algorithme :
int longueur_mois(int mois,int annee)

Déclarer un tableau, nommé liste_mois et contenant les valeurs suivantes :

5
31,28,31,30,31,30,31,31,30,31,30,31

SI ((annee divisible par 4 ET annee divisible par 100) OU (annee divisible par 400)) ET mois=2

ALORS la fonction renvoie ((contenu de la case du tableau correspondant au mois) + 1) (attention !!)

SINON la fonction renvoie (contenu de la case du tableau correspondant au mois) (attention !!)

BROUILLON (non corrigé)

Vous aimerez peut-être aussi