Réinitialiser un compteur en ADA

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

Réinitialiser un compteur en ADA

par Rockleader » 22 Sep 2012, 13:01

Bonjour/ bonsoir, je vous explique rapidement mon problème.


Je suis en train de faire un tp d'info, et dans ce tp je suis censé utiliser des commandes "pré-enregistrer" permettant d'incrémenter et de remettre à 0 un compteur. (dans le cas présent pour tracer 5 carrés imbriqués)



Seulement voilà, les commandes en questions ne fonctionnent pas, il faut donc se débrouiller sans...



Donc, avec une boucle while je peux facilement utiliser mon compteur sans soucis.

Le problème étant que je n'ai pas le droit d'en utiliser plus de 3 ! Il est donc indispensable que je remette le compteur à 0 après l'avoir utiliser....et je n'ai aucune idée de la manière de procéder.


Code: Tout sélectionner
compteur1 : integer := 0;

begin
       While (compteur1 /= 10) loop
                compteur1 := compteur1 + 1;
                Action à effectuer
       end loop;

et donc là j'aimerais bien pouvoir réutiliser le compteur 1 auquel il faudrait redonner la valeur 0....




Merci à ceux qui aurait une solution !
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !



C.Ret
Membre Relatif
Messages: 497
Enregistré le: 02 Juil 2012, 14:33

par C.Ret » 22 Sep 2012, 13:10

Bonjour,

Il est donc authorisé d'incrémenté dans une boucle, mais pas d'en changer la valeur directement !?

J'imagine que la même contrainte s'applique pour la décrémentation.

Dans ce cas, pourquoi ne pas faire la ré-initialisation dans une boucle ?

Code: Tout sélectionner
Comp : INteger :=0 ;
WHILE Comp /= 10 LOOP
     Comp:=Comp+1  ;
     ...
END LOOP
WHILE Comp /= 0 LOOP
     Comp:=Comp-1;
END LOOP

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

par Rockleader » 22 Sep 2012, 13:19

Merci beaucoup je n'y avais pas pensé !


Cela commençait à devenir lourd, à peine deux carré de fait sur 5 et je dépassais les 40 lignes de codes, pas très lisible^^
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 14:00

par fatal_error » 22 Sep 2012, 14:21

Le problème étant que je n'ai pas le droit d'en utiliser plus de 3 ! Il est donc indispensable que je remette le compteur à 0 après l'avoir utiliser....et je n'ai aucune idée de la manière de procéder.

pe que tu peux faire un algorithme qui n'a pas besoin de recommencer à zéro à chaque fois...

ca veut dire quoi tracer 5 carrés?

sinon si tu fais tu peux betement ten sortie avec
Code: Tout sélectionner
caseIndex=0
while machin
 if (caseIndex==0) faire la premiere action
 else if( caseIndex==1 )...faire la seconde action
 ...
 finsi
 if compteur==10; compteur=0
 caseIndex++;
finwhile


tu noteras ce caseIndex,..., c'est un pattern [je cherche son nom...] même si généralement on les utilise pas pour économiser des boucles...

edit: bon, j'ai paumé le nom. En gros ca dit un switch c'est pas toujours evil (dans ce cas c'est fumeux), si pour chaque type on a une action différente à réaliser, au sein d'un algo, typiquement un parseur. Mias j'insiste, à mon avis le coup des trois boucles c'est plus pour aborder l'exo différemment que pour réinitialiser le compteur (ce qui est pas tres intelligent...). Typiquement imbriquer les trois boucles?
la vie est une fête :)

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

par Rockleader » 22 Sep 2012, 15:06

En gros l'exo c'était de tracer 5 carrés imbriqué les uns dans les autres avec un espace de 1 unité entre chacun. Et ceci par rapport au centre de la feuille.

Donc, ce qui fait qu'on a 5 carrés de même centre (les poupées russes quoi) le premier de 2u, le second 4 ... 6....8...10


Pour le carré de 2 et de 4 j'ai fait sans compteurs.
Pour les autre j'ai utilisé les 3 compteurs pour tracer le bas, le coté gauche et le haut.


J'en ai aussi utilisé un quatrième que j'ai utilisé pour faire tourner une boucle qui réinitialisait chacun des compteur en même temps; ou plutôt devrais je dire à la suite, enfin c'était juste pour m'éviter de faire une boucle pour réinitialiser chaque compteur de son coté.

Comme je n'ai pas vraiment utiliser ce compteur pour la construction du carré en lui même je pense pas avoir enfreint la règle.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

C.Ret
Membre Relatif
Messages: 497
Enregistré le: 02 Juil 2012, 14:33

par C.Ret » 22 Sep 2012, 15:25

Quel drôle d'excercice.

Moi quand je lis qu'il faut tracer des figures géométriques centrées sur l'écran ou la feuille, j'aurais tendance à utiliser le LOGO, pas faire cela en ADA ?!?

Sont durs vos profs !!

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

par Rockleader » 22 Sep 2012, 15:49

C.Ret a écrit:Quel drôle d'excercice.

Moi quand je lis qu'il faut tracer des figures géométriques centrées sur l'écran ou la feuille, j'aurais tendance à utiliser le LOGO, pas faire cela en ADA ?!?

Sont durs vos profs !!



En première année de licence ils considèrent que le langage Ada est bien pour apprendre la logique de la programmation ainsi que les normes. En fait ADA serait un langage fait spécialement pour apprendre à programmer...car, des langages comme le C par exemple serait trop brouillon, et pas assez cadrer pour apprendre la norme.
Et l'on est censé voir le reste que par la suite C/C++/ java et bien d'autres ne seront pas au programme avant la L2 voir la L3....

Enfin bon, il n'empêche que chez soi, on fait quand même quelques trucs à coté, du moins pour ma part...







J'ai une petite question: Quand on ajoute 1 à un compteur on dit qu'on l'incrémente. Mais quand on enlève 1 : est ce qu'il y a un terme spécifique à l'opération ?


Voilà c'est pour mes commentaires, il me semble que préciser dans les com ce que fait le programme c'est plus important que le programme en lui même...
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 14:00

par fatal_error » 22 Sep 2012, 15:54

normalement une seule boucle suffit.
for i=1 a 5
tracerNiemeCarre(i)
endfor

tracerNieme carre dessine simplement le ieme carré...
le cote droit du premier carré se trouve à mettons 1u du centre.
le second a 2u, le troisieme 3u, etc...
idem le cote haut.
au final il est assez facile de trouver l'origine.
pour le cote bas: premier carre
plotLigne(-u,-u,u,-u);//ou plotLigne(origineX,origineY,destinationX,destinationY)
pour le cote bas: ieme carre
plotLigne(-i*u,-i*u,i*u,-i*u);//ou plotLigne(origineX,origineY,destinationX,destinationY)

la seule subtilité étant si tu veux la jouer pgm et ne pas avoir à calculer toi même origine et destination pour chacun des côté, mais je crois pas qu'on en soit là

edit:poste entre temps: enlever 1, c'est décrémenter
la vie est une fête :)

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

par Rockleader » 22 Sep 2012, 16:19

edit:poste entre temps: enlever 1, c'est décrémenter


Ok merci j'étais pas sur, mais j'avais bien mis comme ça.



Quand à la boucle que tu me propose, le problème c'est que ce n’est pas de l'Ada =) enfin je pense pas. Et dans tous les cas ce n'est pas le but de l'exercice qui était d'utiliser un fichier source "traceur" avec des opérateur bien particulier du genre monter et descendre de une unité.



Dans tous les cas je viens de finir les 5 exos de mon tp donc tout va bien ! =)

Je vais un peu plus galérer avec ma physique è_é
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

C.Ret
Membre Relatif
Messages: 497
Enregistré le: 02 Juil 2012, 14:33

par C.Ret » 22 Sep 2012, 16:34

Rockleader a écrit:Voilà c'est pour mes commentaires, il me semble que préciser dans les com ce que fait le programme c'est plus important que le programme en lui même...


Très juste. Le but et l'important de ces excercices c'est surtout l'explication et la justification des choix, plus que le code lui-même.

De mon temps, arrivé à la fac, le language pédagogique était le PASCAL.
Mais, le LOGO aussi est un language qui a surtout servi de support pédagogique, mais je suis trop jeune pour l'avoir connu en TP; c'était plutot un des languages de mon initiation.

Je suis quand même surpris que dans cette version de l'ADA, on ne puisse pas réinitialiser une variable à tout moment par une simple affectation !

Et je suis comme fatal_error, j'aurais tenté une approche récursive du problème, car en fait les cinq carrés sont centrés sur l'écran/page/feuille, seul la longuer de leur coté respectif doit être ajusté pour répondre à la contrainte d'espacement.

D'ailleurs, cette idée de faire par récurrence n'est peut-être pas étrangère à mes connaissances en LOGO, car justement, le LOGO a été mis au point pour servir de language pédagogique et expliqué la récurence.

Ou alors plus au simple :
Code: Tout sélectionner
with Ada.Text_IO;

procedure FiveSquareCentered is
begin
   IO.Put_Line(";););););););););););););););););););)"); IO.New_Line;
   IO.Put_Line(";) ;););););););););););););););) ;)"); IO.New_Line;
   IO.Put_Line(";) ;) ;););););););););););) ;) ;)"); IO.New_Line;
   IO.Put_Line(";) ;) ;) ;););););););) ;) ;) ;)"); IO.New_Line;
   IO.Put_Line(";) ;) ;) ;) ;););) ;) ;) ;) ;)"); IO.New_Line;
   IO.Put_Line(";) ;) ;) ;) ;););) ;) ;) ;) ;)"); IO.New_Line;
   IO.Put_Line(";) ;) ;) ;););););););) ;) ;) ;)"); IO.New_Line;
   IO.Put_Line(";) ;) ;););););););););););) ;) ;)"); IO.New_Line;
   IO.Put_Line(";) ;););););););););););););););) ;)"); IO.New_Line;
   IO.Put_Line(";););););););););););););););););););)");
   IO.New_Line;

end FiveSquareCentered;

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

par Rockleader » 22 Sep 2012, 16:39

Je suis quand même surpris que dans cette version de l'ADA, on ne puisse pas réinitialiser une variable à tout moment par une simple affectation !



Attention je ne dis pas que ce n’est pas possible, je dis que je ne connais pas de moyen de le faire en Ada, je ne connais que ce que mon prof m'a dis pour le moment sur ce langage...


La commande qui devrait réinitialiser le compteur que l'on nous avaait donné était spécifique à un compteur donné du problème...et pour une raison inconnu elle ne marchait pas, alors que toutes les autres commandes provenant du fichier source marchait...
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 14:00

par fatal_error » 22 Sep 2012, 16:55

Ou alors plus au simple :

:ptdr:

(sinon je parlais pas d'une récursive mais bien d'une itérative).

>rockleader
Sinon j'espère que tu vas pas écrire i-- //je decrémente la variable
parce que c'est absolument inutile.
la vie est une fête :)

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

par Rockleader » 23 Sep 2012, 10:54

Désolé pour tous ce temps sans réponses...il se trouve qu'entre temps mon chien est mort, voilà ça semblera ridicule pour certain mais j'ai pas eu la force de continuer à bosser après.
Ce matin je l'ai enterré; et j'ai l'impression que c'est pire...je sais même pas pourquoi je vous dis ça je dois passer pour un imbécile...

Le fait est que je peux pas rester dans cet état, je pense que je vais me remettre à bosser manière de faire une bulle et de ne plus y penser.


Sinon j'espère que tu vas pas écrire i-- //je decrémente la variable




Non, mais en revanche, je vais expliquer pourquoi je décrémente ma variable compteur1 de cette manière

compteur1 := compteur1 - 1;

Alors que théoriquement je suis censé utilisé une commande pré-enregistré RAZ1 (qui ne fonctionne pas ! )


Ou alors plus au simple :


Et bien, le fichier source que j'utilise ne trace pas vraiment le carré mais seulement des points chaque unité. donc impossible de faire autrement je pense =)
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Kaza
Messages: 3
Enregistré le: 27 Sep 2012, 20:51

par Kaza » 27 Sep 2012, 20:55

Bonsoir, j'aimerai savoir Rockleader quel est le code que tu as utilisé pour réaliser tes carrés imbriqués, moi-même apprenant l'ADA mais a titre personnel je n'ai pas trouvé d'aide sur internet.
Merci de ta réponse.

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

par Rockleader » 27 Sep 2012, 22:49

Kaza a écrit:Bonsoir, j'aimerai savoir Rockleader quel est le code que tu as utilisé pour réaliser tes carrés imbriqués, moi-même apprenant l'ADA mais a titre personnel je n'ai pas trouvé d'aide sur internet.
Merci de ta réponse.



Je ne crois pas que mon code te serait d'une grande aide, de plus il marchait avec l'aide d'un fichier source bien précis avec des fonctions pré définies
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Kaza
Messages: 3
Enregistré le: 27 Sep 2012, 20:51

par Kaza » 27 Sep 2012, 23:19

D'accords, dommage c'étais juste pour se faire une idée au moins, car ce fichier source dont tu parles il sagit certainement d'un traceur non? Si oui je pourrai quand même deviné la signification de ces fonctions dites définies. Mais bon pas grave je vais faire d'autre exos ^o^'

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

par Rockleader » 27 Sep 2012, 23:56

Kaza a écrit:D'accords, dommage c'étais juste pour se faire une idée au moins, car ce fichier source dont tu parles il sagit certainement d'un traceur non? Si oui je pourrai quand même deviné la signification de ces fonctions dites définies. Mais bon pas grave je vais faire d'autre exos ^o^'



Oui c'est bien un fichier traceur.


Bon, je veux bien te filer le code que j'ai mis, mais il est pas réellement au point, normalement on doit pouvoir tout faire avec une série de boucle imbriqué.
Moi j'ai simplement fait chaque carré les uns après les autres.


Je te livre l'algorithme, mais il est loin d'être parfait.

Code: Tout sélectionner
--Tracé de 5 carrés imbriqués

with traceur; use traceur;
procedure carre_imbriques is
   compteur3 : integer := 0;
   compteur4 : integer := 0;
   --utilisation du compteur4 pour réinitialiser les 3 compteurs.
begin
   --Initialisation du stylet
   LEVER;
   CENTRER;
   AVANCER;
   --Tracé du premier carré
   BAISSER;
   DESCENDRE;
   RECULER;
   RECULER;
   MONTER;
   MONTER;
   AVANCER;
   AVANCER;
   DESCENDRE;
   LEVER;
   AVANCER;
   --Tracé du second carré
   BAISSER;
   DESCENDRE;
   DESCENDRE;
   RECULER;
   RECULER;
   RECULER;
   RECULER;
   MONTER;
   MONTER;
   MONTER;
   MONTER;
   AVANCER;
   AVANCER;
   AVANCER;
   AVANCER;
   DESCENDRE;
   DESCENDRE;
   LEVER;
   AVANCER;
   --Tracé du troisième carré
   BAISSER;
   DESCENDRE;
   DESCENDRE;
   DESCENDRE;
   While compteur1 /= 6 loop
      compteur1 := compteur1 + 1;
      RECULER;
   end loop;
   While compteur2 /= 6 loop
      compteur2 := compteur2 + 1;
      MONTER;
   end loop;
   While compteur3 /= 6 loop
      compteur3 := compteur3 + 1;
      AVANCER;
   end loop;
   DESCENDRE;
   DESCENDRE;
   DESCENDRE;
   LEVER;
   AVANCER;
   --Réinitialisation des compteurs
   While compteur4 /= 6 loop
      compteur4 := compteur4 + 1;
      compteur1 := compteur1 - 1;
      compteur2 := compteur2 - 1;
      compteur3 := compteur3 - 1;
   end loop;
   -- Tracé du 4ème carré
   BAISSER;
   DESCENDRE;
   DESCENDRE;
   DESCENDRE;
   DESCENDRE;
   While compteur1 /= 8 loop
      compteur1 := compteur1 + 1;
      RECULER;
   end loop;
   While compteur2 /= 8 loop
      compteur2 := compteur2 + 1;
      MONTER;
   end loop;
   While compteur3 /= 8 loop
      compteur3 := compteur3 + 1;
      AVANCER;
   end loop;
   DESCENDRE;
   DESCENDRE;
   DESCENDRE;
   DESCENDRE;
   LEVER;
   AVANCER;
   --Réinitialisaton des compteurs
   While compteur4 /= 0 loop
      compteur4 := compteur4 - 1;
   end loop;
   While compteur4 /= 8 loop
      compteur4 := compteur4 + 1;
      compteur1 := compteur1 - 1;
      compteur2 := compteur2 - 1;
      compteur3 := compteur3 - 1;
   end loop;
   --Tracé du dernier carré
   BAISSER;
   DESCENDRE;
   DESCENDRE;
   DESCENDRE;
   DESCENDRE;
   DESCENDRE;
   While compteur1 /= 10 loop
      compteur1 := compteur1 + 1;
      RECULER;
   end loop;
   While compteur2 /= 10 loop
      compteur2 := compteur2 + 1;
      MONTER;
   end loop;
   While compteur3 /= 10 loop
      compteur3 := compteur3 + 1;
      AVANCER;
   end loop;
   DESCENDRE;
   DESCENDRE;
   DESCENDRE;
   DESCENDRE;
   DESCENDRE;
   DESSINER;
end carre_imbriques;
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

C.Ret
Membre Relatif
Messages: 497
Enregistré le: 02 Juil 2012, 14:33

par C.Ret » 28 Sep 2012, 10:36

Mais !
C'est du LOGO çà !!! :we: :we:

Le fichier "source" en fait c'est une adaptation pour avoir une programmation type LOGO sur un système programmé en ADA !

Je me rends compte que j'ai eut une chace inouis, lors de ma formation le système que nous utilisions, il suffisait de changer le disque dur pour passer de l'environnement FORTRAN, au LISP, au LOGO ou autre macro-languages... Nous utilisions toujours le même terminal, mais tout le système changeait . C'était quand-même plus clair et plus simple qu'aujourd'hui !

Et à la maison c'était pareil, il suffisait d'éteindre son micro, d'insérer la cartouche qui va bien et hop, on pressez le bouton ON est on était prêt à programmer en BASIC, PASCAL ou autre ...

Faire du LOGO dans un environnemetn ADA !? Aihe Aihe pauvres de vous !
Comment est-ce que l'on en est arrivé là ?

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

par Rockleader » 28 Sep 2012, 11:19

Va savoir...


Mais bon l'objectif c'est plus de travailler ses boucles après le fichier source peu importe au final d'où il vient puisque ça passe en ADA non ?


M'enfin au premier semestre de L1, l'info ça reste une option donc bon...les vrais langages comme le c ou le java pour ne citer qu'eux ça sera pour plus tard =)



Théoriquement ce programme trace 5 carré, mais la façon dont il aurait fallu le faire aurait été de demander à l'utilisateur le nombre de carré qu'il veut pour que le traceur les trace...et là par contre j'ai bloqué, j'ai pas trouvé comment imbriquer n carré...mais bon c'est pas ça le plus important je pense.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 14:00

par fatal_error » 28 Sep 2012, 11:39

que font tes primitives BAISSER, AVANCER, RECULER, etc?
la vie est une fête :)

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 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