C# Kalenderblatt
-
Hallo ihr,
ich habe die "Wiederholungsschleife" eingebaut und schon tritt ein neues Problem auf und zwar mach ich ganz zu anfang diese Eingabe:
Console.WriteLine("Bitte geben Sie das Jahr ein: ", jahr); jahr = Convert.ToInt16(Console.ReadLine()); Console.WriteLine("Bitte geben Sie den Monat ein: ", monat); monat = Convert.ToInt16(Console.ReadLine()); if (jahr >= 1 && jahr <= 3000 && monat >= 1 && monat <= 12)
Ich habe nun am ende des Programmes gesagt wenn die Eingabe nicht zwischen 1 und 12 ist, dann soll er schreiben das ein falsches Jahr oder Monat eingegeben wurde.
Console.WriteLine("Sie haben ein falsches jahr oder einen falschen Monat eingegeben");
Soweit so gut.
Mein Anliegen ist es wenn ich zum Beispiel als Monat die 13 eingebe und er sagt das es eine falsche Eingabe ist, einfach die Abfrage solange wiederholt bis die Eingabe stimmt.
Frohe Weihnachten wünscht euch Smokee :xmas1:
-
Du solltest die Eingabe erst als String holen und dann mit int.TryParse schauen ob es überhaupt eine Zahl ist. Wenn ich "hutzlblutz" eingebe fliegt dir die Applikation um die Ohren.
Zudem sollte in der Eingabeaufforderung bescheid gegeben werden das eine Zahl erwartet wird, könnte ja "January" bzw "Januar" eingeben wollen.
eine "Eingabeschleife" könnte ich mir so vorstellen
//Pseudocode public int GetMonth() { var isValid = false; var result = 0; do { Console.WriteLine("Please give the month number: "); var input = Console.ReadLine(); if (!int.TryParse(input, out result)) { Console.WriteLine(string.Format("\"{0}\" is not a number, please retry", input); isValid = false; } else if (result < 1 || result > 12) { Console.WriteLine(string.Format("\"{0}\" is not a valid month number, please retry", result); isValid = false; } else isValid = true; } while (!isValid) }
Das selbe dann fürs Jahr.
Und da man keine Code Duplikation haben möchte kann man es refactoren:public int GetNumber(string message, int min, int max) { var isValid = false; var result = 0; do { Console.WriteLine(message); var input = Console.ReadLine(); if (!int.TryParse(input, out result)) { Console.WriteLine(string.Format("\"{0}\" is not a number, please retry", input); isValid = false; } else if (result < min || result > max) { Console.WriteLine(string.Format("\"{0}\" is not in the allowed range, please retry", result); isValid = false; } else isValid = true; } while (!isValid) }
schon kannst du es fürs Jahr und für den Monat nehmen
var year = GetNumber("Please give the year: ", 1980, 2040);
var month = GetNumber("Please give the month number: ", 1, 12);Am ende Bietet sich in der Do-While noch eine "Exit" Funktionalität an oder ein "Maximum Retry".
//Alles hier im Forum getippt, muss nicht korrekt sein oder funktionieren.
//Edit: Blöde fehler im Code
-
Hallo zusammen,
hoffe ihr hattet alle schöne Weihnachten.
So ich habe jetzt soweit den Kalender fertig und poste hier jetzt mal den Quellcode, zumindest in teilen. Vielleicht gibts ja noch verbesserungsvorschläge.
Den Quellcode habe ich wieder rausgenommen, da ich nicht möchte das dieser einfach nur kopiert wird. Wer dennoch den Quellcode haben möchte einfach eine PN an mich und ich schicken zu.
Mit freundlichen Grüssen
Smokee
-
Hast du meinen Beitrag gelesen? Entschuldige wenn ich es so sagen muss, dein Code ist gruselig und auch sehr gefährlich.
Was mir auffällt beim ersten drüber schauen:
01. Du Kommentierst was man im Code direkt sieht -> Redundant, Schlecht.
02. Kein TryParse sondern ein blankes Convert -> Sehr Schlecht, Gefährlich.
03. Kein Hinweis für den Nutzer das der Monat als Zahl erwartet wird -> Unschön.
04. Keine Aufteilung, alle Funktionalität in der Main Methode -> Unsauber und schwer zu maintainen -> Sehr Schlecht, Gefährlich.
05. Variablen auf Deutsch -> Unschön.
06. Variablen weit außerhalb definiert wo sie verwendet werden und auch noch mehrfache Verwendung -> Unsauber, Gefährlich.
07. Ein unnötiger Scope -> Unsauber.
08. Console.Clear direkt nach WriteLine? -> Sinn?
09. Dein Kommentar "So wie oben geht das noch für alle anderen Wochentage" lässt darauf schließen das du noch Tonnen an doppelten Code hast und zudem die Main Methoden dadurch noch um ein paar Kilometer verlängert hast -> Unsauber, Unschön, Gefährlich
-
So um den Code zu vervollständigen hier die Berechnungen für die Wochentage.
Das Gleiche auch hier
Falls hier einer weis wie ich das verkürzen kann, bitte tipps
Und danke für die Tipps die ich schon bekommen habe, werde ich schnellst möglichst umsetzen.
Mit freundlichen Grüssen
Smokee
-
Also,
im Prinzip hat dir David ja schon alles gesagt, dein Problem ist schon längst gelöst. Schmeiss deinen Rotz da weg und mach ausnahmsweise mal copy & paste.
Zu deinem Code kann ich nur sagen: Du hast eine endliche Zahl an Bedingungen, das ist grausam. Um eine Zahlenreihe abzuprüfen, verwende doch bitte den Modulo-Operator. Mit ihm kannst du eine Bedingung vormulieren, mit der schonmal 20000 Zeilen code wegfallen.
Darüber hinaus ist dein Code nicht wartbar. In 2 Wochen weisst du nicht mehr was du gemacht hast. Sagen wir es kommt mal ein 8. Tag hinzu. Dann hast du 500% deiner Entwicklungszeit zu veranschlagen, um diese Änderung da einzubauen. Unter Gesichtspunkten einer Projektplanung ist dieser Code unzumutbar und einfach ein Griff in die Kloschüssel. Sry.
Guck oben im Thread, da steht alles was du wissen musst. Und ansonsten: Überleg dir erstmal ein ordentliches Design.
Grüße Fluxy
-
Dank dir. Ich wollte nur veranschaulichen was ich so als erst Entwurf zusammen geschrieben habe.
Naja ich werde mich mal dran setzten und versuchen auf so 100 Zeilen zukommen.
Mfg Smokee
-
Hallo,
ich habe nun den Kalender auf 150 zeilen zusammengeschrumpft. Erstmal ^^
Nun zu meinem kleinen ziwschen Problem und zwar muss ich falsche Eingaben wie zum Beispiel Buchstaben oder Sonderzeichen abfangen und den Benutzer darauf hinweisen, danach dann halt nochmal die Abfrage für den Monat und das Jahr. Und das solange bis die Eingaben stimmen, beziehungsweise die Eingabe für den Monat zwischen 1 und 12 liegt und die Eingabe für das Jahr nicht 3000 überschreitet.
also müsste das meiner ansicht so anfangen
while (monat != 1 bis 12)
dann geb aus das eingabe flasche
wenn doch dann weiter
und die nächste schleife oder kann man die ganzen sachen auch in
einer großen schleife abfragen??
Hoffe das verstehen alle und für alle anderen schuldigt bitte wenn ich mich nicht klar ausdrücken konnte.
Mit freundlichen Grüssen
Smokee
-
David W schrieb:
02. Kein TryParse sondern ein blankes Convert -> Sehr Schlecht, Gefährlich.
03. Kein Hinweis für den Nutzer das der Monat als Zahl erwartet wird -> Unschön.
-
O.o schrieb:
David W schrieb:
02. Kein TryParse sondern ein blankes Convert -> Sehr Schlecht, Gefährlich.
03. Kein Hinweis für den Nutzer das der Monat als Zahl erwartet wird -> Unschön.was wolltest du mir jetzt damit sagen?!?!
mfg smokee
-
Hast du dir überhaupt einmal angeschaut was TryParse macht?
http://msdn.microsoft.com/en-us/library/f02979c7.aspx
TryParse wandelt einen String in einen entsprechenden Zahltyp um (sinnvollerweise int). Nebenbei wirft die Methode, sozusagen als Nebenprodukt auch noch ab, ob die Konvertierung überhaupt erfolgreich war. Sprich ob sich nur Ziffern (+- gehören bei Integern auch zu den erlaubten Zeichen) im String befunden haben oder ob auch andere Zeichen dabei waren, die dort nicht hingehören.
Außerdem ist es natürlich sinnvoll dem User gleich zu sagen, dass er nur Zahlen eingeben darf, vielleicht hast du das ja aber auch schon übernommen.
-
O.o schrieb:
Hast du dir überhaupt einmal angeschaut was TryParse macht?
http://msdn.microsoft.com/en-us/library/f02979c7.aspx
TryParse wandelt einen String in einen entsprechenden Zahltyp um (sinnvollerweise int). Nebenbei wirft die Methode, sozusagen als Nebenprodukt auch noch ab, ob die Konvertierung überhaupt erfolgreich war. Sprich ob sich nur Ziffern (+- gehören bei Integern auch zu den erlaubten Zeichen) im String befunden haben oder ob auch andere Zeichen dabei waren, die dort nicht hingehören.
Außerdem ist es natürlich sinnvoll dem User gleich zu sagen, dass er nur Zahlen eingeben darf, vielleicht hast du das ja aber auch schon übernommen.
Hallo,
also mit TryParse habe ich mich noch nicht wirklich beschäftigt und ich muss ehrlich gestehen ich hab es total überlesen (sehe momentan den wald vor lauter bäumen nicht) aber probiere ich natürlich gleich mal aus^^.
Mfg Smokee
-
Ein Beispielcode wie man es schreiben könnte hatte ich dir auch schon gegeben, Seite 4, 2. Beitrag von oben
-
Hallo,
ich bin am Sonntag nun endlich fertig geworden. Vielleicht ist es nicht schön und übersichtlich gehalten, aber passt schon.
So nun wollte ich noch gerne eventuell Feiertage wie Ostern, Pfingsten, Weihnachten und Silvester kennzeichnen.Die Berechnung habe ich auch noch irgendwo rumgeistern, aber wie gesagt wie kann ich bestimmte Tage zum beispiel anders Farbig hinterlegen?
Mfg Smokee
-
Smokee schrieb:
Hallo,
ich bin am Sonntag nun endlich fertig geworden. Vielleicht ist es nicht schön und übersichtlich gehalten, aber passt schon.
So nun wollte ich noch gerne eventuell Feiertage wie Ostern, Pfingsten, Weihnachten und Silvester kennzeichnen.Feiertagsberechnung an die Suchmaschine verfüttert, liefert beispielsweise dies. Ausführlicher ist das Verfahren aber hier beschrieben: http://de.wikipedia.org/wiki/Gaußsche_Osterformel
Smokee schrieb:
Die Berechnung habe ich auch noch irgendwo rumgeistern, aber wie gesagt wie kann ich bestimmte Tage zum beispiel anders Farbig hinterlegen?
Da wird SetConsoleTextAttribute bestimmt dein Freund ...
-
Danke für deine schnelle Antwort. Ich werd mal schauen ob ich das damit irgendwie noch in meinen Kalender rein bringen kann.
Mfg Smokee
-
-
schmidt-webdesign.net schrieb:
Da wird SetConsoleTextAttribute bestimmt dein Freund ...
Hallo,
ich bin gerade dabei bzw war es bestimmte Sachen im Kalender farbig zu machen wie zum Beispiel die Überschrift
Console.WriteLine("\n{0,15}Hier das Kalenderblatt aus folgendem Monat und Jahr");
So weit so gut.
Wenn ich das weiter richtig verstanden habe muss ich eine zweite "Class" zu dem bestehenden Projekt hinzufügen um die Textabschnitte farbig zu hinterlegen.
Dies habe ich auch gemacht. Wie bei deinem Link zu Microsoft beschrieben. Allerdings scheitert die ganze sache daran, das ich nicht aus meinem Programm auf die zweite Class zugreifen kann wie bei Mircosoft im nächsten Schritt beschrieben.Mg Smokee
-
Hi zusammen,
so das mit Farbe und so funktioniert jetzt einigermassen.
Nun zu meinem weiteren Vorhaben. Ich möchte Funktionen oder Teile des Quellcodes auslagern z.B.: die Berechnungen der Wochentage. Dafür lege ich eine Klasse an und schreibe dort die Berechnungen für die Wochentage rein. Nun zu meiner Frage:
Ich versuche die Klasse in dem Hauptprogramm abzurufen, aber es funktioniert nicht. Es kommt folgende Fehlermeldung:
"ConsolenApplication3.schoen" ist ein(e) "Typ", wird aber wie ein(e) "Variable" verwendet.
Hier jetzt noch der ausschnitt aus dem Programmcode wo ich die Klasse abrufen möchte:
Die Klasse:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication3 { public class schoen { static void schoen() { int i; Console.WriteLine("\n"); for (i = 0; i <= 25; i++) //Wenn "i" gleich 0 und "i" kleiner gleich 25, dann soll "i" einen dazu zählen // So wie bei diesem Beispiel habe ich das auch für die anderen gleichen "Schönheitsformatierungen" gemacht Console.Write("-+-"); //Dient zur Verschönerung des Kalenders ;) Console.WriteLine("\n"); } } }
Hier das Hauptprogramm (nur einen Auszug):
using System; namespace ConsoleApplication3 { class Program { public class schoen1 { static void Main(string[] args) { //Hier werden die Variablen deklariert int jahr; int monat; int tage; int zähler; string abbruch; bool exit = true; Console.WriteLine("Herzlich Willkommen."); //Hier ist die Anleitung zu dem Kalender, was man alles beachten muss Console.WriteLine("Hier erhalten Sie eine kleine Einweisung in den Kalender.\n\nFolgende Sachen sind zubeachten:\n\n *Der Monat und das Jahr sind als Zahlen einzugeben.\n\n *Desweiteren ist der Kalender fortlaufend aufrufbar bis man am Ende\n\n des jeweiligen Monats *ende* eingibt. "); schoen();//Verschönerung der Ausgabe Console.WriteLine("\nDrücken Sie bitte Enter um fortzufahren."); //Die Aufforderung zum Kalender bedienen Console.ReadKey(); Console.Clear(); //Löscht das Konsolenfenster so das es gleich weiter geht mit der Eingabe für den Kalender //..........
Hoffe ich konnte mich eingermassen verständlich ausgedrückt.
Mfg Smokee
-
1. Du musst die Methode "schoen()" public machen.
2. Du musst die Methode "schoen()" über seine Klasse "schoen" ansprechenschoen.schoen();
3. Du musst dir ein Grundlagenbuch besorgen