Форум программистов, компьютерный форум CyberForum.ru

Класс "дата", расчет дней недели - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.75
Злобный
2 / 2 / 0
Регистрация: 18.09.2010
Сообщений: 43
19.12.2010, 03:00     Класс "дата", расчет дней недели #1
Всем доброй ночи, всех с наступающим.
Прошу помочь программкой.
Задание: Саздайте класс "дата", в котором будут храниться три числа - год, месяц, число. В классе содержатся методы: (1) конструктор, задающий начальные значения, (2) деструктор, сообщающий об удалении объекта, (3) метод "изменить" с тремя параметрами, задающими новые значения, (4) метод "печать", выводящий дату, (5) метод "вычисление", выводящий день недели заданной даты.
Вот, что получилось:
MAIN.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <cstdlib>
#include <iostream>
 
using namespace std;
#include "Date1.h"
#include "Date2.cpp" 
 
void enter(int &,int &,int &);  //ввод трёх переменных
 
int main()           //ф-ия main
{
    int var, g, m, d;      //задание параметров var(выбор), g(год), m(месяц), d(день)
    char count='y';    //переменная повтора работы
    enter(g,m,d);     //ввод нач. переменных
    Date l(g,m,d);         //создание объекта Date1    
int OK;
do
 {
      cout<<"Возможны следующие методы:\n"<<endl;
      cout<<"  1. 'изменить'  , будет введена новая дата\n";
      cout<<"  2. 'печать'  , будет выведена дата\n";
      cout<<"  3. 'вычисление', будет вычислен день недели";
      cout<<"Выберите метод 1-3, = ";
      cin>>var;  //ввод выбора 
      if((var>3)||(var<1))cout<<"Ошибка ввода!"; //если введено не 1..3
      else
      {
          switch(var) //start swich 
          {
               case 1:
                    enter(g,m,d);    //ввод данных
                    l.change(g,m,d);  //смена даты
                    break;           //сделано
               case 2:
                    cout<<"Сейчас  "; l.print();   //печать даты
                    cout<<endl;
                    break;
               case 3: 
                    l.process(); //вычисление
                    break;
                   
          } //end switch
      }
      
  cout<<"повторить?(1/0)"<<endl;
  cout<<"1-да; "<<"0-нет"<<endl;
   cin>>OK;
    }
    while(OK==1);
    system("pause");
    return 0;        
}
 
void enter(int &a,int &b,int &c)
{
    cout<<"введите год = ";
    cin>>a;
    cout<<"введите месяц = ";
    cin>>b;
    cout<<"введите число = ";
    cin>>c;
    return;
}
DATE1.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//header
#ifndef DATE1_H
#define DATE1_H
 
 
class Date
{
 
public:
       Date(int, int, int); //конструктор
       ~Date();             //деструктор
       void change( int, int, int);   //меняем дату
       void print();                //печать
       void process();              //расчет
 
       
private:
        int year; //ввод года
        int month;//ввод месяца
        int day;//ввод числа
      
        
};      //
 
#endif
DATE2.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//опр. методов
#include<iostream>
using std::cout;
using std::endl;
 
#include<iomanip>
 
using std::setfill;
using std::setw;
 
#include "Date1.h"  //вкл. класс DATE
//конструктор
Date::Date(int a, int b, int c)
{
 change(a,b,c);  //присваиваем значения
}
//деструктор
Date::~Date()
  {
     cout<<"Объект удален!";
  } 
  /////////////////////////////////////////////////////////
void Date::change( int g, int m, int d )   //ставим дату
{
   if(g>0)year=g; else year=0;
   if(m>1&&m<13)month=m; else month=0;
   if(d>1&&d<32)day=d; else day=0;
}
 
void Date::print()
{
     const char* mon[12]={"янв", "фев","мар","апр","май","июн","июл","авг","сен","окт","ноя", "дек"};
     cout << year << " год "
          << mon [month-1]
          << day<< " день";
}
 
void Date::process()
{
     int x;
     const char* ar[7]={"пон","вт", "ср", "чт", "пт", "сб", "вс"};//дни недели
int a=(14-year)/12;
int ye =year-a+1;
int mo=month+(month*12)-2;
x =(7000+(day+ye+(ye/4)-(ye/100)+(ye/400)+(31*mo)/12)) % 7;
 
std::cout<<x+1<<" день недели это "<< ar[x]<<endl;
}
Проблемы:
1. алгоритм расчета дней недели нашел в гугле... На вчера-сегодня-завтра работает, повбивал разные - ни разу с календарем не совпало.
2. как сделать так, чтобы реальные дни были(не по 31 в месяц, а 31 янв, 28 февр+29 если високос, 31 март и т.д.)? Пробовал через массив в классе - фигня получается(
Надеюсь на Вашу помощь)
Спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2010, 03:00     Класс "дата", расчет дней недели
Посмотрите здесь:

Написать программу, которая запрашивает у пользователя номер дня недели и выводит одно из сообщений: "Рабочий день","Суббота" или "Воскресенье" C++
C++ Наследуемым классом для комплексного числа объявить класс "радиус-вектор", имеющий данные "длина" и "угол"
C++ Написать программу которaя запрашиваeт у пользователя номер дня недели, затем выводит одно из сообщений "рабочий день", "суббота", "воскресенье"
Создать класс "Дата" с конструкторами, деструктором, указанными методами. Выполнить перегрузку указанных операторов C++
C++ Из класса "Дата" с полями день, месяц, год создать класс "Время" с дополнительными полями час, минута, секунда
C++ Класс "Графический объект", от которого будут наследоваться классы "круг" и "квадрат"
C++ Класс "Дата", перегрузка операций
Класс "Дата": день, месяц, год C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.12.2010, 05:54     Класс "дата", расчет дней недели #2
Формула Зеллера. Пример: http://www.cyberforum.ru/cpp-beginne...46-page45.html
eYneS
0 / 0 / 0
Регистрация: 17.11.2016
Сообщений: 1
17.11.2016, 00:42     Класс "дата", расчет дней недели #3
#include<iostream>
#include<cmath>
#include<Windows.h>
using namespace std;

//1. Вводится день месяца,месяц и год
//Предусловие - вводятся даты:день месяца, месяц и год. Они должны соответствовать условиям нашей проверки
//Постусловие - вывести день недели, операясь на формулу Зеллера
cout << "Zeller's Algorithm.\n ";
int d_m, m, y, d_w;
xyz:cout << "\n";
cout << "Day of month-->\n";
cin >> d_m;
cout << "Month\n";
cin >> m;
cout << "Year-->\n";
cin >> y;

//1.Проверка ввода значений
if ((d_m>31||m>12||y<0)||(m==1&&d_m>31)|| (m == 2 && d_m>29)|| (m == 3 && d_m>31)|| (m == 4 && d_m>30)|| (m == 5 && d_m>31)
|| (m == 6 && d_m>30)|| (m == 7 && d_m>31)|| (m == 8 && d_m>30)|| (m == 9 && d_m>31)|| (m == 10 && d_m>30)
|| (m == 11 && d_m>31)|| (m == 12 && d_m>30))//защита от дурака
{
MessageBox(0, L"Некорректное значения!", L"Информация", MB_RETRYCANCEL | MB_ICONERROR);
goto xyz;
}

//2. Реализуем формулу Зеллера(год начинается с марта)

if (y > 1582) {//проверка на григорианский календарь
if (m == 1||m==2) {
m += 12;
y -= 1;
}
d_w = (d_m + (int)((13 * (m +1)) / 5) + y % 100 + (int)((y % 100) / 4) + (int)((y / 100) / 4) + 5 * (y / 100)) % 7;
}
else
{

d_w = (d_m + (int)((13 * (m + 1)) / 5) + y % 100 + (int)((y % 100) / 4) + 5 + 6 * (y / 100)) % 7;
}


//3. Определим день недели
switch (d_w) {

case 0:
cout << " is a Saturday\n ";
break;
case 1:
cout << " is a Sunday\n ";
break;
case 2:
cout << " is a Monday\n ";
break;
case 3:
cout << " is a Tuesday\n ";
break;
case 4:
cout << " is a Wednesday\n ";
break;
case 5:
cout << "is a Thursday \n ";
break;
case 6:
cout << " is a Friday\n ";
break;
default:
cout << "Error! Something happend\n";
goto xyz;
}

return 0;
}
Yandex
Объявления
17.11.2016, 00:42     Класс "дата", расчет дней недели
Ответ Создать тему
Опции темы

Текущее время: 14:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru