Bonjour tout le monde ! Je vous propose ce premier exercice dans la continuité de ceux déjà proposer pour vous entrainer et constituer une petite base sympa ! Il est possible de faire l'exercide dans n'importe quel langage ! Veuillez m'excuser pour la froideur de l'énoncé, je ne suis pas un grand rédacteur xD
Les tableaux d'indices (et de références)
Pour tout les niveaux vous devrez respecter certaines contraintes :
-
Il faut toujours vérifier que les données sont valides (que le telephone ne soit composé que de chiffre par exemple)
-
Il faut que l'ensemble des fonctionnalité demandées dans les niveaux précédents fonctionnent encore !
Les objectifs sont là pour vous donner des conseils et ce que vous devez faire puisqu'il existe parfois d'autre façon de faire mais l'exercice est fait pour faire travailler certains concepts (les tableaux d'indices notamment), ne pas les suivre reviendraient à ne pas faire l'exercice
Si vous postez du code, merci de le mettre dans la balise secret (ici si vous ne savez pas faire) pour ne pas avoir une page trop grande et ne pas spoiler ceux qui réfléchissent encore !
Niveau 1
Enoncé
Lire les noms, prénoms et téléphones. Arrêt de la lecture au caractère *. Afficher le tableau dans l'ordre alphabétique (nom puis prénom)
Données
Pour le langage C
1 2 3 4 5 | typedef struct Pers { char nom[256]; char prenom[256]; char tel[10]; } Contact; |
Pour le langage Java
1 2 3 4 5 | public class Contact{ String nom; String prenom; String tel; } |
Objectifs
Faire un tri au fur et a mesure
Exemple
Entrée :
1 2 3 4 | Toto tata 0123456789 Titi toto 0123654789 ToTo titi 0321456987 Tata TuTu 0321654789 |
Tableau trié :
1 2 3 4 | tata tutu 0321654789 titi toto 0123654789 toto tata 0123456789 toto titi 0321456987 |
Niveau 2
Énoncé
Lire une commande et exécuter une commande
Donnée
-
m nom prenom : modification du contact nom prenom
-
s nom prenom : suppression du contact nom prenom
-
a nom prenom telephone : ajout du contact nom prenom
-
A : affichage de la liste des contact
-
A nom [prenom] : affichage des contacts ayant le nom (ou prenom si indiqué)
-
r nom [prenom] : recherche du ou des contacts ayant le nom (et optionnellement le prenom)
Niveau 2.1
Données
-
mn : modification nom
-
mp : modification prenom
-
mt : modification telephone
Objectif
Récupérer et interpréter un code commande
Exemple
(Avec les entrées précédentes) Entrée :
1 2 3 4 5 | a toto titi a toto tutu s ToTO TAtA A TOTo A |
Sortie :
1 2 3 4 5 6 7 8 9 10 11 12 13 | Contact [Toto, Titi, 0321456987] a été ajouté avec succès Erreur 253 : Le contact [Toto, tutu] n'existe pas Suppression du contact [Toto, Tata, 0123456789] effectuée {[Toto, Tata, 0123456789], [Toto, Titi, 0321456987]} {[Tata, Tutu, 0321654789], [Titi, Toto, 0123654789], [Toto, Tata, 0123456789], [Toto, Titi, 0321456987]} |
(Ce sont des exemples d'affichage tout moisi, faites un truc un peu plus beau !)
Niveau 3
Énoncé
On veut différencier deux types de contact : les professionnels, les personnels
Au moment de l'ajout d'un contact, j'indique "pro" s'il s'agit d'un contact professionnel, "pers" pour personnel
On veut aussi pouvoir afficher, toujours dans l'ordre alphabétique, les contacts pro uniquement, perso uniquement, tout les contacts
Données
- a nom prenom tel type : Même façon que pour le niveau 1 ; type par defaut : pro
- A pro/pers : Affichage de contacts pro ou perso
Objectifs
Gérer plusieurs tableaux.
Il est INTERDIT de modifier la structure !
Exemple
Entrée :
1 2 3 4 5 6 7 | a TATA TurlUTUTu 0147852369 pro a TatA CHAPEAUpointU 0369852147 pers a TOTO tututu 0159874236 A A pro A pers |
Sortie :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Contact [Tata, Turlututu, 0147852369, professionnel] a été ajouté avec succès Contact [Tata, Chapeaupointu, 0369852147, personnel] a été ajouté avec succès Contact [Toto, Tututu, 0159874236, personnel] a été ajouté avec succès {[Tata, Chapeaupointu, 0369852147, personnel], [Tata, Turlututu, 0147852369, professionnel], [Toto, Tututu, 0159874236, personnel]} {[Tata, Turlututu, 0147852369, professionnel]} {[Tata, Chapeaupointu, 0369852147, personnel], [Toto, Tututu, 0159874236, personnel]} |
Niveau 4
Énoncé
Votre utilisateur a rentrer 3millions de contact et trouve votre programme lent. Allez plus vite !
Objectif
Utiliser les tableaux d'indice
Niveau 4.1
Objectif
Utiliser des tableaux de références (pointeurs en C/C++, références en Java par exemple)
Explications
Explication : Les tableaux de références (ou d'indices) permettent de trier plus rapidement. A chaque copie de variable, l'ensemble de son contenu est copié. Si c'est un int, peu de données sont copiées. En revanche, il peut s'agir d'un tableau variable contenant un tableau d'un milliard de case qui chacune contient une structure ayant 30 chaines de caractères de taille un million. Ce n'est plus la même histoire. Les tableaux permettent d'accéder à leur valeur avec des indices (de 0 à n - 1, n étant la taille du tableau) ainsi il est possible de conserver les indices pour chacune des valeurs. Donnons un exemple :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // On stockera dans indicesDeCinq l'ensemble des cases de tab contenant 5 int indicesDeCinq[30], tab[30], i, index; for(i = 0; i < 30; i = i + 1){ tab[30] = *valeur aléatoire entre 0 et 30*; } index = 0; for(i = 0; i < 30; i = i + 1){ if(tab[i] == 5){ indicesDeCinq[index] = i; index = index + 1; } } |
Ici dans le tableau indicesDeCinq on aura les indices du tableau tab contenant 5. Si on veut récupérer la valeur du tableau tab avec l'indice du tableau indicesDeCinq, il faut faire :
1 2 3 4 5 | int indiceDeTab = indicesDeCinq[0]; int resultat = tab[indiceDeTab]; // Ou encore int resultat = tab[indicesDeCinq[0]]; |
Si vous avez compris avec les indices, le faire avec des pointeurs ou des références sera un jeu d'enfant !
N'hésitez pas a critiquer ma présentation et m'aider à l'améliorer envoyez moi un mp, c'est la première fois que je rédige un truc long ! Et si vous n'importe quelle remarque, envoyez moi un mp aussi, ça évitera de polluer ceux qui veulent faire l'exercice