Лабораторная работа №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.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.