Помощь - Поиск - Пользователи - Календарь
Полная версия: День, месяц, год
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
SwlR
Ввести день, месяц, год; определить какой это день недели


Есть программа, которая при вводе числа (целого), определяет на какой день недели приходится n-й день невисокосного года. 1-е число - ПН.
program data;
uses crt;
var
i,n:integer;
begin
clrscr;
write ('vvedi n= ');
readln (n);
i:=n mod 7;
case i of
1:writeln ('Monday');
2:writeln ('Tuesday');
3:writeln ('Wensday');
4:writeln ('Thursday');
5:writeln ('Friady');
6:writeln ('Saturday');
7,0:writeln ('Sanday');
end;
readln;
end.


А как разобраться с этой задачей?
volvo
Смотри здесь:
FAQ: Задачи связанные с календарем
Там есть модуль, который можно подключить и пользоваться описанными функциями. Если тебе не нужен модуль, то вот так (сами функции - из того же модуля, чуть-чуть переделанные. Описание смотри по приведенной ссылке):
type
tdate = record
d : byte;
m : byte;
y : integer;
end;

const
Days_of_week: array[0 .. 6] of String[3] =
('Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб');

function numofday(dat: tdate): longint;
var
stcor : integer;
begin
stcor := 2-dat.y div 100+dat.y div 400;
if ((dat.y mod 100 = 0) and
(dat.y mod 400 <> 0)) and
(dat.m <= 2) then stcor := stcor + 1;

inc(dat.m);
if dat.m <= 3 then begin
dat.m := dat.m+12;
dec(dat.y);
end;
numofday := (36525*dat.y) div 100 + (306*dat.m) div 10 + stcor + dat.d;
end;

function dayofweek(dat: tdate): byte;
var
sum : real;
day : byte;
buf : longint;
begin
buf := numofday(dat);
buf := buf+4;
day := buf mod 7;
dayofweek := day;
end;

var
mydate: tdate;

begin
write('input DD MM YYYY');
with mydate do readln(d, m, y);

writeln(days_of_week[dayofweek(mydate)]);
end.
SwlR
в третьей задаче (в faq) при вводе, к примеру 1 11 2005, выводит Пятница.
volvo
SwlR, я заметил. Тот пост пока скрыт... До выяснения причин. cool.gif Пользуйся тем, что я написал выше...
SwlR
To: volvo

И тот, что ты привлёл выше, тоже неправильный.

Объясни мне, если массив [0 .. 6], то как возможна следующая строчка:
 if day = 0 then day := 7;
klem4
По поводу правильности работы уж не знаю ... но какую связь ты видишь между переменной day и массивом [0..6] & blink.gif

unction dayofweek(dat: tdate): byte;
var
sum : real;
day : byte;
buf : longint;
begin
buf := numofday(dat);
buf := buf+4;
day := buf mod 7;
if day = 0 then day := 7;
dayofweek := day;
end;
Atos
to SVLR: множество значений day не [0,6], а [1,6]. ноль может записываться в day только на промежуточном этапе вычисления
volvo
SwlR, правильность или неправильность программы определяется правильностью или неправильностью результата. Я НЕ принимаю ответ "этот вариант неправильный". Принимается только: "Этот вариант неправильный, т.к. на входных значениях X получен результат Y хотя должен был быть Z" Ясно?

Сказать, что программа работает неверно, очень просто... Ты докажи !!!

Кстати, ту строку
if day = 0 then day := 7;
я добавил при отладке, когда пытался привести Day к интервалу [1 .. 7]. Она там вообще не нужна. Можешь ее убрать.
SwlR
To: klem4
Цитата
но какую связь ты видишь между переменной day и массивом [0..6]

Как какую? Размерность массива [0..6] и поэтому, если "остаток от деления 0 то мы присваеваем 7", а макс. позиция массив а 6! Т.е. из такой позиции в массиве не содержится. Я что не прав?

To: volvo
Я доказал, что программа работает неверно, разве не так?
volvo
Цитата
Я доказал, что программа работает неверно, разве не так?

Нет, не так. Я привел тебе пример утверждения (внимательно читай пост №8. Только ОЧЕНЬ внимательно, включая 4 последние строки !!!)

Данные, которые вводил, и на которых программа не сработала - в студию !!!
SwlR
Цитата
Данные, которые вводил, и на которых программа не сработала - в студию !!!

6 11 2005 - ничего не выводило, хотя должно было вывести ВС.
из-за строки:
 if day = 0 then day := 7;
volvo
Да ты научишься читать-то в конце концов ???!!! mad.gif Сказал же, "Убери строку!!!"
Хватит переливать из пустого в порожнее!
Закрыто
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.