|
|
|
Forum Member
      
участник
Last Login: 21.10.2006 17:09
Сообщ.: 27,
Visits: 231
|
|
Собссно, сабж и есть, покритикуйте пожалуйста мой код, подскажите, что где неправильно...т.е нерационально, чем можно заменить, что лучше использовать...Чтобы учится на ошибках надо их знать...
void CDLineDlg::OnOK() { UpdateData (TRUE); CString out; CTimeSpan diff; CTime currt = CTime::GetCurrentTime();
int nD = currt.GetDay(); int nM = currt.GetMonth(); int nY = currt.GetYear();
int drD = m_DTP.GetDay(); int drM = m_DTP.GetMonth(); int drY = m_DTP.GetYear();
int difY=nY-drY; int difM=nM-drM; int difD=nD-drD;
if (difY>50) { MessageBox("C введённой вами даты прошло больше 50 лет! На фига вам линеечка!","Ошибка!!!",MB_OK); } if ((nY { MessageBox("Указанная вами дата не должна быть больше сегодняшнего числа","Ошибка!!!",MB_OK); }
else { if ((difM 0)) { difY=difY-1;difM=difM+12; } if ((difD { bool vis =checkvisokos(nY); int res= dayInMonth(nM-1,nY,vis); difY=difY-1; difM=difM+12; difM=difM-1; difD=difD+res; }
if ((difD 0)) { bool vis =checkvisokos(nY); int res= dayInMonth(nM-1,nY,vis); difM=difM-1; difD=difD+res; }
CString out =Out(difY,difM,difD,m_Sig); MessageBox(out,"zuzu",MB_OK);
}
} int CDLineDlg::dayInMonth(int numb_month, int year,bool visflag) { int dIm =0;
if ((numb_month==1)||(numb_month==3)||(numb_month==5)||(numb_month==7)||(numb_month==8)||(numb_month==10)||(numb_month==12)) { dIm=31; } else if ((numb_month==4)||(numb_month==6)||(numb_month==9)||(numb_month==11)) { dIm=30; } else if (visflag==true) { dIm=28; } else { dIm=29; } return dIm;
}
bool CDLineDlg::checkvisokos(int god) { int r; div_t divr; divr=div(god,4); r=divr.rem; if ( r ==0) { return true; } else { return false; } }
int CDLineDlg::whattype(int c) { int type; if ((c==1)||(c==21)||(c==21)||(c==31)||(c==41)||(c==51)) { type=1;//ед.число } else if ( ((c>=5)&&(c=25)&&(c=35)&&(c=45)&&(c { type =3;//мн.число } else { type= 2;//род.падеж }
return type; }
CString CDLineDlg::Out(int resY,int resM,int resD, CString sig) { CString sdifY,sdifM,sdifD,output;
sdifY.Format("%d", resY); sdifD.Format("%d", resD); sdifM.Format("%d", resM);
output=sig+":";
if (resY!=0) { int Yt = whattype(resY); switch (Yt) { case 1: {output+=sdifY+" год ";break;} case 2: {output+=sdifY+" года ";break;} case 3: {output+=sdifY+" лет ";break;} } }
if (resM!=0) { int Mt = whattype(resM); switch (Mt) { case 1: {output+=sdifM+" месяц и ";break;} case 2: {output+=sdifM+" месяца и ";break;} case 3: {output+=sdifM+" месяцев и ";break;} } }
if (resD!=0) { int Dt = whattype(resD); switch (Dt) { case 1: {output+=sdifD+" день.";break;} case 2: {output+=sdifD+" дня.";break;} case 3: {output+=sdifD+" дней.";break;} } }
return output; }
|
|
|
|
|
Supreme Being
      
непров.участник
Last Login: 08.07.2008 15:52
Сообщ.: 1 131,
Visits: 8 867
|
|
| Вот так считается число дней в феврале: if (year mod 4 != 0) {use 28 for days in February} else if (year mod 400 == 0) {use 29 for days in February} else if (year mod 100 == 0) {use 28 for days in February} else {use 29 for days in February} На VB6: Private Function GetFebDays(ByVal pintYear As Integer) As Integer Dim intReturn As Integer If pintYear Mod 4 <> 0 Then intReturn = 28 ElseIf pintYear Mod 400 = 0 Then intReturn = 29 ElseIf pintYear Mod 100 = 0 Then intReturn = 28 Else intReturn = 29 End If GetFebDays = intReturn End Function Успехов
|
|
|
|
|
Forum Member
      
участник
Last Login: 21.10.2006 17:09
Сообщ.: 27,
Visits: 231
|
|
VladConn (01.08.2006)
Вот так считается число дней в феврале: if (year mod 4 != 0) {use 28 for days in February} else if (year mod 400 == 0) {use 29 for days in February} else if (year mod 100 == 0) {use 28 for days in February} else {use 29 for days in February} Спасибо, только чёт ничего не понятно - зачем сначала mod 4, потом 400, потом 100...А чем этот код лучше?
|
|
|
|
|
Supreme Being
      
непров.участник
Last Login: 08.07.2008 15:52
Сообщ.: 1 131,
Visits: 8 867
|
|
| А тем, что если год делится нацело на 4, то это совсем не значит, что он будет високосным...
|
|
|
|
|
Forum Member
      
участник
Last Login: 21.10.2006 17:09
Сообщ.: 27,
Visits: 231
|
|
|
|
|
|
Forum Member
      
участник
Last Login: 21.10.2006 17:09
Сообщ.: 27,
Visits: 231
|
|
| только mod -это видимо VB -шное ...тут наверное надо modf()
|
|
|
|
|
Supreme Being
      
непров.участник
Last Login: 08.07.2008 15:52
Сообщ.: 1 131,
Visits: 8 867
|
|
|
|
|
|
Supreme Being
      
модератор
Last Login: 10.11.2008 0:08
Сообщ.: 1 298,
Visits: 12 501
|
|
В C++ есть оператор "остаток от деления" :)
Например,
int mod = 5 % 3;
Удачи,
Владимир
|
|
|
|
| | |