Mémoriser des chiffres !

Résolu
m_cyril1 Messages postés 59 Date d'inscription mercredi 30 mars 2005 Statut Membre Dernière intervention 3 juin 2005 - 20 avril 2005 à 10:49
Niki2001 Messages postés 85 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 17 décembre 2005 - 26 avril 2005 à 19:04
Voila mon petit problème, j’ai une Form avec


3 TEdit : le TEdit1 sert entrer des chiffres


le TEdit2 sert de compteur pour savoir le nombre de chiffres rentrés


le TEdit3 sert à visualiser le résultat


3 TButton : le TButton1 sert à mémoriser les chiffres du TEdit1


le TButton2 sert à calculer la somme de tout les chiffres mémorisés


le TButton3 sert à tout effacer


Cela s’apparente à une calculatrice sauf que tant qu’on n’a pas appuyé sur le TButton3 le TEdit3 reste à 0.


Donc si on appuie sur le TButton3, le résultat s’affiche. Et si l’on ajoute d’autre chiffres et qu’on appui de nouveau sur TButton3 il faut que la nouvelle somme calculée vienne s’ajouter à la précédente.
Ca parrait simple mais ça fait deux jours que je me casse les dents dessus

Please HELP!!!!

24 réponses

cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
22 avril 2005 à 09:53
Salut,

Quand la taille de ton tableau est nulle, la boucle for ne tourne pas (for i := 0 to -1) et comme x n'est pas initialisé .....


procedure TForm1.BtCalculerClick(Sender: TObject);
var i, x: integer;
begin

x : = 0;

for i:= 0 to (Length(TabValue)-1) do
x:= x+TabValue[i];
EdResultat.Text:=FloatToStr(x);
end;



Ken@vo


<hr size ="2" width="100%">
Code, Code, Codec !

http://www.pourflorenceethussein.org/
3
Niki2001 Messages postés 85 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 17 décembre 2005 1
26 avril 2005 à 19:04
Tu peux donc accepter une réponse pour que ton problème soit officiellement résolu.
Sur ce...
3
vincentstryckmans Messages postés 228 Date d'inscription lundi 5 avril 2004 Statut Membre Dernière intervention 25 octobre 2006
20 avril 2005 à 12:16
Plusieurs pistes et questions :

Je suppose que TButton3 efface les chiffres mémorisés et pas leur somme, tu ne le précise pas ?



Si tu places la somme dans le TEdit3, pourquoi ne récupéres-tu pas son
contenu pour l'additionner à la nouvelle somme des valeurs entrées dans
TEdit1.



Ne devrais-tu pas prévoir deux effacement : un pour les chiffres introduits, l'autre pour la somme.

Et comme disait ma grand-mère : il y a toujours du soleil derrière les nuages.

Vincent Stryckmans.
0
Niki2001 Messages postés 85 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 17 décembre 2005 1
20 avril 2005 à 12:25
Déjà, premier conseil, nomme tes edits et tes boutons! EdSaisie, EdNombre, EdResultat, BtMemoriser, BtCalculer, EdEffacer. Ce sera beaucoup plus clair.
Ensuite, utilise la propriété Tag de tes edits: met le tag de ton Edit2 à la propriété qu'il affiche. Comme ça, tu n'as plus qu'à faire un Edit2.Tag+1 à chaque click sur Button1 et à faire un IntToStr. De même, met le Tag de ton Edit3 sur le résultat pour additionner a chaque clic sur Bouton1. Tu n'auras plus qu'à l'afficher à chaque click sur Button3;

Si vraiment tu n'y arrives pas, j'ai mis dessous un exemple de ce que j'aurais fait. Mais bon, c'est pas intéressant si on ne fait pas ses programmes soi-même.

En résumé, tu pourrais faire un truc comme ça:
BtMemoriserClick:
begin
EdNombre.Tag:= EdNombre.Tag+1;
EdNombre.Text:= IntToStr(EdNombre.Tag);
EdResultat.Tag:= EdResultat.Tag+StrToInt(EdSaisie.Text);
EdSaisie.Clear;
end;

BtCalculerClick:
begin
If EdSaisie.Text<>'' then
BtMemoriserClick(BtMemoriser);
EdResultat.Text:= IntToStr(EdResultat.Tag);
end;

BtEffacerClick:
begin
EdSaisie.Clear;
EdNomBre.Tag:= 0;
EdNombre.Text:= '0';
EdResultat.Tag:= 0;
EdResultat.Text:= '0';
end;
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
m_cyril1 Messages postés 59 Date d'inscription mercredi 30 mars 2005 Statut Membre Dernière intervention 3 juin 2005
20 avril 2005 à 13:50
Merci Niki 2001, c'est cool ça "marche"!
Mais je me suis mal exprimé avec mon histoire de mémoriser
En faite il faut que ces chiffres soient mémorisés dans des variables que j'appelerais Ei où i varie de 1 à n (n étant le chiffres final du compteur), parce qu' après j'aurais d'autres opérations plus compliquées à faire avec ces Ei
0
vincentstryckmans Messages postés 228 Date d'inscription lundi 5 avril 2004 Statut Membre Dernière intervention 25 octobre 2006
20 avril 2005 à 13:57
Niki 2001 a raison pour les noms des composants.



C'est également valable pour tes variables. Ei cela ne veut pas dire
grand chose surtout à la personne qui devra plonger (ou toi même) ton
code dans 3 à 4 ans.



Si la réponse de Nikki 2001 t'agrée, accepte là STP.

Et comme disait ma grand-mère : il y a toujours du soleil derrière les nuages.

Vincent Stryckmans.
0
m_cyril1 Messages postés 59 Date d'inscription mercredi 30 mars 2005 Statut Membre Dernière intervention 3 juin 2005
20 avril 2005 à 14:54
Dans le domaine ou je travail les Ei sont des variables courantes, tout la vingtaine autres variables portant un indice i, que je manipule sur papier. <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


Ca peut même être pire parce que j'ai même des variables a 4 indices comme par exemple Zijkl ou chaque indice i, j, k et l varie de 1 à 3 et ou il faudrait rajouter un cinquième indices pour mon programme!


Je n’en dirais pas plus sur cette histoire de variables indicés, sinon je risque de gaffer, et vu que c’est un projet industriel je peut avoir des ennuis.
C’est vrai ça réponse me va pour une addition, mais j'ai d'autre opérations à faire ces chiffres, et ils ne seront pas tous réutilisés dans certaines opérations qui seront effectués plus tard, c'est pour ça qu’il faut qu’ils soient stockés dans des Ei
où i varie de 1 à n (n étant le chiffres final du compteur).
En gros il faut qu’a chaque fois qu’on clique sur Mémoriser cela créé une variable Ei !!!!


Exemple :


10 dans Edsaisie click Mémoriser => créer E1 et mémoriser 10 dans E1 (E1=10)


23 dans Edsaisie click Mémoriser => créer E2 et mémoriser 23 dans E2 (E2=23)





76 dans Edsaisie click Mémoriser => créer Ei et mémoriser 76 dans Ei (Ei=76)





57
dans Edsaisie click Mémoriser => créer En et mémoriser 57 dans En (En=76)
ou n étant le dernier chiffre apparaissant dans le compteur.


Et donc quand on fait Calculer on a Resultat=E1+E2+…Ei+…+En avec l’exemple ça donne


Resultat=10+23+…+76+…+57


C’est tout !
J'espère que cette dernière explication est un peu plus claire

Merci !!!!

PS: Désolé pour ce ton austère et peu agressif mais j’ai 3 personnes sur le dos a qui je doit rendre des comptes quasiment tout les jours.
0
slachz Messages postés 109 Date d'inscription lundi 21 avril 2003 Statut Membre Dernière intervention 1 janvier 2006
20 avril 2005 à 19:21
tu creer un tableau dynamique:

var TabValue: array of integer;



et tu definis la longeur du tableau avec setlenght:

SetLength(TabValue, n);



ou n est la taille du tableau..



j'espere que ca repond a ta question ^^
0
m_cyril1 Messages postés 59 Date d'inscription mercredi 30 mars 2005 Statut Membre Dernière intervention 3 juin 2005
21 avril 2005 à 08:40
Ca que très peut de temps que j'ai commencé à faire de la programmation (environ 3semaines) et je n'avait fait qu'un peut de C avant (juste les bases et encore) alors je suis un peu perdu
Don ça parrait bête comme questions, mais comment il faut faire pour ranger les chiffres et les réutilisés avec la fonction TabValue (un exemple m'aiderais beaucoup)
Et comme je l'ai "dit" dans le message précédant j'aurais au final une vingtaine de variables comme mais Ei , ça ne risque pas de poser un problème
0
Niki2001 Messages postés 85 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 17 décembre 2005 1
21 avril 2005 à 11:46
C'est très simple (en théorie): tu fais SetLength(TabValue, n) pour lui attribuer une taille (que tu pourras bien sûr modifier à chaque fois que tu ajoute un chiffre). Ensuite, tu fais TabValue[x] pour accéder au xième nombre mémorisé. Donc à chaque fois que tu mémorise un nombre tu fais:
Inc(n);
SetLength(TabValue, n);
Remarque!! L'index commence à zéro! Donc, le dernier nombre du tableau sera n-1!
Donc:
TabValue[n-1]:= x;
Bonne chance!
0
Niki2001 Messages postés 85 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 17 décembre 2005 1
21 avril 2005 à 11:49
Dernier truc! Pour additionner tous les nombres,il faut créer une boucle:
var
i, x: integer;
for i:=0 to (Length(TabValue)-1) do
x:= x+TabValue[i];
Voila!
Sur ce...
0
m_cyril1 Messages postés 59 Date d'inscription mercredi 30 mars 2005 Statut Membre Dernière intervention 3 juin 2005
21 avril 2005 à 14:14
J'ai reppris tes notations (suite au premier message) et j'ai fait ça:

procedure TForm1.BtMemoriserClick(Sender: TObject);
var TabValue: array of integer;
var n:Integer;
begin
Inc(n);
SetLength(TabValue, n);
TabValue[n]:= StrToInt(EdSaisie.Text);
EdNombre.Text:=IntToStr(StrToInt(EdNombre.Text)+1);
EdSaisie.Clear;
end;

procedure TForm1.BtCalculerClick(Sender: TObject);
var TabValue: array of integer;
var i, x: integer;
begin
for i: =0 to (Length(TabValue) -1) do
x:= x+TabValue[i];
EdResultat.Text:=FloatToStr(x);
end;


procedure TForm1.EdEffacerClick(Sender: TObject);
begin
EdSaisie.Clear;
EdResultat.Clear;
EdNombre.Text: ='0';
end;

Ca ne fonctionne pas, et je ne vois pas pourquoi
La je commence vraiment à devinir fou

PS: Et la déclaration du TabValue il faut la faire où (avant toutes les procédures?) et peut ton donner un autre nom que TabValue
0
Niki2001 Messages postés 85 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 17 décembre 2005 1
21 avril 2005 à 14:36
En fait le problème vient du fait que (et je crois que tu l'avais senti) TabValue et n doivent être déclarés avant toutes les procédures. Ensuite, quelques autres erreurs:
-tu doit faire TabValue[n-1] pour accéder au dernier nombre du tableau, car l'index commence à 0 (par exmple s'il y a 2 nombres, les index seront 0 et 1).
- quand tu fais: EdNombre.Text:=IntToStr(StrToInt(EdNombre.Text)+1); pourquoi ne pas faire directement IntToStr(n)? puisque n représente le nombre en question.
- je viens de penser, si tu veux que l'on puisse rentrer des nombres décimaux (je pense ça en voyant que tu fais FloatToStr), il faut déclarer TabValue: array of extended et faire un StrToFloat au lieu d'un StrToInt dans BtMemoriserClick.

Je pense que ça devrait aller mais s'il y a un problème n'hésite pas!
0
m_cyril1 Messages postés 59 Date d'inscription mercredi 30 mars 2005 Statut Membre Dernière intervention 3 juin 2005
21 avril 2005 à 15:19
Je viens de modifier le code en :
var TabValue: array of integer;
var n:Integer;

procedure TForm1.BtMemoriserClick(Sender: TObject);
begin
Inc(n);
SetLength(TabValue, n);
TabValue[n-1]:= StrToInt(EdSaisie.Text);
EdNombre.Text:=IntToStr(n);
EdSaisie.Clear;
end;

procedure TForm1.BtCalculerClick(Sender: TObject);
var i, x: integer;
begin
for i: =0 to (Length(TabValue) -1) do
x:= x+TabValue[i];
EdResultat.Text:=FloatToStr(x);
end;
procedure TForm1.EdEffacerClick(Sender: TObject);
begin
EdSaisie.Clear;
EdResultat.Clear;
EdNombre.Text: ='0';
end;
Quand on clique sur Calculer dans le EdResultat il y a 4358304 qui apparait sa c'est si on n'a pas restré de nombres et s'il y a des nombres mémorisés, par exemple 10,on fait Calculer et on a 4358314. Je ne comprend toujours pas
Et si toi tu devais tapper un code pour ce problème ça donnerait quoi
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
21 avril 2005 à 17:25
C'est tout bon, ton code, tu as juste oublié d'initialiser n := 0.



procedure TForm1.FormCreate(Sender: TObject);

begin

n := 0;

edResult.Clear;

edSaisie.Text := '0';

edNombre.Text := '0';

end;



procedure TForm1.btnEffacerClick(Sender: TObject);

begin

n := 0;

edResult.Clear;

edSaisie.Text := '0';

edNombre.Text := '0';

end;



Ou plus élégant, tu fais une procedure que tu n'oublies pas de déclarer dans la section private :



private

{ Déclarations privées }

procedure TForm1.InitialiseCalculs;



implementation



{$R *.DFM}



procedure TForm1.InitialiseCalculs;

begin

n := 0;

edResult.Clear;

edSaisie.Text := '0';

edNombre.Text := '0';

end;



// que tu appelles dans:



procedure TForm1.FormCreate(Sender: TObject);


begin


InitialiseCalculs;


end;



procedure TForm1.btnEffacerClick(Sender: TObject);


begin


InitialiseCalculs;


end;



Bonne prog'
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
21 avril 2005 à 17:27
Zut !



Tu enlèves TForm1 dans la déclaration:



private

{ Déclarations privées }

procedure InitialiseCalculs;




Bonne prog'
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
21 avril 2005 à 17:46
En fait, en se penchant un peu sur le problème, il ne faut pas oublier
de réinitialiser la longueur du tableau, sinon... petit bug !



procedure TForm1.InitialiseCalculs;

begin

n := 0;

SetLength(TabValue, n);

edResult.Text := '0';

edSaisie.Text := '0';

edNombre.Text := '0';

end;



Bonne prog'
0
m_cyril1 Messages postés 59 Date d'inscription mercredi 30 mars 2005 Statut Membre Dernière intervention 3 juin 2005
21 avril 2005 à 18:08
On y est presque
Avec la première astuce que tu m'as donnée et en remplaçant n par x et en le déclarant avec n on s'en rapproche.
Exemple on mémorise 10 et 20 et clique sur calculer et on a bien 30. Et si on mémorise 70 après calcul on devrait obtenir 100 et bien non on a 130.
Comme je l'ai dit tout à l'heure je deviens fou !!!
J'ai même essayer de mettre des conditions du style si EdResultat=0, mais ça donne le même problème qu'au dessus.
Je sais pas/plus quoi essayer
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
21 avril 2005 à 18:50
"Comme je l'ai dit tout à l'heure je deviens fou !!!"




C'est vraiment dommage... je te donnais la solution dans mes posts.

INITIALISATION !
0
m_cyril1 Messages postés 59 Date d'inscription mercredi 30 mars 2005 Statut Membre Dernière intervention 3 juin 2005
22 avril 2005 à 09:15
Non pas d'accord!!!


Revoici le code avec la deuxième solution et il y a toujours le problème du 4358324 (et non 4358304) après avoir cliqué sur Calculer.<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />


type
TForm1 = class(TForm)
EdSaisie: TEdit;
EdNombre: TEdit;
EdResultat: TEdit;
BtMemoriser: TButton;
BtCalculer: TButton;
BtEffacer: TButton;
procedure Form1Create(Sender: TObject);
procedure BtMemoriserClick(Sender: TObject);
procedure BtCalculerClick(Sender: TObject);
procedure BtEffacerClick(Sender: TObject);
private
{ Déclarations privées }
procedure InitialiseCalculs;
public
{ Déclarations publiques }
end;


var Form1: TForm1;
var TabValue: array of integer;
var n:Integer;


implementation


{$R *.dfm}


procedure TForm1.InitialiseCalculs;
begin
n:= 0;
SetLength(TabValue, n);
edResultat.Text:='0';
edNombre.Text:='0';
edSaisie.Clear;
end;


procedure TForm1.Form1Create(Sender: TObject);
begin
InitialiseCalculs;
end;


procedure TForm1.BtMemoriserClick(Sender: TObject);
begin
Inc(n);
SetLength(TabValue, n);
TabValue[n-1]: =StrToInt(EdSaisie.Text);
EdNombre.Text:= IntToStr(n);
EdSaisie.Clear;
end;


procedure TForm1.BtCalculerClick(Sender: TObject);
var i, x: integer;
begin
for i: =0 to (Length(TabValue)-1) do
x:= x+TabValue[i];
EdResultat.Text:=FloatToStr(x);
end;


procedure TForm1.BtEffacerClick(Sender: TObject);
begin
InitialiseCalculs;
end;


end.

Et je pense que lorsque l'on fait Calculer sans avoir mémoriser de chiffres, on devrait avoir un message d'erreur, vu que par défaut (d'aprés l'aide de Delphi) le TabValue[0] =vide. Donc c'est qu'il y a un problème.
PS: D'après une doc que j'ai trouvé sur Delphi la variable n lorsqu'on utilise la fonction Inc(n) est automatiquement mis à zéro à l'ouverte, parcontre c'est vrai qu'il faut remettre n à 0 qu'on fait effacer. Je pense plutot que ça vient de l'initialisation de x
0
Rejoignez-nous