salut
j'ai deux tableaux A et B et je veux supprimer les élement de A qui se trouve dans B . comment j'ai pensé mettre ces élement redendant a -1 mais j'ai remarqué que les élements des deux tableau peuevnt étre négative ..comment je peux procéder ?
salut
j'ai deux tableaux A et B et je veux supprimer les élement de A qui se trouve dans B . comment j'ai pensé mettre ces élement redendant a -1 mais j'ai remarqué que les élements des deux tableau peuevnt étre négative ..comment je peux procéder ?
Salut,
Il y a plein de solutions possibles. J'en vois trois principales, mais y en a peut-être d'autres :
1)
Si tu n'utilises qu'une plage de valeurs pour remplir ton tableau B, il suffit alors de trouver une valeur autre que -1 pour indiquer que cet élément est "supprimé". Par exemple, si tu n'utilises que les valeurs comprises entre -999 et 999, tu peux désigner -1000 comme valeur indiquant une case vide du tableau.
C'est la solution la plus simple, mais si elle est impossible à mettre en oeuvre (i.e. si tu n'utilises pas de plage de valeurs), il faut voir les deux autres solutions, juste après.
2)
Tu déclares une variable (par exemple "nombre_valeurs") correspondant au nombre de valeurs contenues dans ton tableau B. Si tu veux supprimer une valeur dans ce tableau, tu décales tout ce qui suit cette valeur dans le tableau d'un cran vers la gauche et tu décrémente de 1 la variable.
Par exemple si ton tableau B contient 10 valeurs utiles, composé de :
1 2 3 4 5 6 7 8 9 10
Ta variable "nombre_valeurs" est à 10.
Si tu veux supprimer par exemple la valeur 5, tu décales d'un cran vers la gauche toutes les valeurs qui suivent :
1 2 3 4 6 7 8 9 10 10
Tu te retrouves maintenant avec deux fois la valeur 10, mais ce n'est pas grave car il suffit alors de décrémenter de 1 la variable "nombre_valeurs", qui se trouve maintenant à 9, ce qui fait que les valeurs du tableau qui nous intéressent réellement sont :
1 2 3 4 6 7 8 9 10
Si tu utilises de gros tableaux, cela risque de devenir lent, car à chaque valeur à supprimer, il faut décaler tout le reste vers la gauche.
3)
Tu peux créer un tableau temporaire de même taille que le tableau B, dont ses valeurs (0 ou 1) t'indiquent quels éléments du tableau B on doit garder.
Exemple, si tu as un tableau B composé de 10 éléments
8 3 1 2 15 97 24 18 67 13
ton tableau temporaire est donc composé lui aussi de 10 éléments, chaque élément est mis à 1 au début. Ce 1 indique que tous les éléments du tableau B sont à considérer.
Ensuite, si par exemple tu veux supprimer la 5ème valeur du tableau B, c'est-à-dire la valeur 15, il suffit tout simplement de mettre la 5ème valeur du tableau temporaire à 0.
Une fois que tu as fini de scanner ton tableau A, tu sais alors quels éléments du tableau B tu veux garder : si le 'n'ième élément du tableau temporaire est à 0, alors l'élément 'n' du tableau B est supprimé.
Cette méthode est plus rapide que la solution 2 (surtout pour les gros tableaux), mais cela oblige à créer un autre tableau et donc à consommer plus de mémoire (c'est toutefois optimisable).
On peut envisager cette solution :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 1- Définir une position de lecture Lec et d'écriture Ecr dans le tableau A. 2- Positionner Lec et Ecr au début du tableau A 3- Tant que la position Lec n'est pas arrivée au dernier élément du tableau A (inclus): 3.1- Si la valeur en position Lec n'est pas dans le tableau B : 3.1.1- l'écrire en position Ecr 3.1.2- incrémenter la position Ecr 3.2- Incrémenter la position Lec
Après relecture, je constate maintenant que j'avais en fait mal compris la question de départ...Du coup, j'ai inversé tableau A et tableau B.
![]()
il y a plus rapide et simple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 k = 0 ; for ( i = 0 ; i < NA ; i++ ) { Ok = 1 ; for ( j = 0 ; j < NB ; j++ ) { if ( A[i] == B[j] ) { Ok = 0 ; break ; } } if ( Ok ) { A[k] = A[i] ; k++ ; } } NA = k + 1 ;
@Débutant_ASM
Non, il n'y a pas besoin d'un troisième tableau Lec et Ecr parcourent le même tableau A. C'est écrit noir sur blanc ici :le tableau A est initialement rempli. mais je pense que tu as pensé dire , remplir un 3 ème tableau RES avec LEc parcourant A et ECR parcourant RES.
@souviron341- Définir une position de lecture Lec et d'écriture Ecr dans le tableau A.
Le code que tu montres est une implémentation de l'algo proposé. Tu appelles simplement i et k ce que j'ai appelé Lec et Ecr.il y a plus rapide et simple :
La variable Ok est d'ailleurs inutile :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 k = 0 ; for (i = 0 ; i < NA ; i++) { for (j = 0 ; j < NB && A[i] != B[j] ; j++) {} if (j == NB) { A[k] = A[i] ; k++ ; } } NA = k + 1 ;
Partager