Tableau

Résolu/Fermé
Anna - 20 nov. 2016 à 21:56
 Anna - 26 nov. 2016 à 19:31
Bonjour,

J'ai trouvé une correction pour l'exercice suivant;

Ecrire une procédure permettant d’éclater un tableau T d’entiers en deux tableaux :
  • TP qui contiendra les éléments positifs de T.
  • TN qui contiendra les éléments négatifs de T.


Correction:
Procédure Eclater(T : Tab ; Var TP, TN : Tab)
Var
i, j, k : Entier
Début
i <- 1 j <- 1 k <- 1
Pour i de 1 à n Faire
Si (T[i] > 0) Alors
TP[j] <- T[i]
j <- j + 1
FinSi
Si(T[i] < 0) Alors
TN[k] <- T[i]
k <- k + 1
FinSi
Si(T[i] = 0) Alors
TP[j] <- T[i]
j <- j + 1
TN[k] <- T[i]
k <- k + 1
FinSi
FinPour
Fin

La question qui se pose : pourquoi on a initialiser le compteur "i" au moment ou l'initialisation et l'avancement du compteur dans la boucle "pour" se fait automatiquement ?
en plus, au niveau de 3ème condition ( Si(T[i] = 0) Alors) pourquoi, on ne l'a traité pas avec la 1ère comme ça : ( Si (T[i] >= 0) Alors) ?
Qui peut m'expliquer ça svp. Merci

2 réponses

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
20 nov. 2016 à 22:48
Bonsoir

dans ce cas l'initialisation des variables d'itération avant la boucle ne sert à rien.
Mais il y a des cas ou c'est utile, par exemple si tu fais une recherche, tu vas parcourir le tableau (dans l'ordre, par dichotomie ou autre peut importe) et au moment ou tu trouves ce que tu cherches tu sors de la boucle.
L'index est conservé, puisqu'il a été initialisé avant.

Quand à la 3eme condition, tu constatera que l'algorithme ne fait pas la même chose que pour >0, le 0 est un cas particulier qui justifie un traitement différentié
0
Merci pour l'explication.
Juste, j'ai pas compris la différence dans le traitement du cas de zéro, au moment ou on peut l'ajouter au 2 premières conditions ( puisque 0 peut être négatif et positif à la fois) et ça devient: Si (T[i] >= 0) Alors TP[j] <- T[i]
Si (T[i] >= 0) Alors TP[k] <- T[i]
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
21 nov. 2016 à 18:48
Oui ça marche aussi, enfin si tu en fait un >= et l'autre <= et pas les deux mêmes ;)
Après les traitement en 3 fois vient peut être introduire l'opérateur ou la fonction signe, qui retourne en general 1 pour un nombre positif, -1 pour un négatif et 0 pour 0
0
Merci pour votre réponse, mais je m'excuse, il me reste un soucis:
D'une part, si j'adopte la ère correction avec les 3 conditions, le nombre de zéro va être dupliqué, autrement dit, à chaque fois qu' on trouve un zéro on va le mettre dans TP[j] et dans TN[k] à la fois, de ce fait, le nombre d'éléments par rapport au tableau initial va être augmenté.
D'autre part, si je garde ma proposition ( éviter la 3ème condition ) tous les zéros vont être stockés dans le premier tableau TP puisque la condition est vérifié, après ça, le compteur s'incrémente.
Pensez-vous qu'il y a un manque d'indice au niveau de l'énoncé d'exercice ? à votre avis quelle est la meilleure solution ?
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
21 nov. 2016 à 21:15
D'autre part, si je garde ma proposition ( éviter la 3ème condition ) tous les zéros vont être stockés dans le premier tableau TP puisque la condition est vérifié, après ça, le compteur s'incrémente.
non pas comme l'algorithme est écrit

Pour i de 1 à n Faire 
  Si (T[i] > 0) Alors 
    TP[j] <- T[i] 
     j <- j + 1 
  FinSi 

  Si(T[i] < 0) Alors 
    TN[k] <- T[i] 
     k <- k + 1 
  FinSi 

  Si(T[i] = 0) Alors 
    TP[j] <- T[i] 
     j <- j + 1 
    TN[k] <- T[i] 
     k <- k + 1 
  FinSi
FinPour 'i n'est incrémenté qu'ici 


de même
Pour i de 1 à n Faire 
  Si (T[i] >= 0) Alors 
    TP[j] <- T[i] 
     j <- j + 1 
  FinSi 

  Si(T[i] <= 0) Alors 
    TN[k] <- T[i] 
     k <- k + 1 
  FinSi 
FinPour 'i n'est toujours incrémenté qu'ici


Dans les 2 cas la somme des nombres d'enregistrement dans les tableaux résultats sera plus grande que le nombre d'enregistrements d'origine dès l'ors qu'il y a des zéros

Par contre
Pour i de 1 à n Faire 
  Si (T[i] >= 0) Alors 
    TP[j] <- T[i] 
     j <- j + 1 
  Sinon Si(T[i] <= 0) Alors 'aucun 0 ne passera ici car il y a Sinon
    TN[k] <- T[i] 
     k <- k + 1 
  FinSi 
FinPour
0
L'idée est claire maintenant, merci beaucoup.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
23 nov. 2016 à 07:15
Bonjour

si ça te convient, tu peux passer le sujet résolu, avec le lien dédié sous le titre de la discussion
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
23 nov. 2016 à 07:46
D'ailleurs, tu peux en faire autant pour tes précédentes questions
0
Comment je peux faire ça ?
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
26 nov. 2016 à 07:48
Il y a un lien "Marquer comme résolu" sous le titre de la discussion. Tu y a accès tant que le site te reconnais.
Évidemment comme tu est une utilisatrice non inscrite, il est possible qu'au bout d'un moment le site ne te reconnaisse plus.
Alors, il faut demander à la modération, par un signalement, de passer tes questions résolues.
0
Je m'excuse, mais j'ai pas compris.. Tantque je ne suis pas inscrite, j'ai pas trouvé le lien "marquer comme résolu" donc, j'ai essayée de m'inscrire mais il me dit que le pseudo que j'ai choisi n'est pas disponible .. comment je peux utiliser le signalement ?
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
26 nov. 2016 à 19:18
Pour les discussions existante, t'inscrire ne permettra pas de les marquer résolues.
Le site (comme beaucoup d'autres) utilise des cookies pour te reconnaitre, mais cela n'est pas parfait, tu peux venir depuis plusieurs ordinateurs / téléphones / tablettes, tu peux aussi nettoyer les cookies, ou encore celui-ci peut devenir obsolète.
Seul la personne reconnue comme le posteur initial (ou un modérateur) peut marquer un sujet résolu.
Voilà une capture sur une de mes discussions (non résolue)


Pour s'inscrire, il faut trouver un pseudo qui n'existe pas déjà, là ça se complique, on est plusieurs millions d'inscrits.

Pour le signalement c'est là
0