Вывод календаря в консоль - C#
Формулировка задачи:
Есть такое задание, обработать строку получаемую от пользователя в виде dd mm yyyy и вывести все в виде красивого календаря.
Первую часть сделал, а вот с выводом проблемы. Вот собственно код:
Help
Листинг программы
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace Calendar
- {
- class chekIt
- {
- public int[] daysOfMonth = new int[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; // Дни в месяцах соответсвенно
- public bool chekOnDayInWeek(int day, int month, int year, bool exit)
- {
- if (day != daysOfMonth[month - 1] && month != 2) //если введен не последний день месяца и месяц не февраль, идем дальше
- {
- return exit = true;
- }
- if (day == daysOfMonth[month - 1]) //если это последний день месяца, проверить совпадение
- {
- return exit = true;
- }
- else if ((month == 2) && (year % 4 == 0) && (day == 29)) // если это последний день февраля високосного года, то все норм
- {
- return exit = true;
- }
- else
- {
- Console.WriteLine("Данные введены не верно, попробуйте ввести снова!"); // иначе, предложить ввести снова
- return exit = false;
- }
- }
- public int output(int day, int month, int year, int week)
- {
- int count = 1;
- Console.WriteLine("ПН\tВТ\tСР\tЧТ\tПТ\tСБ\tВС");
- for (int i = 0; i < 7; i++)
- {
- for (int j = 0; j < 7; j++)
- {
- if (count -1 == daysOfMonth[month - 1])
- {
- break;
- }
- if (count == day)
- {
- Console.Write("[{0}]\t", count);
- count++;
- continue;
- }
- Console.Write(" {0}\t", count);
- count++;
- }
- Console.WriteLine("\n");
- }
- return 0;
- }
- public int dayOfWeek(int day, int month, int year) // просто формула нахождения дня недели по дате
- {
- int a = (14 - month) / 12;
- int y = year - a;
- int m = month + 12 * a - 2;
- return ((7000 + (day + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12)) % 7) + 1;
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- chekIt e = new chekIt();
- string input = " "; //Входные данные
- int day, month, year; //Здесь будут хранится значения приведенные в инт.
- bool chek = false; //Выход из цикла, значит введенные данные верны.
- Console.WriteLine("Введите день, месяц и год искомой даты, разделенный пробелом в формате dd mm yyyy:");
- while (!chek) // Проверяем строку на корректность, если прошли - идем дальше.
- {
- input = Console.ReadLine();
- // Делим строку на 3 числа
- string[] massSplit = input.Split(' ');
- if (massSplit.Length != 3)
- {
- Console.WriteLine("Введены не все данные, или слишком много, повторите ввод в формате dd mm yyyy!");
- continue;
- }
- if (massSplit[0] == "")
- {
- Console.WriteLine("Первый символ не может быть пробелом!");
- continue;
- }
- // Приводим наш инпут в целые числа
- try
- {
- day = Convert.ToInt32(massSplit[0]);
- month = Convert.ToInt32(massSplit[1]);
- year = Convert.ToInt32(massSplit[2]);
- }
- catch
- {
- Console.WriteLine("Введенный символ или символы не являются числами, повторите ввод!");
- continue;
- }
- // Проверяем корректность данных
- if (day <= 0 || day > 31)
- {
- Console.WriteLine("Значение дня может быть числом от 1 до 31, повторите ввод!");
- continue;
- }
- if (month <= 0 || month > 12)
- {
- Console.WriteLine("Значение месяца может быть числом от 1 до 12, повторите ввод!");
- continue;
- }
- if (year < 1600 || year > 2400)
- {
- Console.WriteLine("Значение года может быть числом от 1600 до 2400, повторите ввод!");
- continue;
- }
- chek = e.chekOnDayInWeek(day, month, year, chek);
- if (chek != true)
- {
- continue;
- }
- // Узнаем день недели
- int week = e.dayOfWeek(day, month, year);
- switch (week)
- {
- case 1:
- {
- Console.WriteLine("В этот день воскресенье!");
- break;
- }
- case 2:
- {
- Console.WriteLine("В этот день понедельник!");
- break;
- }
- case 3:
- {
- Console.WriteLine("В этот день вторник!");
- break;
- }
- case 4:
- {
- Console.WriteLine("В этот день среда!");
- break;
- }
- case 5:
- {
- Console.WriteLine("В этот день четверг!");
- break;
- }
- case 6:
- {
- Console.WriteLine("В этот день пятница!");
- break;
- }
- case 7:
- {
- Console.WriteLine("В этот день суббота!");
- break;
- }
- }
- e.output(day, month, year, week);
- int[,] arrDayOfWeek = new int[7, 7];
- for (int i = 0; i < 7; i++ )
- {
- for (int j = 0; j < 7; j++)
- {
- arrDayOfWeek[i,j] = // И вот в этом месте я и не понимаю, что писать.
- }
- }
- }
- Console.ReadKey();
- }
- }
- }
Решение задачи: «Вывод календаря в консоль»
textual
Листинг программы
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- class chek
- {
- public bool check(string d, ref string e)
- {
- int[] daysOfMonth = new int[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
- int D = 0;
- int M = 0;
- int Y = 0;
- int l = d.Length;
- string[] d2 = d.Split(' ');//деим входную строку на подстроки
- if (d2.Length != 3)
- {
- e = "Нужно ввести 3 числа в формате dd mm yyyy";
- return false;
- }
- if (d[0] == ' ')
- {
- e = "первый символ не может быть пробелом!";
- return false;
- }
- if (d2[0].Length > 2 || d2[0].Length == 0)
- {
- e = "неправильно введен день";
- return false;
- }
- if (d2[1].Length > 2 || d2[0].Length == 0)
- {
- e = "неправильно введен месяц";
- return false;
- }
- if (d2[2].Length != 4)
- {
- e = "неправильно введен год";
- return false;
- }
- try
- {
- D = Convert.ToInt32(d2[0]);
- M = Convert.ToInt32(d2[1]);
- Y = Convert.ToInt32(d2[2]);
- }
- catch
- {
- e = "Можно вводить только цифры :)";
- return false;
- }
- //на данный момент мы уже знаем, что нами прочитана корректная строка с тремя целыми значениями
- //теперь надо проверить, корректно ли кол-во дней для данного месяца, кол-во месяцев, кол-во лет
- if (Y < 1600 || Y > 2400)
- {
- e = "год должен быть от 1600 до 2400";
- return false;
- }
- if (M < 1 || M > 12)
- {
- e = "месяц должен быть от одного до 12";
- return false;
- }
- if (D < 1 || D > 31)
- {
- e = "день должен быть от одного до 31";
- return false;
- }
- DateTime dt = new DateTime();
- try
- {
- dt = DateTime.Parse(d);
- return true;
- }
- catch
- {
- e = "В этом месяце не может быть столько дней";
- return false;
- }
- }
- }
- /*функция, проверяющая строку d.
- Если всё норм, возвр. тру, если нет - фолс и заполняет строку e описанием ошибки*/
- namespace Calendar2
- {
- class Program
- {
- static void Main(string[] args)
- {
- int[] daysOfMonth = new int[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
- bool flag = false;
- string error = " ";
- string input = " ";
- chek e = new chek();
- while (flag != true)
- {
- Console.WriteLine("Введите дату в формате dd mm yyyy: ");
- input = Console.ReadLine();
- flag = e.check(input, ref error);
- string[] d2 = input.Split(' '); //деим входную строку на подстроки
- int M = Convert.ToInt32(d2[1]);
- if (flag != true)
- {
- Console.WriteLine(error);
- }
- int chislo = 1;
- DayOfWeek[] d = new DayOfWeek[daysOfMonth[M]];
- d[0] = DayOfWeek.Monday;
- d[1] = DayOfWeek.Tuesday;
- d[2] = DayOfWeek.Wednesday;
- d[3] = DayOfWeek.Thursday;
- d[4] = DayOfWeek.Friday;
- d[5] = DayOfWeek.Saturday;
- d[6] = DayOfWeek.Sunday;
- int a = 0; // ВОТ ТУТ ЧТО-ТО НАЧИНАЕТ ИДТИ НЕ ТАК
- for(int i=0; i < 7; i ++)
- {
- foreach (var x in d)
- {
- if (x == d[i])
- {
- Console.Write(a);
- }
- else
- {
- Console.Write(" ");
- }
- }
- Console.WriteLine();
- }
- }
- Console.ReadLine();
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д