1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Условие задачи: Необходимо ввести день, число и год. Определить день недели, приходящийся на этот день, месяц, год. При решении задачи использовать типы. Начал решать задачу и возник следующий вопрос: как можно введя только нужную дату, определить день недели, приходящийся на этот день месяца и год?
Начало пока такое: (по мере понимания задачи, буду сюда скидывать более полностью решение):
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 число) П.С. Я хочу решить задачу без использования формул
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) Как обходиться с количеством дней в месяцах?
Сейчас анализирую, подход к решению задачи, без формул. В голову пришла идея следующего решения: 1) Считаем между указанными датами количество дней, с учетом высокосных лет 2) Делим эту разницу на 7, и берем от этого остаток, число, в остатке - и будет днем в некоторой неделе Правда... Как реализовать такое в коде, с использованием типов?
По сравнению с тем, что по кругу гонять (всмысле уменьшать/увеличивать) года, месяцы и дни, чтобы дойти до нужного дня, и постоянно учитывать какой день будет на каждую дату, получается очень громоздким...
И всетаки решил вернутся к тому, чему хотел. Помогите сделать случай с уменьшением даты, до искомой даты, с учетом того, что с каждым сдвигом меняется день недели! Например. Пускай сейчас... скажем какая-нибудь среда 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.