Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11679
Последний выпуск: 19.06.2015

Помогите в Delpfi

81K
29 мая 2012 года
boxerko
2 / / 22.05.2012
Составить процедуру, возвращающую значение TRUE, если в первом из двух заданных одномерных массивов длиной N количество отрицательных элементов окажется больше, чем во втором, и значение FALSE в противном случае.Использовать такую процедуру для двух заданных массивов и вывести результат ее работы.
285
29 мая 2012 года
sadovoya
757 / / 19.11.2005
Процедуру, так процедуру (хотя логичней было бы функцию):

Код:
procedure Compare(const inFirst, inSecond: Array of Integer; out Res: Boolean);
var
  szFirst, szSecond, I, countFirst, countSecond: Integer;
begin
  szFirst:= length(inFirst);
  szSecond:= length(inSecond);
  countFirst:= 0;
  countSecond:= 0;
  for I := 0 to szFirst - 1 do if inFirst[I] < 0 then countFirst:= countFirst + 1;
  for I := 0 to szSecond - 1 do if inSecond[I] < 0 then countSecond:= countSecond + 1;
  If countFirst > CountSecond then Res:= True else Res:= False;
end;
Она сама размер массива определяет. Можешь упростить - сделать просто цикл от 0 до N-1

Для проверки повесь на какой-нибудь обработчик след. код (здесь для Button1):


Код:
procedure TForm1.Button1Click(Sender: TObject);
const N = 3;
var
  CompRes: Boolean;
  F: Array[0..N-1] of Integer;
  S: Array[0..N-1] of Integer;
  I: Integer;
begin
    F[0]:=-1; F[1]:= 2; F[2]:=-3;
    S[0]:= -1; S[1]:= -2; S[2]:=-3;
    Compare(F,S,CompRes);
    if CompRes then ShowMessage('В первом больше')
    else ShowMessage('Больше во втором или поровну');
end;
244
30 мая 2012 года
misha_turist
572 / / 28.11.2005
countFirst:= countFirst + 1; и countSecond:= countSecond + 1; можно заменить на inc(countFirst); и inc(countSecond); соответственно.

записи аналогичны, только лишь второй вариант Теоретически работает быстрее :) да и читается легче.
285
30 мая 2012 года
sadovoya
757 / / 19.11.2005
Код:
procedure Compare(const inFirst, inSecond: Array of Integer; out Res: Boolean);
var
  szFirst, szSecond, I, delt_count: Integer;
begin
  szFirst:= length(inFirst);
  szSecond:= length(inSecond);
  delt_count:= 0;
  for I := 0 to szFirst - 1 do if inFirst[I] < 0 then inc(delt_count);
  for I := 0 to szSecond - 1 do if inSecond[I] < 0 then dec(delt_count);
  If delt_count > 0 then Res:= True else Res:= False;
end;
423
30 мая 2012 года
QWERYTY
595 / / 25.03.2012
Цитата: misha_turist
countFirst:= countFirst + 1; и countSecond:= countSecond + 1; можно заменить на inc(countFirst); и inc(countSecond); соответственно.

записи аналогичны, только лишь второй вариант Теоретически работает быстрее :) да и читается легче.



Здесь может и не быть разницы, по тому как означают они одно и то же, и компилятор из них сделает один и тот же машинный код.
Насчёт читаемости спорное утверждение, мне например первый вариант более привычен и понятен, это лиш дело вкуса.

285
30 мая 2012 года
sadovoya
757 / / 19.11.2005
Цитата: QWERYTY

Насчёт читаемости спорное утверждение, мне например первый вариант более привычен и понятен, это лиш дело вкуса.


Согласен. А в Lazarus можно в стиле C++ писать i++, += и т.п. Дело вкуса -- точно.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог