add BDD tp's 4, Droit's TP and maths's TP

master
Antoine PEREDERII 2 years ago
parent 7ab040c294
commit 916b30019d

@ -0,0 +1,172 @@
-- ? 1 - Écrire une fonction qui pour un match donné calcule le nombre de rebonds
-- ? pris par les joueurs qui nont pas débuté la rencontre. Proposez deux versions,
-- ? une utilisant les fonctions dagrégation et une autre utilisant un curseur mais aucune fonction dagrégation.
CREATE OR REPLACE FUNCTION calcul_rebonds(match Game.id%TYPE) RETURNS integer AS $$
DECLARE
sumRebounds integer;
BEGIN
SELECT sum(gd.rebounds) INTO sumRebounds
FROM GameDetail gd, Game g
WHERE g.id = match AND gd.idGame = g.id AND gd.startPosition is NULL;
RETURN sumRebounds;
END;
$$ LANGUAGE plpgsql;
SELECT calcul_rebonds('22100979');
-- CREATE FUNCTION
-- calcul_rebonds
-- ----------------
-- 32
-- (1 row)
CREATE OR REPLACE FUNCTION calcul_rebonds_curs(match Game.id%TYPE) RETURNS GameDetail.rebounds%TYPE AS $$
DECLARE
sumRebounds GameDetail.rebounds%TYPE := 0;
rbs GameDetail.rebounds%TYPE := 0;
curs cursor FOR SELECT rebounds
FROM GameDetail
WHERE idGame = match AND startPosition is NULL AND rebounds is NOT NULL;
BEGIN
OPEN curs;
FETCH curs INTO rbs;
WHILE FOUND LOOP
sumRebounds = sumRebounds + rbs;
FETCH curs INTO rbs;
END LOOP;
CLOSE curs;
RETURN sumRebounds;
END;
$$ LANGUAGE plpgsql;
SELECT calcul_rebonds_curs('22100979');
-- CREATE FUNCTION
-- calcul_rebonds_curs
-- ---------------------
-- 32
-- (1 row)
-- ? 2 - Vérifier que vos deux versions retournent les mêmes résultats en affichant le nombre total de rebonds
-- ? pris par les joueurs nayant pas débuté la rencontre pour tous les matchs ayant eu lieu le 12 mars 2022.
SELECT calcul_rebonds(id)
FROM Game
WHERE dateGame = '2022-03-12';
-- calcul_rebonds
-- ----------------
-- 39
-- 20
-- 43
-- 40
-- 41
-- 25
-- 24
-- (7 rows)
SELECT calcul_rebonds_curs(id)
FROM Game
WHERE dateGame = '2022-03-12';
-- calcul_rebonds_curs
-- ---------------------
-- 39
-- 20
-- 43
-- 40
-- 41
-- 25
-- 24
-- (7 rows)
-- ? 3 - Écrire une fonction qui calcule la même chose mais pour les joueurs ayant débuté la rencontre,
-- ? autrement dit qui calcule, pour un match donné, le nombre de rebonds pris par les joueurs ayant débuté la rencontre.
CREATE OR REPLACE FUNCTION calcul_rebonds_t(match Game.id%TYPE) RETURNS integer AS $$
DECLARE
sumRebounds integer;
BEGIN
SELECT sum(gd.rebounds) INTO sumRebounds
FROM GameDetail gd, Game g
WHERE g.id = match AND gd.idGame = g.id AND gd.startPosition is NOT NULL;
IF sumRebounds is NULL THEN
RETURN 0;
END IF;
RETURN sumRebounds;
END;
$$ LANGUAGE plpgsql;
SELECT calcul_rebonds_t('22100979');
-- CREATE FUNCTION
-- calcul_rebonds_t
-- ------------------
-- 57
-- (1 row)
CREATE OR REPLACE FUNCTION calcul_rebonds_curs_t(match Game.id%TYPE) RETURNS GameDetail.rebounds%TYPE AS $$
DECLARE
sumRebounds GameDetail.rebounds%TYPE := 0;
rbs GameDetail.rebounds%TYPE := 0;
curs cursor FOR SELECT rebounds
FROM GameDetail
WHERE idGame = match AND startPosition is NOT NULL AND rebounds is NOT NULL;
BEGIN
OPEN curs;
FETCH curs INTO rbs;
WHILE FOUND LOOP
sumRebounds = sumRebounds + rbs;
FETCH curs INTO rbs;
END LOOP;
CLOSE curs;
RETURN sumRebounds;
END;
$$ LANGUAGE plpgsql;
SELECT calcul_rebonds_curs_t('22100979');
-- CREATE FUNCTION
-- calcul_rebonds_curs_t
-- -----------------------
-- 57
-- (1 row)
SELECT calcul_rebonds_t('10300004');
SELECT calcul_rebonds_curs_t('10300004');
-- ? 4 - Trouver le match (abréviation des équipes et date) pendant lequel les joueurs
-- ? ayant débuté la rencontre ont réalisé le plus de rebonds.
SELECT t1.abbreviation, t2.abbreviation, g.dateGame, calcul_rebonds_t(g.id)
FROM Game g, Team t1, Team t2
WHERE g.idHomeTeam = t1.id AND g.idVisitorTeam = t2.id AND calcul_rebonds_t(g.id) = (SELECT max(calcul_rebonds_t(id))
FROM Game);
-- abbreviation | abbreviation | dategame | calcul_rebonds_t
-- --------------+--------------+------------+------------------
-- POR | DEN | 2019-05-03 | 101
-- (1 row)
-- ? 5 - Y a til des matchs pour lesquels les données sur les rebonds sont incohérentes?
-- ? Vérifier en comparant les valeurs obtenus grâce aux fonctions précédentes avec les valeurs contenues dans la table Game.
-- ! SELECT t1.abbreviation, t2.abbreviation, g.dateGame, (calcul_rebonds_t(g.id) + calcul_rebonds(g.id)) as fct, g.reboundsHome, g.reboundsAway
-- ! FROM Game g, Team t1, Team t2
-- ! WHERE g.idHomeTeam = t1.id AND g.idVisitorTeam = t2.id AND calcul_rebonds_t(g.id) = (SELECT max(calcul_rebonds_t(id))
-- ! FROM Game);

Binary file not shown.

@ -0,0 +1,287 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "a35eeb9f-df70-4ab1-a243-2d2025888eb0",
"metadata": {},
"source": [
"# Exercice 1\n",
"1) Combien y a t'il de dominos dans un jeu classique ? \n",
"Un jeu de dominos classique est composé de 28 pièces dont chaque moitié comporte un certain nombre de petits points allant de 0 à 6, sans doublons, ce qui donne 7 * 4 = 28 pièces.\n",
"\n",
"2) Pourquoi est-il possible que le jeu s'arrête sans avoir posé tous les dominos ? \n",
"Il est possible que le jeu s'arrete avant d'avoir posé tout les dominos car chaque moitié comporte un certain nombre de petits points allant de 0 à 6. Si les combinaisons de dominos disponibles dans la pioche ne sont pas compatibles avec les extrémités de la chaîne déjà construite, le jeu peut se terminer sans avoir posé tous les dominos. Cela dépend de la chance et de l'ordre dans lequel les dominos sont tirés.\n",
"\n",
"3) Pourquoi X et Y sont des variables aléatoires ? \n",
"X et Y sont des variables aléatoires car leur valeur dépend du hasard et des choix effectués tout au long du jeu. La variable aléatoire X représente le nombre de dominos posés dans la chaîne, et elle dépend du nombre de dominos tirés et de la possibilité de les placer à chaque étape. De même, la variable aléatoire Y représente le nombre de points restants dans la pioche, ce qui dépend également de la manière dont les dominos sont tirés et placés. En raison de la nature aléatoire du jeu, X et Y prennent des valeurs différentes à chaque partie, d'où leur caractère aléatoire. Pour comprendre leur comportement, il est nécessaire d'étudier leur distribution de probabilité."
]
},
{
"cell_type": "markdown",
"id": "2f8b9e53-7277-4663-ad35-0db9e824d45f",
"metadata": {},
"source": [
"- Quelle structure de données pour représenter la pioche de dominos restants ?\n",
" - La structure nécéssaire est une file car on insere en queue mais on supprime en tete\n",
"- Quelle structure de données pour représenter la chaîne de dominos déjà construite? (Sachant qu'il suffit de considérer l'information pertinente pour le déroulement du jeu.)\n",
" - Une liste car c'est une fassons simple de stocker les dominos mis en place sur le tapis\n",
"- Comment savoir si le jeu est \u001c",
"fini ?\n",
" - si on ne peut plus inserer en tete ou en queue les dominos de la pioche.\n",
"- Est-il éventuellement utile d'écrire certaines sous-fonctions, afin de clarifier le code ? \n",
"Ca peut être plus simple à comprendre le code, notamment pour le comptage de Y."
]
},
{
"cell_type": "markdown",
"id": "060f3b6e-ed57-4ecc-9338-f2491f54bd74",
"metadata": {},
"source": [
"exemple de file en python :"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "bee8d798-d9bb-464c-9b66-329678fa2fda",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1\n",
"[2, 3]\n"
]
}
],
"source": [
"queue = [] # la file est vide\n",
"\n",
"queue.append(1) # la file contient [1]\n",
"queue.append(2) # la file contient [1, 2]\n",
"queue.append(3) # la file contient [1, 2, 3]\n",
"\n",
"result = queue.pop(0) # la file contient [2, 3]\n",
"\n",
"print(result)\n",
"print(queue)"
]
},
{
"cell_type": "markdown",
"id": "5fabca55-4ebf-4499-b652-86844be439e5",
"metadata": {},
"source": [
"**Initialisation et affichage de la pioche**"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "fe55883a-6887-43dd-9498-5333a51799e2",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1, 1]\n",
"[1, 2]\n",
"[1, 3]\n",
"[1, 4]\n",
"[1, 5]\n",
"[1, 6]\n",
"[2, 2]\n",
"[2, 3]\n",
"[2, 4]\n",
"[2, 5]\n",
"[2, 6]\n",
"[3, 3]\n",
"[3, 4]\n",
"[3, 5]\n",
"[3, 6]\n",
"[4, 4]\n",
"[4, 5]\n",
"[4, 6]\n",
"[5, 5]\n",
"[5, 6]\n",
"[6, 6]\n"
]
}
],
"source": [
"import random\n",
"\n",
"# initialisation de la pioche contenant 28 pièces\n",
"pioche = [[i, j] for i in range(1,7) for j in range(i, 7)]\n",
"\n",
"# Exemple d'utilisation : affichez la file de dominos\n",
"for domino in pioche:\n",
" print(domino)"
]
},
{
"cell_type": "code",
"execution_count": 67,
"id": "09689b16-24dc-4025-bad9-90d0fe385b6b",
"metadata": {},
"outputs": [],
"source": [
"def comptePoints(P):\n",
" # Initialise un compteur pour les points\n",
" nb = 0\n",
" \n",
" # Parcours tous les dominos de la liste\n",
" for domino in P:\n",
" # Ajoute les points des deux moitiés du domino\n",
" nb += sum(domino)\n",
" \n",
" return nb"
]
},
{
"cell_type": "code",
"execution_count": 433,
"id": "f62cffa4-8e44-4b62-a49a-c3b4c9c50964",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"X = 20, Y = 10\n"
]
}
],
"source": [
"# Fonction pour simuler une partie du jeu de dominos\n",
"def une_chaine_domino():\n",
" # Liste représentant les dominos sur le jeu\n",
" tapis = []\n",
"\n",
" #initialisation d'une variable pour compter le nombre de pioche dans la pioche\n",
" cpt = 0\n",
" \n",
" # Liste représentant la pioche de dominos restants\n",
" pioche = [(i, j) for i in range(1, 7) for j in range(i, 7)]\n",
"\n",
" # Tant que la pioche n'est pas vide et qu'on peut poser des dominos\n",
" while pioche:\n",
" domino = random.choice(pioche) # Tirer un domino au hasard\n",
" pioche.remove(domino) # Retirer le domino de la pioche\n",
"\n",
" if not tapis: # Si c'est le premier domino, ajoutez-le directement\n",
" tapis.append(domino)\n",
" else:\n",
" # Vérifiez si le domino peut être placé à l'une des extrémités de la chaîne\n",
" if domino[0] == tapis[0][0] or domino[1] == tapis[0][0]:\n",
" tapis.insert(0, domino) # Placez-le au début de la chaîne\n",
" cpt = 0;\n",
" elif domino[0] == tapis[0][1] or domino[1] == tapis[0][1]: # On regarde le second argument du premier couple du tapis\n",
" tapis.append(domino) # Placez-le à la fin de la chaîne\n",
" cpt = 0;\n",
" else:\n",
" pioche.append(domino)\n",
" cpt = cpt + 1;\n",
" if(cpt > len(pioche)):\n",
" break # Si après un tour entier de la pioche est éfféctué sans pour voir placer un domino\n",
"\n",
" # Valeur de X : nombre de dominos posés dans la chaîne\n",
" X = len(tapis)\n",
"\n",
" # Valeur de Y : nombre de points restants dans la pioche\n",
" Y = comptePoints(pioche)\n",
"\n",
" return X, Y\n",
"\n",
"# Utilisation de la fonction\n",
"X, Y = une_chaine_domino()\n",
"print(f\"X = {X}, Y = {Y}\")"
]
},
{
"cell_type": "markdown",
"id": "0e26c4cc-b76f-40b6-9146-ee2ffb396909",
"metadata": {},
"source": [
"# Exercice 3 (Analyse probabiliste). \n",
"Simulez un grand nombre de réalisations du jeu (au moins 10000). \n",
"Puis, à l'aide des méthodes déjà vues en cours et en TP :"
]
},
{
"cell_type": "code",
"execution_count": 442,
"id": "c86fee95-c245-407b-b93b-4c53661b08a2",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Moyenne de X : 14.8719\n",
"Moyenne de Y : 48.1079\n"
]
}
],
"source": [
"# Nombre de réalisations du jeu\n",
"nombre_de_realisations = 10000\n",
"\n",
"# Liste pour stocker les résultats des n réalisations\n",
"resultats = []\n",
"\n",
"# Simulez le jeu un grand nombre de fois et stockez les résultats\n",
"for _ in range(nombre_de_realisations):\n",
" X, Y = une_chaine_domino()\n",
" resultats.append((X, Y))\n",
"\n",
"# Vous pouvez maintenant analyser les résultats pour obtenir des statistiques\n",
"# Par exemple, vous pouvez calculer la moyenne et l'écart-type pour X et Y.\n",
"moyenne_X = sum(X for X, Y in resultats) / nombre_de_realisations\n",
"moyenne_Y = sum(Y for X, Y in resultats) / nombre_de_realisations\n",
"\n",
"# Affichez les résultats statistiques\n",
"print(f\"Moyenne de X : {moyenne_X}\")\n",
"print(f\"Moyenne de Y : {moyenne_Y}\")"
]
},
{
"cell_type": "markdown",
"id": "111760f4-ecc7-4a97-84bc-de48314e0eb0",
"metadata": {},
"source": [
"1. Estimer et représenter la loi de probabilité de la variable X.\n",
"2. Calculer et tracer la fonction de répartition de X.\n",
"3. Estimer l'espérance de X.\n",
"4. Estimer la variance de X.\n",
"5. Mêmes questions pour la variable Y .\n",
"6. Estimer la probabilité de succès au jeu, c'est-à-dire, la probabilité de parvenir à placer tous\n",
"les dominos dans la chaine.\n",
"7. Estimer le nombre médian de points restants dans la pioche."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

File diff suppressed because one or more lines are too long

@ -1,9 +0,0 @@
# Exercice 1
# 1 - Combien y a t'il de dominos dans un jeu classique ?
# un jeu de dominos classique est composé de 28 pièces dont chaque moitié comporte un certain nombre de petits points allant de 0 à 6.
# 2 - Pourquoi est-il possible que le jeu s'arrête sans avoir posé tous les dominos ?
# Il est possible que le jeu s'arrete avant d'avoir posé tout les dominos car chaque moitié comporte un certain nombre de petits points allant de 0 à 6, il est donc possible
# 3 - Pourquoi X et Y sont des variables aléatoires ?

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save