Вывод календаря в консоль - 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();
}
}
}