Программа, рассчитывающая все 13-е пятницы и вторники начиная с 1 января 1999 года и до даты указанной пользователем

Страницы работы

Содержание работы

Лабораторная работа №1

Выполнила:

Перцева Е.В.

Новосибирск 2005

1. Задание:

Программа рассчитывающая все 13-е пятницы и вторники начиная с 1 января 1999 года и до даты указанной пользователем.

2. Описание алгоритма:

Используется система вложенных циклов, перебирающих года, месяца и числа в месяце. Внутри цикла перебирающего числа находится счетчик дней недели, которому исходное значение задается в начале программы и не обнуляется при переходах от месяца к месяцу и от года к году. Дни недели обозначены числами 1..7, месяца 1..12, при необходимости легко добавить строковый массив хранящий названия дней недели и месяцев.

Для определения количества дней в текущем месяце применен массив month[]. Для поправки на високосный год используется выражение fmod(comp_god,4)==0 (функция fmod() взята из библиотеки math.h).

3. Использованные материалы:

Массивы, логический оператор if-else, циклы for, do-while, функция break.

4. Описание переменных:

month[12] – массив хранящий количество чисел в месяцах; i – число месяца, m – месяц, индекс массива month[]; d – день недели, начальное значение пятница(5); comp_god – год отсчета, начальное значение 1999; user_god, user_month, user_day – год, месяц и число пользователя; flag – флаг конца вычислений, vis – флаг високосного года;

5. Пример выполнения:

2003.5.14

1999        4       13 Vtornik

1999        7       13 Vtornik

1999        8       13 5nizza

2000        6       13 Vtornik

2000       10       13 5nizza

2001        2       13 Vtornik

2001        3       13 Vtornik

2001        4       13 5nizza

2001        7       13 5nizza

2001       11       13 Vtornik

2002        8       13 Vtornik

2002        9       13 5nizza

2002       12       13 5nizza

2003        5       13 Vtornik

2003        6       13 5nizza


6. Текст программы:

#include <stdio.h>

#include <conio.h>

#include <math.h>

void main()

{

int month[12], i=0, m=0, d=4;

int user_god, comp_god=1999,user_month, user_day;

int flag=0, vis=0;

clrscr();                                \\ очистка экрана

month[1]=31; month[2]=28; month[3]=31; month[4]=30; month[5]=31; month[6]=30;

month[7]=31; month[8]=31; month[9]=30; month[10]=31; month[11]=30; month[12]=31;                            \\ инициализация массива

scanf("%u.%u.%u",&user_god,&user_month,&user_day); \\ввод даты конца расчетов

for (;;)                                 \\ начало цикла лет

{

for (m=1;m<13;m++)                 \\ начало цикла 1го года

{

i=0;                          \\ обнуляем число месяца

do                            \\ начало цикла месяца

{

d++;                    \\ счетчик дней недели

if (d==8) d=1;          \\ в неделе 7 дней

i++;                    \\ счетчик чисел месяца

if (m==12 && i==31)     \\ условие Новый Год!

{

break;      \\ выход из цикла месяцев 1-го года

}

if (comp_god==user_god && m==user_month && i==user_day)

{                 \\ дата пользователя

goto theend;\\ условие конца вычислений

}                 \\

if (i==13 && d==5)      \\ условие пятницы 13

{

printf("%8d %8d %8d 5nizza\n",comp_god,m,i);

}

if (i==13 && d==2)      \\ условие вторника 13

{

printf("%8d %8d %8d Vtornik\n",comp_god,m,i);

}

vis = (fmod(comp_god,4)==0 && m==2) ? 1 : 0;

\\ условие високосного года

} while (i != month[m]+vis);  \\ условие конца цикла месяца

}                                  \\ конец цикла 1го года

comp_god++;                              \\ счетчик лет

}    

theend:                                   \\ метка конца расчетов

}

7. Проблемы:

При выполнении программа "застревала" в цикле 12го месяца и считала числа в нем до 256ти, потом только переходила в следующий год. Для устранения ошибки добавлено условие конца года и функция break.

Похожие материалы

Информация о работе

Тип:
Отчеты по лабораторным работам
Размер файла:
74 Kb
Скачали:
0