Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.10.2009, 12:53   #1
Xcess
 
Аватар для Xcess
 
Регистрация: 29.03.2009
Сообщений: 3
Лампочка Вывод дня недели по дате и наоборот (СИ)

Приветствую всех! Казалось бы элементарное задание, но, к сожалению, моя прога работает не совсем правильно: некоторые дни недели определяются правильно, а некоторые - нет. Причина, скорее всего, в неправильном учёте високосных годов. Изначально дано условие, что 1 января 1800 года была среда.

Код:
#include <stdio.h>
#include <conio.h>
#include <math.h>

void main()
{
 int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
 char week[7][10]={"Monday","Tuesday","Wednesday","Thuesday","Friday","Saturday","Sunday"};
 int i,date,day,mes,year;
 long N=0;

 clrscr();
 printf("Vvedite datu (dd mm yyyy): ",date);
 scanf("%d%d%d",&day,&mes,&year);

 for(i=1800;i<year;i++);
   if (i%4==0 && (i%100!=0||i%400==0)) N+=366; else N+=365;
 for(i=0;i<mes-1; i++) N+=month[i];
   if ((year%4==0 && (year%100!=0||year%400==0)) && mes>2) N++;
 N+=day;
 N%=7;
 printf("\nDen nedeli: %s ",week[N]);
 getch();
}
Сначала с прямым переводом надо разобраться, а потом уже с обратным.

Последний раз редактировалось Xcess; 06.10.2009 в 13:05.
Xcess вне форума Ответить с цитированием
Старый 06.10.2009, 17:24   #2
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Вот попалась программка, только без учета нач. условий, может переделаете. Сама по себе работает.
Код:
#include <iostream.h>
#include <conio.h>
#include <math.h>

int day_of_week(int day,int month,int year)
  {
    unsigned long tmp,res;

    if(month>2)
        month++;
    else
      {
	month+=13;
        year-=1;
      }
    tmp=floor(365.25*year)+floor(30.6*month)+day-621050;
    res=tmp-floor(tmp/7)*7+1;

    return res;
  }

void main()
  {
    int res,day,month,year;
    char run; 

    do
      {
        clrscr();
        cout<<"Enter the year: ";  cin>>year;
        cout<<"Enter the month: "; cin>>month;
        cout<<"Enter the day: ";   cin>>day;

        res=day_of_week(day,month,year);

        switch(res)
          {
	    case 1: cout<<endl<<"This day is Monday"   <<endl; break;
	    case 2: cout<<endl<<"This day is Tuesday"  <<endl; break;
	    case 3: cout<<endl<<"This day is Wednesday"<<endl; break;
	    case 4: cout<<endl<<"This day is Thursday" <<endl; break;
	    case 5: cout<<endl<<"This day is Friday"   <<endl; break;
	    case 6: cout<<endl<<"This day is Saturday" <<endl; break;
	    case 7: cout<<endl<<"This day is Sunday"   <<endl; break;
          }
        cout<<endl<<"Press any key to continue or ESC to exit...";
        run=getch();
      }
    while(run!=27);
  }
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 06.10.2009, 17:53   #3
Xcess
 
Аватар для Xcess
 
Регистрация: 29.03.2009
Сообщений: 3
По умолчанию

Sweta
Спасибо! Но саму дату 01.01.1800 прога неправильно обрабатывает и пишет, что понедельник)
Xcess вне форума Ответить с цитированием
Старый 07.10.2009, 07:41   #4
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Дело в том, что 1 1 1800 - среда - это начальная точка отсчета. Ее надо задать как в Вашей, так и в предложенной программе. Алгоритм вычисления я так понимаю.
1 Вычисляем заданный день месяца для 1800 г, (т.е к примеру для 3 2 2000) Среда(1 1)+31(январь) +3(февраль) определяем остаток по %7.
2 Сдвигаем полученный день, за каждый невисокосный год на 1(т.е +1) и високосный на 2 до необходимого года, а потом сумму опять %7
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 07.10.2009, 23:22   #5
Xcess
 
Аватар для Xcess
 
Регистрация: 29.03.2009
Сообщений: 3
По умолчанию

Sweta
У меня цикл считает с 1800 года до заданного и в условном операторе я определяю високосный год или нет. По-моему, тоже всё логично)
Xcess вне форума Ответить с цитированием
Старый 08.10.2009, 11:40   #6
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Посмотрите это Ваш алгоритм?
Если идти по нему с карандашом, то даже 1.1.1800 дает значения понедельник, т.к 2-9-10-18-19 и (1% 7) ??
Вложения
Тип файла: doc Doc2.doc (71.0 Кб, 24 просмотров)
Неприятности приходят и уходят, а жизнь продолжается!

Последний раз редактировалось Sweta; 08.10.2009 в 14:00.
Sweta вне форума Ответить с цитированием
Старый 08.10.2009, 14:02   #7
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Ошиблась немного, но суть не изменилась.
Вложения
Тип файла: doc Doc2.doc (136.0 Кб, 34 просмотров)
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зависимость даты дней от дня недели valerij Microsoft Office Excel 16 18.06.2009 01:17
по заданной дате вычислить какой день недели. Pascal. Яська Помощь студентам 4 28.01.2009 23:51
Первая номер дня в дате mirawoo Microsoft Office Access 3 17.06.2008 15:19
Добавление дня к дате Askat БД в Delphi 2 03.03.2008 11:30