暫無描述

akapralov 4e30361100 lab 8 月之前
kapralov9 4e30361100 lab 8 月之前
kapralov9.sln 4e30361100 lab 8 月之前
readme.md 4e30361100 lab 8 月之前

readme.md

Работа с данными типа: множество, дата, кортежи.

Индивидуальное задание номер 12 "100!-2^100"

class Program
{
    static void Main()
    {
        // Вычисление 100!
        BigInteger factorial = Factorial(100);

        // Вычисление 2^100
        BigInteger powerOf2 = BigInteger.Pow(2, 100);

        // Вычисление разности
        BigInteger result = factorial - powerOf2;

        Console.WriteLine(result);
    }

    // Метод для вычисления факториала
    static BigInteger Factorial(int n)
    {
        if (n == 0 || n == 1)
        {
            return 1;
        }
        else
        {
            return n * Factorial(n - 1);
        }
    }
}

Общие задания с датами.

1. Ввести с консоли строку в формате ДД.ММ.ГГГГ. Проверьте является ли введенная строка валидной датой.

Console.WriteLine("Введите дату: ");
string date1 = Console.ReadLine();
DateTime date;
if (DateTime.TryParse(date1, out date))
{
    Console.WriteLine("Введённая дата соответствует валидной дате. ");
}
else
{
    Console.WriteLine("Введённая дата не соответствует валидной дате. ");
}

2. Найти количество дней между двумя датами.

DateTime date1 = new DateTime(2025, 10, 20);
DateTime date2 = new DateTime(2024, 9, 30);

TimeSpan difference = date1 - date2;

int s = difference.Days;

Console.WriteLine("Разница между датами в днях: " + s);

3. Найти количество часов между двумя датами.

DateTime date1 = new DateTime(2015, 7, 20, 18, 30, 25);
DateTime date2 = new DateTime(2010, 5, 10, 13, 25, 45);
TimeSpan difference = date1 - date2;

int s = difference.Hours;

Console.WriteLine("Разность между двумя датами в часах: " + s);

4. Найти количество минут между двумя датами.

DateTime date1 = new DateTime(1998, 6, 9, 15, 45, 4);
DateTime date2 = new DateTime(1961, 2, 1, 13, 13, 5);
TimeSpan difference = date1 - date2;

int s = difference.Minutes;

Console.WriteLine("Разность между двумя датами в минутах: " + s);

5. Найти "день программиста" (256-й день в году) для указанного года (ввести с консоли). Вывести дату и день недели.

Console.Write("Введите год: ");
int year = Convert.ToInt16(Console.ReadLine());
DateTime date1 = new DateTime(year, 1, 1).AddDays(255);
Console.WriteLine("День программиста: " + date1.ToShortDateString() + " (" + date1.DayOfWeek + ")");

6. Известен номер n некоторого дня года (1 ≤ n ≤ 365). Определить номер и название дня недели, на который

  выпадает данный день года.
Console.Write("Введите номер дня в году: ");
int n = int.Parse(Console.ReadLine());
DateTime date = new DateTime(DateTime.Now.Year, 1, 1).AddDays(n - 1);
Console.WriteLine("День недели: " + date.DayOfWeek + ", номер дня в году: " + date.DayOfYear);

7. Задана дата экзамена. С клавиатуры надо вводить другую дату, в случае, если дата раньше даты экзамена, вывести "осталось n дней", если уже прошел экзамен "прошло n дней", и если экзамен сегодня "сегодня экзамен!"

Console.Write("Введите дату: ");
DateTime date = new DateTime(2024,4, 30);
DateTime date1 = DateTime.Parse(Console.ReadLine());
if (date > date1)
{
    TimeSpan difference = date - date1;
    int s = difference.Days;
    Console.WriteLine("Осталось " + s + " дней до экзамена.");
}

else if (date < date1)
{
    TimeSpan difference = date1 - date;
    int s = difference.Days;
    Console.WriteLine("Прошло " + s + " дней от экзамена.");
}

else
{
    Console.WriteLine("Сегодня экзамен!");
}

8. Вывести дату в формате ДД.ММ.ГГГГ для "завтра"

Console.Write("Введите дату: ");
DateTime date1 = DateTime.Parse(Console.ReadLine());
date1 = date1.AddDays(1);
Console.WriteLine("Завтра будет дата: " + date1.ToString("dd.MM.yyyy"));

9. Задан день и месяц рождения в формате dd.mm. Определите, сколько дней осталось/прошло с дня рождения. Если сегодня - день рождения, то вывести поздравление.

Console.Write("Введите день и месяц рождения: ");
DateTime date1 = DateTime.ParseExact(Console.ReadLine(), "dd.MM", null);
DateTime date2 = DateTime.ParseExact(Console.ReadLine(), "dd.MM", null);
if (date1 > date2)
{
    TimeSpan difference = date1 - date2;
    int s = difference.Days;
    Console.WriteLine("Осталось " + s + " до дня рождения.");
}
else if (date1 < date2)
{
    TimeSpan difference = date2 - date1;
    int s = difference.Days;
    Console.WriteLine("Прошло " + s + " дней со дня рождения.");
}
else
{
    Console.WriteLine("Сегодня день рождения!");
}

10. Часы показывают время в формате hh:mm:ss. Определите количество секунд, которое прошло с начала суток.

List<DateTime> Dates = new List<DateTime>
{
    new DateTime(2017, 12,1),
    new DateTime(2018,1,2),
    new DateTime(2019,2,3),
    new DateTime(2020,3,4),
    new DateTime(2021,4,5),
    new DateTime(2022,5,6),
    new DateTime(2023,6,22),
    new DateTime(2023,12,31)
};

DateTime today = DateTime.Today;
DateTime date1 = Dates[0];
TimeSpan date2 = today - date1;

foreach (DateTime date in Dates)
{
    TimeSpan difference = today - date;
    if (Math.Abs(difference.Days) < Math.Abs(date2.Days))
    {
        date2 = difference;
        date1 = date;
    }
}

Console.WriteLine("Ближайшая дата: " + date1.ToShortDateString());

11. Задан неупорядоченный список дат в формате ДД.ММ.ГГГГ, найти ближайшую (к сегодняшнему дню) дату из списка.

List<DateTime> Dates = new List<DateTime>
{
    new DateTime(2017, 12,1),
    new DateTime(2018,1,2),
    new DateTime(2019,2,3),
    new DateTime(2020,3,4),
    new DateTime(2021,4,5),
    new DateTime(2022,5,6),
    new DateTime(2023,6,22),
    new DateTime(2023,12,31)
};

DateTime today = DateTime.Today;
DateTime date1 = Dates[0];
TimeSpan date2 = today - date1;

foreach (DateTime date in Dates)
{
    TimeSpan difference = today - date;
    if (Math.Abs(difference.Days) < Math.Abs(date2.Days))
    {
        date2 = difference;
        date1 = date;
    }
}

Console.WriteLine("Ближайшая дата: " + date1.ToShortDateString());

12. Задан неупорядоченный список дней рождений в формате ДД.ММ.ГГГГ. Вывести упорядоченный список месяцев с количеством дней рождений в этом месяце.

List<DateTime> Dates = new List<DateTime>
{
    new DateTime(1980, 4, 15),
    new DateTime(2022, 9, 22),
    new DateTime(2023, 1, 8),
    new DateTime(2000, 12, 31)
};
DateTime date1 = GetNearestDate(Dates);
Console.WriteLine($"Ближайшая дата рождения: {date1:dd.MM.yyyy}");

static DateTime GetNearestDate(List<DateTime> dates)
{
    DateTime today = DateTime.Today;
    dates.Sort((d1, d2) => Math.Abs((d1 - today).Days).CompareTo(Math.Abs((d2 - today).Days)));
    return dates[0];
}

13. Поиск наиболее популярного месяца: объявите массив произвольных дат в формате ДД.ММ.ГГГГ. Найдите самый популярный месяц.

string[] Dates = { "15.04.1980", "16.08.2006", "22.12.2023", "19.02.1861", "01.01.2000" };
Dictionary<string, int> month1 = new Dictionary<string, int>();

foreach (var date in Dates)
{
    DateTime date1 = DateTime.ParseExact(date, "dd.MM.yyyy", null);
    string month = date1.ToString("MMMM");

    if (month1.ContainsKey(month))
    {
        month1[month]++;
    }
    else
    {
        month1.Add(month, 1);
    }
}

var popul = month1.Aggregate((l, r) => l.Value > r.Value ? l : r).Key;
Console.WriteLine("Самый популярный месяц: " + popul);

14. Пятница, 13-е. Докажите, что 13-е число месяца чаще всего приходится на пятницу. Напишите программу, которая выводит на экран 7 чисел: вероятности выпадения 13 числа каждого месяца на понедельник, вторник, среду, четверг, пятницу, субботу, воскресенье.

int years1 = 10;
int count1 = 0;
int count2 = 0;
        
for (int year = 1; year <= years1; year++)
{
    for (int month = 1; month <= 12; month++)
    {
        DateTime date1 = new DateTime(year, month, 13);
        if (date1.DayOfWeek == DayOfWeek.Friday)
        {
            count1++;
        }
        count2++;
    }
}

Console.WriteLine("Вероятности выпадения 13 числа каждого месяца на:");
Console.WriteLine("Понедельник: " + (double)CountOfThirteenths(DayOfWeek.Monday) / count2);
Console.WriteLine("Вторник: " + (double)CountOfThirteenths(DayOfWeek.Tuesday) / count2);
Console.WriteLine("Среда: " + (double)CountOfThirteenths(DayOfWeek.Wednesday) / count2);
Console.WriteLine("Четверг: " + (double)CountOfThirteenths(DayOfWeek.Thursday) / count2);
Console.WriteLine("Пятницу: " + (double)count1 / count2);
Console.WriteLine("Субботу: " + (double)CountOfThirteenths(DayOfWeek.Saturday) / count2);
Console.WriteLine("Воскресенье: " + (double)CountOfThirteenths(DayOfWeek.Sunday) / count2);

static int CountOfThirteenths(DayOfWeek day)
{
    int count3 = 0;
    for (int year = 1; year <= 10; year++)
    {
        for (int month = 1; month <= 12; month++)
        {
            DateTime date1 = new DateTime(year, month, 13);
            if (date1.DayOfWeek == day)
            {
                count3++;
            }
        }
    }
    return count3;
}

15. На одном из московских вокзалов билеты продают N касс. Каждая касса работает без перерыва определенный промежуток времени по фиксированному расписанию. Требуется определить, в какой промежуток времени работает наибольшее количество касс. (на входе в программу строка вида 00:00-01:00,00:30-02:30,...)

string wod = "00:00-01:00,00:30-02:30,01:30-03:00,02:00-04:00,02:30-05:00";

string[] schel = wod.Split(',');
int[] time1 = new int[24];

foreach (string schedule in schel)
{
    string[] times = schedule.Split('-');
    string[] startTime = times[0].Split(':');
    string[] endTime = times[1].Split(':');

    int hour1 = int.Parse(startTime[0]);
    int hour2 = int.Parse(endTime[0]);

    for (int i = hour1; i < hour2; i++)
    {
        time1[i]++;
    }
}

int maxTime = 0;
for (int i = 0; i < 24; i++)
{
    if (time1[i] > maxTime)
    {
        maxTime = time1[i];
    }
}

Console.WriteLine("Максимальное количество касс работает в интервале: ");
for (int i = 0; i < 24; i++)
{
    if (time1[i] == maxTime)
    {
        Console.WriteLine("{0:00}:00 - {1:00}:00", i, i + 1);
    }
}

16. Для заданного года посчитайте количество выходных дней в этом году (то есть количество суббот и воскресений).

int years = 2006;
int weeks = CalculateWeekends(years);
Console.WriteLine($"Количество выходных дней в {years} году: {weeks}");

static int CalculateWeekends(int year)
{
    DateTime date1 = new DateTime(year, 1, 1);
    DateTime date2 = new DateTime(year, 12, 31);
    int c = 0;
    for (var date = date1; date <= date2; date = date.AddDays(1))
    {
        if (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday)
        {
            c++;
        }
    }
    return c;
}