Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2014, 22:34   #1
poppop
Заблокирован
 
Регистрация: 27.05.2014
Сообщений: 1
По умолчанию Найти произведение четных чисел от 30 до 50.

Найти произведение четных чисел от 30 до 50.
poppop вне форума Ответить с цитированием
Старый 06.06.2014, 23:18   #2
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Просто ради интереса, Вы пытались сделать самостоятельно эту задачу...??

Код:
uses crt;
var
  i :   integer;
  pr :  integer;
begin
  pr := 1;
  for i := 30 to 50 do
    if((i mod 2) = 0) then
      pr := pr * i;
  
  writeln;
  writeln(' Результат: ', pr);
end.
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 06.06.2014, 23:23   #3
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Здесь лучше while или repeat использовать с шагом 2. Нечётные числа нам ни к чему
Вадим Мошев вне форума Ответить с цитированием
Старый 06.06.2014, 23:28   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Здесь лучше while или repeat использовать с шагом 2.
Не факт. FOR даже в таком случае может быть лучше, желающие могут проверить
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.06.2014, 23:33   #5
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Не факт. FOR даже в таком случае может быть лучше, желающие могут проверить
Пока не могу понять, почему. Объясните, пожалуйста, мне интересно.
Вадим Мошев вне форума Ответить с цитированием
Старый 07.06.2014, 08:48   #6
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Как проверять по людски я не знаю..
Посему так :
Код:
uses SysUtils, DateUtils;
const
    COUNT = 10000000;
var
    st, en : TDateTime;
    pr, i, j : LongInt;
begin
    st := Now;

    for j := 1 to COUNT do begin
        pr := 1;
          for i := 30 to 50 do
            if((i mod 2) = 0) then
                pr := pr * i;
    end;

    en := Now;
    WriteLn('for : ', MilliSecondsBetween(st, en));

    st := Now;
    for j := 1 to COUNT do begin
        pr := 1;
        i := 2;
        while i <= 50 do begin
            pr := pr*i;
            Inc(i, 2)
        end
    end;
    en := Now;
    WriteLn('while : ', MilliSecondsBetween(st, en))

end.
Цитата:
for : 1019
while : 693
Poma][a вне форума Ответить с цитированием
Старый 07.06.2014, 17:52   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Дык и не утверждал, что лучше, а высказал предположение, что возможно лучше. При всех прочих равных условиях FOR безусловно лучше, здесь условия не равны. Ромаха и Вадим, вы победили
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.06.2014, 18:31   #8
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Ромаха и Вадим, вы победили
Неа

Кстати, результаты предсказуемы..
Цитата:
Код:
for j := 1 to COUNT do begin
        pr := 1;
          for i := 15 to 25 do
            pr := pr * 2*i;
    end;
Цитата:
for : 317
while : 690
Poma][a вне форума Ответить с цитированием
Старый 07.06.2014, 18:39   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Кто бы сомневался. Тут другой цикл, он заведомо лучше WHILE
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.06.2014, 20:24   #10
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Так, минутку!
Роман
Код:
 st := Now; // Сейчас будем проверять While - прим. Вадим
    for j := 1 to COUNT do begin
        pr := 1;
        i := 2;
        while i <= 50 do begin
            pr := pr*i;
            Inc(i, 2)
        end
    end;
    en := Now;
    WriteLn('while : ', MilliSecondsBetween(st, en))
Нам чётко сказано, что наши границы - числа 30 и 50. Зачем ты установил i:=2? Ты же нашёл произведение всех чётных чисел от 2 до 50, а нас просили от 30 до 50. Поэтому в последнем тесте у тебя while и проигрывает for'у из последнего теста, потому что он работает дольше.

Проверил я твой первый тест-код у себя (ничего не менял), имею вот такие результаты:
Цитата:
for: 406
while: 234
а теперь я установил i:=30 и получил:
Цитата:
for: 407
while: 92
теперь учитываем твою последнюю модификацию для цикла for и получаем для такого кода:
Код:
uses SysUtils, DateUtils;
const
    COUNT = 10000000;
var
    st, en : TDateTime;
    pr, i, j : LongInt;
begin
    st := Now;

    for j := 1 to COUNT do begin
        pr := 1;
          for i := 15 to 25 do
            pr := pr * 2*i;
    end;

    en := Now;
    WriteLn('for : ', MilliSecondsBetween(st, en));

    st := Now;
    for j := 1 to COUNT do begin
        pr := 1;
        i := 30; // А у тебя, Рома, было установлено i:=2
        while i <= 50 do begin
            pr := pr*i;
            Inc(i, 2)
        end
    end;
    en := Now;
    WriteLn('while : ', MilliSecondsBetween(st, en));

    readln; readln;

end.
такие результаты
Цитата:
for: 109
while: 63
Естественно, у нас с тобой разные числа для одних и тех циклов - это из-за того, что конфигурация ПК разная, однако, разница между ними для разных циклов сохраняется.

Хотя то, что при "одинаковых" условиях while отрабатывает быстрее, для меня - сюрприз

Последний раз редактировалось Вадим Мошев; 07.06.2014 в 20:44.
Вадим Мошев вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дан двумерный массив А размера n*n . Найти произведение не нулевых элементов массива А находящийся в четных столбцах (Delphi) Kat9 Помощь студентам 1 02.03.2014 19:11
Подсчитать сумму отрицательных четных чисел, количество четных чисел кратных 3 и т.д. (pascal abc .net) kardinalmax Общие вопросы .NET 1 24.01.2014 09:28
Составить программу массива: Найти наименьшее из четных и произведение нечетных чисел, входящих в последовательность kolia_y Паскаль, Turbo Pascal, PascalABC.NET 8 06.10.2013 09:39
Найти произведение элементов массива, не равных 0 и стоящих на четных местах ( Delphi ) Nikta1111 Помощь студентам 1 06.12.2011 08:27
вычислить произведение четных чисел в каждой строке массива. Oliver Sykes Паскаль, Turbo Pascal, PascalABC.NET 5 09.10.2008 03:43