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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
kazakovtsev
0 / 0 / 0
Регистрация: 20.02.2013
Сообщений: 24
#1

Как расставить правильно шаблоны класса в готовый код - C++

10.06.2013, 14:41. Просмотров 218. Ответов 0
Метки нет (Все метки)

У меня есть готовый код, он полностью работает, писался для задачи на класс календарных дат. В 3 файлах: main.cpp , myclass.cpp , myclass.h
Теперь препод говорит, что надо добавить шаблоны классов. А я не знаю, как и куда их добавлять. Пытался - запорол весь код, ничего не работало. Лучше подскажите мне вы, знающие люди.

Файл myclass.h
C++ (Qt)
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include<stdio.h>
#include<iostream.h>
#include<iomanip.h>
class data
{
 private:
int day, month, year;
 
 public:
  bool check();
 
  static int type;
  data(int d=1, int m=1, int y=2001);
  friend ostream& operator<<(ostream& out,data &c);
  friend istream& operator>>(istream& in, data &c);
  friend bool operator == (const data&, const data &);
  friend int operator - (const data&, const data &);
  friend bool operator < (const data&, const data &);
  int DateToDays();
  data DaysToDate(int);
  void increase(int);
  void decrease(int);
};
 
ostream& operator << (ostream& out,data &c)
{
        switch (c.type)
        {
            case 1:return out<<setw(2)<<setfill('0')<<c.day<<'/'
                    <<setw(2)<<setfill('0')<<c.month<<'/'
                    <<setw(4)<<setfill('0')<<c.year;   break;
            case 2:return out<<setw(2)<<setfill('0')<<c.month<<'/'
                    <<setw(2)<<setfill('0')<<c.day<<'/'
                    <<setw(4)<<setfill('0')<<c.year;  break;
            case 3:cout<<setw(2)<<setfill('0')<<c.day<<'-';
                switch (c.month)
                {
                    case 1:cout<<"JAN-";break;
                    case 2:cout<<"FEB-";break;
                    case 3:cout<<"MAR-";break;
                    case 4:cout<<"APR-";break;
                    case 5:cout<<"MAY-";break;
                    case 6:cout<<"JUN-";break;
                    case 7:cout<<"JUL-";break;
                    case 8:cout<<"AUG-";break;
                    case 9:cout<<"SEP-";break;
                    case 10:cout<<"OCT-";break;
                    case 11:cout<<"NOV-";break;
                    case 12:cout<<"DEC-";break;
                }
                return out << setw(4) << setfill('0') << c.year;
        }
}
 
istream& operator >> (istream& in, data &c)
{
 
 char str[100],*tPtr;
 
 
in.getline(str,100,'\n');
 
    switch (c.type)
    {
        case 1:
     tPtr=strtok(str,".");
     c.day=atoi(tPtr);
 
     tPtr = strtok(NULL,".");
     c.month=atoi(tPtr);
 
     tPtr = strtok(NULL,".");
     c.year=atoi(tPtr);
    break;
        case 2:
   tPtr=strtok(str,"/");
     c.month=atoi(tPtr);
 
     tPtr = strtok(NULL,"/");
     c.day=atoi(tPtr);
 
     tPtr = strtok(NULL,"/");
     c.year=atoi(tPtr);
    break;
        case 3:
   tPtr=strtok(str,"-");
     c.day=atoi(tPtr);
 
     tPtr = strtok(NULL,"-");
     c.month=atoi(tPtr);
 
     tPtr = strtok(NULL,"-");
     c.year=atoi(tPtr);
    break;
    }
 
     return in;
 
 
 
}

Файл myclass.cpp
C++ (Qt)
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#include "myclass.h"
 
 int mDays[12]={31,28,31,30,31,30,31,31,30,31,30,31};
 
data::data(int d, int m, int y)
{
    month = m;
    if (m > 12)
    {
        while (m > 12)
        {
            cout << "Input month <= 12! \n" << "Month: ";
 
            cin >> m;
        }
        month = m;
     }
     if ((m == 1) || (m == 3) || (m == 5) || (m == 7) || (m == 8) || (m == 10) || (m == 12))
     {
        while (d > 31)
        {
            cout << "Input day <= 31! \n" << "Day: ";
            cin >> d;
        }
        day = d;            
     }
     if ((m == 4) || (m == 6) || (m == 9) || (m == 11))
     {
        while (d > 30)
        {
            cout << "Input day <= 30! \n" << "Day: ";
            cin >> d;
        }
        day = d;
     }
 
     if ((y%4==0 && y%100!=0)&& m==2)
     {
        while (d > 29)
        {
            cout << "Input day <= 29! \n" << "Day: ";
            cin >> d;
        }
        day = d;   
     }
 
     if ((y%4!=0 && y%100==0)&& m==2)
     {
        while (d > 28)
        {
            cout << "Input day <= 28! \n" << "Day: ";
            cin >> d;
        } 
        day = d;         
     } 
     year = y;
 
 
  }
 
 
 
  bool operator == (const data& A,const data& B)
{
    if (A.day==B.day && A.month==B.month && A.year==B.year) return true;
    return false;
}
 
bool operator < (const data& A, const data& B)
{
if (A.year<B.year || (A.year==B.year && A.month<B.month) || (A.year==B.year && A.month==B.month && A.day<B.day))
return true;
 else return false;
}
 
 
 
int data::DateToDays()
{
int tmp = month<=2 && ((year%4==0 && year%100!=0) || year%400==0) ? 1 : 0;
//расчет дней для заданного года с учетом високосных лет
  int days = (year/4)-(year/100)+(year/400) + year*365 - tmp;
 
  //расчет дней в месяцах заданного года
  for(int i=0; i<month-1; i++)
    days+=mDays[i];
 
  //добавление дней последнего месяца
  days+=day;
  return days;
}
 
data data::DaysToDate(int days)
{
  int d=1, m=1, y=0, exception=28;
 
  while ( days > mDays[m-1] ) {
    //определение високосного года
    if ( (y%4==0 && y%100!=0) || y%400==0 ) exception=29;
    else exception=28;
 
    while (m!=13 && days > mDays[m-1]) {
      if (m!=2)  //учет високосного года
        days -= mDays[m-1];
      else
        days -= exception;
 
      m++;
    }
    if(m==13) m=1;
    if(days > mDays[m-1])y++;
  }
   //определение числа месяца из оставшихся дней
  d+=days;
 
  data newDate(d,m,y);
 
  return newDate;
}
 
 
void data::increase(int dt)
{
data incDate;
incDate= DaysToDate(DateToDays() + dt );
this->day=incDate.day;
this->month=incDate.month;
this->year=incDate.year;
}
 
void data::decrease(int dt)
{
data DecDate;
DecDate= DaysToDate(DateToDays() - dt );
this->day=DecDate.day;
this->month=DecDate.month;
this->year=DecDate.year;
}
 
 
int operator - (const data& F, const data& G)
{
  int dd=G.DateToDays()-F.DateToDays();
  return dd>0 ? dd : -dd;
}
 
 
 bool data::check()
{
if(!(year%4==0 && year%100!=0))   {
    if (month==2 && day==29) return true;
    else return false;           }
}
Файл main.cpp
C++ (Qt)
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//---------------------------------------------------------------------------
#include "myclass.h"
#pragma hdrstop
#include "iostream.h"
//---------------------------------------------------------------------------
 
#pragma argsused
int data::type;
int main(int argc, char* argv[])
{
    int day, month, year;
    cout << "Please make a choose the format of data: \n";
    cout << "1: DD.MM.YYYY \n2: MM/DD/YYYY \n3: DD-mon-YYYY \n";
    cin>>data::type;
 
    cout << "Input day, month and year of 1st date: ";
    cin >> day >> month >> year;
    data u(day, month, year);
 
    cout << u;
 
    cout << "\nInput day, month and year of 2nd date: ";
    cin >> day >> month >> year;
    cin.get();
    data r(day, month, year);
    cout << r;
 
 
    if (u == r) cout << "\nDates are equal";
    else cout << "\nDates aren't equal";
    char str[25];
 
   cout << "\nInput first date: ";
    cin>>u;
    while (u.check()==true) {
    cout<<"\nIncorrect Date, re-enter date: ";
    cin>>r;
    }
    cout<<u;
 
 
   cout << "\nInput second date: ";
    cin>>r;
    while (r.check()==true) {
    cout<<"\nIncorrect Date, re-enter date: ";
    cin>>r;
    }
    cout<<r;
    int v=u - r;
    cout << "\nBetween two dates ";
    cout << v <<" days ";
    bool x=u < r;
    if (x==1)  cout << "\n1-st date < 2-nd date\n" << endl;
        else cout << "\n1-st date > 2-nd date\n" << endl;
 
 
 
    int n;
    cout<<"\nEnter inc/dec  dt: ";
    cin>>n;
    cout<<"\nIncrease 1-st Date (+"<<n<<" days) - ";
    u.increase(n);
    cout<<u;
 
    cout<<"\nDecrease 2-nd Date (-"<<n<<" days) - ";
    r.decrease(n);
    cout<<r;
 
    int l,m;
   l=u.DateToDays();      
   m=r.DateToDays();
         cout <<endl<< l;     //проверка ф-ии DateToDays
          cout << "\n"<<m;
     getchar();
    getchar(); getchar();
    return 0;
}
//---------------------------------------------------------------------------
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.06.2013, 14:41     Как расставить правильно шаблоны класса в готовый код
Посмотрите здесь:

Как правильно вызывать конструктор шаблонного класса? C++
Готовый код.Подскажите,как ограничить ввод строки. C++
Готовый код.Как перестроить структуру под класс.wxDex-C++ C++
C++ Есть готовый код C++ (Code Composer Studio). Копирование матрицы. Как исправить ошибки?
как написать готовый код паскаль на с++? C++
Не разбиваются шаблоны класса на файлы C++
Шаблоны функций как исправить код? C++
C++ Как правильно использовать классы? Как вывести значение класса на экран?
Деструктор класса. Как правильно очистить память? C++
Шаблоны методов класса C++
C++ Шаблоны и функторы как callback для класса свойства объекта. Код работает - но не должен
C++ Раздельная компиляция и шаблоны: как правильно использовать?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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