Найти ошибки

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Найти ошибки

Сообщение Gul » 26.04.2014 23:42:48

Дан код, в котором не синтаксических ошибок.Нужно найти и исправить признаки плохого кода(например:Дублирование,сложность методов).Как можно избавиться от большого количества условии IF ,WHILE
Код: Выделить всё
1   var
2     ...
3   begin
4     ...
5
6     Result:= Date;
7     K:= Abs(Number);
8
9    // Если дата не задана – прервать вычисления
10     if Date = ''
11     then
12       Exit();
13   
14    // Если разница равна 0, не изменять дату
15     if K = 0
16     then
17     Result:= Date
18     else
19     begin
20     // Определить знак разницы
21     if Number > 0 then Sign:= 1 else Sign:= -1;
22   
23     // Цикл по количеству дней
24     I:= 1;
25     Date2:= Date;
26     while I <= K do
27     begin
28     Date2:= DateAdd('d'; Date2; Sign);
29     Holiday:= DateIsHoliday(Date2);
30    // Пока день выходной или праздничный, увеличивать общее количество дней на 1   
31     while Holiday = True do
32     begin
33     inс(K);
34     inс(I);
35     Date2:= DateAdd('d'; Date2; Sign);
36     Holiday:= DateIsHoliday(Date2);
37     end
38     inс(I); 
39     end
40     Result:= Date2;
41     end
42   end
Gul
незнакомец
 
Сообщения: 1
Зарегистрирован: 26.04.2014 23:32:33

Re: Найти ошибки

Сообщение Дож » 27.04.2014 00:53:54

Где-то это я уже видел :) (И там утром у внутреннего цикла Holiday проверялся на False, а не на True.)

Дан код, в котором не синтаксических ошибок.

Есть, и много. Параметры функций должны отделятся запятой, а не точкой с запятой, в конце внешнего while должна быть точка с запятой, не говорю уже о том, что функция inc пишется через английскую букву «си», а не кириллическую «эс» :wink:

Мой вариант улучшений, которые можно сделать, не зная остальной программы:
Код: Выделить всё
var
  ...
begin
  ...

  Result:= Date;
  K:= Abs(Number);

  // Если дата не задана или K=0 – прервать вычисления
  if (Date = '') or (K = 0) then
    Exit();

  // Определить знак разницы
  if Number > 0 then Sign:= 1 else Sign:= -1;

  // Цикл по количеству дней
  Date2:= Date;
  // Увеличиваем дату, пока K не станет равным 0
  while K > 0 do begin
    Date2:= DateAdd('d'; Date2; Sign);
    Holiday:= DateIsHoliday(Date2);
    // Уменьшаем K в непраздничные дни
    dec(K, Ord(not Holiday));
  end;
  Result:= Date2;
end


P.S. Трэш какой-то. Gul ассоциируется с Гульмэном.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru