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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2013, 15:20   #1
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию С++ инкапсуляция классы

Задана дата начала занятий. Для даты внутри семестра определить, является ли текущая учебная неделя верхней или нижней и посчитать ее номер. Максимальная длина семестра - 5 месяцев (не выдавать результат для дат, до которых прошло больше 5 месяцев после начала семестра). Начало и конец семестра могут быть в разных астрономических годах.

Имя класса: СSemCalendar
Исходное данное: строка в формате dd.mm.yyyy
Имя метода для установки исходного данного: SetBeginningDate
Имена полей, в которых хранятся исходные данные: m_beg_year, m_beg_month, m_beg_day
Результат: строка в формате dd.mm.yyyy
Прототип метода, который будет выполнять действие:
Код C++
1
2
3
int Up(int,int,int);
int Low(int,int,int);
int Week(int,int,int);
Имена объектов: semestr_1, semestr_N

Вот моя реализация класса:
Код:
class СSemCalendar
{
    int m_beg_year;
    int m_beg_month;
    int m_beg_day;
    int m_month_days[12];
 
    int SetDay(int);       
    int SetMonth(int);   
    int SetYear(int);
 
public:
    СSemCalendar();
    ~СSemCalendar();
 
    void GetDate (char *buf); 
    int  GetDay  ();      
    int  GetMonth();       
    int  GetYear ();     
 
    void SetBeginningDate(int AYear,int AMonth,int ADay);
 
    int Up(int,int,int);
    int Low(int,int,int);
    int Week(int,int,int);
};
А теперь cpp
Main пока не писал
Код:
#include "stdafx.h"
#include "stdio.h"
#include <cmath>
#include <stdlib.h>
#include "SemCalendar.h"
 
СSemCalendar::СSemCalendar()
{
    m_beg_year=1;
    m_beg_month=1;
    m_beg_day=1;
 
    m_month_days[0]=31;
    m_month_days[1]=28;
    m_month_days[2]=31;
    m_month_days[3]=30;
    m_month_days[4]=31;
    m_month_days[5]=30;
    m_month_days[6]=30;
    m_month_days[7]=31;
    m_month_days[8]=30;
    m_month_days[9]=31;
    m_month_days[10]=30;
    m_month_days[11]=31;
}
 
СSemCalendar::~СSemCalendar()
{}
 
 
int Up(int Add,int Amm,int Ayy)
{
 
}
 
int Low(int Add,int Amm, int Ayy)
{
 
}
 
int Week(int Add, int Amm, int Ayy)
{
    
}
 
 
//  ************Get Методы************ 
 
void СSemCalendar::GetDate (char *buf)
{
      //здесь не проверяем, чтобы в переданном буфере было достаточно
        //  памяти: передать правильный буфер должна программа,
        //  которая вызвала этот метод;
        //как известно, сама функция sprintf исходит из тех же соображений
        sprintf(buf,"%02d.%02d.%04d",m_beg_day,m_beg_month,m_beg_year);
}
 
// Взять номер дня
int СSemCalendar::GetDay()
{
return m_beg_day;  
}
// Взять номер месяца
int СSemCalendar::GetMonth()
{
    return m_beg_month;
}
// Взять номер года
int  СSemCalendar::GetYear ()
{
    return m_beg_year;
}
 
//************Set Методы************
 
// Установить день по его номеру
int СSemCalendar::SetDay  (int ADay)
      {
        //проверяем корректность исходных данных
        if(ADay>=1&&ADay<=m_month_days[m_beg_month-1])
        { //данное корректно - устанавливаем его
          m_beg_day=ADay;
          return 1;
        }
        else
          return 0; //данное содержит в себе ошибку
      }
 //установить месяц по его номеру
 
int СSemCalendar::SetMonth(int AMonth)
      {
        //проверяем корректность исходных данных
        if(AMonth>=1&&AMonth<=12)
        { //данное корректно - устанавливаем его
          m_beg_month=AMonth;
          return 1;
        }
        else
          return 0; //данное содержит в себе ошибку
      }
 
 //установить год по его номеру
int СSemCalendar::SetYear (int AYear)
      {
        //проверяем корректность исходных данных
        if(AYear>=1&&AYear<=9999)
        { //данное корректно - устанавливаем его
          m_beg_year=AYear;
          //в зависимости от того, является ли текущий год високосным,
          //  нужно установить количество дней в феврале месяце
          if(m_beg_year%4==0&&m_beg_year%100!=0||m_beg_year%400==0)
            m_month_days[1]=29; //високосный
          else
            m_month_days[1]=28; //обычный
          return 1;
        }
        else
          return 0;  //данное содержит в себе ошибку
      }
Что писать в методах Up, week, Low?
Помогите их описать с объяснениями.

Заранее благодарен
Praud вне форума Ответить с цитированием
Старый 16.05.2013, 15:26   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Для даты внутри семестра определить, является ли текущая учебная неделя верхней или нижней и посчитать ее номер.
Приведите определения "верхней недели", "нижней недели".
Abstraction вне форума Ответить с цитированием
Старый 16.05.2013, 15:27   #3
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

К примеру верхняя неделя имеет одно расписание, а нижняя другое.
Praud вне форума Ответить с цитированием
Старый 16.05.2013, 15:29   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
К примеру верхняя неделя имеет одно расписание, а нижняя другое.
Это определение?! Пусть занятия начались 1.9.2011, текущая дата - 12.12.2011. Принадлежит ли она верхней неделе? Почему?
Abstraction вне форума Ответить с цитированием
Старый 16.05.2013, 15:33   #5
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

Извиняюсь, я просто очень устал вот и туплю.
Недели чередуются.
То есть 1.9.2011 - верхняя, а 8.9.2011 нижняя.
Как я понимаю я должен сам решить с какой недели начать.
Praud вне форума Ответить с цитированием
Старый 16.05.2013, 15:46   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Извиняюсь, я просто очень устал вот и туплю.
Недели чередуются.
То есть 1.9.2011 - верхняя, а 8.9.2011 нижняя.
Как я понимаю я должен сам решить с какой недели начать.
Вы не ответили на мой вопрос. Представьте, что я - очень тупой. Принадлежит ли в описанном мной случае дата 12.12.2011 к верхней неделе? Почему?
Abstraction вне форума Ответить с цитированием
Старый 16.05.2013, 15:57   #7
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

Метод такой.
1 сентября - начало учебного года. Предположим, что это верхняя неделя.
Чередуем местами верхнюю и нижнюю с 1 сентября до вашей даты, к примеру в вашем случае 12.12.2011 и получаем что это будет нижняя неделя.
Может можно проще, но я пока не догадался как
Praud вне форума Ответить с цитированием
Старый 16.05.2013, 16:22   #8
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Чередуем местами верхнюю и нижнюю с 1 сентября до вашей даты, к примеру в вашем случае 12.12.2011 и получаем что это будет нижняя неделя.
Ок. Задача: написать функцию, которая прибавляет к текущей дате одну неделю. Советую передавать не три int-а, а структуру вроде
Код:
struct Date{
  int day;
  int month;
  int year;
};
Если позволяется условиями задачи, я бы вообще использовал либо стандартный тип time_t, либо std::chrono::time_point. Если нельзя, то Вам придётся реализовывать все соответствующие нюансы вручную (т.е. написать функцию AddDays, прибавляющую к дате заданное количество дней либо функцию DaysDiff, считающую разность в днях между датами, функцию IsDateLess, проверяющую, меньше ли одна дата, чем другая и т.д.)
Обратите внимание, что условие задачи позволяет начало семестра в декабре, так что при начале семестра в декабре 2011 года февраль этого семестра содержит 29 дней.
Abstraction вне форума Ответить с цитированием
Старый 16.05.2013, 16:47   #9
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

Функции up, week, low являются обязательными.
А вот функция AddDays
Код:
AddDays(int p)
	{
		m_day=m_day+p;

		while(m_day > m_month_days[m_month-1])
		{
			m_day = m_day - m_month_days[m_month-1];
			m_month++;

			if(m_month > 12)
			{
				m_month=m_month-12;
				m_year++;
			}
		}
	}
Я вот не пойму зачем мне 3 функции эти. И что в них писать?
Praud вне форума Ответить с цитированием
Старый 16.05.2013, 17:03   #10
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
А вот функция AddDays
Это функция другого Вашего класса? Ну отлично. Теперь берёте копию даты начала занятий и прибавляете по неделе, пока дата не станет меньше заданной, параллельно чередуя признак недели, например.
Код:
CDate date(day, month, year);
CDate start = m_sem_beginning;
int weekType = 0;
while(IsLessDate(start, date)){
  weekType = 1-weekType;
  start.AddDate(7);
}
Abstraction вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C #. Простейшие классы. Инкапсуляция и свойства. Elena04 Помощь студентам 1 07.11.2012 20:59
Простейшие классы. Инкапсуляция и свойства. Elena04 C# (си шарп) 1 07.11.2012 19:16
Инкапсуляция keksik Общие вопросы Delphi 1 06.04.2012 20:21
Инкапсуляция. Классы и их компоненты. Объекты gessi Общие вопросы C/C++ 0 09.09.2010 16:05
Инкапсуляция Syltan Общие вопросы C/C++ 21 08.10.2009 17:03