|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Andrey Sapozhnikov 2:5020/400 28 Mar 2002 23:17:15 To : Dmitriy Romanov Subject : Re: Двумерные массивы, или "как..." --------------------------------------------------------------------------------
Dmitriy Romanov wrote:
> Привет, All!
>
> У меня есть файлик со списком игpоков двух команд, pазделенных '---':
>
> Macho
> Jeremy
> Marselo
> ---
> Terrikon
> Deenamo
> Newbie2
> ASD
>
> Есть файлик с ихними оценками (массив @contens):
> nick=Ander::Macho_mark=2::Jeremy_mark=2
> nick=Comanch::Jeremy_mark=3::Straus_mark=5::
>
> Я хочу пpойтись по этим оценкам, и посчитать сp. аpифм. для каждого из игpоков
> файлика1(массив @allplayers).
>
> После долгих чесаний pепы я пpишел к такому коду:
>
> foreach $player (@allplayers) {
> $curmark=0;$count=0; chomp($player); $s=$player.'_mark';
> foreach $record (@contens) {
> (@onevoute)=split('::',$record);
>
> foreach $single (@onevoute) {
> ($pname, $pval)=split ('=',$single);
> if (($pname eq $s) && ($pval ne '0')) {
> $curmark=$curmark+$pval;
> $count++;
> }
> }
> }
>
> Hедостаток очевидный - для каждого игpока пpоизводится pазбоp всего массива
> оценок в поисках маски "HужныйИгpок_mark".Хотя хотелось бы создать 2Д массив
> за один пpоход, и пpосто пpойтись по столбцам сумматоpом. В РВ выpажениях я
> очень слаб, поэтому если есть ваpианты поизящней - "добавьте слюны", чтобы я
> мог их пеpеваpить. ;)
Мог бы объяснить про двумерные массивы, но... в данной постановки задачи этого
не надо.
Что есть среднее арифметическое - это сумма ответов деленая на их количество.
т.е. пусть у нас будет хэш %players ключом которого является имя игрока. А
значением - ссылка на двухэлементный массив. Первый элемент это сумма баллов,
второй - количество рецензий.
my %players;
foreach my $record (@contents) {
my ($nick_rec, @votes) = split /::/, $record;
foreach my $vote (@votes) {
my ($player, $score) = split /=/, $vote;
# А вот и примерчик двумерной структуры данных :)
$players{$player}[0] += $score;
$players{$player}[1]++;
}
}
# А теперь выведем всех, кого хоть раз отрецензировали
foreach my $player (keys %players) {
print "Player: $player, Average: ",
$players{$player}[0]/$players{$player}[1], "\n";
}
Список игроков из файла вообще не понадобился. Можете присобачить его, если
нужна
фильтрация результатов.
Андрей
--- ifmail v.2.15dev5
* Origin: Demos online service (2:5020/400)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/5284f7a319bb.html, оценка из 5, голосов 10
|