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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2016, 17:42   #1
artilun
Пользователь
 
Регистрация: 25.10.2016
Сообщений: 25
По умолчанию Помогити пожалуйста исправить код на СИ

Задние такое: Получить даты всех праздничных дней года, которые бы совпадали в заданном году с выходными (суббота или воскресенье). Помогите найти ошибку, не правильно вычисляются даты

Код:
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <windows.h>
#define KPD 11
struct struct_date
{
    int day;
    int month;
    int year;
};

int what_day(const struct struct_date* date)
{
    int a = (14 - date->month) / 12;
    int y = date->year - a;
    int m = date->month + 12 * a - 2;
    return (7000 + (date->day + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12)) % 7;
}
void Holliday()
{
	int M[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	int mas_pr[2][KPD]={ {1,2,7,8,1,2,9,28,25,7,8}, // массив праздников {день}{месяц}
	{1,1,1,3,5,5,5,6,8,11,11}};
	int Uyear=0,T=0;
	printf("Введите год:\n");
	while((!scanf("%d", &Uyear))||(Uyear<=0))
		{
			printf("Повторите ввод года:\n");
			fflush(stdin);
		}
	if((Uyear%4==0)&&(Uyear%100==0)&&(Uyear%400==0))
		M[1]=29;
	
	for(int i=mas_pr[1][0]; i<11;i++)
	{
		for(int j=mas_pr[0][j]; j<=KPD; j++)
		{
			struct_date a={j, i+1, Uyear};
			T=what_day(&a);
			if((T==6)||(T==0)) printf("Праздник совпадает с выходным %d-го числа %d-го месяца\n", j,i+1);
		}
	}
}


int main()
{
	setlocale(LC_ALL, "rus");
	Holliday();
	_getch();
	return 0;
}

Последний раз редактировалось artilun; 08.12.2016 в 17:52.
artilun вне форума Ответить с цитированием
Старый 08.12.2016, 19:14   #2
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от artilun Посмотреть сообщение
Получить даты всех праздничных дней года, которые бы совпадали в заданном году с выходными (суббота или воскресенье). Помогите найти ошибку, не правильно вычисляются даты
Принципиальная ошибка всех (сколько я видел ) при работе с датами - это составить календарь на основе собственных представлений о календаре (складываем, вычисляем, массивы заполняем...).
Но для работы с датами есть готовые библиотечные функции, в POSIX это: struct tm, gmtime(), mktime(), asctime(), ctime() и т.д. функции и типы/структуры данных этой группы.

Код при умелом использовании библиотечных функций будет а). безошибочным и б). много компактнее и понятнее.
olej.tsil вне форума Ответить с цитированием
Старый 08.12.2016, 22:15   #3
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от artilun Посмотреть сообщение
Получить даты всех праздничных дней года, которые бы совпадали в заданном году с выходными (суббота или воскресенье).
Ваши субботы с воскресеньями могут выглядеть примерно так (без всяких 30/31, 365/366 и прочих глупостей):
Код:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main( int argc, char **argv ) {
   struct tm d1 = { 
      .tm_year = 116,
      .tm_mday = 1
   }, d2;
   if( argc > 1 ) d1.tm_year = atoi( argv[ 1 ] );
   else {
      printf( "год? : " );
      scanf( "%d", &d1.tm_year );
   }
   d1.tm_year -= 1900;
   if( d1.tm_year < 0 || d1.tm_year > 200 ) {
      printf( "недопустимый год\n" );
      return 1;
   }
   int n = 0;
   while( 1 ) {
      time_t t = mktime( &d1 );
      d2 = *localtime( &t );
      if( d1.tm_mon != d2.tm_mon && d2.tm_mday != d2.tm_mday + 1 ) {
         if( d1.tm_mon == 12 ) break;
         d1.tm_mon++;
         d1.tm_mday = 1; 
      }
      else
         d1.tm_mday++;
      if( d1.tm_wday == 6 /* Sat */ || d1.tm_wday == 0 /* Sun */ ) {
         printf( asctime( &d1 ) );
         n++;
      }
   }
   printf( "найдено %d дат\n", n );      
   return 0;
}
Выполнение:
Код:
$ ./holliday 2015
Sat Jan  4 00:00:00 2015
Sun Jan  5 00:00:00 2015
Sat Jan 11 00:00:00 2015
Sun Jan 12 00:00:00 2015
Sat Jan 18 00:00:00 2015
Sun Jan 19 00:00:00 2015
Sat Jan 25 00:00:00 2015
Sun Jan 26 00:00:00 2015
Sat Jan 32 00:00:00 2015
Sun Feb  2 00:00:00 2015
Sat Feb  8 00:00:00 2015
Sun Feb  9 00:00:00 2015
Sat Feb 15 00:00:00 2015
Sun Feb 16 00:00:00 2015
Sat Feb 22 00:00:00 2015
Sun Feb 23 00:00:00 2015
Sat Feb 29 00:00:00 2015
Sun Mar  2 00:00:00 2015
...
Весь отбор суббот-воскресений занимает 10 строк кода.
Думаю, что можно сделать и проще (с инкрементированием даты) ... если найти из функций что-то, что возвращает ошибку на несуществующую дату.

Последний раз редактировалось olej.tsil; 09.12.2016 в 13:05.
olej.tsil вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Здравствуйте. Помогите пожалуйста исправить код C++ MaKs676 Visual C++ 1 01.07.2015 14:45
Исправить код саша40 Мультимедиа в Delphi 7 06.11.2012 22:01
исправить код seed92 Помощь студентам 0 21.02.2011 16:02