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