Практическое руководство. Извлечение дня недели из конкретной даты
Платформа .NET упрощает определение дня недели и отображение локализованного дня для определенной даты. Значение перечисления, которое указывает день недели, соответствующий определенной дате, можно получить из свойства DayOfWeek или DayOfWeek. Напротив, получение названия дня недели — это операция форматирования, которую можно выполнить с помощью метода форматирования, например метода ToString значения даты и времени или метода String.Format. В этой статье показано, как выполнять эти операции форматирования.
Извлечение числа, указывающего день месяца
- Используйте статический DateTime.Parse метод или DateTimeOffset.Parse для преобразования строкового представления даты в DateTime значение или DateTimeOffset .
- Используйте свойство DateTime.DayOfWeek или DateTimeOffset.DayOfWeek для получения значения типа DayOfWeek, которое указывает день недели.
- При необходимости приведите (в C#) или преобразуйте (в Visual Basic) значение DayOfWeek в целочисленный тип.
В следующем примере отображается целое число, представляющее день недели определенной даты:
using System; public class Example < public static void Main() < DateTime dateValue = new DateTime(2008, 6, 11); Console.WriteLine((int) dateValue.DayOfWeek); >> // The example displays the following output: // 3
Module Example Public Sub Main() Dim dateValue As Date = #6/11/2008# Console.WriteLine(dateValue.DayOfWeek) End Sub End Module ' The example displays the following output: ' 3
Извлечение сокращенного названия дня недели
- Используйте статический DateTime.Parse метод или DateTimeOffset.Parse для преобразования строкового представления даты в DateTime значение или DateTimeOffset .
- Вы можете извлечь сокращенное название дня недели для текущих или заданных региональных параметров:
- Чтобы извлечь сокращенное имя дня недели для текущего языка и региональных параметров, вызовите метод или DateTimeOffset.ToString(String) экземпляр значения даты и времени DateTime.ToString(String) и передайте строку ddd в format качестве параметра . В следующем примере показан вызов ToString(String) метода :
using System; public class Example < public static void Main() < DateTime dateValue = new DateTime(2008, 6, 11); Console.WriteLine(dateValue.ToString("ddd")); >> // The example displays the following output: // Wed
Module Example Public Sub Main() Dim dateValue As Date = #6/11/2008# Console.WriteLine(dateValue.ToString("ddd")) End Sub End Module ' The example displays the following output: ' Wed
using System; using System.Globalization; public class Example < public static void Main() < DateTime dateValue = new DateTime(2008, 6, 11); Console.WriteLine(dateValue.ToString("ddd", new CultureInfo("fr-FR"))); >> // The example displays the following output: // mer.
Imports System.Globalization Module Example Public Sub Main() Dim dateValue As Date = #6/11/2008# Console.WriteLine(dateValue.ToString("ddd", New CultureInfo("fr-FR"))) End Sub End Module ' The example displays the following output: ' mer.
Извлечение полного названия дня недели
- Используйте статический DateTime.Parse метод или DateTimeOffset.Parse для преобразования строкового представления даты в DateTime значение или DateTimeOffset .
- Вы можете извлечь полное название дня недели для текущих или заданных региональных параметров:
- Чтобы извлечь имя дня недели для текущего языка и региональных параметров, вызовите метод или DateTimeOffset.ToString(String) экземпляр значения даты и времени DateTime.ToString(String) и передайте строку dddd в format качестве параметра . В следующем примере показан вызов ToString(String) метода :
using System; public class Example < public static void Main() < DateTime dateValue = new DateTime(2008, 6, 11); Console.WriteLine(dateValue.ToString("dddd")); >> // The example displays the following output: // Wednesday
Module Example Public Sub Main() Dim dateValue As Date = #6/11/2008# Console.WriteLine(dateValue.ToString("dddd")) End Sub End Module ' The example displays the following output: ' Wednesday
using System; using System.Globalization; public class Example < public static void Main() < DateTime dateValue = new DateTime(2008, 6, 11); Console.WriteLine(dateValue.ToString("dddd", new CultureInfo("es-ES"))); >> // The example displays the following output: // miércoles.
Imports System.Globalization Module Example Public Sub Main() Dim dateValue As Date = #6/11/2008# Console.WriteLine(dateValue.ToString("dddd", _ New CultureInfo("es-ES"))) End Sub End Module ' The example displays the following output: ' miércoles.
Пример
В следующем примере показаны вызовы DateTime.DayOfWeek свойств и DateTimeOffset.DayOfWeek для получения числа, представляющего день недели для определенной даты. Он также включает вызовы DateTime.ToString методов и DateTimeOffset.ToString для извлечения сокращенного имени дня недели и полного имени дня недели.
using System; using System.Globalization; public class Example < public static void Main() < string dateString = "6/11/2007"; DateTime dateValue; DateTimeOffset dateOffsetValue; try < DateTimeFormatInfo dateTimeFormats; // Convert date representation to a date value dateValue = DateTime.Parse(dateString, CultureInfo.InvariantCulture); dateOffsetValue = new DateTimeOffset(dateValue, TimeZoneInfo.Local.GetUtcOffset(dateValue)); // Convert date representation to a number indicating the day of week Console.WriteLine((int) dateValue.DayOfWeek); Console.WriteLine((int) dateOffsetValue.DayOfWeek); // Display abbreviated weekday name using current culture Console.WriteLine(dateValue.ToString("ddd")); Console.WriteLine(dateOffsetValue.ToString("ddd")); // Display full weekday name using current culture Console.WriteLine(dateValue.ToString("dddd")); Console.WriteLine(dateOffsetValue.ToString("dddd")); // Display abbreviated weekday name for de-DE culture Console.WriteLine(dateValue.ToString("ddd", new CultureInfo("de-DE"))); Console.WriteLine(dateOffsetValue.ToString("ddd", new CultureInfo("de-DE"))); // Display abbreviated weekday name with de-DE DateTimeFormatInfo object dateTimeFormats = new CultureInfo("de-DE").DateTimeFormat; Console.WriteLine(dateValue.ToString("ddd", dateTimeFormats)); Console.WriteLine(dateOffsetValue.ToString("ddd", dateTimeFormats)); // Display full weekday name for fr-FR culture Console.WriteLine(dateValue.ToString("ddd", new CultureInfo("fr-FR"))); Console.WriteLine(dateOffsetValue.ToString("ddd", new CultureInfo("fr-FR"))); // Display abbreviated weekday name with fr-FR DateTimeFormatInfo object dateTimeFormats = new CultureInfo("fr-FR").DateTimeFormat; Console.WriteLine(dateValue.ToString("dddd", dateTimeFormats)); Console.WriteLine(dateOffsetValue.ToString("dddd", dateTimeFormats)); >catch (FormatException) < Console.WriteLine("Unable to convert to a date.", dateString); > > > // The example displays the following output: // 1 // 1 // Mon // Mon // Monday // Monday // Mo // Mo // Mo // Mo // lun. // lun. // lundi // lundi
Imports System.Globalization Module Example Public Sub Main() Dim dateString As String = "6/11/2007" Dim dateValue As Date Dim dateOffsetValue As DateTimeOffset Try Dim dateTimeFormats As DateTimeFormatInfo ' Convert date representation to a date value dateValue = Date.Parse(dateString, CultureInfo.InvariantCulture) dateOffsetValue = New DateTimeOffset(dateValue, _ TimeZoneInfo.Local.GetUtcOffset(dateValue)) ' Convert date representation to a number indicating the day of week Console.WriteLine(dateValue.DayOfWeek) Console.WriteLine(dateOffsetValue.DayOfWeek) ' Display abbreviated weekday name using current culture Console.WriteLine(dateValue.ToString("ddd")) Console.WriteLine(dateOffsetValue.ToString("ddd")) ' Display full weekday name using current culture Console.WriteLine(dateValue.ToString("dddd")) Console.WriteLine(dateOffsetValue.ToString("dddd")) ' Display abbreviated weekday name for de-DE culture Console.WriteLine(dateValue.ToString("ddd", New CultureInfo("de-DE"))) Console.WriteLine(dateOffsetValue.ToString("ddd", _ New CultureInfo("de-DE"))) ' Display abbreviated weekday name with de-DE DateTimeFormatInfo object dateTimeFormats = New CultureInfo("de-DE").DateTimeFormat Console.WriteLine(dateValue.ToString("ddd", dateTimeFormats)) Console.WriteLine(dateOffsetValue.ToString("ddd", dateTimeFormats)) ' Display full weekday name for fr-FR culture Console.WriteLine(dateValue.ToString("ddd", New CultureInfo("fr-FR"))) Console.WriteLine(dateOffsetValue.ToString("ddd", _ New CultureInfo("fr-FR"))) ' Display abbreviated weekday name with fr-FR DateTimeFormatInfo object dateTimeFormats = New CultureInfo("fr-FR").DateTimeFormat Console.WriteLine(dateValue.ToString("dddd", dateTimeFormats)) Console.WriteLine(dateOffsetValue.ToString("dddd", dateTimeFormats)) Catch e As FormatException Console.WriteLine("Unable to convert to a date.", dateString) End Try End Sub End Module ' The example displays the following output to the console: ' 1 ' 1 ' Mon ' Mon ' Monday ' Monday ' Mo ' Mo ' Mo ' Mo ' lun. ' lun. ' lundi ' lundi
Отдельные языки могут предоставлять функции, которые дублируют или дополняют функции, предоставляемые .NET. Например, Visual Basic предоставляет две такие функции:
- Weekday , которая возвращает число, обозначающее день недели для определенной даты. Функция считает порядковое значение первого дня недели равным 1, а свойство DateTime.DayOfWeek — равным 0.
- WeekdayName , которая возвращает название дня недели для текущих региональных параметров, которое соответствует определенному номеру дня недели.
В следующем примере показано использование функций Visual Basic Weekday и WeekdayName :
Imports System.Globalization Imports System.Threading Module Example Public Sub Main() Dim dateValue As Date = #6/11/2008# ' Get weekday number using Visual Basic Weekday function Console.WriteLine(Weekday(dateValue)) ' Displays 4 ' Compare with .NET DateTime.DayOfWeek property Console.WriteLine(dateValue.DayOfWeek) ' Displays 3 ' Get weekday name using Weekday and WeekdayName functions Console.WriteLine(WeekdayName(Weekday(dateValue))) ' Displays Wednesday ' Change culture to de-DE Dim originalCulture As CultureInfo = Thread.CurrentThread.CurrentCulture Thread.CurrentThread.CurrentCulture = New CultureInfo("de-DE") ' Get weekday name using Weekday and WeekdayName functions Console.WriteLine(WeekdayName(Weekday(dateValue))) ' Displays Donnerstag ' Restore original culture Thread.CurrentThread.CurrentCulture = originalCulture End Sub End Module
Вы также можете использовать значение, возвращенное свойством DateTime.DayOfWeek, для получения названия дня недели для определенной даты. Этот процесс требует только вызова ToString метода для значения, DayOfWeek возвращаемого свойством . Однако этот метод не создает локализованное имя дня недели для текущего языка и региональных параметров, как показано в следующем примере:
using System; using System.Globalization; using System.Threading; public class Example < public static void Main() < // Change current culture to fr-FR CultureInfo originalCulture = Thread.CurrentThread.CurrentCulture; Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR"); DateTime dateValue = new DateTime(2008, 6, 11); // Display the DayOfWeek string representation Console.WriteLine(dateValue.DayOfWeek.ToString()); // Restore original current culture Thread.CurrentThread.CurrentCulture = originalCulture; >> // The example displays the following output: // Wednesday
Imports System.Globalization Imports System.Threading Module Example Public Sub Main() ' Change current culture to fr-FR Dim originalCulture As CultureInfo = Thread.CurrentThread.CurrentCulture Thread.CurrentThread.CurrentCulture = New CultureInfo("fr-FR") Dim dateValue As Date = #6/11/2008# ' Display the DayOfWeek string representation Console.WriteLine(dateValue.DayOfWeek.ToString()) ' Restore original current culture Thread.CurrentThread.CurrentCulture = originalCulture End Sub End Module ' The example displays the following output: ' Wednesday
См. также
- Строки стандартных форматов даты и времени
- Строки настраиваемых форматов даты и времени
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Статья C# Как определить день недели по дате?
Из этой статьи вы узнаете, как определять день недели по дате с помощью языка C#.
1. Создадим новое консольное приложение (Console Application).
using System; using System.Text; namespace example < class Program < static void Main(string[] args) < >> >
2. Для определения дня недели воспользуемся классом DateTime.
static void Main(string[] args) < DateTime dt = new DateTime(2014, 11, 1); Console.WriteLine(dt.ToString("dddd")); Console.ReadLine(); //Результат: суббота >
Конструктор класса DateTime принимает 3 параметра: год, месяц и день месяца. Например, в данном примере я хочу узнать, какой день недели будет 1 ноября 2014 года.
Получив объект типа DateTime (dt) определим день недели. Для этого либо воспользуемся свойством DayOfWeek, например:
Console.WriteLine(dt.DayOfWeek); //Результат: Saturday
Либо воспользуемся методом ToString, как например, в данном примере, указав в качестве параметра формат строки вида: “dddd”, который позволяет вывести полное название дня недели.
Если нужно вывести сокращенное название (Пн, Вт, Ср. и т.д.), то в таком случае указываем формат:“ddd”.
Изучаем календарь
Эта статья получилась из вопроса, который я сам себе задал вчера.
«Существует ли год, в котором ни один месяц не начинается в понедельник?»
На первый взгляд — да. Год может начинаться с любого дня недели, месяцы тоже каждый раз начинаются в разные дни недели. Вариантов множество, скорее всего, найдётся и не один такой год.
Так я подумал в первую минуту после того, как задался вопросом. Это следовало бы доказать. Перебрать все года, например. Простой и быстрый способ, но не интересный. Доказать математически было намного более заманчивой идеей, но как к этому подступиться я совершенно не понимал. Поэтому просто начал выписывать продолжительность каждого месяца на бумагу.
Тут стоит оговорить, что речь дальше пойдёт про григорианский календарь, по которому мы живём с 1918 года. Однако часть рассуждений будет верна и для юлианского.
На самом деле такого года не существует. Давайте разбираться почему.
Часть 1. Месяцы
Сначала вспомним, сколько дней в каждом месяце:
Янв Фев Март Апр Май Июнь Июль Авг Сен Окт Нояб Дек 31 28 / 29 31 30 31 30 31 31 30 31 30 31 Теперь посмотрим, на сколько дней в каждом месяце больше, чем в четырёх неделях.
Янв Фев Март Апр Май Июнь Июль Авг Сен Окт Нояб Дек 3 0 / 1 3 2 3 2 3 3 2 3 2 3 В этом месте возникает следующая идея. Если к дате прибавить 7 дней, то день недели не изменится. Работает модульная арифметика. Отсюда легко понять, что если дней в месяце на два больше, чем в четырёх неделях, то первое число следующего месяца сдвинется на два дня недели относительно первого числа текущего месяца. Да и вообще,
если в месяце (28 + N) дней, то первое число следующего месяца сдвинется на N дней относительно дня недели первого числа текущего месяца.
Например, в этом году январь начался во вторник, поэтому февраль начался в пятницу. Вт + 3 = Пт.
Насколько же сдвинут день недели первого числа некоторого месяца? Чтобы найти это, надо просуммировать «излишки» дней над четырьмя неделями во всех предыдущих месяцах. В таблице представлены сдвиги относительно дня недели на первое января. Первая строка для невисокосного года, вторая для високосного.
Янв Фев Март Апр Май Июнь Июль Авг Сен Окт Нояб Дек 0 3 3 6 8 11 13 16 19 21 24 26 0 3 4 7 9 12 14 17 20 22 25 27 Но это выглядит не очень показательно, да и мы знаем, что сдвиг на семь дней не меняет день недели. Поэтому запишем теперь в таблицу остатки от деления суммарных сдвигов на 7.
Янв Фев Март Апр Май Июнь Июль Авг Сен Окт Нояб Дек 0 3 3 6 1 4 6 2 5 0 3 5 0 3 4 0 2 5 0 3 6 1 4 6 Вот теперь другое дело! Ясно видно, как определить день недели на первое число любого месяца, если известен день недели на первое января. Надо просто прибавить сдвиг для интересующего месяца. Закономерность февраль-март-ноябрь я знаю ещё со школы, а другие не замечал.
Мы получили ответ на вопрос в начале статьи.
Так как для обоих вариантов года в таблице присутствуют все сдвиги от 0 до 6, то в любом году есть месяц, который начинается в какой-то определённый день недели.
Но теперь можно задавать другие вопросы. Например, «в каких годах такой месяц только один?» или «в какие года таких месяцев максимально много?». Для этого надо уметь определять день недели на первое января любого года.
Часть 2. Годы
Когда я учился программировать, а это было в 10 классе школы на PascalABC, одним из первых серьёзных заданий было реализовать процедуру, распечатывающую календарь на год, который передавался как аргумент. У нас были подсказки, какие функции для этого надо реализовать. В целом всё сводилось к подсчёту дней между двумя датами: эталонной и текущей, чтобы определить день недели на первое января нужного года.
Такой подход работал, но скорость зависела от того, насколько близко необходимый год к эталонному. Меня это расстраивало, но придумать что-то лучше я тогда не смог. Теперь же настал идеальный момент, чтобы до конца разобраться в этом.
Високосные года в григорианском календаре назначаются следующим образом:
- год, номер которого кратен 400, — високосный
- остальные года, номер которых кратен 100, — невисокосные
- остальные года, номер которых кратен 4, — високосные
- остальные года — невисокосные
Из этого описания видно, что цикл високосности имеет период в 400 лет. Но не ясно, будут ли такие четырёхсотлетние циклы начинаться в один и тот же день недели.
Заметим, что первое января от года к году смещается на один или два дня недели, и напишем
немного кода.
bool is_leap_year(int year) < if ((year % 400) == 0) return true; if ((year % 100) == 0) return false; if ((year % 4) == 0) return true; return false; >void first_weekdays_table() < ofstream file("weekdays.txt", ios_base::out); int weekday = 3; for (int i = 1801; i else < file weekday += is_leap_year(i) ? 2 : 1; weekday %= 7; > file.close(); >
Выводятся дни недели на первое января каждого года, с 1801 до 3000. Понедельник обозначается как «0», вторник как «1», и т. д. Представим всё в виде таблицы из двух полных четырёхсотлетних циклов и двух половинок. По горизонтали идут столетия, по вертикали года в этих столетиях. В ячейки на пересечении столетия и года написан день недели, в который этот год начался. Например, день недели, в который начался 1997 год, стоит на пересечении столбца «1900» и строки «97». Это среда. Полная версия таблицы: часть 1, часть 2.
В таблице сразу можно заметить две вещи: четырёхсотлетние циклы действительно начинаются в один день недели (2001, 2401 и 2801 года; понедельник), а вместо 2000 года есть «тысяча девятьсот сотый». Последнее сделано нарочно, для дальнейшего удобства. Первый же факт позволяет нам без препятствий двигаться дальше.В григорианском календаре все четырёхсотлетние циклы начинаются в понедельник.
Но самое интересное кроется в полной версии таблицы. Можно обнаружить, что каждое столетие внутри четырёхсотлетнего цикла состоит из повторяющегося двадцативосьмилетнего цикла:
0 1 2 3 5 6 0 1 3 4 5 6 1 2 3 4 6 0 1 2 4 5 6 0 2 3 4 5 Первое столетие начинается со смещением по циклу, равным 0, второе со смещением 4, третье со смещением 8 и четвёртое со смещением 12. Именно для этого таблица представлена в виде, где в столетии есть «сотые» года и нет нулевых. Стоит сказать, что всего существует 14 различных вариантов года. В двадцативосьмилетнем цикле по одному разу на каждый день недели приходится начало високосного года и по три раза начало не високосного.
Теперь мы можем определить день недели для любой даты, не используя опорных дат. Для этого нам надо понять, в каком столетии внутри четырёхсотлетнего цикла находится год и какой он по счёту в этом столетии. По таблице определим день недели на первое января года, а с помощью первой части статьи — день недели в конкретное число нужного месяца. Вместо тысячи слов
напишем ещё немного кода.
int get_weekday(int year, int month, int day) < int weekdays[] = ; int shift_not_leap[] = ; int shift_leap[] = ; bool is_leap = is_leap_year(year); year -= 1; year %= 400; int century = year / 100; year %= 100; int index = (year + (4 * century)) % 28; int weekday = weekdays[index]; weekday += is_leap ? shift_leap[month - 1] : shift_not_leap[month - 1]; weekday += (day - 1); weekday %= 7; return weekday; >
Часть 3. Итоги
С помощью всего двух таблиц можно определить день недели для любой даты, не используя при этом опорных дат.
Последовательность дней недели на первое января в двадцативосьмилетнем цикле:
0 1 2 3 5 6 0 1 3 4 5 6 1 2 3 4 6 0 1 2 4 5 6 0 2 3 4 5 И таблица смещений дней недели на первое число каждого месяца для невисокосного и високосного годов:
Янв Фев Март Апр Май Июнь Июль Авг Сен Окт Нояб Дек 0 3 3 6 1 4 6 2 5 0 3 5 0 3 4 0 2 5 0 3 6 1 4 6 Во время написания статьи, я нашёл на Хабре две схожие по тематике: раз и два. Автор первой с помощью специальной таблицы показывает, как найти в уме день недели для дат в XX и XXI веках. Представленная им таблица содержит 56 чисел. Предложенный в статье алгоритм использует таблицу дней недели и две таблицы смещений, содержащие (28 + 2*12) = 52 числа, которые необходимо запомнить. Весь исходный код лежит на GitHub’е.
Интересный факт: с 1 по 13 февраля 1918 года в Советской России не родился ни один человек.
Задавайте себе вопросы с утра по воскресеньям =)
Обновление от 03.07.2019 (среда)
Если представить двадцативосьмилетний цикл в виде таблицы,
0, 1, 2, 3, 5, 6, 0, 1, 3, 4, 5, 6, 1, 2, 3, 4, 6, 0, 1, 2, 4, 5, 6, 0, 2, 3, 4, 5
то становится понятно, как можно вычислить смещение дня недели на первое января:
weekday = (index + (index / 4)) % 7;
С учётом этого, а также того, что смещения для месяцев в високосном году можно вычислить через смещения в невисокосном, напишем
следующую функцию
int get_weekday_c(int year, int month, int day) < int shifts[] = ; int shift = shifts[month - 1]; if (is_leap_year(year) and (month > 2)) < shift += 1; >; year = (year - 1) % 400; int century = year / 100; int index = ((4 * century) + (year % 100)) % 28; int weekday = (index + (index / 4)) + shift + (day - 1); return (weekday % 7); >
Таким образом, можно вычислить день недели для любой даты, зная всего лишь 12 чисел: смещения дней недели на первое число каждого месяца.
- календарь
- первый день года
- день недели
Как определить день недели по дате c
Вычисление дня недели
Случалось ли Вам мучительно вспоминать, какой именно день недели приходился на то или иное число год или два назад, или вычислять, на какой день недели в этом году приходится Ваш день рождения? Если да, то Вас, думаю, заинтересует простая программа, позволяющая по заданной дате мгновенно вычислить соответствующий день недели. В ее основе лежит такая формула:
день недели = остаток от деления X на 7,
где X = abs(trunc(2.6*m-0.2)+d+y/4+y+c/4-2*c);
m — номер месяца (см. ниже);
d — число (день месяца);
с — номер столетия (см. ниже);
у — номер года в столетии.
При использовании этой формулы следует учесть два обстоятельства. Во-первых, формула верна для григорианского календаря нового стиля (от 1582 до 4903 года). Во-вторых, год и месяц следует предварительно преобразовать так, как если бы начало года приходилось на 1 марта. Иными словами, март в этой формуле имеет порядковый номер 1, апрель 2, . январь 11 и февраль 12, причем январь и февраль следует отнести к предыдущему году. Например, для 1 февраля 1991 года номер месяца должен быть равен 12, а год 1990, в то время как для 31 декабря 1991 года номер месяца — 10, а год — 1991. Результат вычисления дается в виде целого числа в диапазоне от 0 до 6, причем 0 соответствует воскресенью.
Приступим к разработке программы. Прежде всего, предположим, что программа уже создана и Вы осуществляете ее прогон. Какая форма взаимодействия с программой кажется Вам наиболее подходящей? Вряд ли Вас удовлетворит однократное ее исполнение (ввод некоторой даты и вывод на экран соответствующего дня недели). Скорее всего Вы захотите повторить работу программы для нескольких дат, например, поинтересоваться, в какой день недели Вы родились, затем, на какой день недели приходится в этом году Ваш день рождения, дни рождения близких, друзей; может быть, определить, в какой день родились известные Вам исторические деятели, и т.д. Таким образом, в программе следует предусмотреть многократное выполнение действий — , причем число циклов вычисления заранее не известно. Сразу же возникает новый вопрос: как сообщить программе, что Вы завершаете работу с ней? Для этого можно условиться, что ввод некоторой заранее обусловленной или недопустимой даты должен интерпретироваться программой, как указание на прекращение работы. С учетом сказанного, напишем такой начальный вариант программы:
if IsCorrectDate then
until not IsCorrectDate
Если Вы попытаетесь запустить эту программу на счет, то ее поведение будет зависеть от начального значения переменной IsCorrectDate. Это значение случайно, так как компилятор Турбо Паскаля не проводит начальной инициализации переменных. Скорее всего, тот байт оперативной памяти, в котором она разместится, окажется нулевым, что в Турбо Паскале расценивается как логическое значение FALSE, поэтому с большой вероятностью ничего не произойдет, и программа сразу же завершит свою работу (условие not IsCorrectDate будет выполнено). Если начальное значение IsCorrectDate окажется не нулевым, то цикл REPEAT. . .UNTIL будет выполняться до тех пор, пока Вы не выключите компьютер или не нажмете клавиши Ctrl-Break.
Будем считать, что необходимые действия осуществляются в двух процедурах с именами InputDate (ввод даты) и WriteDay (вычисление и печать дня недели). В процедуру InputDate не нужно ничего передавать из программы, так как в ней самой осуществляются ввод и контроль даты. Поэтому заголовок процедуры может иметь такой вид:
Procedure InputDate(var d,m,y: Integer; var correctly:
Процедура WriteDay, напротив, только получает из программы нужные ей данные и ничего не возвращает в программу, поэтому в ее заголовке параметры описываются без слова VAR:
Procedure WriteDay(d,m,у : Integer);
С учетом этого программу можно уточнить следующим образом:
Procedure InputDate(var d,m,y : Integer;
var correctly : Boolean);