Автор: Пользователь скрыл имя, 23 Декабря 2012 в 15:27, курсовая работа
Целью данного курсового проекта является программная реализация вечного календаря (алгоритм расчёта дня недели по заданной дате).
Программа должна работать следующим образом:
– пользователь вводит дату,
– после выполнения программы на экран должен выводиться день недели, на который попадает эта дата.
Программа должна быть реализована на языке С++ в среде Visual C++.
Введение………………………………………………………....……
4
1 Постановка задачи и сфера её применения…..………………......
5
2 Теоретическая часть…………………………………….……….....
6
2.1 История календарей……………………..………….......…….
6
2.2 Описание использованного алгоритма.………...…………...
11
2.3 Пример реализации алгоритма………………………………
11
3 Программная реализация………………………………….……….
13
3.1 Описание алгоритма и структуры программы……………..
13
3.2 Описание программных средств…………………………….
17
4 Инструкция пользователя………………………………………….
20
Заключение……………………………………………………..…….
21
Перечень ссылок……………………………………………………..
22
Приложение А Текст программы………………………….………..
23
Приложение Б Результат………..……………………………….…..
28
Приложение В …………………………………………….………….
29
В ходе выполнения курсового проекта я использовал алгоритм построения вечного календаря. Существуют разнообразные методы вычисления дня недели. Некоторые из них основываются на заранее просчитанных таблицах сдвигов, а некоторые вычисляют все необходимые значения «с нуля» при каждом запуске.
В алгоритм входит проверка введённого значения года на высокостность: каждый год который делится без остатка на 4, кроме годов которые делятся без остатка на 100, не считая года кратные 400(эти года есть високосными)).
В программе предусмотрены 2 варианта задания формата даты: «normal» (пр. 28 ноября 2008) и «american» (пр. 28 11 2008). В случаи не корректного задания даты программа выдает соответствующие сообщение.
Пошаговая работа алгоритма описана ниже на примере.
Рассмотрим выполнение алгоритма на примере.
Первый шаг. Программа делает запрос на выбор формата задания даты: 1 – «normal», other number – «american».
Второй шаг. Ввод даты в раннее выбранном формате. В случаи если выбран «normal» формат задания даты, программа присваивает месяцу его порядковый номер от начала года.
Третий шаг. Проверка корректности задания даты. В случаи если дата введена не правильно или введена не существующая дата (напр. 32 jan), программа выводит соответствующее сообщение и алгоритм продолжает выполняться с пункта 6.
Четвертый шаг. На следующем шаге программа проводит расчёты по григорианскому календарю с учетом всех его особенностей (т.е в учет берётся високосный год : каждый год который делится без остатка на 4, кроме годов которые делятся без остатка на 100, не считаю года кратные 400(эти года есть високосными)). Далее вся дата переводится в дни, т.е. количество лет в дате умножается на 365 + количество месяцев умножается на 30 + количество дней, внесённые в дату. Полученное значение делим на 7 и берём целую часть.
Пятый шаг. В зависимости какое число получилось, программа выводит сообщение. Если 0 – «Sunday», 1 – «Monday », 2 – «Tuesday», …, 6 – «Saturday».
Шестой шаг. Программа выводит запрос на продолжения работы. Если пользователь захочет продолжить работу с программой, алгоритм повторяется с шага 2. Иначе, программа завершает свою работу.
3 ПРОГРАММНАЯ РЕАЛИЗАЦИЯ
3.1 Описание алгоритма и структуры программы
Данная программа разработана для определения дня недели заданной даты.
При запуске программы на экран выводится запрос о выборе формата задания даты. Пользователь должен выбрать каким форматом ему удобней задавать дату, либо «normal» (пр. 28 nov 2008), либо «american» (пр 28 11 2009).
Следующим этапом выполнения программы является запрос о вводе даты, в порядке: день, месяц, год, в том формате, который был выбран раннее. В случае если дата была введена не корректно, на экран выводится соответствующее сообщение. В противном случае выполняется расчёт дня недели.
Результатом программы является день недели на который попадает заданная дата. Далее идёт запрос о продолжении работы с программой, если пользователь предпочтёт продолжить – алгоритм выполнится заново, а если пользователь предпочтёт не продолжать работу с программой – программа завершается.
Ниже приведен поэтапный пример выполнения программы:
Рис. 3.1 – Выбор формата задания даты
Предположим, на первом этапе был выбран «normal» формат задания даты.
2. Ввод даты: число, месяц, год.
Рис. 3.2 – Задание даты
3. Выполнения
программы и запрос на
Рис. 3.3 – Запрос на продолжение работы с программой
4. Если пользователь введёт «yes», он программа вернётся к пункту 2.
Рис. 3.4 – Продолжение работы с программой
Если пользователь введёт «no», то программа завершит своё выполнение:
Рис. 3.5 – Завершение работы программы
Полностью аналогичен алгоритм, если выбрать «american» формат задания даты:
Рис. 3.6 – Работа программы при выборе «american»
формата задания даты
3.2 Описание использованных программных средств
Таблица 4.1–Описание переменных в функции main (главная функция)
Переменная |
Тип |
Описание |
d |
int |
День |
m |
int |
Месяц |
y |
int |
Год |
x |
int |
День недели |
a |
int |
Выбор формата задания даты |
n |
int |
Счётчик |
i |
int |
Счётчик |
q1 |
char |
Объект типа char который содержит в себе сообщение «yes» |
q2 |
char |
Запрос на продолжение работы с программой |
Таблица 4.2–Описание переменных в функции fun1 (функция просчёта дня недели)
Переменная |
Тип |
Описание |
d |
int |
День |
m |
int |
Месяц |
y |
int |
Год |
a |
int |
Промежуточное значение |
b |
int |
Промежуточное значение |
c |
int |
Промежуточное значение |
Таблица 4.3–Описание переменных в функции fun2 (функция проверки корректности задания дат)
Переменная |
Тип |
Описание |
y1 |
int |
Месяц |
x1 |
int |
Промежуточное значение |
Таблица 4.4–Описание переменных в функции fun3 (функция корректировки расхождения количества дней в месяце)
Переменная |
Тип |
Описание |
м |
int |
Месяц |
у |
int |
Год |
x1 |
int |
Промежуточное значение |
Описание использованных функций:
1. void main (главная функция)
Главная функция программы. Она вызывает в себе остальные функции, проводит основные расчёты, выполняет различные преобразования, выводит результат.
2. int f1 (Функция просчёта дня недели)
Функция, которая осуществляет окончательный расчёт дня недели, основная формула.
3. int f2 (Функция проверки корректности записи месяца)
Функция, которая осуществляет проверку корректности записи месяца.
4. int f3 (Функция корректировки расхождения количества дней в месяце)
Функция, которая возвращает количество недостающих дней в пройденных месяцах, дополняя их.
4 ИНСТРУКЦИЯ ПОЛЬЗОВАТЕЛЯ
При запуске программы выводится окно со следующими запросами:
1. Выберете формат задания даты.
2. Ввод значения 1, если хотите выбрать «normal» формат (пр 28 nov 2008), ввод значения 2, если хотите выбрать «american» формат (пр 28 11 2008)
3. Ввод даты: день, месяц, год, в раннее выбранном формате.
На экран выводится день недели, на который попадает заданный день. Появляется запрос на продолжение работы с программой.
4. В случае если вы ввели «yes» программа повторит выполнение с пункта 2, в случае если вы ввели «no», то программа завершит свою работу.
ВЫВОД
В данном курсовом проекте была разработана программа, реализующая вечный календарь. Программа была написана на Microsoft Visual C++ 2006.
В ходе выполнения курсового проекта я изучил историю календарей, особенности построения вечного календаря с среде программирования. Рассмотрел основные алгоритмы вычисления дня недели, изучил их преимущества и недостатки.
Также были углублены знания, полученные в процессе выполнения лабораторных работ по предмету «Программирование».
ПЕРЕЧЕНЬ ССЫЛОК
Приложение А
Текст программы
#include <iostream>
#include <string.h>//работа со строками
using namespace std;
/*функция просчёта дня недели*/
int fun1(int d, int m, int y)
{
int a, b, c=0;//промежуточные значения
b = fun3(m,y);
a = (y-1)/4;
if((y/4*4 == y && y/100*100 != y) || y/400*400 == y)//проверка на високосный год
c = -1;
if(m == 2)//если февраль считать по этой формуле
return y*365+m*30+d+a+b-(y-1)/100+(y-
else
{
if(m == 4 || m == 6 || m == 9 || m == 11)//если эти месяцы – апрель, июнь, сентябрь, ноябрь, то считать по этой формуле
return y*365+m*30+d+a+b-(y-1)/100+(y-
else return y*365+m*30+d+a+b-(y-1)/100+(y-
}
}
/*функция проверки корректности задания дат*/
int fun2(int y1)
{
int x1;//промежуточная переменная
switch(y1)//переключатель
{
case 1: x1=1;
break;
case 2: x1=-2;
break;
case 3: x1=1;
break;
case 4: x1=0;
break;
case 5: x1=1;
break;
case 6: x1=0;
break;
case 7: x1=1;
break;
case 8: x1=1;
break;
case 9: x1=0;
break;
case 10: x1=1;
break;
case 11: x1=0;
break;
case 12: x1=1;
break;
}
return x1;//значение которое возвращает функция
}
int fun3(int m, int y)
{
int x1;//промежуточная переменная
if((y/4*4 == y && y/100*100 != y) || y/400*400 == y)
switch(m)//переключатель
{
case 1: x1=1;
break;
case 2: x1=0;
break;
case 3: x1=1;
break;
case 4: x1=1;
break;
case 5: x1=2;
break;
case 6: x1=2;
break;
case 7: x1=3;
break;
case 8: x1=4;
break;
case 9: x1=4;
break;
case 10: x1=5;
break;
case 11: x1=5;
break;
case 12: x1=6;
break;
}
else
switch(m)//переключатель
{
case 1: x1=1;
break;
case 2: x1=-1;
break;
case 3: x1=0;
break;
case 4: x1=0;
break;
case 5: x1=1;
break;
case 6: x1=1;
break;
case 7: x1=2;
break;
case 8: x1=3;
break;
case 9: x1=3;
break;
case 10: x1=4;
break;
case 11: x1=4;
break;
case 12: x1=5;
break;
}
return x1;//значение которое возвращает функция
}
/*главная функция*/
void main()
{
int d, m, y, x, a, n=1;//переменные которые, соответственно: день, месяц, год, день недели, выбор формата, промежуточная переменная
char q1[]= "yes", q2[4];//переменные которые проверяют продолжать работу с программой или нет
cout << "Select the format of writing dates,then: 1 - normal (ex. 01 jan 2008), other number - american (ex. 01 01 2008) \n";