| Autor |
Beitrag |
dnb
Hält's aus hier
Beiträge: 6
|
Verfasst: So 16.02.03 18:11
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!
Zuletzt bearbeitet von dnb am So 16.02.03 18:51, insgesamt 1-mal bearbeitet
|
|
bis11
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: 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.
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 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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  :
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
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
dnb 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 17.02.03 12:06
Vielleicht war ich etwas sparsam an Kommentaren? Kannst ja aber jederzeit fragen! Prima, dass es Dir hilft.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
dnb 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
dnb 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mo 17.02.03 13:05
Titel: also..
hier erstma der umgeschriebene code
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!
Zuletzt bearbeitet von dnb am Mo 17.02.03 13:46, insgesamt 1-mal bearbeitet
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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:
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
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
dnb 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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! 
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Marc
      
Beiträge: 169
Win 2000, Win XP, SuSE Linux 8.2
|
Verfasst: Mo 17.02.03 14:26
|
|
bis11
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: Mo 17.02.03 16:32
@Marc
Das war nicht gewollt 
|
|