Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка одномерно массива 
V
    Опции темы
qw1mb0
Дата 19.10.2011, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Непутевый студент
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 24.4.2010
Где: Севастополь

Репутация: нет
Всего: нет



Очередная задача по обработке одномерного массива
Задание: Преобразовать массив, умножив все положительные числа на   максимальное  число этого массива.

Вот к чему пришел за 10 минут (варианты. как предлагали в топике выше, просьба, не предлагать, потому что уровень знания языка минимален).

Как можно упростить код:
Код

print "Введите элементы через пробел:\n";
@b = split (/\s/,<>); 
foreach (@b){ 
    if ($_ > 0){
        push @a,$_;
        }
}
sub max{
    foreach (@a){
        if ($_>$max_so_far){
            $max_so_far = $_;
        }
    }
    $max_so_far;
}
foreach (@b){
    if ($_ > 0){
        $_ *= &max;
    }
}
print "@b ";


Заранее спасибо.
PM MAIL ICQ Skype   Вверх
ginnie
Дата 19.10.2011, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



qw1mb0, три вопроса по коду: зачем массив @a, зачем для каждого элемента массива @b вызывать max() и зачем для вызова max() использовать синтаксис &max?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
MakTpaxep
  Дата 19.10.2011, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 25.11.2010

Репутация: нет
Всего: нет



Код

for (@b) # в этом цикле ищем максимальный элемент
{
    $max=$_ if $_>$max;
}
for (@b) # а в этом умножаем каждый положительный элемент
{
    $_*=$max if $_>0;
}

Но так конечно круче:
Код

$_>$max&&($max=$_)for@b;
$_>0&&($_*=$max)for@b;


Это сообщение отредактировал(а) MakTpaxep - 19.10.2011, 17:20
PM MAIL   Вверх
qw1mb0
Дата 19.10.2011, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Непутевый студент
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 24.4.2010
Где: Севастополь

Репутация: нет
Всего: нет



Цитата(ginnie @ 19.10.2011,  16:35)
qw1mb0, три вопроса по коду: зачем массив @a, зачем для каждого элемента массива @b вызывать max() и зачем для вызова max() использовать синтаксис &max?

1 вопрос: в массив @a заносятся положительные элементы > 0. 
2 вопрос:
Код


print "Введите элементы через пробел:\n";
@b = split (/\s/,<>);
foreach (@b){  
    if ($_ > 0){
        push @a,$_;
        }
}
foreach (@a){
        if ($_>$max_so_far){
            $max_so_far = $_;
        }
}

foreach (@b){ 
    if ($_ > 0){
        $_ *= $max_so_far;
    }
}
print "@b "; 


3 вопрос: не знаю даже что ответить smile
PM MAIL ICQ Skype   Вверх
MakTpaxep
Дата 19.10.2011, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 25.11.2010

Репутация: нет
Всего: нет



Для нахождения максимального элемента массива не требуется заносить все положительные значения в другой массив. Кто вам это подсказал?)
PM MAIL   Вверх
ginnie
Дата 19.10.2011, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



qw1mb0, в perldoc perlsub написано, что вызов &max аналогичен max(@_), поэтому если нет необходимости, используйте max().


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
dixoNICH
Дата 19.10.2011, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 222
Регистрация: 20.3.2011

Репутация: нет
Всего: нет



Код

grep {$m=$_ if$m<$_} @a;print grep{$_*=$m if$_>0}@a;


Это сообщение отредактировал(а) dixoNICH - 19.10.2011, 18:23
PM MAIL   Вверх
ginnie
Дата 19.10.2011, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



dixoNICH, за такой код нас училка линейкой по рукам била в школе smile 


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
dixoNICH
Дата 19.10.2011, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 222
Регистрация: 20.3.2011

Репутация: нет
Всего: нет



Цитата(ginnie @ 19.10.2011,  18:25)
dixoNICH, за такой код нас училка линейкой по рукам била в школе smile

зато коротко и ясно smile
PM MAIL   Вверх
ginnie
Дата 19.10.2011, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



По поводу краткости не спорю, а вот с ясностью беда: объясните, зачем Вы использовали grep?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
MakTpaxep
Дата 19.10.2011, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 25.11.2010

Репутация: нет
Всего: нет



Можно map вместо grep и будет короче ещё на 2 символа)
PM MAIL   Вверх
dixoNICH
Дата 19.10.2011, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 222
Регистрация: 20.3.2011

Репутация: нет
Всего: нет



Цитата(ginnie @ 19.10.2011,  18:32)
По поводу краткости не спорю, а вот с ясностью беда: объясните, зачем Вы использовали grep?

а что ещё надо было использовать? for? 
PM MAIL   Вверх
ginnie
Дата 19.10.2011, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



dixoNICH, мне кажется логичным использовать for. Когда программист вместо этого использует grep, сразу возникает затруднение с ясностью: зачем он это сделал, особенно, учитывая, что в первой части он используется в пустом контексте (void).


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
qw1mb0
Дата 19.10.2011, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Непутевый студент
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 24.4.2010
Где: Севастополь

Репутация: нет
Всего: нет



В ходе не долгих размышлений и конечно же благодаря вашим коментариям, особенно ginnie и MakTpaxep
Дошел  до такого кода:
Код

print "Введите элементы через пробел:\n";
@b = split (/\s/,<>);
for (@b){
    $max=$_ if $_>$max;
}
for (@b){ 
    $_*=$max if $_>0;
}
print "@b "; 


Спасибо за помощь 
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0596 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.