Tableau

Résolu
Anna -  
 Anna -
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

  1. Utilisateur anonyme
     
    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
    1. Anna
       
      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
    2. Utilisateur anonyme
       
      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
    3. Anna
       
      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
    4. Utilisateur anonyme
       
      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
    5. Anna
       
      L'idée est claire maintenant, merci beaucoup.
      0
  2. Utilisateur anonyme
     
    Bonjour

    si ça te convient, tu peux passer le sujet résolu, avec le lien dédié sous le titre de la discussion
    0
    1. Utilisateur anonyme
       
      D'ailleurs, tu peux en faire autant pour tes précédentes questions
      0
    2. Anna
       
      Comment je peux faire ça ?
      0
    3. Utilisateur anonyme
       
      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
    4. Anna
       
      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
    5. Utilisateur anonyme
       
      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