оформление и оптимизация кода
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



оформление и оптимизация кода Expand / Collapse
Автор
Сообщение
01.08.2006 15:09
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum 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;
}

Сообщ. #901853
01.08.2006 16:13
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme 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

Успехов

Сообщ. #901856
01.08.2006 18:14
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum 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...А чем этот код лучше?

Сообщ. #901864
01.08.2006 18:27
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

непров.участник
Last Login: 08.07.2008 15:52
Сообщ.: 1 131, Visits: 8 867
А тем, что если год делится нацело на 4, то это совсем не значит, что он будет високосным...
Сообщ. #901865
01.08.2006 18:58
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum Member

участник
Last Login: 21.10.2006 17:09
Сообщ.: 27, Visits: 231
тьфу, точно...
Сообщ. #901867
01.08.2006 19:28
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum Member

участник
Last Login: 21.10.2006 17:09
Сообщ.: 27, Visits: 231
только mod -это видимо VB -шное ...тут наверное надо modf()
Сообщ. #901868
01.08.2006 20:11
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

непров.участник
Last Login: 08.07.2008 15:52
Сообщ.: 1 131, Visits: 8 867
Видимо...
Сообщ. #901870
02.08.2006 18:49
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 10.11.2008 0:08
Сообщ.: 1 298, Visits: 12 501
В C++ есть оператор "остаток от деления" :)
Например,
int mod = 5 % 3;

Удачи,
Владимир
Сообщ. #901919