Programme tableau

Résolu/Fermé
Bonjour,
voici l'exercice
ecrire un algorithme qui lit un tableau de taille N et élimine la redondance sur place (sans utiliser un tableau d'aide)
example: pour N=6
tableau avant 12 4 8 4 12 4
tableau après 12 4 8 et N=3

j'ai essayer et voilà ma solution

program redondance;
var t:array[1..100] of real; i,n,d,cpt:integer; x,v,p:real;
begin
writeln('donnez la taille du tableau');
readln(n);
writeln('donnez la premiere valeur');
readln(p);
t[1]:=p; cpt:=0;
for i:=2 to n do
begin
writeln('donnez la valeur suivante');
readln(v);
d:=i;
for i:=1 to d-1 do
begin
if (v=t[i]) then
begin
x:=v; cpt:=cpt+1;
end;
end;
t[i]:=v;
i:=i+1;
end;

for i:=1 to n-cpt do
writeln(t[i]);

readln;


mais quand je l’exécute il m'affiche les cases similaires
je ne sais pas j'ai besoin de votre aide

ou est la faute??

5 réponses

  1. OK Rossi j'ai tout compris.
    et ce message est passé pour moi Metaref pas pour toi c'est moi qui a lancé l'alerte.

    --
    0
    1. Salut,

      Suite à ton alerte (la 3e). CCM ne supprime pas les topics à la demande et sans raisons valables (hors charte). Nous supprimons seulement lorsque des infos personnelles sont mentionnées, ce qui n'est pas le cas ici et contrairement à ce que tu dis dans ton alerte.

      Le but d'un forum d'entraide (entre autres) c'est que les sujets résolus servent à d'autres avec un problème similaire.

      @+

      "Pouvoir du prisme lunaire transforme moi"
      (Sailormoon - 1992-1997 - RIP).
      0
      1. Le code que j'ai posté ne tente rien supprimer et comme je demeure son auteur, j'en ai rien tenter de supprimer, apparemment tu as appris beaucoup de choses en si peu de temps sur ce plateau sauf que ton post s'est trompé de destinataire et de fait tombé en rebut .
        0
      2. ?

        Je parle à l'auteur du topic et à la personne qui a fait le signalement (el_clapotis). Mon post est donc bien au bon endroit. Merci, je sais donc beaucoup de choses, oufff.
        0
      3. Moi, je ne l'ai pas signalé et j'en ai jamais signalé quelqu'un, quand il s'agit de privé, Commentcamarche offre une fenêtre pour messages en privé .
        0
      4. Je ne te parle pas à toi (bis). Je parle à l'auteur du topic (bis).
        Celui qui a signalé (bis). C'est pas toi (bis), donc merci, passe ton chemin --->.
        0
    2. Un traitement en temps réel; exclusion des éléments redondants et mise à jour du curseur de remplissage.

      Une autre version consiste à saisir les éléments du tableau en vrac et effectuer des collisions sur les éléments redondants par décalage à gauche.

      program Redondance;
      
      const Max = 100;
      type Tableau = array[1 .. Max] of Real;
      
      procedure Curseur(var N : Integer);
      begin
      Write('Donnez le nombre d''elements a saisir : N <= ', Max, ' : ');
      Readln(N);
      end;
      
      procedure Alimentation(var T : Tableau; var N : Integer);
      var I, J, sentinelle : Integer;
      EnCours : Real;
      Negatif : Boolean;
      
      begin
      
      Write('Donnez le premier element du Tableau : ');
      Readln(T[1]);
      
      Sentinelle := 1;
      Negatif := True;
      I := 2;
      while I <= N do begin
      Write('Donnez l''lement ', I, ' : ');
      ReadLn(EnCours);
      
      for J := 1 to Sentinelle do begin
      if Encours = T[J] then begin
      Negatif := False;
      Break;
      end;
      end;
      
      if Negatif then begin
      Sentinelle := sentinelle + 1;
      T[Sentinelle] := EnCours;
      end;
      
      Negatif := True;
      I := I + 1;
      end;
      N := Sentinelle;
      end;
      
      var T : Tableau;
      N, I : integer;
      
      begin
      
      Curseur(N);
      Writeln;
      Writeln('Alimenter les ', N, ' elements du tableau');
      Writeln;
      Writeln('Exclusion des elements redondants');
      Writeln('et affichage des elements distincts');
      Writeln;
      Alimentation(T, N);
      Writeln;
      
      for I := 1 to N do
      Write(T[I]:6:2);
      
      ReadLn;
      
      end.
      0
      1. Je te remercie pour ton grand aide
        T'as m'a donné une autre idée très intéressante
        :)
        0
    3. Modérateur
      Regarde ceci. Il y a plein d'améliorations à faire et de tests à effectuer.
      program redondance;
      var t:array[1..100] of real;
         n, cnt, i , j:integer;
         val      :real;
      begin
      
         writeln('donnez la taille du tableau');
         readln(n);
      
         for i:=1 to n do
            t[i] := 0 ;
      
         cnt := 1;
      
         for i:=1 to n do
         begin
            write('donnez la valeur (' , i:2 , '/', n:2, ') suivante:');
            readln(val);
      
            j := 1;
      
            while ( ( j < cnt ) and ( t[j] <> val ) ) do
            begin
      	 j := j + 1;
            end;
            if (( j = cnt ) or ( cnt =1 )) then
            begin
      	 t[cnt] := val;
      	 cnt := cnt + 1 ;
            end;
         end;
      
         cnt := cnt - 1;
      
         for i:= 1 to cnt  do
            writeln(t[i]);
      
      end.
      


      Testé sous p2c (Pascal to C), fpc (FreePascal), BorlandPascal7.

      Gates gave ^W  sold  you the windows.
      GNU gave us the whole house.(Alexandrin)
      0
      1. merci beaucoup pour l'aide et pour ton temps;
        je vais essayez de le comprendre et améliorer
        c'est intéressant
        0
      2. ça marche c génialll;;; j'ai compris mes fautes
        mais c trop sympa merci beaucoup
        je souhaite me développer
        0
      3. Pourquoi t'as rempli le tableau au début par des zéros ?
        0
      4. Modérateur
        Il est vrai que dans la forme actuelle, c'est superflu.
        Sans doute la boone habitude d'initialiser toutes les variables.

        Par contre , il faudrait trouver une combine pour simplifier la condition
        if (( j = cnt ) or ( cnt =1 )) then : supprimer le OU.
        Si le compilateur est optimisé, ie code généré n'évaluera cependant le second derme du OU que si le premier terme est false
        0
    4. Modérateur
      Bonjour,

      Je n'ai pas regardé en détail, mais il y a une erreur flagrante, c'est que tes deux boucles imbriquées utilisent la même variable i...
      0
      1. merci pour ta réponse mais rien n'a changé
        0
      2. Modérateur
        Montre ton nouveau code, comment tu as géré l'imbrication du coup ?
        0
      3. @KX
        for i:=2 to n do
        begin
        writeln('donnez la valeur suivante');
        readln(v);
        d:=i;
        for j:=1 to d-1 do
        begin
        if (v=t[j]) then
        begin
        x:=v; cpt:=cpt+1;
        end;
        end;
        t[i]:=v;
        i:=i+1;
        end;

        for i:=1 to n-cpt do
        writeln(t[i]);

        readln;
        end.
        0
      4. @el_clapotisBonjour,

        A quoi sert la variable x?
        Ce que tu dois faire dans la 2ème boucle, c'est comparer chaque élément du tableau à v.
        Si tu trouve une égalité, tu ne fais rien, sinon tu ajoute v au tableau et incrémente cpt.
        Tu dois aussi initialiser cpt à 1 car il y a au moins un élément.
        Enfin tu affiche le tableau (for i:=1 to cpt do). A toi de jouer.
        0
      5. @Yodamerci pour ton aide ^^
        le x c'est comme une corbeille mais enfin il ne sert à rien
        je vais essayez plus ,
        0