Ich kam letztens einfach nicht umher meinen alten C# Ordner zu durchstöbern. Ich hatte mich damals wenige Wochen mit C# beschäftigt. Also beschäftigt im Sinne von: Einsteigerkurse in der S-Bahn lesen, paar Tutorials im Netz und los gehts 😀
Ein Projekt hatte ich damals tatsächlich realisieren wollen. Ein kleines Programm, mit dem ich eine kleine Investition rechtfertigen und strategisch präsentieren konnte.
Damals wollte ich mir nämlich einen Kaffeevollautomaten kaufen, der gerade im Angebot war. Solch ein Gerät ist ja nicht gerade günstig, also habe ich die Ersparnisse, die mit so einem Gerät möglich sind, versucht einfach zu verdeutlichen.
Und somit, let me proudly introduce to you:
Kaffe-Kalkulator
DIE Rechtfertigung, wenn es um den Kauf eines Kaffeevollautomaten geht!
Der Sinn dieser Software ist einfach: sie soll die Rechenarbeit bei der Frage „Lohnt sich der Kauf eines Kaffeevollautomaten?“ für euch erledigen.
Das Programm fragt nach einigen Grundangaben aus denen dann ein kurzer Infotext gebastelt wird.
Simple thing, huh?! 🙂
Wie gesagt war das ein recht kurzer Abstecher in die C# Welt, der Code ist jetzt also nicht sonderlich cool.
Ich habe mich gestern und heute kurz damit beschäftigt und den Code stark gereinigt und umgeschrieben, Funktionen geschrieben, Fehler abgefangen, Code gekürzt und sowas. Aber mittlerweile würde ich einige Schritte anders realisieren (Stichwort „.“ bei Kaffeebohnenpreis und MaskedTextBoxes) und würde auch einige andere Details ändern (z.B. variabler durchschnittlicher Verbrauch von Kaffeebohnen pro Tasse (ist ja je nach Tassengröße unterschiedlich)) aber wichtig ist das alles nicht. Dazu müsste das Programm grundlegend umgestaltet werden und so viel Langeweile habe ich ja nun auch wieder nicht. Es funktioniert grundlegend und erfüllt seine Aufgabe mit Stolz. 🙂
Den Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.
public partial class Main : Form { // Variablen einzeln setzen, für Kommentare const char nl = (char)10; // Zeilenumbruch als Konstante double PrUn = 0; // Preisunterschied zwischen eigenem und alternativem Kaffee double PrKa = 0; // Preis der eigenen Tasse double PrAlKa = 0; // Preis des altern. Kaffees double MaxKaBo = 0; // maximale Anzahl der Tassen pro voller Kaffeebohnenpackung double DuVeKaBo = 20; // Durchschnittlicher Kaffeebohnenverbrauch pro Tasse double KaAuBezWo = 0; // Anzahl an Wochen die man braucht um mit dem Preisunterschied den Kaffeevollautomaten zu bezahlen bool empty = true; // Felder leer? public Main() { InitializeComponent(); } void btnBerechne_Click(object sender, EventArgs e) { try { // Setze intern berechnete Variablen zurück initReset(false, true); // GET: Preis des alternativen Kaffees PrAlKa = checkPrAlKa(); if (PrAlKa == 0 || checkEmpty() == true) emptyErr(); else { if (checkNegative() == true) showStats("negative"); else showStats("positive"); } } catch { unknownErr(); } } void negativeErr() { lblStatistik.Text = "Die berechnete Statistik zeigt, dass du mit deinen Angaben keinen Gewinn machen würdest. Der Kaffee deines Vollautomaten ist teurer als der Kaffee, den du dir im Laden kaufst."; gbxStatistik.Visible = true; } void emptyErr() { lblStatistik.Text = "Fehler bei der Eingabe. Es wurden nicht alle Felder ausgefüllt."; gbxStatistik.Visible = true; } void unknownErr() { lblStatistik.Text = "Ein unbekannter Fehler ist aufgetreten... sorry...\nPrüfe deine Eingaben, irgendetwas stimmt hier nicht ;)"; gbxStatistik.Visible = true; } double checkPrAlKa() { switch (cbxPrAlKa.Text) { case "": { return 0; break; } case "0,50€ - Berlin Ost billig": { return 50; break; } case "0,80€ - Berlin West billig": { return 80; break; } case "1,00€ - Berlin Mitte billig": { return 100; break; } case "1,30€ - Berlin Mitte normal": { return 130; break; } case "2,00€ - Berlin Mitte teuer": { return 200; break; } case "3,50€ - Berlin Fucking Luxus": { return 350; break; } case "6,00€ - Scheiße wo trinkst du Kaffee?!": { return 600; break; } default: { return 0; break; } } } bool checkEmpty() { // CHECK: leere Eingaben if (tbxAnKaWo.Text == "" || tbxMeKaBo.Text == "" || tbxPrKaAu.Text == "" || tbxPrKaBo.Text == "") return true; else return false; } bool checkNegative() { // CALC: Preis der eigenen Tasse in Cent PrKa = (((double.Parse(tbxPrKaBo.Text) * 100) / double.Parse(tbxMeKaBo.Text)) * DuVeKaBo); // CALC: Preisunterschied zwischen eigenem und alternativem Kaffee PrUn = PrAlKa - PrKa; // CALC: maximale Anzahl der Tassen pro voller Kaffeebohnenpackung beim angegebenen Durchschnittsverbrauch pro Tasse MaxKaBo = Math.Round((double.Parse(tbxMeKaBo.Text) / DuVeKaBo), 1); // CALC: Anzahl an Wochen die man braucht um mit dem Preisunterschied den Kaffeevollautomaten zu bezahlen KaAuBezWo = double.Parse(tbxPrKaAu.Text) / (PrUn * double.Parse(tbxAnKaWo.Text)); // PRINT: Preis der eigenen Tasse in € tbxPrTaKa.Text = Math.Round((PrKa / 100), 2).ToString(); // PRINT: Preisunterschied zwischen eigenem und alternativem Kaffee in € tbxPrUn.Text = Math.Round((PrUn / 100), 2).ToString(); if (PrUn < 0) return true; else return false; } void showStats(string pon) { if (pon == "positive") { // PRINT: Statistiktext lblStatistik.Text = tbxMeKaBo.Text + "g Kaffeebohnen kosten " + tbxPrKaBo.Text + " €. Für eine kleine Tasse werden " + DuVeKaBo + "g Kaffeebohnen verbraucht, mit den " + tbxMeKaBo.Text + "g Kaffeebohnen lassen sich also bis zu " + MaxKaBo + " Tassen machen." + nl + "Eine Tasse Kaffee zu Hause kostet nur " + tbxPrTaKa.Text + " € ! Günstig, oder?! Und dann noch lecker Kakao drin, hhmmmm lecker." + nl + "Wenn ein gekaufter Kaffee in der Stadt " + Math.Round((PrAlKa / 100), 2) + " € kostet, ist ein selbstgemachter Kaffee also " + Math.Round((PrUn / 100), 2) + " € günstiger!" + nl + "Bei " + tbxAnKaWo.Text + " Tassen Kaffee pro Woche sparst du also " + // CALC: Ersparnis pro Woche: Anzahl der Tassen pro Woche * Preisunterschied in € gerundet auf 2 Stellen Math.Round((double.Parse(tbxAnKaWo.Text) * Math.Round((PrUn / 100), 2)), 2) + " € pro Woche, " + // CALC: Ersparnis pro Monat: Anz. d. Tassen pro Woche / 7 (Ersparnis pro Tag) * 30.416 (durchschnittliche Tagesanzahl pro Monat) gerundet auf 2 Stellen Math.Round(((Math.Round((double.Parse(tbxAnKaWo.Text) * Math.Round((PrUn / 100), 2)), 2) / 7) * 30.416), 2) // Math.Round((double.Parse(tbxAnKaWo.Text) * Math.Round((PrUn / 100), 2) * 30.416), 2) + " € pro Monat und ganze " + // CALC: Ersparnis pro Jahr: Anz. d. Tassen pro Woche / 7 (Ersparnis pro Tag) * 365,25 (durchschnittliche Tagesanzahl pro Jahr) gerundet auf 2 Stellen Math.Round(((Math.Round((double.Parse(tbxAnKaWo.Text) * Math.Round((PrUn / 100), 2)), 2) / 7) * 365.25), 2) //Math.Round((double.Parse(tbxAnKaWo.Text) * Math.Round((PrUn / 100), 2) * 365.25), 2) + " € im Jahr!!" + nl + "Es erklärt sich also von selbst, dass der Kaffeevollautomat bei einem Preis von satten " + tbxPrKaAu.Text + ",00 € bereits nach " + //CALC: Wochen die zum Abbezahlen nötig sind: (Preis der Automats / Ersparnis pro Tag) / 7 Math.Round(((double.Parse(tbxPrKaAu.Text) / Math.Round(((Math.Round((double.Parse(tbxAnKaWo.Text) * Math.Round((PrUn / 100), 2)), 2) / 7)), 2)) / 7), 1) + " Wochen abbezahlt ist!" + nl + "Danach sparst du bei jeder Tasse wirklich die " + Math.Round((PrUn / 100), 2) + " €."; gbxStatistik.Visible = true; } else if (pon == "negative") { negativeErr(); } } void resetToolStripMenuItem_Click(object sender, EventArgs e) { initReset(true, true); } void btnReset_Click(object sender, EventArgs e) { initReset(true, true); } private void aboutToolStripMenuItem_Click(object sender, EventArgs e) { Form2 About = new Form2(); About.Show(); } private void beendenToolStripMenuItem_Click(object sender, EventArgs e) { Application.Exit(); } void initReset (bool elems,bool vars) { if (elems==true) resetElements(); if (vars==true) resetVars(); } void resetElements() { tbxMeKaBo.Text = tbxPrKaAu.Text = tbxPrKaAu.Text = tbxPrKaBo.Text = tbxPrTaKa.Text = tbxPrUn.Text = tbxAnKaWo.Text = ""; cbxPrAlKa.ResetText(); gbxStatistik.Visible = false; tbxPrKaAu.Focus(); } void resetVars() { PrUn=PrKa=PrAlKa=MaxKaBo=KaAuBezWo=0; DuVeKaBo = 20; } }
Ich denke nicht, dass es eine ausgebaute Version 2 des Programms geben wird aber trotzdem; Kritik, Verbesserungsvorschläge, Ausbauvorschläge, Spam und puren Stuss, einfach Kommentar schreiben.
PS: Was haltet ihr von meiner neuen „Code anzeigen“ Methode? Ich dachte mir so bleibt die Übersichtlichkeit meines Blogs unverändert und ich kann trotzdem lange Codeschnipsel präsentieren. Ob und wenn ja wie der Code dann allerdings im RSS Reader erscheint weiß ich noch nicht. Werden display:none divs im RSS beachtet? Naja mal sehen.