C# Kalenderblatt
-
Noch einfacher? Hm ... nein. Wie wär's denn mit ausführlicher?
-
ich habe noch so einige probleme die nach und nach auftreten. ich hoffe irgendwer hat noch ne idee wie man das verkürzen oder einfacher umsetzten könnte.
[CSharp]
short getAnzahlTageImMonat(int uMonat, int uJahr)
{
// ungült,Jan,Feb,Mrz,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov ,Dez
int arrTageImMonat[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };if (uMonat == 2)
{
// Februar: Schaltjahr unterscheiden
if (istEinSchaltjahr(uJahr))
return 29;
else
return 28;
}[/CSharp]
mfg smokee
-
schmidt-webdesign.net schrieb:
Noch einfacher? Hm ... nein. Wie wär's denn mit ausführlicher?
Hi,
danke für den Link ich habe den Link mal überflogen sieht gut aus.
mfg smokee
-
[quote="Smokee"]ich habe noch so einige probleme die nach und nach auftreten. ich hoffe irgendwer hat noch ne idee wie man das verkürzen oder einfacher umsetzten könnte...[/CSharp]
Bitte sinnvoll einrücken, erleichtert es uns zu lesen.
Ich bin kein Fan von "0=Ungültig"-Arrays aber greifen wir es mal auf (wobei du dann eigentlich auch Werte größer 12 abfangen müsstest):
// Warum short zurückgeben, aber mit einem int-Array arbeiten? // (ich habe es mal auf int umgestellt) int getAnzahlTageImMonat(int monat, int jahr) { // ungült,Jan,Feb,Mrz,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez int tageImMonat[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if((monat == 2) && istEinSchaltjahr(uJahr)) return 29; return tageImMonat[monat]; }
-
Guten Morgen,
danke schön für deine Hilfe.
Habe den Quellcode jetzt noch einmal überarbeitet
short getWochentag(int uTag,int uMonat,int uJahr) { // ungült Jan Feb Mrz Apr Mai Jun Jul Aug Sep Okt Nov Dez BYTE arrMonatsOffset[13] = [b]{ 0, 1, 4, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5};[/b] BYTE cbJahrhundertOffset = 0; [b]_ASSERT[/b](uTag > 0); [b]_ASSERT[/b](uTag <= 31); [b]_ASSERT[/b](uMonat > 0); [b]_ASSERT[/b](uMonat <= 12); [b]_ASSERT[/b](uJahr >= 1600);
Bei den Sachen die ich Größer gemacht habe sind die Fehler. Ich hab es schon gegoogelt, aber ich finde nichts wirklich hilfreiches was ich newbie auch verstehe
Hoffe ihr könnt mir wieder einmal helfen. Hab irgendwie nen Brett vorm Kopf xDMfg Smokee
-
Was genau ist da das Problem und wo/wie hast du eigentlich BYTE und _ASSERT() definiert?
-
dot schrieb:
Was genau ist da das Problem und wo/wie hast du eigentlich BYTE und _ASSERT() definiert?
Ich habe ja gesagt Brett vorm Kopf. Manchmal sind die Fehler so simpel.
Danke
Mfg Smokee
-
Smokee schrieb:
Guten Morgen,
danke schön für deine Hilfe.
Habe den Quellcode jetzt noch einmal überarbeitet
short getWochentag(int uTag,int uMonat,int uJahr) { // ungült Jan Feb Mrz Apr Mai Jun Jul Aug Sep Okt Nov Dez BYTE arrMonatsOffset[13] = [b]{ 0, 1, 4, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5};[/b] BYTE cbJahrhundertOffset = 0; [b]_ASSERT[/b](uTag > 0); [b]_ASSERT[/b](uTag <= 31); [b]_ASSERT[/b](uMonat > 0); [b]_ASSERT[/b](uMonat <= 12); [b]_ASSERT[/b](uJahr >= 1600);
Bei den Sachen die ich Größer gemacht habe sind die Fehler. Ich hab es schon gegoogelt, aber ich finde nichts wirklich hilfreiches was ich newbie auch verstehe
Hoffe ihr könnt mir wieder einmal helfen. Hab irgendwie nen Brett vorm Kopf xDMfg Smokee
Also eigentlich ist das Problem das "_ASSERT" und "BYTE" nicht defeniert wurden was ich aber leider nicht raffe, weil wenn ich es defeniere bzw deklariere. dann kommt genau der selbe fehler wie wenn ich es nicht deklariere. hoffe irgendwer steigt noch hier durch
Mfg Smokee
-
Smokee schrieb:
[...] weil wenn ich es defeniere bzw deklariere. dann kommt genau der selbe fehler wie wenn ich es nicht deklariere.
Verrat uns vielleicht auch mal was genau das für ein Fehler ist
-
dot schrieb:
Smokee schrieb:
[...] weil wenn ich es defeniere bzw deklariere. dann kommt genau der selbe fehler wie wenn ich es nicht deklariere.
Verrat uns vielleicht auch mal was genau das für ein Fehler ist
short getWochentag(int uTag,int uMonat,int uJahr) { int _ASSERT; int Byte; // ungült Jan Feb Mrz Apr Mai Jun Jul Aug Sep Okt Nov Dez BYTE arrMonatsOffset[13] = [b]{0, 1, 4, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5}[/b]; //Bei den Zahlen will VS anstatt den Komma, ein Semikolon. Aber wenn ich ein //Semikolon setzte dann sagt er mir trotzdem noch das er eins haben will. BYTE cbJahrhundertOffset = 0; [b]_ASSERT[/b](uTag >) 0; //Hierbei sagt er dass die Variable "_ASSERT" wie eine Methode verwendet wird _ASSERT(uTag [b]<[/b]= [i][b]31)[/b][/i]; _ASSERT(uMonat [b]>[/b] [i][b]0)[/b][/i]; _ASSERT(uMonat [b]<=[/b] [i][b]12)[/b][/i]; _ASSERT(uJahr [b]>=[/b] [i][b]1600)[/b][/i]; //Bei den Zahlen will VS anstatt den Komma, ein Semikolon. Aber wenn ich ein //Semikolon setzte dann sagt er mir trotzdem noch das er eins haben will.
Hoffe das ich es einigermaßen verständlich beschrieben habe.
Mfg Smokee
-
Was genau versprichst du dir davon zwei Variablen mit Namen Byte und _ASSERT zu definieren!?
Dass er sich danach wegen irgendwas aufregt ist auch klar. C# ist eben nicht C++, das sollte wenn dann eher so aussehen:int[] arrMonatsOffset = new int[]{0, 1, 4, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5};
Und da _ASSERT eine Variable ist kannst du es natürlich nicht wie eine Funktion aufrufen, das macht so alles absolut keinen Sinn, was sollte da deiner Meinung nach passieren!?
Wenn du schon ein assert willst dann verwend doch das im .NET Framework eingebaute und statt diesem BYTE Kram (wie auch immer du drauf kommst) verwend doch einfach int und fertig!? Vielleicht solltest du dir auch einmal das zu Gemüte führen und dir ins Bewusstsein rufen dass C# case sensitive ist.
-
So danke für eure Hilfe, wenn ich den Quellcode soweit fertig habe und es läuft kann ich ja auszüge daraus nochmal posten. vielleicht werden dann fragen von neulingen wie mir gleich gelöst ^^.
schönen abend bzw mittag noch.
mfg jan
-
Smokee schrieb:
So danke für eure Hilfe, wenn ich den Quellcode soweit fertig habe und es läuft kann ich ja auszüge daraus nochmal posten. vielleicht werden dann fragen von neulingen wie mir gleich gelöst ^^.
schönen abend bzw mittag noch.
mfg jan
hallo zusammen,
ich habe nun endlich geschafft "mein" kalenderblatt zu programmieren und es funtkioniert auch soweit ganz gut. nur mein problem jetzt ist es, das nach erstellen eines kalenderblattes nachgefragt werden soll ob das programm beendet oder ein neues kalenderblatt erstellt werden soll. ich würde das in eine while schleife packen die ungfähr so aussehen würde.
bool exit false while (exit) { Programmcode vom Kalender } Console.Readline(); if (a=exit) exit false;
wäre nun die frage wie genau ich das machen muss um den Kalender immer und immer wieder aufrufen zu können bis ich sage per befehl das er das beenden soll.
hoffe mir können wieder einige helfen.
:xmas1: Fröhliche Weihnachten :xmas1: und einen guten Rutsch schon mal vorweg ^^
Smokee
-
Wünsch dir ein C# Buch zu Weihnachten ^^
-
David W schrieb:
Wünsch dir ein C# Buch zu Weihnachten ^^
Muss wirklich sagen ein sehr guter Beitrag zum Thema.
Leider ist der Wunschzettel schon abgeschickt.
Spass bei seite.
Wäre echt nett wenn ihr mir Lösungsansätze gebt oder mir meine Fehler erklärt.
-
Smokee schrieb:
bool exit false while (exit) { Programmcode vom Kalender } Console.Readline(); if (a=exit) exit false;
Hast du schon gemacht
Gruss Sheldor
-
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