C# :: Aufgabe #109
3 Lösungen
BashCal - grafischer Konsolenkalender
Anfänger - C#
von Michi
- 07.09.2015 um 14:34 Uhr
Schreiben Sie ein Programm das einen simplen Kalender grafisch in der Konsole darstellt.
Folgende Befehle mit Parametern sollen zur Verfügung stehen
- cal -m -> bestimmten Monat aus dem aktuellen Jahr anzeigen
- cal -y -> alle Kalender für ausgewähltes Jahr anzeigen
- cal -my -> bestimmten Monat aus bestimmten Jahr anzeigen
Beispiel:
"cal -m 2" zeigt den Kalender Februar des aktuellen Jahres
"cal -y 2013" zeigt alle Monate von Januar bis Dezember des Jahres 2013
"cal -my 2 2011" zeigt den Kalender Februar des Jahres 2011
Im Anhang befindet sich ein Beispiel der möglichen grafischen Ausgabe in der Konsole.
Folgende Befehle mit Parametern sollen zur Verfügung stehen
- cal -m -> bestimmten Monat aus dem aktuellen Jahr anzeigen
- cal -y -> alle Kalender für ausgewähltes Jahr anzeigen
- cal -my -> bestimmten Monat aus bestimmten Jahr anzeigen
Beispiel:
"cal -m 2" zeigt den Kalender Februar des aktuellen Jahres
"cal -y 2013" zeigt alle Monate von Januar bis Dezember des Jahres 2013
"cal -my 2 2011" zeigt den Kalender Februar des Jahres 2011
Im Anhang befindet sich ein Beispiel der möglichen grafischen Ausgabe in der Konsole.
Lösungen:
C#-Code
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Kalender { class Program { static void Main(string[] args) { DateTime aktuellesDatum = DateTime.Today; while (true) { Console.WriteLine("Bitte Befehl eingeben:"); String befehl = Console.ReadLine(); char[] trennzeichen = { ' ' }; String[] BefehlsTeile = befehl.Split(trennzeichen); Console.WriteLine(); //Test ob 3. Teil und optional 4. Teil Zahlen sind try { for (int i = 2; i < BefehlsTeile.Length; i++) { Convert.ToInt32(BefehlsTeile[i]); } } catch { Console.WriteLine("Befehl nicht erkannt\n"); } //Aufschlüsseln des Befehls if (BefehlsTeile[0] == "cal") { switch (BefehlsTeile[1]) { case "-m": if (Convert.ToInt32(BefehlsTeile[2]) < 13 && Convert.ToInt32(BefehlsTeile[2]) > 0) { DateTime monat = new DateTime(aktuellesDatum.Year, Convert.ToInt32(BefehlsTeile[2]), 1); ausgabe(monat); } else { Console.WriteLine("Bitte nur Monate 1 - 12 eingeben.\n"); } break; case "-y": if (Convert.ToInt32(BefehlsTeile[2]) < 10000 && Convert.ToInt32(BefehlsTeile[2]) > 0) { for (int i = 1; i <= 12; i++) { DateTime jahr = new DateTime(Convert.ToInt32(BefehlsTeile[2]), i, 1); ausgabe(jahr); } } else { Console.WriteLine("Bitte nur die Jahre 1 - 9999 eingeben.\n"); } break; case "-my": if (Convert.ToInt32(BefehlsTeile[2]) < 13 && Convert.ToInt32(BefehlsTeile[2]) > 0 && Convert.ToInt32(BefehlsTeile[3]) < 10000 && Convert.ToInt32(BefehlsTeile[3]) > 0) { DateTime monatJahr = new DateTime(Convert.ToInt32(BefehlsTeile[3]), Convert.ToInt32(BefehlsTeile[2]), 1); ausgabe(monatJahr); } else { Console.WriteLine("Bitte nur Monate 1 - 12 und Jahre 1 - 9999 eingeben."); } break; default: Console.WriteLine("Befehl nicht erkannt\n"); break; } } else { Console.WriteLine("Befehl nicht erkannt\n"); } } } public static void ausgabe(DateTime wunschdatum) { String[] Monate = { "Jannuar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember" }; //Ermittlung Monatslänge int monatslaenge = 0; switch (wunschdatum.Month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: monatslaenge = 31; break; case 4: case 6: case 9: case 11: monatslaenge = 30; break; case 2: monatslaenge = 28; if (DateTime.IsLeapYear(wunschdatum.Year)) { monatslaenge++; } break; } //Formattierung Überschriftenzeile int ueberschriftenRestLaenge = 20 - Monate[wunschdatum.Month - 1].Length - 9;//4 Jahr; 1 Leezeichen; 2 -- int pufferLinks = (int)Math.Floor((decimal)ueberschriftenRestLaenge / 2); int pufferRechts = (int)Math.Round((decimal)ueberschriftenRestLaenge / 2); Console.Write("--"); for (int i = 0; i < pufferLinks; i++) { Console.Write(" "); } Console.Write("{0} {1:0000}", Monate[wunschdatum.Month - 1], wunschdatum.Year); for (int i = 0; i < pufferRechts; i++) { Console.Write(" "); } Console.WriteLine("--"); Console.WriteLine("Mo Di Mi Do Fr Sa So"); int Wochentag = 0; //Formattierung des Start-Wochentages switch (Convert.ToString(wunschdatum.DayOfWeek)) { case "Monday": break; case "Tuesday": Console.Write(" "); Wochentag++; goto case "Monday"; case "Wednesday": Console.Write(" "); Wochentag++; goto case "Tuesday"; case "Thursday": Console.Write(" "); Wochentag++; goto case "Wednesday"; case "Friday": Console.Write(" "); Wochentag++; goto case "Thursday"; case "Saturday": Console.Write(" "); Wochentag++; goto case "Friday"; case "Sunday": Console.Write(" "); Wochentag++; goto case "Saturday"; } //Ausgabe der Tage for (int i = 1; i <= monatslaenge; i++) { if (Wochentag == 7) { Console.WriteLine(""); Wochentag = 0; } Console.Write("{0:00} ", i); Wochentag++; } Console.WriteLine("\n"); } } }
C#-Code
using System; using System.Globalization; namespace ConsoleKalendar { class Program { static readonly GregorianCalendar calendar = new GregorianCalendar(); static void Main(string[] args) { Console.WriteLine("-cal m:\t\t\tMonat des aktuellen Jahres ausgeben (Bsp.: -cal m 10)"); Console.WriteLine("-cal y:\t\t\tAlle Monate des Jahres ausgeben (Bsp.: -cal y 2016)"); Console.WriteLine("-cal m y:\t\tMonat des Jahres ausgeben (Bsp.: -cal m y 5 2015)"); Console.WriteLine("-end:\t\t\tProgramm beenden"); int currentYear = DateTime.Now.Year; string input = ""; do { int month; int year; input = Console.ReadLine(); string[] split = input.Split(' '); if (split[0] == "-cal") { if (split.Length == 3 || split.Length == 5) { if (split[1] == "m") { year = currentYear; if (int.TryParse(split[2], out month)) { PrintCalendar(year, month); } else if (split[2] == "y") { if (split.Length == 5) { if (int.TryParse(split[3], out month) && int.TryParse(split[4], out year)) { if (year >= 1 && year <= 9999) { PrintCalendar(year, month); } else { Console.WriteLine("Das Jahr muss zwischen 1 und 9999 liegen"); } } else { Console.WriteLine("Der Monat muss zwischen 1 und 12 liegen\nDas Jahr muss zwischen 1 und 9999 liegen"); } } else { Console.WriteLine("Eingabe fehlerhaft"); } } else { Console.WriteLine("Der Monat muss zwischen 1 und 12 liegen"); } } else if (split[1] == "y") { if (int.TryParse(split[2], out year)) { if (year >= 1 && year <= 9999) { for (int m = 1; m <= 12; m++) { PrintCalendar(year, m); } } else { Console.WriteLine("Das Jahr muss zwischen 1 und 9999 liegen"); } } } } else { Console.WriteLine("Eingabe fehlerhaft"); } } else if (split[0] != "-end") { Console.WriteLine("Der Befehl \"{0}\" wurde nicht gefunden", split[0]); } } while (input != "-end"); } static void PrintCalendar(int year, int month) { int days = calendar.GetDaysInMonth(year, month); string monthName = "\n " + new DateTime(year, month, 1).ToString("MMMM") + " " + year.ToString(); Console.WriteLine(monthName); Console.Write(" "); for (int i = 1; i <= 7; i++) { Console.Write(new DateTime(2016, 2, i).ToString("ddd "));//1 Februar 2016 ist ein Montag } Console.WriteLine(); DayOfWeek firstDay = calendar.GetDayOfWeek(new DateTime(year, month, 1)); if (firstDay != DayOfWeek.Monday) { int whitespaces = (((int)firstDay - 1) < 0 ? 18 : ((int)firstDay - 1) * 3) + 1; Console.Write(new string(' ', whitespaces)); } bool writeLine = false; for (int d = 1; d <= days; d++) { switch (calendar.GetDayOfWeek(new DateTime(year, month, d))) { case DayOfWeek.Monday: writeLine = false; Console.Write(d.ToString().PadLeft(3, ' ') + " "); break; case DayOfWeek.Tuesday: Console.Write(d.ToString().PadLeft(2, ' ') + " "); break; case DayOfWeek.Wednesday: Console.Write(d.ToString().PadLeft(2, ' ') + " "); break; case DayOfWeek.Thursday: Console.Write(d.ToString().PadLeft(2, ' ') + " "); break; case DayOfWeek.Friday: Console.Write(d.ToString().PadLeft(2, ' ') + " "); break; case DayOfWeek.Saturday: Console.Write(d.ToString().PadLeft(2, ' ') + " "); break; case DayOfWeek.Sunday: writeLine = true; Console.WriteLine(d.ToString().PadLeft(2, ' ')); break; } } if (!writeLine) { Console.WriteLine(); } } } }
C#-Code
using System; using static System.Console; //ab c# 6.0 compiler namespace kalender { class Program { private static void instruction() { WriteLine("instructions:"); WriteLine("cal -m\t\tMonat des aktuellen Jahres ausgeben (Bsp.: cal -m 10)"); WriteLine("cal -y\t\tAlle Monate des Jahres ausgeben (Bsp.: cal -y 2000)"); WriteLine("cal -my\t\tMonat des Jahres ausgeben (Bsp.: cal -my 5 2015)"); WriteLine("end\t\tProgramm beenden"); } static void Main() { instruction(); Boolean bo_input_ok = false; while (true) { try { String[] input = null; try { input = ReadLine().Split(new Char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); if (input[0] == "end") break; bo_input_ok = (input[0] == "cal") && (input.Length == 3 || input.Length == 4); } catch { }; if (bo_input_ok) { bo_input_ok = false; int monat = -1, jahr = -1; switch (input.Length) { case 3: { if (input[1] == "-m") bo_input_ok = int.TryParse(input[2], out monat); else if (input[1] == "-y") bo_input_ok = int.TryParse(input[2], out jahr); break; } case 4: {//hier wird Bedingung input[1] == "-my" nicht abgefragt bo_input_ok = int.TryParse(input[2], out monat) && int.TryParse(input[3], out jahr); break; } } if (!bo_input_ok) { WriteLine("error: falsche Eingabe"); instruction(); } else { if (jahr == -1) jahr = DateTime.Now.Year; int start = 1, end = 12; if (monat != -1) { start = monat; end = monat; } for (var i = start; i <= end; i++) WriteLine(Kalender(jahr, i)); } } else {WriteLine("falsche Eingabe"); instruction(); } } catch (Exception e) {WriteLine("falsche Eingabe") /* + e.Message) */; instruction(); } } WriteLine("finished"); ReadKey(); } private static String Kalender(int year, int month) { String[] monate = new String[] { " Januar", " Februar", " Maerz", " April", " Mai", " Juni", " Juli", " August", " September", " Oktober", " November", " Dezember" }; System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.AppendLine(monate[month - 1] + " " + year.ToString()); sb.AppendLine(" Mo Di Mi Do Fr Sa So"); int start = (int)(new DateTime(year, month, 1)).DayOfWeek; int anzahl = DateTime.DaysInMonth(year, month); sb.AppendLine(smonat(start, anzahl)); return sb.ToString(); } private static string smonat(int start, int anzahl) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); for (var i = 0; i < start - 1; i++) sb.Append(" "); int counter = 1; while(counter < anzahl + 1) { sb.Append(counter.format(3)); if ((counter + start - 1) % 7 == 0) sb.AppendLine(); counter++; } return sb.ToString(); } } public static class MyExtensions { public static string format(this int c, int weight) { string result = c.ToString(); int diff = weight - result.Length; for (var i = 0; i < diff; i++) result = " " + result; return result; } } }