Студент Хлопина Анастасия Георгиевна
Группа РС8-71
Дата выполнения 24,04,2008
Преподаватель Ванцев Д.В.
Отметка о защите _________________
Задание:
Написать функцию, определяющую для произвольной даты определенного года соответствующий день недели.
1 разработка структуры входных и выходных данных;
Исходя из текста задания, логично предположить, что основными входными данными будут являться год, номер месяца и число, а выходными - день недели.
2 выбор метода решения информационной задачи;
Для того, чтобы вычислить день недели, нужно воспользоваться формулой, которая могла бы посчитать день недели для любой даты. Нужную формулу я нашла в книге по программированию на языке бэйсик, где нужная задача была решена в общем виде. Но формула не работала для некоторых дат 21 века. Пришлось опытным путем ее доработать. В итоге задача решается так:
Пусть пользователь вводит год – G, месяц – n, и день – d.
Тогда если n>2, то переменной m зададим значение n-2, а если n<=2, то n+10. таким образом, m=1 – это март,а январь и февраль это 11 и 12 месяцы предыдущего года.
Переменной Р присвоим значение G, если n>2, и G-1, если n<=2. Пусть С- полное число столетий, прошедших к заданной пользователем датой, а Y – номер года в текущем столетии. То есть Р=100С+Y или С=P/100 (целое деление), а Y=P%100(остаток от деления P на 100)
Так например для 12,04,1961:
d=12
n=4
m=2
G=1961
P=1961
C=19
Y=61
Пусть день недели будет задан цифрами так:
0- воскресенье
1-понедельник
2-вторник
3- среда
4- четверг
5- пятница
6- суббота
Тогда нужный нам день недели- это остаток от деления w на 7, где
w= d+ (13*m-1)/5 + Y+Y/4 +C/4-2*C.
3 разработка модульной структуры и потоков данных;
Для легкой отладки программы и для удобства я решила разделить программу на несколько модулей:
-модуль ввода данных
-проверка на ошибки
-модуль, считающий день недели
- модуль вывода дня недели
-главная программа
4 разработка алгоритмов отдельных модулей с приведением их блок-схем;
1- модуль ввода данных
итак, в приведенном модуле идет запрос ввода входных данных, а именно даты, месяца и года.
Блок-схема:
2-модуль проверки на ошибки:
В этом модуле мы проверяем корректность введенной даты.
То есть нужно проверить, чтобы номер месяца был положительным, целым числом не более 12.
Чтобы дата была положительным числом. При этом в зависимости от месяца это число не превышало 31,30,28,29 дней.
Блок-схема: (примечание: все левые ветки условия означают «истину», а правые - «ложь»)
Да Нет
Да Нет Да Нет
Да нет да нет
Да нет
3-модуль, считающий день недели
Подробное описание модуля находится выше. Приведу в этом пункте только блок-схему:
Да нет
Да нет
4-модуль вывода дня недели
Модуль выводящий результат. Выводит в соответствии со значением остатка от деления w на 7.
Где
0- воскресенье
1-понедельник
2-вторник
3- среда
4- четверг
5- пятница
6- суббота
Блок-схема:
0 1 2 3 4 5 6
5-главная программа
В управляющей программе вызываются все предыдущие функции. Таким образом, при помощи главной программы мы объединяем все кусочки в единое целое.
Блок-схема:
Да
Нет
5 разработка текста программы на языке С++;
Главная программа:
Функция ввода:
Функция контроля корректности ввода:
Функция вычисления дня недели:
Функция вывода:
6 разработку тестовых наборов данных и результаты испытания программы.
Проще всего проверять на нынешнем годе, так как под рукой всегда нужный календарь=))
Итак.
Проверим программу на пяти датах:
29 февраля 2007(такой даты нет, => программа должна вывести сообщение об ошибке)
1 января 2008 (вторник)
8 марта 2008 (суббота)
13 октября 2008 (понедельник)
31 декабря 2008 (среда)
Вывод
Задание выполнено, программа работает корректно для всех проверенных мною дат.
Я как всегда молодец.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.