Bug dans le programme ???

Discutez d'informatique ici !
Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

Bug dans le programme ???

par Rockleader » 09 Fév 2013, 10:19

Bonjour, j'ai un soucis au niveau des intervalle de mon programme à priori; ce qui le fait planter dans les calculs.

En gros l'idée c'est que j'ai un tableau qui ne peut contenir que 3 caractères (b,v,r).
Le but étant de trier de dit tableau afin que tout les r passent au début, les v au milieu, et les b à la fin.

Pour cela je fais d'abord la saisie du tableau, et je réalise un premier test pour voir si les valeurs sont bien à leur places : Ok.

Ensuite j'utilise une sous procédure qui calcule le nombre de R. Et en connaissant ce nombre, je les places au début du tableau en switchant avec l'ancienne valeur des cases.
Je réalise un second test: Ok.


Ensuite j'utilise le même corps de sous programme pour calculer le nombre de 'b'. (J'ai au préalable vérifié que le nombre de r retournée soit la bon).
ET je switche dans mon code de la même façon que j'ai fais au début pour les 'r'; De cette façon les 'r' sont censée se placer à la fin du tableau.
Et les v devraient donc par défaut être au milieu.
Je réalise à ce moment là un ultime test d'affichage. Hors à ce niveau là, l'affichage ne se fait pas. Cela signifie donc que le programme s’est perdu entre le second et le dernier test; mais impossible de trouver où. Je suis persuadé qu'il s'agit d'une erreur d'intervalle, parce qu'il arrive que le dernier affichage se réalise de temps en temps.


Exemple d'exécution planté:

Code: Tout sélectionner
 Nombre de lettre du tableau : 6
Entrez un caractère (b,v ou r) autrement il ne sera pas compté: b
Entrez un caractère (b,v ou r) autrement il ne sera pas compté: v
Entrez un caractère (b,v ou r) autrement il ne sera pas compté: r
Entrez un caractère (b,v ou r) autrement il ne sera pas compté: r
Entrez un caractère (b,v ou r) autrement il ne sera pas compté: b
Entrez un caractère (b,v ou r) autrement il ne sera pas compté: v
bvrrbv
rrbvbv


Bref, en espérant que quelqun arrive à voir à quel niveau se situe le bug, je lui en serais très reconnaissant.

Voici le code:

Code: Tout sélectionner
procedure tri_flag is

nb_max:constant integer:=50;
subtype Intervalle is Integer range 1..nb_max;
type TableauTricolore is array (Intervalle) of character;

  procedure putTabChar(TabExit:out TableauTricolore; nb_lettre: out integer) is
    lettre: character:='a';
    test:boolean:=FALSE;
    begin
   put(" Nombre de lettre du tableau : ");
   get(nb_lettre);
   for k in 1..nb_lettre loop
     While (test = FALSE ) loop
       put("Entrez un caractère (b,v ou r) autrement il ne sera pas compté: ");
       get(lettre);

       if (lettre = 'b') then
         test:= TRUE;
       elsif (lettre = 'r') then
         test := TRUE;
       elsif (lettre = 'v') then
         test:=TRUE;
       else
         test:= FALSE;
       end if;
     end loop;
     tabExit(k):=lettre;
   end loop;
  end putTabChar;

  procedure exitNb_R (tabInt : In TableauTricolore;Nb_R :out Integer) is
    begin
    Nb_R:=0;
      for k in 1..tabInt'last loop
   if tabInt(k) = 'r' then
     Nb_R := Nb_R +1;
   end if;
      end loop;
    end exitNb_R;

  procedure exitNb_B (tabInt : In TableauTricolore;Nb_B :out Integer) is
    begin
    Nb_B:=0;
      for k in 1..tabInt'last loop
   if tabInt(k) = 'r' then
     Nb_B := Nb_B +1;
   end if;
      end loop;
    end exitNb_B;

Tab:TableauTricolore;
Nb_R,Nb_B,Nb_eff,cpt:Integer;
tempo:character; -- pour échanger

begin

  putTabChar(Tab,Nb_eff);
  exitNb_R(Tab,Nb_R);
  cpt:=1;

    for k in 1..Nb_eff loop -- test de départ
    put(Tab(k));
   end loop;
   new_line;

  for k in 1..Nb_eff loop -- la boucle place tout les rouges au début
    if (Tab(k)='r') then
   tempo:=Tab(cpt);
   Tab(cpt):='r';
   Tab(k):= tempo;
   cpt:=cpt+1;
    end if;
  end loop;
  exitNb_B(Tab,Nb_B);

    for k in 1..Nb_eff loop -- test de valeur
    put(Tab(k));
  end loop;
   new_line;

  While (Nb_B /=0) loop -- la boucle place tout les bleu Ã* la fin, non fini reste une erreur d'intervalle
    for k in Nb_R+1..Nb_eff loop
      if (Tab(k)='b') then
   tempo:=Tab(Nb_eff-Nb_B);
   Tab(Nb_eff-Nb_B):='b';
   Tab(k):= tempo;
   Nb_B:=Nb_B-1;
      end if;
   end loop;
 end loop;

  for k in 1..Nb_eff loop -- test de fin
    put(Tab(k));
  end loop;

end tri_flag;



Merci pour votre aide.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !



Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 09 Fév 2013, 11:11

Hormis les variables/fonctions mal nommées de surcroit avec ce langage de dinosaures,
ton algo m'a l'air d'etre pourrave.

Code: Tout sélectionner
for k in 1..Nb_eff loop -- la boucle place tout les rouges au début
    if (Tab(k)='r') then
   tempo:=Tab(cpt);
   Tab(cpt):='r';
   Tab(k):= tempo;
   cpt:=cpt+1;
    end if;
  end loop;

est-ce vraiment le cas?


Sinon normalement c'est trivial si : tu comptes le nombres de b:nb,v:nv,r:nr
et tu fais
Code: Tout sélectionner
pour i=1 à nb
 tab[i]='b'
finpour
pour i=nb+1 à nb+1+nv
 tab[i]='v'
finpour
pour i=nb+1+nv+1 à nb+1+nv+1+nr
 tab[i]='r'
finpour
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 09 Fév 2013, 11:38

Oui, ce que tu fais la c'est une autre solution qui marche tout aussi correctement voir mieux en fait =)

Mais le prof veut qu'on fasse ça en faisant des échanges par le biais d'une variable tampon au final...
Mais je t'accorde qu'il est plus logique de faire de la manière dont tu le présentes.


Quand au langage de dinosaure, pas trop le choix en première année^^
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

joel76
Membre Relatif
Messages: 230
Enregistré le: 11 Fév 2013, 15:31

par joel76 » 11 Fév 2013, 15:41

Pour cet exercice, je vous conseille de consulter cette page http://en.wikipedia.org/wiki/Dutch_national_flag_problem, et vous pouurez utiliser une variable temporaire pour les échanges !

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 11 Fév 2013, 17:02

Bonjour,
là j'ai pas compris
Code: Tout sélectionner
 procedure exitNb_B (tabInt : In TableauTricolore;Nb_B :out Integer) is
    begin
    Nb_B:=0;
      for k in 1..tabInt'last loop
   if tabInt(k) = 'r' then
     Nb_B := Nb_B +1;
    end if;
      end loop;
    end exitNb_B;
Vous semblez vouloir compter les 'b' et vous testez 'r' ?
Je pense que si vous aviez mis ce comptage au fur et à mesure de la saisie, àa n'aurait pas pu arriver, et surout la somme de r, des v et des b vous aurait donné la somme totale. Je crois même me souvenir que ce type de contrôle était obligatoire.

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 11 Fév 2013, 19:16

Erreur stupide lors du copier coller de la sous procédure...je m'en suis effectivement aperçue après coup.
J'ai fini par débugguer le programme, et à coté de ça je l'ai aussi faite de la manière dont pensait fatal_error qui était tout de même bien plus pertinente à mes yeux. J'aurais rendu le devoir sous deux formes les deux étant de toute façon bonne...
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 11 Fév 2013, 19:32

Oui, mais c'est là qu'est la différence entre un exercice (tri en l'occurrence) et une exploitation réelle.
Il faudrait connaitre l'énoncé exact de l'exercice.

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 9 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite