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

Поиск:

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


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


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

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



Добрый день уважаемые формучане
Есть задание: написать программу которая будет выполнять:
Найти  среднее  арифметическое  всех  положительных  чисел   массива. Вывести на экран все числа массива, которые  больше, чем это среднее арифметическое.

Хоть убейте, но не могу додуматься как это реализовать....
Пока получилось, что то около такого бреда:
Код

chomp(my @fred = <STDIN>);
foreach (@fred){
    if ($fred > 0){
        push @list,$fred;
    }
}

my @list2 = above_average();
print "\@fred is @list2\n";
sub total{
    my $sum=0;
    foreach(@_){
        $sum+=$_;
    }
    $sum;
}
sub average{
    if(@_==0){return}
    my $count = @_;
    my $sum = total(@_);
    $sum/$count;
}
sub above_average{
    my $average = average(@_);
    my @list;
    foreach my $element(@_){
        if($element>$average){
            push @list,$element;
        }
    }
    @list;
}


Подскажите пожалуйста другие способы решения данной задачи...
PM MAIL ICQ Skype   Вверх
arto
Дата 6.10.2011, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

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



# perl -MList::Util=sum -le '$a = sum (@ARGV)/($#ARGV+1); print "Num: $a"; print join ", ", grep { $_ > $a } @ARGV' 1 2 3 4 5 6 7 8 9 10
Num: 5.5
6, 7, 8, 9, 10
# 
PM MAIL ICQ   Вверх
ginnie
Дата 6.10.2011, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



arto, надо "Найти  среднее  арифметическое  всех  положительных  чисел   массива."


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

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



неужели мне надо сделать все домашнее задание для человека?
PM MAIL ICQ   Вверх
dixoNICH
Дата 7.10.2011, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

@arr=qw/1 2 3 4 5 6 7 8 9 10 -3 -4 -5 -6 -7 -8 -9 -10 /;
$_>0&&($summ+=$_)&&($i++)for@arr;
$_>$summ/$i&&print for@arr;

C:\Users\dixon>perl 2.pl
678910
а что вы хотели сказать 31-ой строкой кода? может быть если добавить return, то будет выглядеть адекватно.

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


Эксперт
***


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

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



dixoNICH, а зачем надо несколько раз рассчитывать $summ/$i?


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


Бывалый
*


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

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



почему несколько? 1 раз во 2-ом цикле ведь)
PM MAIL   Вверх
ginnie
Дата 8.10.2011, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



dixoNICH, а это выражение не на каждой итерации второго цикла вычисляется (в Вашем примере 18 раз)?


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


Бывалый
*


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

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



а да)
Код

$p=$summ/$i;
$_>$p&&print for@arr;

PM MAIL   Вверх
qw1mb0
Дата 11.10.2011, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Всем спасибо за участие.
Но мои познания в перле скудны, так что додумался пока только до такого:
Код

@b = split (/\s/,<>);
foreach (@b){ 
    if ($_ > 0){
        push @a,$_;
    }
}
foreach (@a){ 
        $sum+=$_;
}        
foreach (@a){
    if ($_ > ($sum/(scalar @a))){
        print "$_ ";
    }
}

Что вполне меня устраивает
PM MAIL ICQ Skype   Вверх
ginnie
Дата 11.10.2011, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



qw1mb0, у меня два предложения по Вашему коду:
зачем в отдельном цикле считать сумму, если ее можно рассчитать сразу в первом цикле, где push?
зачем в последнем цикле считать $sum/(scalar @a) на каждой итерации?


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


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


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

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



ginnie, Это да... Сначала у меня  $sum/(scalar @a) высчитывалось отдельно, потом просто что бы уменьшить обьем кода загнал туда.
Так как студент и программа пишется для выполнения работы. А преподаватель совсем не знает Perl, то сильно можно не гнаться за производительностью программы..

Но а так, спасибо, учту ваши комментарии и внесу эти поправки, во время оптимизации кода.
PM MAIL ICQ Skype   Вверх
MakTpaxep
  Дата 13.10.2011, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(dixoNICH @  7.10.2011,  12:30 Найти цитируемый пост)
@arr=qw/1 2 3 4 5 6 7 8 9 10 -3 -4 -5 -6 -7 -8 -9 -10 /;
$_>0&&($summ+=$_)&&($i++)for@arr;
$_>$summ/$i&&print for@arr;

Прикольно)
А почему у меня не работает такая фигня:
Код

foreach (@data)
{
    .....
    $_="<tag>$_</tag>"&&next unless m!\t!;
    .....
}

Вроде из цикла выходит, а в тэг не заключает.
Можно как ниже, но всё равно интересно...
Код

do{$_="<tag>$_</tag>";next} unless m!\t!;


Это сообщение отредактировал(а) MakTpaxep - 13.10.2011, 09:57
PM MAIL   Вверх
alezzz
Дата 13.10.2011, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


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

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



возможно потому что next ничего не возвращает
PM MAIL   Вверх
MakTpaxep
Дата 13.10.2011, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Пора...
Пора видимо мне начинать с дебагером разбираться
PM MAIL   Вверх
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   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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