From d3361281cd8d54d6f7471f83f90bbe34bc68553f Mon Sep 17 00:00:00 2001 From: Jean-Christophe Engel Date: Fri, 7 Jun 2024 13:43:54 +0200 Subject: [PATCH] code.js tri.js : : enregistrement initial --- code.js | 301 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ tri.js | 230 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 531 insertions(+) create mode 100644 code.js create mode 100644 tri.js diff --git a/code.js b/code.js new file mode 100644 index 0000000..98a4d6d --- /dev/null +++ b/code.js @@ -0,0 +1,301 @@ +// ------------------------------------------------------------------------ +// fabriquer une chaine aléatoire +const chaine = (length) => { + let chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzàâäéèêëîïôöûüùÀÂÄÉÈÊËÎÏÔÖÛÜÙ'; + let str = ''; + for (let i = 0; i < length; i++) { + str += chars.charAt(Math.floor(Math.random() * chars.length)); + } + return str; +} +// renvoyer une chaine +return chaine(10) + +// renvoyer un tableau de chaines +for (let i = 0; i < 3 + Math.floor(Math.random() * 5); ++i) { + ${lesnoms} = ${lesnoms}.concat(chaine(10)); +} +return ${lesnoms}; // => lesnoms + +// ------------------------------------------------------------------------ +// fabriquer chaîne avec nom prénom +const upper = (str) => { + return str.charAt(0).toUpperCase() + str.slice(1); +}; +const chaine = (length) => { + let chars = 'aàbcdeéèfghijklmnoôpqrstuùvwxyz'; + let str = ''; + for (let i = 0; i < length; i++) { + str += chars.charAt(Math.floor(Math.random() * chars.length)); + } + let debut = upper(str.slice(0, length/2)); + let fin = upper(str.slice(length/2)); + return debut + ' ' + fin; +}; +for (let i = 0; i < 7 + Math.floor(Math.random() * 15); ++i) { + ${lesnoms} = ${lesnoms}.concat(chaine(11 + Math.floor(Math.random() * 5))); +} +return ${lesnoms}; + +// fabriquer adresse courriel +const chaine = (length) => { + let chars = 'abcdefghijklmnopqrstuvwxyz0123456789'; + let str = ''; + for (let i = 0; i < length; i++) { + str += chars.charAt(Math.floor(Math.random() * chars.length)); + } + return str; +}; +return chaine(8) + "@ici.fr"; + +// code postal +return Math.random().toString(10).substring(2, 7); + +// numéro téléphone +return '0' + Math.random().toString(10).substring(2, 11); + +// supprimer espace dans numéro téléphone +return ${telephone}.replace(/\\s/g, "") + + +// ------------------------------------------------------------------------ +// Calculer date réelle à partir d'une date saisie même bizarre +// ex: 95/31/2020 => 03/10/2022 +function joursMois (annee, mois) { + return new Date(annee, mois, 0).getDate(); +} +function getDate(chaine) { + var ds = chaine.split('/'); + var jour=ds[0]; + var an = Math.floor(ds[1]/12); + var annee = Number(ds[2]) + an; + var mois = ds[1] - 12 * an; + var dm = joursMois(annee, mois); + while (jour > dm) { + jour -= dm; + ++mois; + if (mois > 12) { mois = 1; ++annee; } + dm = joursMois(annee, mois); + } + if (jour < 10) { jour = '0' + jour; } + if (mois < 10) { mois = '0' + mois; } + return(jour + '/' + mois + '/' + annee); +} +return getDate(${date}); + + +// ------------------------------------------------------------------------ +// rendre visibles les options de filtres de membre +var nav = document.querySelector(".dropdown"); +var li = nav.querySelectorAll("li"); +for (const l of li) { l.style.display="block"; } +return; + + +// ------------------------------------------------------------------------ +// vérifier la validité d'une date au format JJ/MM/AAAA + +// 1. séparer une date JJ/MM/AAAA selon les / +return ${ds}.split('/') // => ts + +// 2. faire une date au format MM-DD-YYYY +return ${ts}[1] + '-' + ${ts}[0] +'-' + ${ts}[2] // => dd + +// 3. vérifier si on peut créer une date valide +return ! isNaN(Date.parse(${dd})) // => ok + + +// ------------------------------------------------------------------------ +// créer un tableau d'objets {numéro, catégorie} +// le trier par numéro +// renvoyer le tableau des catégories +let tab = []; +for (let i = 0; i < ${lesnumeros}.length; ++i) +{ + let o = Object(); + o.num=${lesnumeros}[i]; + o.cat=${lescategories}[i]; + tab.push(o); +} + +// trier +tab.sort((a, b) => { + return a.num - b.num; +}); + +// catégories +let categs = []; +tab.forEach((e) => { + categs.push(e.cat); +}); +return categs; + +// ------------------------------------------------------------------------ +// renvoyer le numéro d'une catégorie donnée +// params : +// - nom d'une catégorie +// - tableau des catégories classé par numéro croissant +function getNumero(cat_name, categories) { + let i = 0; + while (i < categories.length) { + if (categories[i] == cat_name) { return i + 1; } + i += 1; + } +} + +return getNumero(${categorie}, ${categories_num}); + +// ------------------------------------------------------------------------ +// trier les membres : voir tri.js +// ------------------------------------------------------------------------ + +// sélectionner un parent parmi les nb premiers éléments du tableau +// lesnoms +function selParent(lesnoms, lesparents, nb) +{ + while(true) { + let num = Math.floor(Math.random() * nb); + if (lesparents[num].length == 0) { return lesnoms[num]; } + } +} +return selParent(${lesnoms}, ${lesparents}, ${i}) + +// trier les membres selon le parent +// critères : +// - id_parent IS NULL +// - nom_parent +// - nom_membre +// - numero +function trierParents(tparents, tnoms, tnumeros, croissant = true) +{ + let tab = []; + for (let i = 0; i < tnumeros.length; ++i) { + let o = Object(); + o.numero = tnumeros[i]; + o.nom = tnoms[i]; + o.parent = tparents[i]; + tab.push(o); + } + tab.sort((a, b) => { + if (! croissant) { [a, b] = [b, a]; } + let comp = a.parent.localeCompare(b.parent); + if (comp == 0) { comp = a.nom.localeCompare(b.nom); } + if (comp == 0) { comp = a.numero - b.numero; } + return comp; + }); + /* + if (a.parent === "") { + if (b.parent === "") { + // deux parents vides => comparer les noms + return a.nom.localeCompare(b.nom); + } + else { + return 1; + } + } + else { + if (b.parent === "") { + return -1; + } + else { + // deux parents non vides => comparer les noms + let comp = a.parent.localeCompare(b.parent); + if (comp == 0) { + comp = a.nom.localeCompare(b.nom); + } + return comp; + } + } + }); + */ + + return tab; +} +let tab = trier(${lesnumeros}, ${lesnoms}, ${lesparents}); +let resu = []; +tab.forEach((e) => { + resu.push(e.nom); +}); +return resu; + +// ------------------------------------------------------------------------ +// normaliser une chaîne : +// - mettre en minuscules +// - remplacer les caractères avec accent par leur équivalent sans accent +// ------------------------------------------------------------------------ +const accent = "àâäéèêëîïôöùûü"; +const normal = "aaaeeeeiioouuu"; + +function normaliser (chaine) { + let resu = ""; + chaine = chaine.toLocaleLowerCase(); + for (let i = 0; i < chaine.length; ++i) { + let ind = accent.indexOf(chaine[i]); + if (ind == -1) { + resu += chaine[i]; + } else { + resu += normal[ind]; + } + } + return resu; +} + +// const donnee = "Aèzfoj Rdùxiè"; +// let resu = normaliser(donnee.toLocaleLowerCase()); +// console.log("donnée = " + donnee + "\nresu = " + resu); + +// ------------------------------------------------------------------------ +// compter le nb d'occurences d'un élément dans un tableau de chaines +// ------------------------------------------------------------------------ +function nbocc(elem, tab) { + let nb = 0; + for (const e of tab) { + if (normaliser(e).localeCompare(elem) == 0) { nb += 1; } + } + return nb; +} +//return nbocc(${nom}.toLocaleLowerCase(), ${lesnoms}) + +// ------------------------------------------------------------------------ +// renvoyer un nom au hasard d'un tableau en s'assurant qu'il n'a pas +// d'homonyme après normalisation +// ------------------------------------------------------------------------ +function getNom(tab) { + while (true) { + let nom = tab.at(Math.floor(Math.random() * tab.length)); + let nb = nbocc(normaliser(nom), tab); + if (nb == 1) { return nom; } + } +} +return getNom(${lesnoms}) + +// ------------------------------------------------------------------------ +// vérifier qu'une chaine est présente dans un nom normalisé +// ------------------------------------------------------------------------ +function verif(chaine, nom) { + return normaliser(nom).includes(chaine); +} + +// ------------------------------------------------------------------------ +// faire un tableau des « homonymes » de chaine +// ------------------------------------------------------------------------ +function homonymes(chaine, tab) { + let homos = [] + for (const e of tab) { + if (normaliser(e).includes(chaine)) { + homos.push(e); + } + } + return homos; +} + +// idem en renvoyant les indices +function indonymes(chaine, tab) { + let homos = []; + for (let i = 0 ; i < tab.length; ++i) { + if (normaliser(tab[i]).includes(chaine)) { + homos.push(i); + } + } + return homos; +} diff --git a/tri.js b/tri.js new file mode 100644 index 0000000..2a2b46f --- /dev/null +++ b/tri.js @@ -0,0 +1,230 @@ +// trier par nom puis par numéro +function trierNoms(tnoms, tnumeros, croissant = true) +{ + let tab = []; + for (let i = 0; i < tnoms.length; ++i) + { + let o = Object(); + o.nom = tnoms[i]; + o.numero = tnumeros[i]; + tab.push(o); + } + + tab.sort((a, b) => { + if (! croissant) { [a, b] = [b, a]; } + let comp = a.nom.localeCompare(b.nom); + if (comp == 0) { comp = a.numero - b.numero; } + return comp; + }); + return tab; +} + +// extraire le tableau des noms d'un tableau d'objets trié +function extraireNoms(tab) +{ + let noms = []; + tab.forEach((e) => { + noms.push(e.nom); + }); + return noms; +} + +// afficher un tableau +function afficher(msg, tab) +{ + console.log("\n" + msg); + for (let i = 0; i < tab.length; ++i) + { + console.log(tab[i]); + } +} + +// trier par ville puis par numéro +// ville (dé)croissant, numéro (dé)croissant +// ville vide en fin(début), numéro (dé)croissant +function trierVilles(tvilles, tnumeros, croissant = true) +{ + let tab = []; + for (let i = 0; i < tvilles.length; ++i) + { + let o = Object(); + o.ville = tvilles[i]; + o.numero = tnumeros[i]; + tab.push(o); + } + + tab.sort((a, b) => { + if (! croissant) { [a, b] = [b, a]; } + + // une ville au moins vide ? + if (a.ville == "" && b.ville == "") { return a.numero - b.numero; } + if (a.ville == "") { return 1; } + if (b.ville == "") { return -1;} + + // deux villes non vides + let comp = a.ville.localeCompare(b.ville); + if (comp == 0) { comp = a.numero - b.numero; } + return comp; + }); + return tab; +} + +// extraire le tableau des villes d'un tableau d'objets trié +function extraireVilles(tab) +{ + let villes = []; + tab.forEach((e) => { + villes.push(e.ville); + }); + return villes; +} + +// trier les membres selon le parent +// - parent (dé)croissant, nom membre (dé)croissant, numéro (dé)croissant +// - parent vide à la fin, nom membre (dé)croissant, numéro (dé)croissant +function trierParents(tparents, tnoms, tnumeros, croissant = true) +{ + let tab = []; + for (let i = 0; i < tnumeros.length; ++i) { + let o = Object(); + o.numero = tnumeros[i]; + o.nom = tnoms[i]; + o.parent = tparents[i]; + tab.push(o); + } + tab.sort((a, b) => { + ordre = croissant ? 1 : -1; + + // un parent au moins est vide ? + if (a.parent == "" && b.parent == "") { + let comp = a.nom.localeCompare(b.nom); + if (comp == 0) { comp = a.numero - b.numero; } + return comp * ordre; + } + if (a.parent == "") { return 1; } + if (b.parent == "") { return -1; } + + // deux parents non vides + let comp = a.parent.localeCompare(b.parent); + if (comp == 0) { comp = a.nom.localeCompare(b.nom); } + if (comp == 0) { comp = a.numero - b.numero; } + return comp * ordre; + }); + + return tab; +} + +// trier les membres selon la colonne responsable +// - non vide au début, nom membre (dé)croissant, numéro (dé)croissant +// - vide à la fin, nom membre (dé)croissant, numéro (dé)croissant +function trierResp(tresp, tnoms, tnumeros, croissant = true) +{ + let tab = []; + for (let i = 0; i < tnumeros.length; ++i) { + let o = Object(); + o.numero = tnumeros[i]; + o.nom = tnoms[i]; + o.resp = tresp[i]; + tab.push(o); + } + tab.sort((a, b) => { + ordre = croissant ? 1 : -1; + + // un resp au moins est vide ? + if (a.resp == "" && b.resp == "") { + let comp = a.nom.localeCompare(b.nom); + if (comp == 0) { comp = a.numero - b.numero; } + return comp * ordre; + } + if (a.resp == "") { return 1; } + if (b.resp == "") { return -1; } + + // deux resp non vides + let comp = a.resp.localeCompare(b.resp); + if (comp == 0) { comp = a.nom.localeCompare(b.nom); } + if (comp == 0) { comp = a.numero - b.numero; } + return comp * ordre; + }); + + return tab; +} + +// ------------------------------------------------------------------------ +// les données et les tests +// ------------------------------------------------------------------------ + +const tnumeros = [ + 1, 2, 3, 4, 5, 6, 7, 8, 9, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123 +]; + +const tnoms = [ + "Lambert Paul", "Sjqeaz Njguqô", "Gfjkms Ôfyike", "Xnunèp Tmhàxz", "Xhràèk Ùmunyv", + "Jgévxù Wohyrv", "Mèkixt Ùyimtd", "Zhamberlain Luuc", "Ézhaée Ùùpwab", "Éàkhhô Psyauà", + "Lambert Paul", "Zphjéà Irôezqé", "Mpùuky Blégmmz", "Htôtkl Sxgtrô", "Kcfyè Nsvmvq", + "Hdzcpèn Rddpdafx", "Èàrgkx Idèpoù", "Rhocry Dlùvwpq", "Ziùcwe Hpqltrs", "Brkcàg Nigcyi", + "Jtinjôù Wmwiônj", "Cylsx Nzoèwl", "Éxiqnh Fcbwizà" +]; + +const tvilles = [ + "", "Erawvcyfézgrfoi", "Jbqmqeyemdbstcf", "Ùhkfwuvgpcuèùqa", "Yécewxefmepôàeé", + "La Havane", "Fyàwxsbedwanxqt", "", "Sipkàoféuslgiiu", "Psôhègébulaùdzm", + "Pioùôutôeyytùlà", "", "", "", "", + "", "", "", "La Havane", "", "", "La Havane", "" +]; + +const parents = [ + "", "", "", "", "", + "", "Jgévxù Wohyrv", "", "Zhamberlain Luuc", "", + "", "", "", "Xhràèk Ùmunyv", "Xnunèp Tmhàxz", + "", "Jgévxù Wohyrv", "", "Zhamberlain Luuc", "Gfjkms Ôfyike", + "Sjqeaz Njguqô", "Jgévxù Wohyrv", "Sjqeaz Njguqô" +]; + +const tresp = [ + "", "Oui", "Oui", "Oui", "Oui", + "Oui", "", "Oui", "", "", + "", "", "", "", "", + "", "", "", "", "", + "", "", "" +]; + +// console.log("p.l = " + parents.length + ", nom.l = " + tnoms.length + ", num.l = " + tnumeros.length + ", r.l = " + resp.length); + +// trier par nom croissant puis décroissant +let tab_noms = trierNoms(tnoms, tnumeros); +afficher("Tri par nom croissant :", tab_noms); +// let tnoms_trie = extraireNoms(tab_noms); +// afficher("Tableau de noms trié en ordre croissant", tnoms_trie); + +tab_noms = trierNoms(tnoms, tnumeros, false); +afficher("Tri par nom décroissant :", tab_noms); +// tnoms_trie = extraireNoms(tab_noms); +// afficher("Tableau de noms trié en ordre décroissant", tnoms_trie); + +// trier par ville croissante puis décroissante +let tab_villes = trierVilles(tvilles, tnumeros); +afficher("Tri par ville croissant :", tab_villes); +// let tvilles_trie = extraireVilles(tab_villes); +// afficher("Tableau de villes trié en ordre croissant", tvilles_trie); + +tab_villes = trierVilles(tvilles, tnumeros, false); +afficher("Tri par ville décroissant :", tab_villes); +// tvilles_trie = extraireVilles(tab_villes); +// afficher("Tableau de villes trié en ordre décroissant", tvilles_trie); + +// trier par parent croissant +let tab_parents = trierParents(parents, tnoms, tnumeros); +afficher("Tri par parent croissant :", tab_parents); + +tab_parents = trierParents(parents, tnoms, tnumeros, false); +afficher("Tri par parent décroissant :", tab_parents); + +// trier par resp croissant +let tab_resp = trierResp(tresp, tnoms, tnumeros); +afficher("Tri par resp croissant :", tab_resp); + +tab_resp = trierResp(tresp, tnoms, tnumeros, false); +afficher("Tri par resp décroissant :", tab_resp); +