Visual Basic 10 Problem: Frankieren von Briefen

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von mikeb69.

    Visual Basic 10 Problem: Frankieren von Briefen

    Hallo,
    Ich habe ein Problem mit ein Problem mit ein Programm. Es soll ein Brief mit 6,00€ frankiert werden. Es stehen dazu Briefmarken im Wert von 0,40 0,60 und 0,80 € Verfügung. Es sollen alle denkbaren Kombination durchprobiert werden und die zulässige Kombination gedruckt werden.

    Ich würde mich freuen wenn jemand eine Lösung hat, bzw mir helfen kann.

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Ich hätte einmal ne Lösung Marke Bruteforce im Sortiment:

    Visual Basic-Quellcode

    1. Dim WertSorteA = 0.4, WertSorteB = 0.6, WertSorteC = 0.8
    2. Dim WertGesamt = 0.0
    3. For MengeSorteA = 0 To 15 'mehr als 15 ergeben immer Werte > 6 €
    4. For MengeSorteB = 0 To 10 'mehr als 10 ergeben immer Werte > 6 €
    5. For MengeSorteC = 0 To 7 'mehr als 7 ergeben immer Werte > 6 €
    6. WertGesamt = WertSorteA * MengeSorteA + WertSorteB * MengeSorteB + WertSorteC * MengeSorteC
    7. If WertGesamt = 6 Then MsgBox(WertSorteA.ToString & "x" & MengeSorteA & " + " & WertSorteB & "x" & MengeSorteB & " + " & WertSorteC & "x" & MengeSorteC)
    8. Next
    9. Next
    10. Next


    Das alles ist natürlich sehr unflexibel, da es nur auf die angegebenen Werte fixiert ist. Und das mit der MsgBox ist auch insofern unpraktisch, weil es laut meinem Programm 21 zulässige Kombinationen gibt. Aber: Problem ist so lösbar.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Erstmal vielen Dank für die Antwort.
    ich habe jetzt anstatt das die Ergebnisse in einer MessageBox ausgegeben werden die in einer ListBox getan. Wie könnte man das machen, das zum Schluss das Ergebnis 6€ da steht? Also meine jetzige Ausgabe(eine Zeile) ist 0,4*0 + 0,6*6 + 0,8*3 und dahinter sollte das Ergebnis. Meine nächste Frage ist wie die Printfunktion in VB funktioniert weil die kenne ich noch nicht?


    ---------------------
    ps. wie haben sie/ hast du oben den Quellcode in so ein kasten bekommen (bin noch neu im Forum)
    1. "Du", nix mit "Sie" ;)
    2. Code->Kasten: Entweder mit den netten Buttons, da gibt's n Tut von EdR. Oder indem Du schreibst: [code=vb*]...[/code*] (ohne das *, sonst wird die Formatierung ausgelöst)
    3. Der bisherige Code sagt ja schon, was für ein String in die ListBox kommt. Da setzt Du einfach noch dran: & " = 6,00 €", also zusammengefasst eben ListBox.AddItem WertSorteA.ToString & "x" & MengeSorteA & " + " & WertSorteB & "x" & MengeSorteB & " + " & WertSorteC & "x" & MengeSorteC & " = 6,00 €"
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @X-Zat Das ist mir durchaus bewusst, aber solange der TE das Problem nicht allgemeiner gelöst haben will, gibt es für mich momentan keinen Grund, die Lösung allgemeiner zu gestalten. Natürlich: Wo einem nicht bewusst ist, dass es flexible Möglichkeiten für eine Lösung gibt, kann man auch nicht nachfragen. Ich glaube nicht, dass das einzige Problem bei 6 € ist und dass es nur die drei genannten Frankiermarken gibt, aber wie gemeint: Es ist die Aufgabe des TE zu fragen, wenn er nicht weiter kommt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @X-Zat Das ist mir durchaus bewusst, aber solange der TE das Problem nicht allgemeiner gelöst haben will, gibt es für mich momentan keinen Grund, die Lösung allgemeiner zu gestalten. Natürlich: Wo einem nicht bewusst ist, dass es flexible Möglichkeiten für eine Lösung gibt, kann man auch nicht nachfragen. Ich glaube nicht, dass das einzige Problem bei 6 € ist und dass es nur die drei genannten Frankiermarken gibt, aber wie gemeint: Es ist die Aufgabe des TE zu fragen, wenn er nicht weiter kommt.​


    Ich hatte meine Problemstellung gekürzt.

    Hier ist die komplette Problemstellung:
    Ein Brief soll mit 6,00 EUR frankiert werden. Es stehen dazu Briefmarken im Wert von 40, 60 und 80 Pfennig(ja so steht es da :) ) in jeweils beliebiger Anzahl zur Verfügung. Welche Möglichkeiten gibt es, den Brief zu Frankieren ? Schreiben Sie ein Programm, das alle denkbaren Kombination durchprobiert und die zulässigen Kombination ausdruckt.

    Eventuell kann man mit der Beschreibung mehr anfangen
    @Käsekuchen,

    mir scheint du verkennst den Sinn des Forums.
    Die Leute sind hier nicht dazu da um deinen Code zu schreiben.

    Desweiteren sollte man für eine weitere Frage einen neuen Thread eröffnen.
    Meine nächste Frage ist wie die Printfunktion in VB funktioniert weil die kenne ich noch nicht?

    Was hast du den bisher und was fehlt noch ?
    Eleganz wäre ein Rekursiver Ansatz zu deinem Euro Problem, der Code von @VaporiZed ist eher unelegant zu nennen.

    Also - zeig uns mal den von dir erstellten Code !

    Gruss

    mikeb69
    Das irgendjemand das Programm für mich schreibt möchte ich nicht. Ich möchte gerne einen Lösungsvorschlag(Ansatz) evtl. mit Beispiel (Beispiel muss nichts mit dem Programm zu tun haben), damit ich weiter komme.
    Das ist mein Lösungsansatz nur hier ist das Problem, (0,40 wird richtig dargestellt 0,60 auch) ich weis nicht wie man mehre (verschiedenen )Möglichkeiten anzeigen lassen kann und das diese auch überprüft werden ob die 6 € überschritten worden sind oder nicht.

    Visual Basic-Quellcode

    1. Public Class Form1
    2. Dim Zahlen As Integer
    3. Dim Liste1 As Integer
    4. Dim Zahlen2 As Integer
    5. Dim Liste2 As Integer
    6. Dim Zahlen3 As Integer
    7. Dim Liste3 As Integer
    8. Private Sub cmd_start_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_start.Click
    9. Zahlen = 0
    10. Liste1 = 0
    11. For x = 1 To 15 Step 1
    12. Zahlen = Zahlen + 40
    13. Liste1 = Liste1 + 1
    14. lst_40ctausgabe.Items.Add(Zahlen.ToString)
    15. lst_40ct.Items.Add(Liste1.ToString)
    16. Next
    17. Zahlen2 = 0
    18. Liste2 = 0
    19. For y = 1 To 10 Step 1
    20. Zahlen2 = Zahlen2 + 60
    21. Liste2 = Liste2 + 1
    22. lst_60ctausgabe.Items.Add(Zahlen2.ToString)
    23. lst_60ct.Items.Add(Liste2.ToString)
    24. Next
    25. Zahlen3 = 0
    26. Liste3 = 0
    27. For w = 1 To 8 Step 1
    28. Zahlen3 = Zahlen3 + 80
    29. Liste3 = Liste3 + 1
    30. lst_80ctausgabe.Items.Add(Zahlen3.ToString)
    31. lst_80ct.Items.Add(Liste3.ToString)
    32. Next
    33. End Sub
    34. Private Sub cmd_ende_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_ende.Click
    35. End
    36. End Sub
    37. Private Sub cmd_clearAllList_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_clearAllList.Click
    38. lst_40ct.Items.Clear()
    39. lst_40ctausgabe.Items.Clear()
    40. lst_60ct.Items.Clear()
    41. lst_60ctausgabe.Items.Clear()
    42. lst_80ct.Items.Clear()
    43. lst_80ctausgabe.Items.Clear()
    44. End Sub
    45. End Class
    @Käsekuchen: Öhm ... ich dachte, wir sind bei VBA. Und jetzt ist der Thread mit VB.Net getagged. Auch Dein Code ist jetzt VB.Net-Design. Ja, was denn nun? Wenn wirklich VB.Net, dann lässt sich der Code mit dem netten Bearbeitungssymbol [VB.Net] markieren (oder per Hand mit [vbnet*][/vbnet*], wieder ohne *)

    Bzgl. Beispiel und die Frage, ob der Gesamtwert = 6 € (oder eben nicht) rauskommt, habe ich bereits in Post#2 ne Lösung angeboten. Deinem Code fehlt eigentlich einmal das Zusammenrechnen der Einzelcent(oder -pfennig)werte, damit überprüft wird, wieviel die bisherigen Frankiermarken zusammen ergeben, zum anderen die Kombinationsmöglichkeiten. Meines Erachtens geht das nur darüber, dass man alle Kombinationen durchprobiert. Aber es scheint, als ob @mikeb69 noch was besseres im Sinn hat, irgendwas mit Lösung-einer-Gleichung-mit-drei-Unbekannten oder so.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Sorry, dass ich hier für etwas Verwirrung mit den Markierungen und der angebenden Programmiersprache gestiftet habe.
    Zur der Programmiersprache ich benutze die ich oben verwendet habe, dass ist auch die, die ich in der Schule verwenden und mit der ich am meisten Erfahrung habe.
    ​Deinem Code fehlt eigentlich einmal das Zusammenrechnen der Einzelcent(oder -pfennig)werte, damit überprüft wird, wie viel die bisherigen Frankiermarken zusammen ergeben
    Dann werde ich das mal machen und auf den Vorschlag von @mikeb69 warten
    @VaporiZed

    mikeb69 schrieb:

    Eleganz wäre ein Rekursiver Ansatz zu deinem Euro Problem


    @Käsekuchen

    hatte eigentlich nicht vor dir die Lösung zu präsentieren.
    Kann ich aber natürlich machen - musst halt bis heute Nachmittag warten, werde jetzt erst einmal für meine Familie kochen.

    Gruss

    mikeb69
    @Käsekuchen Mal zum Problem selbst:
    Du hast eine Gleichung in 3 Unbekannten, die nur ganzzahlige Lösungen zulässt:
    a * Preis1 + b * Preis2 + c * Preis3 = Wert
    Diesen Typ nennt man Diophantische Gleichung.Wenn Du da ein wenig runstöberst, wirst Du geeignete Ansätze finden.
    Dies als Hinweis sollte genügen, denn Deine Hausaufgaben mach ich auch nicht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Käsekuchen
    mein Ansatz wäre dieser.

    C#-Quellcode

    1. ​private void Form1_Load(object sender, EventArgs e)
    2. {
    3. int[] ret = GetStamps(new List<int>() { 80, 60, 40}, new int[3] , 600, 0);
    4. }
    5. private int[] GetStamps(List<int> coins, int[] result, int summe, int counter)
    6. {
    7. int rest = summe % coins[counter];
    8. int anzahl = summe / coins[counter];
    9. result[counter] = anzahl;
    10. return rest == 0 ? result : GetStamps(coins, result, rest, counter + 1);
    11. }


    Gruss mikeb69
    habe beim lösen mich am Beispiel von @VaporiZed gehalten. so sieht im Moment mein Code aus

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub cmd_start2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_start2.Click
    3. Dim WertSorteA As Double
    4. Dim WertSorteB As Double
    5. Dim WertSorteC As Double
    6. Dim WertGesammt As Double
    7. Dim GesMengeA As Double
    8. Dim GesMengeB As Double
    9. Dim GesMengeC As Double
    10. WertSorteA = 0.4
    11. WertSorteB = 0.6
    12. WertSorteC = 0.8
    13. For GesMengeA = 0 To 15 Step 1
    14. For GesMengeB = 0 To 10 Step 1
    15. For GesMengeC = 0 To 7 Step 1
    16. WertGesammt = WertSorteA * GesMengeA + WertSorteB * GesMengeB + WertSorteC * GesMengeC
    17. If WertGesammt = 6 Then lst_ausgabe.Items.Add(WertSorteA.ToString & "x" & GesMengeA & " + " & WertSorteB & "x" & GesMengeB & " + " & WertSorteC & "x" & GesMengeC & "= 6,00€")
    18. Next
    19. Next
    20. Next
    21. lbl_items.Text = lst_ausgabe.Items.Count.ToString
    22. End Sub
    23. Private Sub cmd_clear_lst_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_clear_lst.Click
    24. lst_ausgabe.Items.Clear()
    25. lbl_items.Text = ""
    26. End Sub

    Käsekuchen schrieb:

    WertGesammt = WertSorteA * GesMengeA + WertSorteB * GesMengeB + WertSorteC * GesMengeC
    Diese Rechnung geht vor die Hose, weil Du unrunde Double-Werte verwendest.
    Stell das ganze auf Integer und Cent um und Deine Nachbarin redet wieder mit Dir.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Käsekuchen

    was gefällt dir an meiner Lösung nicht ?
    Bei deinem Ansatz müssen es immer drei Briefmarken sein - was ist wenn du mal mehr mal weniger brauchst ?

    Das ist ganz wichtig

    RodFromGermany schrieb:

    Stell das ganze auf Integer und Cent um


    Gruss

    mikeb69
    @mikeb69 1. Ist das prinzip was du bei C# hast bei VB.Net gleich, weil mit C# kenne ich mich noch weniger aus.
    Bei deinem Ansatz müssen es immer drei Briefmarken sein - was ist wenn du mal mehr mal weniger brauchst ?

    2. wegen den verschiedenen Möglichkeiten: Da hast du recht. Dann werde das versuchen anzupassen/ abzuändern
    @Käsekuchen

    hierfür gibt es CodeConverter

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load_1(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Dim ret As Integer() = GetStamps(New List(Of Integer)() From {80, 60, 40}, New Integer(2) {}, 600, 0)
    4. End Sub
    5. Private Function GetStamps(coins As List(Of Integer), result As Integer(), summe As Integer, counter As Integer) As Integer()
    6. Dim rest As Integer = summe Mod coins(counter)
    7. Dim anzahl As Integer = Fix(summe / coins(counter))
    8. result(counter) = anzahl
    9. Return If(rest = 0, result, GetStamps(coins, result, rest, counter + 1))
    10. End Function
    11. End Class


    In Form_Load beim Aufruf, das erste Array gibt die Werte der Briefmarken an.
    Das zweite Array ein leeres Array der selben Größe für das Ergebnis
    Dann das was der Brief kostet und eine 0 für den Zähler.

    Alle Werte in Cent
    Gruss

    mikeb69

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „mikeb69“ ()