IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

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

 
 Ответить  Открыть новую тему 
> Григорианский календарь, Поиск дня недели...
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 64
Пол: Мужской

Репутация: -  0  +


Условие задачи: Необходимо ввести день, число и год. Определить день недели, приходящийся на этот день, месяц, год. При решении задачи использовать типы.
Начал решать задачу и возник следующий вопрос: как можно введя только нужную дату, определить день недели, приходящийся на этот день месяца и год?


Начало пока такое: (по мере понимания задачи, буду сюда скидывать более полностью решение):

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.


Я правильно указал типы? Заранее спасибо yes2.gif

Сообщение отредактировано: Relrin -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


http://ru.wikipedia.org/wiki/Вечный_календарь


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 64
Пол: Мужской

Репутация: -  0  +


Цитата(TarasBer @ 16.12.2010 18:13) *

Спасибо, за ссылку, только пока встал главный вопрос:
Как сделать эту таблицу с годами в паскале, чтобы с нее считывало? Оформление в виде двумерного массива? Если да, то как она должна заполнятся, всмысле как будет происходить заполнение от 1 года н.э до 9999 года с пометкой числа на месяц, каким он должен быть в этот год (Например, в примере указывается что февраль 2007 имеет число 3...а следующий раз через 28 лет также будет 3 число)
П.С. Я хочу решить задачу без использования формул

Сообщение отредактировано: Relrin -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Пионер
**

Группа: Пользователи
Сообщений: 64
Пол: Мужской

Репутация: -  0  +


Нужна помощь по преобразованиям типа, вопросы возникли следующего характера:
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);

Var
DoW,FDoW: DayofWeek;
Day,TDay: NumbDays;
Mon,TMon: Month;
Year,TYear: integer;
i,j,k: integer;

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) Как обходиться с количеством дней в месяцах?

Сообщение отредактировано: Relrin -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Цитата
Как введи скажем число 10 - и обратившись к типу, получить октябрь?

var
m: integer;

// ...
readln(m);
TMon := Month(Pred(m)); { <--- Pred - потому что перечисление в типах начинается с 0 }

, но я бы еще проверял, не ввел ли пользователь число меньше 1 или больше 12, иначе будет ошибка.

Остальные вопросы по приведению типов решаются аналогично.

Цитата
Как обходиться с количеством дней в месяцах?
Создать массив:
Const
DayOfMonth: array[Month] of NumbDays = (31, 28, 31, 30, 31, 30, 30, 31, 30, 31, 30, 31);
А вот с февралем у тебя проблемы. Без формул определить, в каком феврале 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');
...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Пионер
**

Группа: Пользователи
Сообщений: 64
Пол: Мужской

Репутация: -  0  +


Сейчас анализирую, подход к решению задачи, без формул. В голову пришла идея следующего решения:
1) Считаем между указанными датами количество дней, с учетом высокосных лет
2) Делим эту разницу на 7, и берем от этого остаток, число, в остатке - и будет днем в некоторой неделе
Правда... Как реализовать такое в коде, с использованием типов?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 64
Пол: Мужской

Репутация: -  0  +


По сравнению с тем, что по кругу гонять (всмысле уменьшать/увеличивать) года, месяцы и дни, чтобы дойти до нужного дня, и постоянно учитывать какой день будет на каждую дату, получается очень громоздким...

Сообщение отредактировано: Relrin -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Пионер
**

Группа: Пользователи
Сообщений: 64
Пол: Мужской

Репутация: -  0  +


И всетаки решил вернутся к тому, чему хотел. Помогите сделать случай с уменьшением даты, до искомой даты, с учетом того, что с каждым сдвигом меняется день недели! mega_chok.gif
Например. Пускай сейчас... скажем какая-нибудь среда 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);

Var
DoW,FDoW: DayOfWeek;
Day,TDay: NumbDays;
Mon,TMon: integer;
Year,TYear: integer;
a,i,j,k: integer;

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.




Сообщение отредактировано: Relrin -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 27.10.2020 16:39
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name