Exam Maitrise CMO partie BDO O2 janvier 2002

Transcription

Exam Maitrise CMO partie BDO O2 janvier 2002
Nom :
page 1
Prénom :
Université Pierre et Marie Curie - Paris 6 - UFR 922 - Licence d'informatique
Module Bases de Données et Sites Web
Examen du 26 mai 2008
Version CORRIGEE
Documents autorisés – Durée : 2h.
Exercice 1 : XML, DTD, XPath
5 pts
On considère le fichier Vehicules.xml suivant, décrivant des véhicules.
<?xml version="1.0" encoding="UTF-8"?>
<vehicules>
<voiture const='C1'>
<modele>
<nom>Clio</nom>
<type>TCE</type>
</modele>
<puissance>4</puissance>
</voiture>
<voiture const='C2'>
<modele>
<nom>Prius</nom>
<type>linea</type>
</modele>
<puissance>5</puissance>
</voiture>
<camion const='C2'>
<modele>
<nom>Tundra</nom>
<type>Double Cab</type>
</modele>
<puissance>8</puissance>
</camion>
<voiture const='C1'>
<modele>
<nom>Modus</nom>
<type>turbo</type>
</modele>
<puissance>4</puissance>
</voiture>
<voiture const='C2'>
<modele>
<nom>Camry</nom>
<type>BVA</type>
</modele>
<puissance>7</puissance>
</voiture>
<constructeur n='C1' nom='Renault'>
<pays>France</pays>
</constructeur>
<constructeur n='C2' nom='Toyota'>
<pays>Japon</pays>
</constructeur>
</vehicules>
Question1. Ecrire une DTD Vehicules.dtd représentant des véhicules pour laquelle ce document est
conforme.
Lettres initiales du Prénom et du Nom:
page 2
< !ELEMENT Vehicules ((Voiture,|Camion|Constructeur)*)>
< !ELEMENT Voiture(modele,puissance)>
< !ELEMENT Camion(modele,puissance)>
< !ELEMENT Constructeur(pays)>
< !ELEMENT modele(nom,type)>
< !ELEMENT puissance (#PCDATA)>
< !ELEMENT nom (#PCDATA)>
< !ELEMENT type (#PCDATA)>
< !ELEMENT pays(#PCDATA)>
< !ATTLIST Voiture const IDREF #REQUIRED>
< !ATTLIST Camion const IDREF #REQUIRED>
< !ATTLIST Constructeur
n ID #REQUIRED
nom CDATA #REQUIRED>
Question2.On considère les expressions XPath suivantes, appliquées au document Vehicules.xml. Pour
chacune d’elles, indiquez ce qu’elles signifient, et ce qu’elles renvoient.
a) //voiture[position()=4]/modele/nom
Renvoie Camry. 4eme voiture du document
b) //voiture[position()=2][puissance > 4]/modele/nom
Renvoie Prius. Deuxième voiture du document qui a une puissance >4
c) //voiture[position()=2 and puissance > 4]/modele/nom
Lettres initiales du Prénom et du Nom:
Renvoie Prius
d) //voiture [puissance > 4] [position()=2]/modele/nom
Renvoie Camry. 2eme Voiture de puissance > 4 du document.
Question3. Exprimez en XPath les requêtes suivantes sur le fichier Vehicules.xml :
a) Nom des constructeurs de France
//constructeur[pays=’France’] /@nom
b) Pays du constructeur de la Clio
//constructeur[@n=//voiture[modele/nom=’Clio’]@const]/pays
c) Nom des modèles de voitures françaises
//voiture[@const=//constructeur[pays=’France’]/@n]/modele/nom
d) Nom des constructeurs qui ne construisent pas de camion.
//constructeur[not(@n=//camion/@const)]/@nom
page 3
Lettres initiales du Prénom et du Nom:
page 4
Question 4. Indiquez pour chacune des requêtes suivantes la réponse correspondante parmi celles qui
sont proposées :
Requêtes :
R1. //voiture[modele/nom=’Modus’]@const
R2. //voiture/modele[nom=’Modus’]@const
R3. //voiture[//nom=’Modus’]@const
R4. //voiture[modele/nom=’Modus’]/@const
Réponses :
a) C1
b) C1 C2
c) C1 C2 C1 C2
d) Pas de réponse
R1 …………………….
R2……………………..
R3…………………….
R4…………………….
Réponse :
R1……..a
R2……..d
R3……c
R4…….a
Exercice 2 : XSLT
5 pts
NB : Les questions 1 à 3 sont faciles de type TD. La question 4 mélange plusieurs
difficultées (mini-problème). Barème : question 1 à 3 : 1 point, question 4 : 2
points
On considère des fichiers XML qui contiennent une liste de documents sur internet. Chaque document est
associé à son type (page web ou image), son url et à une description succincte du document. Ces fichiers
XML suivent la DTD docs.dtd suivante :
<!ELEMENT
<!ELEMENT
<!ATTLIST
<!ELEMENT
<!ELEMENT
<!ELEMENT
docs (doc*) >
doc (type, url, description) >
doc numero ID #REQUIRED>
type (#PCDATA) >
url (#PCDATA) >
description (#PCDATA) >
Par exemple, le fichier exemple.xml ci-dessous contient deux documents (un de type “page web” et un
autre de type “image”) :
<docs>
<doc numero='1'>
Lettres initiales du Prénom et du Nom:
page 5
<type>page web</type>
<url>http://www.upmc.fr</url>
<description>Site web de l'UPMC</description>
</doc>
<doc numero='2'>
<type>image</type>
<url>http://www.upmc.fr/logo.jpg</url>
<description>Nouveau logo de l'UPMC</description>
</doc>
</docs>
Remarque : L’exemple ci-dessus contient seulement deux documents, mais vous répondrez aux questions
suivantes afin que vos feuilles XSL puissent traiter tous fichiers XML au format docs.dtd.
Question 1. Compléter la feuille XSL suivante pour qu’elle transforme un document XML (qui suit la
DTD docs.dtd) en un autre document XML contenant seulement une liste d’URL. Ce nouveau document
suit la DTD :
<!ELEMENT adresses (ad*) >
<!ELEMENT ad (#PCDATA)>
Par exemple, le résultat obtenu pour le fichier exemple.xml est :
<
adresses>
<ad>http://www.upmc.fr</ad>
<ad>http://www.upmc.fr/logo.jpg</ad>
</adresses>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match= "…………………………………">
/docs
<adresses>
<xsl:apply-templates select= "//doc"/>
</adresses>
</xsl:template>
<xsl:template match= "………………………………….">
<ad><xsl:value-of select='url'/></ad>
</xsl:template>
doc
Lettres initiales du Prénom et du Nom:
page 6
</xsl:stylesheet>
Question 2. Compléter la feuille XSL suivante pour quelle génère un nouveau document XML (qui
respecte la DTD docs.dtd) contenant seulement les documents de type « image ».
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match=”…………………………………...”>
/docs
<docs>
<xsl:copy-of select= "//doc[type='image']"/>
</docs>
</xsl:template>
</xsl:stylesheet>
Question 3 : Compléter la feuille XSL ci-dessous pour qu’elle transforme le document XML en une page
HTML indiquant le nombre de documents de type « image » et le nombre de documents de type « page
web » dans le fichier XML. Par exemple, pour le fichier exemple.xml, le code HTML obtenu est :
<HTML>
<p>Nombre d’images : 1</p>
<p>Nombre de pages web : 1 </p>
</HTML>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match= "…………………………………">
/docs
<HTML>
<p>Nombre d’images : <xsl:value-of
select="count(//doc[type='image'])"/></p>
<p>Nombre de pages web : <xsl:value-of
select="count(//doc[type='page web'])"/></p>
</HTML>
Lettres initiales du Prénom et du Nom:
page 7
</xsl:template>
</xsl:stylesheet>
Question 4. Compléter la feuille XSL ci-dessous pour qu’elle transforme un document XML (suivant la
DTD docs.dtd) en un page HTML qui affiche un tableau HTML contenant une ligne par document. Pour
chaque document, on affiche seulement son numéro (première colonne du tableau) et son url (deuxième
colonne du tableau) : les urls des documents de type « page web » sont affichées comme des liens
cliquables ayant la description du document comme valeur du lien, et les urls des documents de type
« image » sont remplacées par l’image avec un attribut alt contenant la description du document.
Par exemple, pour le fichier exemple.xml, le code HTML obtenu est :
<HTML>
<TABLE BORDER="1">
<TR><TH>Numero</TH><TH>URL</TH></TR>
<TR><TD>1</TD><TD><A href="http://www.upmc.fr">Site web de
l'UPMC</A></TD></TR>
<TR><TD>2</TD><TD><IMG width="200" src="http://www.upmc.fr/logo.jpg"
alt="Nouveau logo de
l'UPMC"></TD></TR>
</TABLE>
</HTML>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match= "………………………………….">
</xsl:template>
<xsl:template match= "…………………………………">
Lettres initiales du Prénom et du Nom:
page 8
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes" />
<xsl:template match= "/docs">
<HTML>
<TABLE BORDER='1'>
<TR><TH>Numero</TH><TH>URL</TH></TR>
<xsl:apply-templates select= "//doc"/>
</TABLE>
</HTML>
</xsl:template>
<xsl:template match= "doc">
<TR>
<TD><xsl:value-of select='@numero'/></TD>
<TD>
<xsl:if test="type='image'">
<IMG width='200'>
<xsl:attribute name='src'><xsl:value-of select='url'/></xsl:attribute>
<xsl:attribute name='alt'><xsl:value-of
select='description'/></xsl:attribute>
</IMG>
</xsl:if>
<xsl:if test="type='page web'">
<A><xsl:attribute name='href'><xsl:value-of
select='url'/></xsl:attribute>
<xsl:value-of select='description'/>
</A>
</xsl:if>
</TD>
</TR>
</xsl:template>
</xsl:stylesheet>
page 9
Lettres initiales du Prénom et du Nom:
Exercice 3 : SQL3
5 pts
On considère une base de données pour la gestion des menus d’un restaurant, dont le schéma
Entité/Association est donné ci-dessous :
:
Equivalent
type
nom
:
poids
Nom
Préparation
composant_de
Recette
:
durée
:
:
:
:
:
Ingrédient_de
fait_partie
accompagne
:
:
Menu
Date
Vin
Nom
Type
Nom
On précise qu’un menu peut être composé des recettes suivantes (décrite par le type de recette) : une
entrée (optionnelle), d’un plat (obligatoire) et d’un dessert (optionnel). Une recette est faite de
préparations, elles-mêmes éventuellement composées d’autres préparations qui leur servent d’ingrédient.
Par exemple, la sauce béchamel peut servir (entre autres) à confectionner une sauce mornay (en lui
ajoutant de l’œuf et du fromage). Les ingrédients de base (beurre, œuf, etc) peuvent donc être considérés
comme des préparations n’ayant pas d’ingrédient et de durée nulle. Une préparation pouvant ne pas être
réalisable (manque d’un ingrédient de base par exemple), il existe éventuellement une préparation
équivalente. Un vin a un type (« rouge », « rosé », « champagne », etc.) et chaque recette peut être
accompagnée d’un ou plusieurs vins.
Question 1 ( 1 points)
Compléter le schéma précédent en indiquant les cardinalités maximum:minimum dans les cadres prévus à
cet effet. On rappelle que les cardinalités s’expriment d’une entité vers une association, la flèche indique
le sens de lecture pour les associations réflexives. Une cardinalité peut-être un nombre entier (1, 2, 3…)
ou alors N, pour indiquer que le nombre ne peut être borné.
Préparation 0:N Ingrédient 1:N Préparation
Lettres initiales du Prénom et du Nom:
page 10
Préparation 0:1 Equivalent 0 :1 Préparation
Recette 1:N Composé 1 :N Préparation
Recette 1:N Accompagne 1 :N Vin
Recette 1:N fait_partie 1 :3 Menu
Question 2 ( 1 point)
Quelle(s) contrainte(s) d’intégrité sur un ou des attribut(s) de Préparation est induite par l’association
Ingrédient_de ? Répondre en français.
Le poids d’une préparation est égale à la somme des poids de ses ingrédients.
La durée d’une préparation est supérieure à la durée maximale de ses ingrédients.
Question 3 ( 2 points)
Compléter la série d’instruction SQL3 suivante pour créer le schéma d’une telle base de données. Vous
ne pouvez pas créer de type supplémentaire ni de table supplémentaire.
CREATE TYPE .....................................................;
CREATE TYPE Vin AS OBJECT
(
………………………………………………………..
………………………………………………………..
………………………………………………………..
);
CREATE TYPE Menu AS OBJECT
(
nom VARCHAR2(50),
date Date
);
Lettres initiales du Prénom et du Nom:
CREATE TYPE LesVins AS ………………………. Vin;
CREATE TYPE Recette AS OBJECT
(
nom VARCHAR2(50),
type VARCHAR2(30),
fait_partie ……………………,
accompagne ………………….
);
CREATE TYPE EnsRecettes AS …………………………………….. Recette;
CREATE TYPE EnsPréparation AS …………………………………. Preparation;
CREATE TYPE Préparation AS OBJECT
(
nom ………………………………………………,
durée ……………………………………………..,
poids……………………………………………...,
composant_de ……………………………………...,
équivalent ……………………………………...,
ingrédient_de ……………………………………...,
);
CREATE TABLE LesPréparations OF…………
…………………………………………
…………………………………………
……………………………………………. ;
CREATE TABLE LesMenus OF …………
…………………………………………
…………………………………………
……………………………………………. ;
page 11
Lettres initiales du Prénom et du Nom:
CREATE TABLE LesRecettes OF…………
…………………………………………
…………………………………………
……………………………………………. ;
CREATE TYPE Préparation;
CREATE TYPE Vin AS OBJECT
(
type VARCHAR2(20),
nom VARCHAR2(20)
);
CREATE TYPE Menu AS OBJECT
(
nom VARCHAR2(50),
date Date
);
CREATE TYPE LesVins AS TABLE OF REF Vin;
CREATE TYPE Recette AS OBJECT
(
nom VARCHAR2(50),
type VARCHAR2(30),
fait_partie REF Menu,
accompagne LesVins
);
CREATE TYPE EnsRecettes AS TABLE OF REF Recette;
CREATE TYPE EnsPréparation AS TABLE OF REF Preparation;
CREATE TYPE Préparation AS OBJECT
(
nom VARCHAR(20),
durée NUMBER(3),
poids NUMBER(3),
page 12
Lettres initiales du Prénom et du Nom:
page 13
composant_de EnsRecettes,
équivalent REF Préparation,
ingrédient_de EnsPréparation
);
CREATE TABLE LesPréparations OF Préparation ;
CREATE TABLE LesMenus OF Menu ;
CREATE TABLE LesRecettes OF Recette
NESTED TABLE accompagne STORE AS tabvins;
Question 4 (1 point)
Quel problème de redondances posent les associations Composant_de et Ingrédient_de par rapport à
l’entité Préparation ? Indiquez ci-dessous les modifications à apporter au schéma Entité/Association
(ajouter uniquement des attributs dans le schéma ci-dessous) pour résoudre ce problème.
Problèmes de redondance :
Modification du schéma Entité/Association :
Equivalent
Recette
Composant
Préparation
Ingrédient_de
Lettres initiales du Prénom et du Nom:
page 14
Reportez ces modifications sur les créations de type : rayez les types inutiles et créez les nouveaux types
nécessaires. Lorsqu’un type est inchangé par rapport à la question 3, il suffit d’indiquer « inchangé ».
CREATE TYPE .....................................................;
CREATE TYPE Vin AS OBJECT
(………………………………………………………..
………………………………………………………..
);
CREATE TYPE Menu AS OBJECT
(nom VARCHAR2(50),
date Date
);
CREATE TYPE LesVins AS ………………………. Vin;
CREATE TYPE Recette AS OBJECT
(
nom VARCHAR2(50),
type VARCHAR2(30),
fait_partie ……………………,
accompagne ………………….
);
CREATE TYPE EnsRecettes AS …………………………………….. Recette;
CREATE TYPE EnsPréparation AS …………………………………. Preparation;
CREATE TYPE Préparation AS OBJECT
(
nom ………………………………………………,
Lettres initiales du Prénom et du Nom:
durée ……………………………………………..,
poids……………………………………………...,
composant_de ……………………………………...,
équivalent ……………………………………...,
ingrédient_de ……………………………………...,
);
CREATE TABLE LesPréparations OF…………
…………………………………………
…………………………………………
……………………………………………. ;
CREATE TABLE LesMenus OF …………
…………………………………………
…………………………………………
……………………………………………. ;
CREATE TABLE LesRecettes OF…………
…………………………………………
…………………………………………
………………………………………;
CREATE TYPE Préparation;
CREATE TYPE Vin AS OBJECT
(
type VARCHAR2(20),
nom VARCHAR2(20)
);
CREATE TYPE Menu AS OBJECT
(
nom VARCHAR2(50),
date Date
);
CREATE TYPE LesVins AS TABLE OF REF Vin;
page 15
Lettres initiales du Prénom et du Nom:
CREATE TYPE Recette AS OBJECT
(
nom VARCHAR2(50),
type VARCHAR2(30),
fait_partie REF Menu,
accompagne LesVins
);
CREATE TYPE EnsRecettes AS TABLE OF REF Recette;
CREATE TYPE EnsPréparation AS TABLE OF REF Preparation;
CREATE TYPE CompoR as OBJECT
( quoi REF Recette,
Combien NUMBER(3)
);
CREATE TYPE EnsCompoR as TABLE of CompoR ;
CREATE TYPE CompoP as OBJECT
( quoi REF Preparation,
Combien NUMBER(3)
);
CREATE TYPE EnsCompoP as TABLE of CompoP ;
CREATE TYPE Préparation AS OBJECT
(
nom VARCHAR(20),
durée NUMBER(3),
poids NUMBER(3),
composant_de EnsCompoR,
équivalent REF Préparation,
ingrédient_de EnsCompoP
);
CREATE TABLE LesPréparations OF Préparation
NESTED TABLE composant_de STORE as tabcompo
NESTED TABLE ingredient_de STORE as tabingre ;
CREATE TABLE LesMenus OF Menu ;
page 16
Lettres initiales du Prénom et du Nom:
page 17
CREATE TABLE LesRecettes OF Recette
NESTED TABLE accompagne STORE AS tabvins;
Exercice 4 : PHP
5 pts
Soit le script PHP suivant
<HTML>
<HEAD><TITLE> Etudiants inscrits </TITLE></HEAD>
<BODY>
<TABLE border=1>
<TR><TD>Nom </TD><TD>Prénom </TD></TR>
< ?
$cnx=mysql_connect(”localhost ”, ”NomResp”, ”PassResp”) ;
Mysql_select_db(“Notes”,$cnx);
$req = mysql_query(”select * from BaseEtudiant”, $cnx) ;
while ($res=mysql_fetch_array($req)){
echo ”<TR><TD>”.$res[“NomE”]
. ”</TD><TD>”.$res[”PrenomE”].”</TD></TR>\n”;
}
?>
</TABLE>
</BODY>
</HTML>
1- Expliquez ce que fait ce script ?
Le script affiche sur une page html les étudiants inscrits (nom+prénom) et qui sont stockés dans la base
BaseEtudiant. La consultation de la page se fait via le script php qui interroge la base BaseEtudiant et
affiche le nom et le prénom des étudiants les uns après les autres dans un tableau.
2- On suppose que la table BaseEtudiant contient les n-uplets suivants :
Lettres initiales du Prénom et du Nom:
page 18
(Durand, Matthieu) ; (Dupont, Xavier) ; (Mary, Zoé)
Représentez sur un schéma le résultat de l’exécution de ce code dans un navigateur.
Nom
Prénom
Durand Matthieu
Dupont Xavier
Mary
Zoé
3- On veut ajouter à ce code deux champs de saisies permettant à un responsable de rentrer les notes de
partiels et d’examens. Chacun de ces deux champs apparaissent devant les noms et les prénoms des
étudiants. Indiquez les modifications à apporter au script précédent permettant l’affichage de ces
champs ainsi que le bouton d’envoi du formulaire. Une fois le bouton d’envoi est pressé, le script PHP
CalculNote.php calculera la moyenne générale des notes (voir la question suivante).
Indication : On pourra utiliser un champ idp et ide permettant le repérage des notes de partiels et
d’examens.
L’ajout de nouvelles parties se fait en gras.
<HTML>
<HEAD><TITLE> Articles choisis </TITLE></HEAD>
<BODY>
<center>
<TABLE border=1>
<TR><TD>Nom produit</TD><TD>Prix Unitaire</TD><TD>Note
Partiel</TD><TD>Note Examen</TD></TR>
<form method="post" action="CalculNote.php">
<?php
$cnx=mysql_connect(”localhost ”, ”NomResp”, ”PassResp”) ;
mysql_select_db("Notes ", $cnx);
$req = mysql_query("select * from BaseEtudiant ",$cnx);
$idp=1;
$ide=1;
while ($res=mysql_fetch_array($req)){
Lettres initiales du Prénom et du Nom:
page 19
echo "<TR><TD>".$res["NomE "]
. "</TD><TD>".$res["PrenomE "].'</TD><TD> <input type="text" size="2"
name='.$idp.'> </TD><TD> <input type="text" size="2" name='.$ide.'> </TD></TR>';
$idp+=1;
$ide+=1;
}
echo
'</TABLE><BR>';
echo '<input type="submit" name="Submit" value="OK">';
?>
</form>
</center>
</BODY>
</HTML>
3- On s’intéresse maintenant au script CalculNote.php calculant la moyenne générale. Pour cela on
suppose que le coefficient du partiel vaut 0.4 et celui de l’examen est égal à 0.6. Donnez les
instructions permettant d’afficher la moyenne générale des notes.
Indication : La formule de ce calcul est
1
MoyenneG =
∑ 0.4 * x. partiel + 0.6 * x.examen où x.partiel (respectivement x.examen)
NbEtudiants x∈{Etudiants}
est la note du partiel (respectivement de l’examen) de l’étudiant x.
Le script CalculNote.php :
<html>
<body bgcolor="#00CCCC" text="#FFFFFF" link="#990066">
<hr />
<p align="center"><font size="5">Moyenne Générale</font></p>
<hr />
<?php
Lettres initiales du Prénom et du Nom:
$cnx=mysql_connect(”localhost ”, ”NomResp”, ”PassResp”) ;
mysql_select_db("Notes ", $cnx);
$req = mysql_query("select * from BaseEtudiant ",$cnx);
$idp=$ide=1;
$Somme=0;
$NbE=1 ;
while ($res=mysql_fetch_array($req)){
if($_POST[$idp]>=0 && $_POST[$ide]>=0){
$Somme+=0.4*$_POST[$idp]+ 0.6*$_POST[$ide];
$NbE++ ;
}
$id+=1;
}
$Moyenne=$Somme/$NbE ;
echo "<B>$Moyenne</B>";
?>
</body>
</html>
page 20

Documents pareils