Условие задачи: Необходимо ввести день, число и год. Определить день недели, приходящийся на этот день, месяц, год. При решении задачи использовать типы. Начал решать задачу и возник следующий вопрос: как можно введя только нужную дату, определить день недели, приходящийся на этот день месяца и год?
Начало пока такое: (по мере понимания задачи, буду сюда скидывать более полностью решение):
Uses crt;
Type NumbDays=1..31; Month=(January,February,March,April,May, June,July,August,September,October, November,December); DayOfWeek=(Monday,Tuesday,Wednesday, Thursday,Friday,Saturday,Sunday);
Var Day: NumbDays; Mon: Month; Year: integer; i,j,k: integer;
Begin clrscr; writeln('Enter Day of Month(from 1 to 31): '); readln(Day); writeln('Enter Month(from 1 to 12): '); readln(Mon); writeln('Enter Year: '); readln(Year); {тут будет вычисление происходить нужного дня, но алгоритма решения пока не знаю} readln; End.
Спасибо, за ссылку, только пока встал главный вопрос: Как сделать эту таблицу с годами в паскале, чтобы с нее считывало? Оформление в виде двумерного массива? Если да, то как она должна заполнятся, всмысле как будет происходить заполнение от 1 года н.э до 9999 года с пометкой числа на месяц, каким он должен быть в этот год (Например, в примере указывается что февраль 2007 имеет число 3...а следующий раз через 28 лет также будет 3 число) П.С. Я хочу решить задачу без использования формул
Relrin
17.12.2010 22:35
Нужна помощь по преобразованиям типа, вопросы возникли следующего характера: 1) Как введи скажем число 10 - и обратившись к типу, получить октябрь?
Type NumbDays=1..31; Month=(January,February,March,April,May, June,July,August,September,October, November,December); DayOfWeek=(Monday,Tuesday,Wednesday, Thursday,Friday,Saturday,Sunday);
Begin clrscr; {Ввод сегодняшней даны и дня, а также дня недели, который мы ищем} writeln('What day is it today?(dd mm yyyy)'); readln(TDay,TMon,TYear); ) {как тут введя число месяца, скажем 10, указать, что сегодня октябрь?} writeln('1 - Monday, 2 - Tuesday, 3 - Wednesday '); writeln('4 - Thursday, 5 - Friday, 6 - Saturday, 7 - Sunday'); writeln('Day of week(1 to 7): '); readln(DoW); {как тут введя число, скажем 3, указать, что сегодня среда?} writeln('Enter date, which you find: dd mm yyyy'); readln(Day,Mon,Year); {Тут ничего нет...пока нет...} readln; End.
2) Как проходится по месяцам и дням в обе стороны? Через Succ и Pred? 3) Возможно ли преобразовать тип строк (Month, DayOfWeek)? Если можно, то как это сделать? 4) Как обходиться с количеством дней в месяцах?
volvo
17.12.2010 23:13
Цитата
Как введи скажем число 10 - и обратившись к типу, получить октябрь?
var m: integer;
// ... readln(m); TMon := Month(Pred(m)); { <--- Pred - потому что перечисление в типах начинается с 0 }
, но я бы еще проверял, не ввел ли пользователь число меньше 1 или больше 12, иначе будет ошибка.
Остальные вопросы по приведению типов решаются аналогично.
А вот с февралем у тебя проблемы. Без формул определить, в каком феврале 28 а в каком 29 дней - вряд ли получится...
Цитата
Как проходится по месяцам и дням в обе стороны? Через Succ и Pred?
Да. Но не забывать проверять граничные значения, иначе при Succ(December) у тебя будут проблемы, равно как и при Pred(January). Кстати, циклы
var M: Month; begin for M := low(Month) to high(Month) do { ... } end.
Работают безо всяких Pred/Succ ...
Цитата
Возможно ли преобразовать тип строк (Month, DayOfWeek)?
Аналогично:
const StrMonth: array[Month] of string = ('January','February','March','April','May', 'June','July','August','September','October','November','December');
...
Relrin
18.12.2010 1:04
Сейчас анализирую, подход к решению задачи, без формул. В голову пришла идея следующего решения: 1) Считаем между указанными датами количество дней, с учетом высокосных лет 2) Делим эту разницу на 7, и берем от этого остаток, число, в остатке - и будет днем в некоторой неделе Правда... Как реализовать такое в коде, с использованием типов?
Relrin
18.12.2010 1:04
По сравнению с тем, что по кругу гонять (всмысле уменьшать/увеличивать) года, месяцы и дни, чтобы дойти до нужного дня, и постоянно учитывать какой день будет на каждую дату, получается очень громоздким...
Relrin
18.12.2010 2:06
И всетаки решил вернутся к тому, чему хотел. Помогите сделать случай с уменьшением даты, до искомой даты, с учетом того, что с каждым сдвигом меняется день недели! Например. Пускай сейчас... скажем какая-нибудь среда 2.1.1989 и искомое - 01.01.0001 года. Первый сдвиг: 1.1.1989, вторник Второй сдвиг: 31.12.1988, понедельник Третий сдвиг: 30.12.1988, воскресенье и так далее...
Uses Crt;
Const DayOfMonth: array[1..12] of integer=(31,28,31,30,31,30,30,31,30,31,30,31); {для обычных лет} DayOfMonth2: array[1..12] of integer=(31,29,31,30,31,30,30,31,30,31,30,31); {для высокосных}
Type NumbDay=:1..31; Month=(January,February,March,April,May,June,July,August, September,October,November,December); DayOfWeek=(Monday,Tuesday,Wednesday, Thursday,Friday,Saturday,Sunday);
Begin clrscr; {Ввод данных} writeln('What day is it today?(dd mm yyyy)'); readln(TDay,a,TYear); TMon:=Month(pred(a)); writeln; writeln('1 - Monday, 2 - Tuesday, 3 - Wednesday '); writeln('4 - Thursday, 5 - Friday, 6 - Saturday, 7 - Sunday'); writeln('Day of week(1 to 7): '); readln(a); DoW:=DayOfWeek(pred(a)); writeln; writeln('Enter date, which you find: dd mm yyyy'); readln(Day,Mon,Year); Mon:=Month(pred(a)); writeln; {Поиск дня недели} {Идея алгоритма - сдвигать дни, месяцы, года, до искомой даты, учитывая также дни недели, на которые приходятся датой} {Сначала случай, когда указанный год больше искомого} if TYear>Year then begin for i:=TYear downto Year do begin {Для высокосного года} if (i mod 4=0) and (i mod 100<>0) and (i mod 400<>0) then begin // как тут дальше идти, т.к. нужно как-то ассоциировать, что в январе - 31 число, феврале 28/29 и т.д. // + ко всему учитывать, что мы уменьшаем дату изначальную до искомой end; {для невысокосного года…} else end; end; writeln('Calendar day of the week ',Day,'.',a,'.',Year,' will 2'); readln; End.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.