1- L'informatique au service de la santé (45 mn)
Des épidémiologistes veulent étudier la propagation de la grippe. Ils disposent de
données décrivant trois types d'événements épidémiologiques : contamination,
guérison ou décès. À chaque événement est
associé le numéro de sécurité sociale du patient et la date de l'événement.
1- Écrire la déclaration d'un type enregistrement permettant de représenter une date
avec un jour, un mois et une année.
2- Écrire la déclaration d'un type enregistrement permettant de représenter un
événement épidémiologique avec le numéro de sécurité sociale du patient (entier), la
date de l'événement et le type de l'événement (contamination, guérison ou décès).
On suppose que tous les événements épidémiologiques sont stockés dans un tableau
d'enregistrements. On suppose qu'on dispose d'une fonction egalDate qui prend en
entrée deux dates et renvoievrai si les dates sont les mêmes et faux sinon, et d'une
fonction distDate qui prend en entrée deux dates etrenvoie la distance entre les deux
dates sous forme d'un entier positif qui représente le nombre de jours
séparant les deux dates.
3- Écrire une fonction qui prend en entrée un tableau d'enregistrements d'événements
épidémiologiqueset une date et renvoie le nombre de décès ayant eu lieu à cette date.
4- Les épidémiologistes veulent pouvoir identifier les contaminations proches dans le
temps. Écrire une fonction qui prend en entrée un tableau d'enregistrements
d'événements épidémiologiques et une date et qui renvoie, parmi les événements du
tableau qui sont de type contamination, celui dont la date est la plus proche
de celle passée en paramètre (sans qu'elle soit forcément égales).
2- L'informatique au service du ministère du travail (45 mn)
Le ministère du travail veut disposer d'un système d'information permettant d'étudier
la population active. Le ministère veut connaître, pour chaque actif, son diplôme le
plus élevé, depuis combien de temps il est sur le marché du travail (durée en nombre
d'années) et l'activité qu'il exerce. Une activité est décrite par un type d'activité (les 3
types possibles sont fonctionnaire, salarié du privé, profession libérale) et le revenu
annuel brut.
1- Écrire la déclaration d'un type enregistrement permettant de représenter une
activité.
2- Écrire la déclaration d'un type enregistrement permettant de représenter un actif.
3- Écrire une fonction qui prend en entrée un tableau d'actifs et un entier n supposé
positif et renvoie le nombre de fonctionnaires qui ont fini leurs études depuis plus de n
années.
4- Le ministère veut savoir si, pour un diplôme donné, ceux qui en sont titulaires sont
plus nombreux à être fonctionnaires qu'à travailler dans le secteur concurrentiel
(salarié du privé ou profession libérale). Écrire une fonction qui prend en entrée un
tableau d'actifs et un diplôme et renvoie vrai si, parmi les personnes possédant ce
diplôme, il y a plus de fonctionnaires que de non fonctionnaires.
3- L'informatique au service des transports aériens (45 mn)
Les compagnies aériennes veulent gérer automatiquement le cas des passagers qui ont raté
leur avion
(pour cause d'éruption volcanique ou autre). On suppose qu'un type enregistrement Date
est déjà disponible, ainsi qu'un type énuméré Ville (ses valeurs représentent toutes les
villes disposant d'un aéroport). On suppose également qu'il existe une fonction
distance(Date d1, Date d2), qui retourne un entier dont la valeur absolue est le nombre de
jours séparant d1 et d2 (cet entier est positif si d1 est antérieure à d2, nul si d1 = d2 et
négatif si d1 est postérieure à d2). Il faut maintenant représenter les données sur les vols et
des fonctions permettant de traiter ces données.
1-Écrire la déclaration d'un type enregistrement permettant de représenter un vol avec
un numéro de vol (nombre entier), une ville de départ, une ville d'arrivée, une date et
un nombre de places encore disponibles.
2- Écrire une fonction récursive qui prend en paramètre un tableau de vols et un
numéro de vol et décrémente de 1 le nombre de places disponibles sur le vol
correspondant au numéro.
3- Écrire une fonction qui prend en paramètres un tableau de vols, une ville de départ,
une ville d'arrivée et une date et renvoie le prochain vol reliant les deux villes sur
lequel il reste au moins une place disponible (ce vol doit avoir lieu le plus tôt possible,
mais à une date postérieure à celle donnée en paramètre). Si aucun vol du tableau ne
vérifie ces conditions, on peut retourner la valeur null qui correspond à un
"enregistrement vide".
3- L'informatique au service des traders (45 mn)
Une banque d'affaire veut pouvoir gérer informatiquement les transactions de ses
traders à la bourse où sont cotées les entreprises. Une entreprise est caractérisée par un
nom, un état de santé économique (A+, A, B ou C), le prix courant de son action
(nombre réel) et le nombre total d'actions émises par l'entreprise. Un paquet d'actions
détenu par la banque est caractérisé par l'entreprise qui a émis les actions, le prix
auquel les actions ont été achetées (prix par action, nombre réel), le nombre d'actions
du paquet et le nom du trader qui les a achetées pour la banque.
1- Écrire les 3 déclarations de type permettant de représenter l'état d'une entreprise,
une entreprise et un paquet d'actions.
2- On veut trouver parmi les paquets d'actions détenus par la banque celui qu'il est
préférable de vendre. Écrire une fonction qui prend en paramètre un tableau de
paquets d'actions et renvoie le paquet d'action qu'il est préférable de vendre, c'est-à-
dire le paquet pour lequel le bénéfice est le plus élevé. Ce bénéfice est égal au prix de
vente (nombre d'actions du paquet fois le prix courant de l'action) moins le prix
d'achat (nombre d'actions du paquet fois le prix d'achat de l'action). Seuls les paquets
d'actions d'entreprises qui sont dans l'état C sont à prendre en compte, les actions des
entreprises dans les états A+, A ou B pouvant encore voir leur prix augmenter. Si
aucun paquet ne correspond à ces critères, on peut renvoyer la valeur null qui
correspond à un "enregistrement vide".
3- Écrire une fonction qui prend en paramètres un tableau de paquets d'actions et un
nom de trader et renvoie le bonus que la banque verse au trader. Ce bonus dépend de
la valeur courante des actions achetées par le trader et de leur valeur d'achat. La valeur
d'achat (respectivement courante) des actions achetées par le trader est égale à la
somme des valeurs d'achat (respectivement courantes) des paquets d'actions qu'il a
achetés, chaque paquet valant le prix d'achat (respectivement courant) de l'action fois
le nombre d'actions du paquet. Si la valeur courante des actions achetées par le trader
est inférieure à la valeur d'achat, le bonus est nul, sinon il est égal à 20% de la
différence entre la valeur courante et la valeur d'achat.
4- L'informatique au service des rencontres (60 mn)
Un site Web de rencontre doit permettre de mettre en relation les clients du site en
fonction de leurs passe-temps. Chaque client indiquera donc sur le site ses passe-temps
parmi jeu, sport, jardinage, cuisine, theatre. Vous êtes chargé de développer le
programme qui gérera les données relatives aux clients.
1- Écrire la déclaration d'un type Hobby pour pouvoir représenter les passe-temps
possibles, puis la déclaration d'un type Client, chaque client ayant un identifiant entier,
une adresse mail et plusieurs passe-temps. On suppose que chaque client a au moins
un passe-temps.
2- Écrire une fonction sameHobbies qui prend en paramètres deux Client et retourne
vrai s'ils ont exactement les mêmes passe-temps, et faux sinon.
3- Écrire une fonction soulmates qui prend en paramètres un Client c, un tableau de
Client tab, et renvoie tous les Client contenus dans tab qui ont les mêmes passe-temps
que c. On suppose que c n'est pas dans le tableau tab.
5- Analyse de réseau social (60 mn)
On veut écrire un programme pour analyser les pages web d'un réseau social. Une page est
représentée par le nom de son propriétaire, sa date de création et le nombre d'internautes qui
visitent la page chaque jour. On suppose qu'il existe un type de données Date, qui représente
une date, et une fonction avec retour Date creerDate(int a, int m, int j) qui prend en
paramètres les année, mois et jour d'une date et renvoie la Date correspondante.
1- Proposer une structure de données pour représenter les pages du réseau social. Écrire un
programme qui initialise les données relatives à la page de Toto, créée le 13 juin 2010 et
visitées tous les jours par 234 internautes.
2- Écrire une fonction qui prend en entrée un tableau de pages et renvoie le nombre moyen
d'internautes qui visitent les pages du tableau.
3- Écrire une fonction qui prend en entrée un tableau de pages et renvoie vrai s'il existe au
moins deux pages ayant le même propriétaire et faux sinon. On veut maintenant représenter
les liens entre les pages du réseau social. Chaque propriétaire de page peut en effet lier à sa
page les pages de ses amis.
4- Améliorer la structure de données pour pouvoir représenter, pour chaque page, les pages
qui lui sont liées.
5- Écrire une fonction qui prend en entrée un tableau de pages, deux noms d'internautes, et
renvoie vrai s'il existe des pages des deux internautes qui sont liées, et faux sinon. Il est
possible que les internautes possèdent plusieurs pages dans le réseau, ou aucune.
7- Intentions de vote (60 mn)
Un institut de sondage veut réaliser un programme informatique pour analyser les intentions
de vote pour l'élection présidentielle de 2012. Les données à représenter portent sur les
candidats à l'élection, les catégories socio-professionnelles des citoyens et les intentions de
votes dans chaque catégorie.
1- Écrire la déclaration d'un type Candidat pour pouvoir représenter les candidats possibles
qui sont, par ordre alphabétique : Bayrou, Hollande, Joly, Lepage, Lepen, Melanchon, Morin,
Nihous, Sarkozy, Villepin.
2- Écrire la déclaration d'un type Categorie qui représente les données d'une catégorie
socioprofessionnelle avec un nom, un nombre de citoyens, et un revenu moyen. Par exemple
la catégorie des agents de la fonction publique d'état a pour nom "agent de l'état", comprend
3681370 personnes et a pour revenu annuel net moyen 26362 euros (source INSEE).
3- Écrire la déclaration d'un type Vote qui représente les intentions de vote des catégories
socioprofessionnelles. Chaque vote associe une catégorie, un candidat, et le pourcentage de
personnes de la catégorie qui déclarent voter pour le candidat en question. Par exemple
0,01\% des agents de l'état ont l'intention de voter pour Villepin.
4- Écrire une fonction qui prend en paramètres un tableau de Vote et une Categorie et renvoie
le Candidat préféré de la catégorie, c'est-à-dire celui qui recueille le plus d'intentions de vote
dans cette catégorie.
5- Écrire une fonction qui prend en paramètres un Candidat et un tableau de Vote et renvoie le
revenu moyen des citoyens qui ont l'intention de voter pour ce candidat. Pour calculer le
revenu moyen, il faut calculer la somme des revenus de tous ceux qui déclarent voter pour le
candidat, et diviser ce revenu total par le nombre
de citoyens déclarant voter pour le candidat.
8- Jeu, set et match (45 mn)
On veut écrire un programme pour gérer les résultats des matchs de tennis dans les tournois
officiels. Un match est constitué de sets, eux-mêmes constitués de jeux. Un match est décrit
par le nom du tournoi dans le cadre duquel il s'est déroulé, les deux noms des joueurs qui ont
disputé le match, et le score. Le score regroupe les résultats des différents sets (il peut y avoir
entre 3 et 5 sets dans un match). Chaque set est décrit par deux entiers qui donnent le nombre
de jeux remportés par chaque joueur (le set le plus disputé de l'histoire du tennis s'est terminé
à 70-68). Par exemple, le match entre Rafael Nadal et Roger Federer, joué lors de l'Open
d'Australie 2012, a eu pour score 6-7, 6-2, 7-6, 6-4 (cela signifie que dans le premier set
Nadal a remporté 6 jeux et Federer en a remporté 7, dans le deuxième set Nadal a remporté 6
jeux et Federer 2 et ainsi de suite).
1- Proposer une structure de données pour représenter les matchs.
2- Écrire un programme qui initialise les données relatives au match entre Nadal et Federer.
3- Écrire une fonction qui prend en entrée un tableau de matchs (tableau au sens informatique)
et le nom d'un tennisman et renvoie le nombre de jeux perdus par le tennisman durant ses
matchs (par exemple, dans le match décrit plus haut, Nadal a perdu 7+2+6+4=19 jeux et
Federer en a perdu 6+6+7+6=25).
9- Traçabilité de la viande (60 mn)
La Commission Européenne veut mettre en place un outil informatique de suivi des lots de
viande produits en Europe.
1- Écrire la déclaration d'un type Viande ayant pour valeurs : cheval, bœuf, canard, poulet,
mouton, porc. Écrire la déclaration d'un type Site représentant les types d'entreprises
agroalimentaires : élevage, abattoir, usine de transformation, usine de conditionnement.
2- Écrire la déclaration d'un type représentant les entreprises agroalimentaires, décrites par un
nom, un type et un pays. On suppose qu'il existe un type énuméré Pays dont les valeurs sont
les différents pays.
3- Écrire la déclaration d'un type Lot qui représente les lots de viande. Un lot possède un
identifiant (entier), un type de viande, un poids et la liste des entreprises par lesquelles il est
passé. Exemple de lot : 537,45kg de viande de cheval, portant l'identifiant 12345 et passé par
les trois entreprises suivantes : l'élevage Ferma Satu Mare situé en Roumanie, l'abattoir
Slachthuis van Maastricht situé aux Pays-Bas et l'usine de transformation Spanghero située en
France.}.
4- On veut pouvoir trouver les lots d'un type donné. Écrire une fonction qui prend en
paramètres un tableau de Lot et un type de viande et retourne un tableau de Lot contenant
uniquement les lots du type spécifié.
5- On veut pouvoir trouver tous les lots qui sont passés par une entreprise donnée. Écrire une
fonction qui prend en paramètres un tableau de Lot et le nom d'une entreprise et affiche à
l'écran les identifiants des lots qui sont passés par l'entreprise. La fonction doit également
retourner le poids total de viande traitée dans l'entreprise. On suppose que le tableau ne
contient pas deux fois le même lot.
10- Paradis fiscal (60 mn)
Le ministère des finances veut développer un programme pour détecter l'évasion fiscale. Il
dispose pour cela des données concernant les opérations bancaires importantes (de plus de
1000 euros) des banques. Une opération bancaire est décrite par un numéro de compte
bancaire (chaine de caractères), une somme (qui peut être négative s'il s'agit d'un retrait) et
une date. On suppose qu'il existe déjà un type Date représentant les dates et qu'on peut
comparer deux dates avec l'opérateur =. Une banque est décrite par un identifiant international
(chaine de caractères), un pays (on se limite à France, Monaco, Suisse, Luxembourg), si elle
est suspectée de faire de faciliter la fraude fiscale ou non, et la liste des opérations bancaires
réalisées sur des comptes de cette banque.
1- Proposer des types de données permettant de représenter ces données de façon structurée.
2- Écrire une fonction qui prend en entrée un tableau d'opérations bancaires et une opération o
et, s'il existe dans le tableau une opération réalisée à la même date que o et d'un montant
inverse, renvoie l'indice de cette opération dans le tableau. Si plusieurs opérations de ce type
existent, on renvoie l'indice de la première opération rencontrée. La fonction renvoie -1 si une
telle opération n'existe pas. Par exemple, si l'opération o a pour montant -5000 euros (il s'agit
donc d'un retrait) réalisé le 27 mai 2012, il faut trouver une opération de 5000 euros réalisée le
27 mai 2012.
3- Écrire une fonction qui prend en entrée un tableau de banques et une opération o et vérifie
s'il existe dans une banque suspectée de faciliter la fraude une opération du montant inverse
du montant de o et réalisée à la même date. La fonction renvoie l'identifiant de la première
banque trouvée et qui a réalisé une telle opération, et renvoie une chaine vide ("") si aucune
banque n'est trouvée.
11- Écoutes téléphoniques (60 mn)
La National Security Agency américaine (NSA) veut mettre en place un outil informatique
d'analyse des conversations téléphoniques. On suppose qu'il existe déjà un type Chaine
représentant les chaines de caractères et qu'il est possible de comparer deux valeurs de ce type
à l'aide de l'opération =. On suppose également qu'il existe déjà un type enregistrement Date
qui représente les dates. On suppose qu'on peut comparer deux valeurs du type Date à l'aide
des opérations habituelles < > et =.
1- On veut représenter le niveau de cryptage des appels. Écrire la déclaration d'un type
Cryptage avec pour valeurs possibles : haut, moyen et bas.
2- Écrire la déclaration d'un type Appel représentant les appels téléphoniques décrits par deux
personnes (l'appelant et l'appelé) dont on connait le nom, une date de début, une durée (en
secondes), un niveau de cryptage et un ensemble de mots-clés qui apparaissent dans la
conversation téléphonique. Exemple d'appel (fictif) : A. Merkel a téléphoné à F. Hollande le
23/03/2014 à 15h57 durant 234 secondes sur une ligne hautement sécurisée pour parler de
"Ukraine", "Kiev", "Ianoukovitch", "Poutine", "Sotchi", "médaille d'or".
3- On veut savoir combien de temps une personne donnée a passé au téléphone durant une
certaine période. Écrire une fonction qui prend en entrée un tableau d'Appel, un nom n, deux
Date d1 et d2 et renvoie la somme des durées des appels reçus ou passés par la personne de
nom n entre les dates d1 et d2.
4- On veut savoir si une personne parle au téléphone de sujets sensibles (comme par exemple
"bombe", "attentat", "aéroport Notre-Dame des Landes"). Écrire une fonction qui prend en
entrée un tableau d'Appel, un nom n et un tableau de Chaine contenant des mots-clés et
renvoie vrai si la personne de nom n a reçu ou passé au moins un appel dans lequel apparait
un des mots-clés du tableau de Chaine.
12- Coupe du monde de football (60 mn)
On veut réaliser un programme pour gérer les données concernant les matchs de la coupe du
monde de football. Chaque match est représenté par les noms des deux équipes qui l'ont
disputé, le nombre de buts marqués par chaque équipe.
1- Proposer un ou des types de données structurés permettant de représenter les données
concernant les matchs de la coupe du monde football.
2- Écrire une fonction qui prend en entrée un tableau des matchs de la coupe du monde et le
nom d'une équipe et renvoie le nombre total de buts marqués par cette équipe au cours de la
compétition.
3- Écrire une fonction qui prend en entrée un tableau des matchs de la coupe du monde et
renvoie un tableau de matchs ne contenant que les matchs nuls (matchs où les deux équipes
ont marqué le même nombre de buts).
13- Épidemie (60 mn)
L'Organisation Mondiale de la Santé veut réaliser un programme pour suivre, analyser et
combattre les épidémies. Pour ce faire, les états sanitaires de différentes villes touchées par
une épidémie doivent être représentés dans le programme.
1- On veut créer une échelle de niveau d'alerte épidémique correspondant à différents types
d'événements épidémiologiques : la détection d'un virus chez les animaux, l'infection
d'humains sans transmission, la transmission inter-humaine, la propagation incontrôlée du
virus. Ecrire la déclaration d'un type NiveauEpidémique avec pour valeurs possibles :
détection, infections, transmissions, pandémie.
2- On veut, pour chaque ville, connaitre le nombre de personnes infectées et le nombre de
morts pour chaque semaine de l'épidémie. Ecrire la déclaration d'un type Ville représentant les
villes avec un nom, un nombre d'habitants, un niveau d'alerte épidémique, le nombre de
personnes infectées pour chaque semaine, et le nombre de morts pour chaque semaine.
Exemple : dans la ville d'Amiens, 134381 habitants, le niveau d'alerte est actuellement à
"transmissions" et, la première semaine il y a eu 3 personnes infectées et aucune de décédée,
la deuxième semaine 8 infections et 1 décès, et la troisième semaine 7 infections et 5 décès.
3- On veut pouvoir connaitre, pour une ville donnée, le nombre total de personnes ayant
survécu à l'infection, c'est-à-dire qui ont été infectées durant l'épidémie mais qui n'en sont pas
(encore) mortes. Exemple :cette fonction appelée sur la ville exemple de la question 2
renverra 18-6 = 12 survivants. Ecrire une fonction qui prend en entrée une Ville et renvoie le
nombre total de survivants.
4- On veut savoir dans quelle ville il y a eu le plus de morts par rapport à la population de la
ville. Ecrire une fonction qui prend en entrée un tableau de Ville et renvoie le nom de la ville
où le rapport [nombre total de morts / population] est le plus élevé
14- Séismes (60 mn)
On veut réaliser un programme pour analyser les données concernant les tremblements de
terre. Chaque séisme est représenté par le lieu de l'épicentre, la magnitude (un réel de 0 à 10)
et la durée (en secondes). Un lieu est représenté par un nom et deux réels pour la latitude et la
longitude.
1- Proposer un ou des types de données structurés permettant de représenter les données
concernant les tremblements de terre.
2- Écrire une fonction qui prend en entrée un tableau de tremblements de terre et le nom d'un
lieu et renvoie la durée totale des séismes ayant eu lieu à cet endroit (c'est-à-dire la somme des
durées des séismes ayant eu lieu à cet endroit).
3- Écrire une fonction qui prend en entrée un tableau de tremblements de terre et renvoie un
tableau ne contenant que les séismes de magnitude supérieure ou égale à 8.
15- Énergie électrique (60 mn)
Dans le cadre de la transition énergétique, on veut analyser la production d'énergie électrique
en France et sa consommation.
1- On veut représenter explicitement les différents types de production électrique. Ecrire la
déclaration d'un type TypeProduction avec pour valeurs possibles : charbon, gaz, nucléaire,
hydraulique, éolien, solaire, biomasse, géothermie.
2- On veut représenter chaque producteur d'électricité. Ecrire la déclaration d'un type
Producteur représentant les producteurs avec pour chacun un nom, un type de production
électrique et une production annuelle en GWh (gigawatt-heure, la production est un nombre
entier). On veut représenter également les régions. Ecrire la déclaration d'un type Region avec
un nom, une consommation électrique annuelle en GWh et l'ensemble des producteurs
d'électricité de la région. Exemple : en région Nord-Picardie, la consommation est
de 46847GWh, les producteurs sont : parc de Bougainville – éolien - 25,8GWh, centrale de
Gravelines –nucléaire – 38400GWh, ... .
3- On veut connaitre pour une région donnée, la part de l'éolien dans sa production totale
d'électricité. Ecrire une fonction qui prend en entrée une Région et renvoie le rapport entre la
somme des productions de ses producteurs d'électricité éolienne et la somme des productions
de tous les producteurs. Exemple : en NordPicardie, la part de l'éolien est de 2916GWh /
44576GWh = 6,5%.
4- On veut récupérer les données de tous les producteurs d'électricité éolienne de toutes les
régions. Ecrire une fonction qui prend en entrée un tableau de Region et renvoie un tableau
contenant les données de tous les producteurs d'électricité éolienne.