C# :: Aufgabe #109

3 Lösungen Lösungen öffentlich

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.

Lösungen:

vote_ok
von dragonmaster (250 Punkte) - 05.01.2016 um 10:14 Uhr
Quellcode ausblenden 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");
        }
    }
}
vote_ok
von daniel59 (4260 Punkte) - 25.07.2016 um 08:05 Uhr
Quellcode ausblenden 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(); }
        }
    }
}
vote_ok
von hollst (13980 Punkte) - 09.11.2016 um 16:22 Uhr
Quellcode ausblenden 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;
        } 
    }
}