Entwickler-Ecke
Sonstiges (Delphi) - bitte um hilfe bei delphi prog(Porto- briefmarken-problem)
dnb - So 16.02.03 18:11
Titel: bitte um hilfe bei delphi prog(Porto- briefmarken-problem)
weiß ni genau wos hinsoll, weil ich noch etwas neu bin,aber ich hoffe es passt hier halbwegs!
also ich habe die aufgabe fürn info unterricht ein programm in delphi zu schreiben! so weit so gut, nur gestaltet es sich etwas schwierig und ich wäre für hilfe dankbar!
also es soll nach der eingabe eines beliebigen portobetrages in einer memobox ausgegeben werden, welche möglichkeiten der frankierung man hat! also 3 marken stehen zur auswahl 1€, 45ct und 55ct! es sollen alle möglichkeiten ausgegeben werden und es muss immer genau aufgehen! es soll wohl mit hilfe von verschachtelten schleifen gelöst werden! aber ich komm ni weiter!
danke schon mal!
bis11 - So 16.02.03 18:19
Hallo und willkommen,
erstmal gebe ich Dir den Tip Deinen Titel vom Posting zu ändern, der etwas aussagekräftiger ist. Indem Du auf den Button Edit oben rechts klickst. Sonnst bekommst Du einen netten Hinweis vom Mod. :wink:
Nun aber zu Deinem Problem, was verstehst Du denn jetzt nicht genau ? Hast Du schon einen Sourcecode geschrieben, wenn ja poste den hier mal, damit man dir etwas besser weiterhelfen kann.
dnb - So 16.02.03 18:46
Titel: ...
danke für den hinweis! werde nächstes mal besser darauf aufpassen! mein hauptproblem besteht eigentlich darin, dass er alle möglichkeiten rausfindet und die falschen gar nicht erst anzeigt! hab schon einen teil geproggt was auch für 2 verschiedene briefmarken klappt, allerdings natürlich nur für die eine möglichkeit!
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| procedure TForm1.Button1Click(Sender: TObject); var porto, i:Real; anzahl100, anzahl45, anzahl55:Integer;
begin
Porto:=StrToFloat(PortoEdit.Text); Anzahl100:=0; anzahl45:=0; anzahl55:=0; i:=0;
Repeat Anzahl100:=anzahl100+1 Until Anzahl100>=Porto; If Porto<Anzahl100 then begin Anzahl100:=anzahl100-1; Repeat Anzahl45:=Anzahl45+1 Until Porto>=Anzahl100+(Anzahl45*0.45); If Porto<Anzahl100+(Anzahl45*0.45) then begin Repeat Anzahl55:=Anzahl55+1 Until Porto<=Anzahl100+(Anzahl45*0.45)+(Anzahl55*0.55); end; end; memo1.lines.add(IntToStr(Anzahl55) + ' ' + (IntToStr(Anzahl100))+ ' ' + IntToStr(Anzahl45)); end;
end. |
also das mitm code klappt ni so recht, aber ega! und das anzahl100 etc bedeutet halt die anzahl der 1? marken, anzahl der 45 cent marken und so!
dankescheen
Christian S. - So 16.02.03 20:42
| Zitat: |
| danke für den hinweis! werde nächstes mal besser darauf aufpassen! |
Und für diese Einsicht (die ich sehr, sehr selten beoachte) bekommst Du jetzt eine Belohnung :wink: :
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
| var Form1: TForm1; anzahl, wert : ARRAY[0..2] OF Integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); VAR gesamtbetrag,betrag1,betrag2,betrag3 : Integer; x,y,z,i : INTEGER; begin wert[0]:=45; wert[1]:=55; wert[2]:=100; Memo1.Lines.Clear; Memo1.Lines.Add(IntTOStr(wert[0])+' '+IntTOStr(wert[1])+' '+IntTOStr(wert[2])); //Markengrößen ausgeben gesamtbetrag:=StrToInt(edit1.text); for x:=0 TO 2 DO anzahl[x]:=0; //Anzahl leeren for x:=0 TO 2 DO //Mit welcher Markengröße soll angefangen werden? begin
anzahl[x]:=gesamtbetrag div wert[x]; //Wie oft passt's rein? betrag1:=gesamtbetrag - (anzahl[x]*wert[x]); //Was bleibt übrig? for y:=0 TO 2 DO //Alle Markengrößen durchgehen ... begin if x<>y then //... aber nur die benutzen, die wir noch nicht hatten. begin anzahl[y]:=betrag1 div wert[y]; //Wie oben betrag2:=betrag1 - (anzahl[y]*wert[y]); //wie oben for z:=0 TO 2 DO //Alle Markengrößen durchgehen ... begin if (z<>x) AND (z<>y) THEN //... aber nur die eine benutzen, die wir noch nicht hatten begin anzahl[z]:=betrag2 div wert[z]; //wie oben betrag3:=betrag2 - (anzahl[z]*wert[z]); //wie oben if betrag3=0 then //wenn kein Rest übrig bleibt, Kombination ausgeben Memo1.Lines.Add(IntTOStr(anzahl[0])+' '+IntTOStr(anzahl[1])+' '+IntTOStr(anzahl[2])); end; end; end; end; end; end; |
Ich habe den Code nur ganz kurz benutzt, aber derbe Fehler konnte ich nicht entdecken. Naja, einen: Kombinationen werden mehrmals ausgegeben, dass müsste man noch irgendwie verhindern.
MfG,
Peter
dnb - Mo 17.02.03 01:04
Titel: ...
wow echt klasse von dir! ganz schön hart da durchzusehen als delphi newbie! aber ich kann mich nur vielmals bedanken! ;)
bye bye
EDIT:
puh hat ne weile gedauert bis ich mich da reingefunden hab in den code aber ich denke ich bekomms auf de reihe!
Christian S. - Mo 17.02.03 12:06
Vielleicht war ich etwas sparsam an Kommentaren? Kannst ja aber jederzeit fragen! Prima, dass es Dir hilft.
dnb - Mo 17.02.03 12:54
Titel: also
ich habe den code jetzt mal für meine zwecke umgeschrieben aber im wesentlichen nichts verändert und wenn ich es starte, gibt man ja den prtobetrag ein und drückt den button! so aber nun gibt er nicht das gewünschte aus sondern nur die eine zeile mit den briefmarkenwerten! man kann einbgeben was man will! soll ich den umgeänderten code nochma posten zwekcs besserer verständlichkeit meines probs?!
tschau und danke
Christian S. - Mo 17.02.03 13:02
Ja, das wäre auf jeden Fall besser. Und auch den Betrag, bei dem es nicht funktioniert. Dann kann man das Problem besser zurückverfolgen.
MfG,
Peter
dnb - Mo 17.02.03 13:05
Titel: also..
hier erstma der umgeschriebene code
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| procedure TForm1.Button1Click(Sender: TObject); VAR Porto,betrag1,betrag2,betrag3, anzahl55, anzahl45, anzahl100, wert0, wert1, wert2 : Integer; x,y,z : INTEGER;
begin wert0:=45; wert1:=55; wert2:=100; Memo1.Lines.Clear; Porto:=StrToInt(Portoedit.text); for x:=0 TO 2 DO //Mit welcher Markengröße soll angefangen werden? begin
anzahl45:=Porto div wert0; //Wie oft passt's rein? betrag1:=Porto - (anzahl45*wert0); //Was bleibt übrig?
for y:=0 TO 2 DO //nächste markenart begin if x<>y then //... aber nur die benutzen, die wir noch nicht hatten. begin anzahl55:=betrag1 div wert1; //Wie oft passt's rein? betrag2:=betrag1 - (anzahl55*wert1); //was bleibt übrig for z:=0 TO 2 DO //nächste markenart begin if (z<>x) AND (z<>y) THEN //... aber nur die eine benutzen, die wir noch nicht hatten begin anzahl100:=betrag2 div wert2; //wie oben betrag3:=betrag2 - (anzahl100*wert2); //wie oben if betrag3=0 then //wenn kein Rest übrig bleibt, Kombination ausgeben Memo1.Lines.Add(IntTOStr(anzahl45)+' '+IntTOStr(anzahl55)+' '+IntTOStr(anzahl100)); end; end; end; end; end; end; |
ich bastel noch bissl ob ichs hinbekomme, weil der ansatz der lsg ist mir ja völlig klar , nur warum er es nicht ausgeben will nicht!
tschau!
EDIT:
es geht ja sicher nicht weil das mit dem Anzahl[x] geändert habe und weril das x zur schleife gehört! aber wenn ich es lassen bringt delphi fehler von wegen undeclared und so
Edit2:
ich habe jetze ma ne neue form gemacht und deine code reinkopiert und jetzt geht es auf einmal! mir unklar, ich bleib dran um es zu ergründen, warume s vorhin nicht wollte! aber danke klappt einwandfrei bis auf die doppleten ausgaben!
Christian S. - Mo 17.02.03 13:45
So wie Du das ungebaut hast, kann es nicht funktionieren: bei Dir ist die erste Anzahl immer die Anzahl für die 45er-Marken, aber das stimmt ja nicht. Der Markentyp ändert sich ja. Entsprechend bei den anderen Schleifen.
Wenn Du es ohne Schleifen machen willst, dann wird es etwas länger:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73:
| procedure TForm1.Button1Click(Sender: TObject); VAR Porto,betrag1,betrag2,betrag3, anzahl55, anzahl45, anzahl100, wert0, wert1, wert2 : Integer; x,y,z : INTEGER; begin wert0:=45; wert1:=55; wert2:=100; Memo1.Lines.Clear; Porto:=StrToInt(Portoedit.text); for x:=0 TO 2 DO //Mit welcher Markengröße soll angefangen werden? begin
case x of 0: begin anzahl45:=Porto div wert0; //Wie oft passt's rein? betrag1:=Porto - (anzahl45*wert0); //Was bleibt übrig? end; 1: begin anzahl55:=Porto div wert1; //Wie oft passt's rein? betrag1:=Porto - (anzahl55*wert1); //Was bleibt übrig? end; 2: begin anzahl100:=Porto div wert2; //Wie oft passt's rein? betrag1:=Porto - (anzahl100*wert2); //Was bleibt übrig? end; end;
for y:=0 TO 2 DO //nächste markenart begin if x<>y then //... aber nur die benutzen, die wir noch nicht hatten. begin case y of 0: begin anzahl45:=betrag1 div wert0; //Wie oft passt's rein? betrag2:=betrag1 - (anzahl45*wert0); //Was bleibt übrig? end; 1: begin anzahl55:=betrag1 div wert1; //Wie oft passt's rein? betrag2:=betrag1 - (anzahl55*wert1); //Was bleibt übrig? end; 2: begin anzahl100:=betrag1 div wert2; //Wie oft passt's rein? betrag2:=betrag1 - (anzahl100*wert2); //Was bleibt übrig? end; end;
for z:=0 TO 2 DO //nächste markenart begin if (z<>x) AND (z<>y) THEN //... aber nur die eine benutzen, die wir noch nicht hatten begin case z of 0: begin anzahl45:=betrag2 div wert0; //Wie oft passt's rein? betrag3:=betrag2 - (anzahl45*wert0); //Was bleibt übrig? end; 1: begin anzahl55:=betrag2 div wert1; //Wie oft passt's rein? betrag3:=betrag2 - (anzahl55*wert1); //Was bleibt übrig? end; 2: begin anzahl100:=betrag2 div wert2; //Wie oft passt's rein? betrag3:=betrag2 - (anzahl100*wert2); //Was bleibt übrig? end; end; if betrag3=0 then //wenn kein Rest übrig bleibt, Kombination ausgeben Memo1.Lines.Add(IntTOStr(anzahl45)+' '+IntTOStr(anzahl55)+' '+IntTOStr(anzahl100)); end; end; end; end; end; end; |
MfG,
Peter
dnb - Mo 17.02.03 14:00
Titel: ...
echt toll dass du dir so ne mühe mit meinen problemen, die in deinen augen sicher kindergarten sind! habs mit schliefen ja jetzt laufen und es muss ja mit schleifen gelöst werden....so jetzt werd ich das noch machen mit den doppelten ergebnissen nd dann is gud!
jop also danke für die große hilfe! hoffe ich kann dir(euch) auch ma bei was helfen, auch wenns ni bei delphi sein wird! :lol:
Christian S. - Mo 17.02.03 14:26
| Zitat: |
| echt toll dass du dir so ne mühe mit meinen problemen, die in deinen augen sicher kindergarten sind! |
Mit Kindergarten hat das nun wirklich nichts zu tun. Ich programmiere seit ca. 7 Jahren, habe mit ca. 13 Jahren angefangen. Da hatte ich 'ne Menge Zeit, das zu lernen. Das muss man sich immer vor Augen halten!
| Zitat: |
| jop also danke für die große hilfe! hoffe ich kann dir(euch) auch ma bei was helfen, auch wenns ni bei delphi sein wird! |
Sag' das nicht! Es wird sicher noch ein paar Jahre dauern, aber niemand weiß alles und so kannst Du mir bestimmt irgendwo mal helfen.
MfG,
Peter
Marc - Mo 17.02.03 14:26
| bis11 hat folgendes geschrieben: |
| ...erstmal gebe ich Dir den Tip Deinen Titel vom Posting zu ändern, der etwas aussagekräftiger ist. Indem Du auf den Button Edit oben rechts klickst. Sonnst bekommst Du einen netten Hinweis vom Mod. :wink: ... |
Du nimmst uns noch die Arbeit weg. :D :D
bis11 - Mo 17.02.03 16:32
@Marc
Das war nicht gewollt :D
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!