المملكة المغربية
المندوبية السامية للتخطيط
HAUT-COMMISSARSAT AU PLAN
Concours de recrutement des Ingénieurs d'Etat 1er grade
Session: Dimanche 2 mai 2021
Spécialité: Génie Logiciel et systèmes d'information, Ingénierie de
Développement des Services Numériques, Ingénierie des données et
Informatique décisionnelle
Organisation de l'épreuve:
Durée: 4 heures
Les documents ne sont pas autorisés
Les appareils électroniques sont strictement interdits
Les copies doivent-être propres et rédigées avec clarté
Exercice 1: QCM (3 points)
(Une seule réponse est valide.)
1- La source des métadonnées du cube pour OLAP
a. Schéma en étoile
b. Schéma en flocon
c. Base de données standard
d. La réponse a et b
dialk.com
2- Quelle est l'opération OLAP qui implique le calcul de toutes les relations de données pour une ou plusieurs dimensions.
a- Dice
b- Slice
c- roll-up
d- Pivot
3- Une base de données multidimensionnelle est une base de données normalisée.
a. Vrai
b. Faux
4- Les tables de dimensions sont des tables servant d'axes d'analyse. On peut par exemple analyser les ventes suivant l'axe des temps (table de dimensions) pour indiquer par
exemple pendant quel trimestre de l'année les ventes ont explosé.
a. Vrai
b. Faux
5- Soit une table de fait DataPoints(D1,D2,D3,x), et les trois requêtes suivantes:
Q1: Select D1,D2,D3, Sum(x) From DataPoints Group By D1,D2,D3
Q2: Select D1,D2,D3.Sum(x) From DataPoints Group By D1,D2,D3 WITH CUBE
Q3: Select D1,D2,D3, Sum(x) From DataPoints Group By D1,D2,D3 WITH ROLLUP
Les attributs D1, D2 et D3 ont respectivement n1, n2 et 13 valeurs différentes.
Supposons que toutes les combinaisons possibles de ces valeurs sont présentes dans la table 'DataPoints' au moins une fois. Le nombre de lignes dans le résultat de chacune des trois requêtes Q1, Q2 et Q3 peut être calculé par une formule utilisant n1, n2 et n3. Choisir le tuple (a, b, c, d, e, f) dans liste ci-dessous tel que, si n1=a, n2=b et n3=c, le nombre de lignes dans les requêtes Q1. Q2 et Q3 est respectivement d, e, et f.
a. (2.2, 2, 6, 18, 8)
b. (2, 2, 2, 8, 64, 15)
c. (5, 10, 10, 500, 1000, 550)
d. (4, 7, 3, 84, 160, 117)
Exercice 2: QCM (3 points)
(Une seule réponse est valide.)
La base de données d'une bibliothèque contient les deux tables suivantes:
Emprunt (Adherent, Livre, DateEmprunt, DateRetour Prevue, Date RetourEective)
Retard (Adherent, Livre. DateEmprunt, PenalitéRetard)
1- Quelles sont les Adhérents n'ayant jamais rendu de livre en retard?
a. SELECT t.Adherent FROM Emprunt t WHERE t. Adherent NOT IN (SELECT * FROM Retard u WHERE u. Adherent 1.Adherent)
b. SELECT Adherent FROM Emprunt WHERE Adherent NOT IN (SELECT Adherent FROM Retard)
c. SELECT Adherent FROM Emprunt WHERE Adherent NOT EXIST (SELECT Adherent FROM Retard)
2- Quelles sont les Adhérents ayant emprunté tous les livres (empruntés au moins une fois)?
a. SELECT 1.Adherent FROM Emprunt t WHERE NOT IN (SELECT FROM Emprunt u WHERE NOT EXISTS (SELECT FROM Emprunt v WHERE v.Adherent 1.Adherent AND v.Livre u.Livre))
b. SELECT t.Adherent FROM Emprunt t WHERE NOT EXISTS (SELECT * FROM Emprunt u WHERE NOT EXISTS (SELECT * FROM Emprunt v WHERE. v.Adherent -t.Adherent AND v.Livre u.Livre))
c. SELECT 1.Adherent FROM Emprunt 1 WHERE t. Adherent NOT IN (SELECT * FROM Emprunt u WHERE NOT EXISTS (SELECT FROM Emprunt v WHERE v.Adherent t.Adherent AND v.Livre u.Livre))
3- Quels sont les livres ayant été empruntés par tous les adhérents?
a. SELECT t.Livre FROM Emprunt t WHERE NOT EXISTS (SELECT * FROM Emprunt u WHERE NOT EXISTS (SELECT FROM Emprunt v WHERE u.Livre t. Livre AND v.Adherent =u.Adherent))
b. SELECT t.Livre FROM Emprunt : WHERE EXISTS (SELECT FROM Emprunt u WHERE EXISTS (SELECT FROM Emprunt v WHERE u.Livre-t.Livre AND v. Adherent u. Adherent))
c. SELECT t.Livre FROM Emprunt t WHERE NOT EXISTS (SELECT * FROM Emprunt u WHERE EXISTS (SELECT * FROM Emprunt v WHERE u.Livre-t.Livre AND v.Adherent =u.Adherent))
Exercice 3: (1 points)
Soit la table ACTIVITE suivante:
Donnez le résultat des requêtes suivantes:
a. SELECT Titulaire, SUM(Heures Cours) + SUM(Heures_Tp) as Charge from ACTIVITE group by Titulaire;
b. SELECT Titulaire, SUM(Heures_Cours + Heures Tp) as Charge from ACTIVITE group by Titulaire;
Exercice 4: (4 points)
On désire réaliser une application web pour concevoir les questionnaires d'enquêtes statistiques. Le système permet aux utilisateurs de réaliser les tâches suivantes:
S'authentifier avec un compte valide.
Consulter les questionnaires des enquêtes.
Modifier les questionnaires dans les cas suivants:
Questionnaire crée par l'utilisateur lui-même
L'utilisateur est contributeur dans la conception de l'enquête
L'utilisateur est le responsable de l'enquête.
Gérer une enquête (Créer, modifier,...)
Gérer les questionnaires d'une enquête (Créer, concevoir,...)
Valider les questionnaires pour lesquels l'utilisateur est responsable de l'enquête, est- ce pour clôturer la phase de conception.
Un questionnaire ne peut être validé que si tous les contributeurs ont déclaré la fin des modifications.
Une enquête peut comporter plusieurs questionnaires. Elle est caractérisée par son nom, la date, son type (Ménages, Entreprises), une description détaillée et un code unique.
Un questionnaire est lié à une seule enquête. Il se compose de plusieurs modules. Chaque module contient plusieurs variables. Une variable est caractérisée par son code unique, un libellé, une description et le type de stockage des valeurs (numérique, texte, booléen).
Une variable peut avoir une liste de valeurs possibles. Dans ce cas la variable est de type d'affichage (liste, case à cocher, ou bouton radio) sinon, elle est de type d'affichage (zone de texte)
Une variable peut avoir une ou plusieurs contraintes de validité, par exemple les contraintes suivantes : << valeur entre 1 et 99, valeur obligatoire,
1. Identifier les acteurs du système et donner le diagramme de cas d'utilisation pour décrire les différentes fonctionnalités.
2. Donner le diagramme de classes.
3. Donner le diagramme de séquences correspondant à la création d'un nouveau
questionnaire.
4. Donner le diagramme de séquences correspondant à la validation d'un questionnaire.
Exercice 5: (2 points)
(Préciser le langage de programmation utilisé)
Soit le tableau nums d'entiers, écrire une fonction qui prend un tableau non trié et qui retourne la différence maximal entre deux éléments successifs dans sa forme trié. Si le tableau contient un seul élément alors la fonction retourne zéro.
Exemple : Input: nums = [3, 6, 9, 1], Output: 3
Explication: le tableau trié est alors [1, 3, 6, 9], les deux possibilités (3,6) ou (6,9) ont une
différence maximale de (3).
Exercice 6: (3 points)
(Préciser le langage de programmation utilisé)
Vous avez une matrice M de dimensions mx et un entier positif r. On veut faire une rotation de la matrice r fois et afficher la matrice résultante. La rotation se fait dans le sens contraire des aiguilles de la montre. Dans une rotation, les éléments de la matrice doivent être déplacés d'une seule position à la fois. Le minimum des deux valeurs met n doit être un nombre pair. Le schéma suivant montre le sens de rotation d'une matrice de dimension 4×5:
Rotation d'une matrice
Travail demandé:
Ecrire une fonction qui prend en paramètre une matrice, ses dimensions et le nombre de rotations (r), et qui permet de faire la rotation de la matrice (r) fois.
Exercice 7: (4 points)
La blockchain est une technologie de stockage et de transmission d'informations, transparente, sécurisée, et fonctionnant sans organe central de contrôle.
Une blockchain constitue une base de données qui contient l'historique de tous les échanges effectués entre ses utilisateurs depuis sa création. Cette base de données est sécurisée et distribuée: elle est partagée par ses différents utilisateurs, sans intermédiaire, ce qui permet à chaque utilisateur de vérifier la validité de la blockchain.
La blockchain est composée de blocs. Chaque bloc contient des données (transactions) et des métadonnées telles que sa date de création (Timestamp). Un bloc contient aussi l'information sur sa propre valeur 'HASH' et la valeur du 'LAST_HASH' qui représente le résultat de l'application d'une fonction de hachage sur le bloc précèdent.
Dans une blockchain, chaque utilisateur possède un portefeuille (Wallet), représenté par une adresse publique (une "clé publique"). Celle-ci peut être comparée à l'identifiant d'un compte bancaire, qui permet à n'importe qui d'y envoyer des fonds via un virement.
Les transactions effectuées entre les utilisateurs du réseau sont regroupées par blocs. Chaque bloc est validé par les noeuds du réseau appelés les "Miners", selon des techniques qui dépendent du type de blockchain. Dans la blockchain du Bitcoin, cette technique est appelée "Proof-of-Work", et consiste en la résolution de problèmes algorithmiques complexes.
1- Donner une définition d'une fonction du hachage et donner 3 exemples.
2- Expliquer la différence entre le hachage, signature numérique et cryptage.
Pour simplifier l'exercice on suppose qu'une transaction est une chaine de
3- Créer la classe 'Block" et la classe 'BlockChain'.
4- Créer une classe 'Miner' et ajouter les méthodes suivantes:
om caractères.
hashBlock: retourne le hash d'un bloc en utilisant 'data", "timestamp", "nonce' et la valeur du 'Last hash'. On suppose qu'une des fonctions de hachage de la question (1) est déjà programmée.
'blockGenesis': Retourne un bloc initial qui représente le premier bloc d'une blockchain. Les données de ce bloc et la valeur du 'Last hash' sont vides, la valeur du timestamp est 1 et la valeur du 'difficulty' égale à 3.
'mineBlock': prend en paramètre le dernier bloc et les nouvelles données (transactions non encore validées) et retourne un nouveau bloc avec le hash calculé.
5- Ajouter les méthodes suivantes à la classe 'BlockChain':
Constructeur qui initialise la liste des blocs avec le bloc 'genesis'
'addBlock' pour ajouter un nouveau bloc.
'printBlockChaine' qui affiche les informations et le contenu de la Blockchain bloc par bloc.
Pour implémenter la notion du 'Proof of work' nous allons utiliser les deux entiers positifs 'difficulty' et 'nonce' de la classe 'Block'. La notion du 'Proof of work' permet d'éviter qu'un pirate puisse ajouter des blocs falsifiés dans notre blockchain.
6- Modifier la fonction 'mineBlock' pour permettre de générer des blocs dont les n premiers caractères du 'hash' sont des zéros tel que n est égale à la valeur de 'difficulty' du bloc précédent. Chaque fois où la fonction génère un hash non valide, la valeur du 'nonce' augmente de 1 (valeur initiale est 0) et le timestamp change. On répète l'opération jusqu'à satisfaction des critères.
Après la génération d'un hash valide on calcul la durée entre le dernier bloc et le bloc actuel. Si la durée dépasse dix minutes, on diminue la valeur de 'difficulty' par 1, sinon on l'augmente de 1.
7- Ecrire le programme principal pour créer une nouvelle blockchain. Ajouter trois blocs valides et afficher les informations de la blockchain.