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. 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
  2. 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
  3. 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
  4. 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
  5. 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