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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.83
Stesh
0 / 0 / 0
Регистрация: 30.04.2010
Сообщений: 27
#1

Оформление и оптимизация кода - C++

01.08.2006, 19:09. Просмотров 2991. Ответов 12
Метки нет (Все метки)

Собссно, сабж и есть, покритикуйте пожалуйста мой код, подскажите, что где неправильно...т.е нерационально, чем можно заменить, что лучше использовать...Чтобы учится на ошибках надо их знать...
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
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
154
155
156
157
158
159
160
161
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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2006, 19:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Оформление и оптимизация кода (C++):

Оформление кода - C++
Здравствуйте, программно получаю строки с неоформленным html кодом, можно ли как-то строки программно обрабатывать и придавать html коду...

Правильное оформление кода - C++
Возникло несколько вопросов по оформлению 1. Важны ли комментарии к коду? 2. Предположим, есть у меня три класса. Выполняют разную...

Оформление кода на С++ (стандарты кодирования) - C++
Добрый день, написал лабораторную на с++, а преподаватель не хочет принимать из-за стандартов оформления, дак вот, как привести программу к...

Оформление выполненного кода в виде шаблона функции - C++
Задание: в одномерном массиве, состоящем из n вещественных элементов, вычислить: 1) максимальный элемент массива; 2) сумму...

Оптимизация кода - C++
main: #include <iostream> #include <conio.h> #include "keyBuffer.h" #include "pause.h" #include <windows.h> const char...

Оптимизация кода - C++
Здравствуйте! у меня есть такая функция, которая очень часто вызывается: int fun(int x_,int y_,int z_) { for(int k=0;k<80;k++) {...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
VladConn
1 / 1 / 2
Регистрация: 17.10.2007
Сообщений: 1,119
01.08.2006, 20:13 #2
Вот так считается число дней в феврале:
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:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
Успехов
Stesh
0 / 0 / 0
Регистрация: 30.04.2010
Сообщений: 27
01.08.2006, 22:14  [ТС] #3
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...А чем этот код лучше?
VladConn
1 / 1 / 2
Регистрация: 17.10.2007
Сообщений: 1,119
01.08.2006, 22:27 #4
А тем, что если год делится нацело на 4, то это совсем не значит, что он будет високосным...
Stesh
0 / 0 / 0
Регистрация: 30.04.2010
Сообщений: 27
01.08.2006, 22:58  [ТС] #5
тьфу, точно...
Stesh
0 / 0 / 0
Регистрация: 30.04.2010
Сообщений: 27
01.08.2006, 23:28  [ТС] #6
только mod -это видимо VB -шное ...тут наверное надо modf()
VladConn
1 / 1 / 2
Регистрация: 17.10.2007
Сообщений: 1,119
02.08.2006, 00:11 #7
Видимо...
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
02.08.2006, 22:49 #8
В C++ есть оператор "остаток от деления"

Например,

int mod = 5 % 3;



Удачи,

Владимир
Stesh
0 / 0 / 0
Регистрация: 30.04.2010
Сообщений: 27
02.08.2006, 23:30  [ТС] #9
ага, спасибо ...я так и сделала:
C++
1
2
3
4
if (god % 400 == 0 || god % 4 == 0 && god % 100 != 0)
    { return true;} 
else 
    {return false;}
VladConn
1 / 1 / 2
Регистрация: 17.10.2007
Сообщений: 1,119
02.08.2006, 23:52 #10
Stesh,
Вы уверены в правильности вашего кода? Логика должна быть такой:
Если год делится на 400, то он високосный. Иначе, если он делится на 100 или не делится на 4, то невисокосный. Иначе - високосный.
Т.е. важен порядок проверки. У вас там он не указан. Скобок по-моему маловато. Я бы сделал через последовательность If-ов.
Vadim_ig
0 / 0 / 0
Регистрация: 05.01.2010
Сообщений: 235
21.08.2006, 17:51 #11
to VladConn
Что-то я никак логики рассчета високостного года не пойму, разве не каждый четвертый? (всегда думал так).

300-й получается не високостный (не делится на 400, но делится на 100), а 296, 304 и 400-й - високостные??? Или каждые 400 лет високостный пропускается?


to Stesh
C++
1
2
3
4
5
6
7
int CDLineDlg::whattype(int c)
{
    int last = c % 10;
    if (lalt == 1) return 1;
    if (last >=5) return 3;
    return 2;
}
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
22.08.2006, 16:56 #12
Вадим, почитайете где-нибудь про разницу между Юлианским и Григорианским календарями, например вот здесь:

http://ru.wikipedia.org/wiki/Юлианский_календарь

http://ru.wikipedia.org/wiki/Григорианский_календарь



С уважением,

Владимир
Vadim_ig
0 / 0 / 0
Регистрация: 05.01.2010
Сообщений: 235
22.08.2006, 19:23 #13
Почитал. Действительно век живи век учись.
Ну и еще по сабжу
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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+":";
 
    static CString yearNames[] = {"год", "года", "лет"};
    static CString monthNames[] = {"месяц", "месяца", "месяцев"};
    static CString dayNames[] = {"день", "дня", "дней"};
 
    if (resY!=0)  output+=sdifY + yearNames[whattype(resY)] + " ";
    if (resM!=0) output+=sdifM + monthNames[whattype(resM)] + " ";
    if (resD!=0) output+=sdifD + dayNames[whattype(resD)] + " ";
 
    return output;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2006, 19:23
Привет! Вот еще темы с ответами:

Оптимизация кода - C++
Пожалуйста форумчане как можно сократить этот код Особенно от 27 до 90 строки #include &lt;iostream&gt; using namespace std; int main() ...

оптимизация кода! - C++
Народ я тут написал простенькую программу которая вычесляет x из уровнения вида a+x=b x+a=b a+b=x Тоесть пишешь например:...

Оптимизация кода (C++) - C++
Добрый вечер. У меня есть две функции. Вопрос:&quot;Как оптимизировать этот код, пользуясь тем, что тела отличаются лишь несколькими строчками?&quot;...

Оптимизация кода - C++
Как сравнить 2 строки. Вот как их задавал в ходе программы string h,b; ... char * text = NULL; if ( OpenClipboard(0) ) { ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.08.2006, 19:23
Ответ Создать тему
Опции темы

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