1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use strict;
use warnings;
my %A = ( name => 'Alfred',
betreff => "Monatliche Sushibarbesuche im halben Jahr",
konsum => [4, 2, 5, 7, 5, 3]
);
zeuch(\%A);
zeuch(\@{$A{'konsum'}});
my $sum = 0;
for my $i (@{$A{'konsum'}})
{ $sum += $i; }
printf("Summe: %d, Durchschnitt: %2.2f\n", $sum, $sum/6);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
use strict; use warnings; use List::Util qw( sum ); # sub routines # ########################################################################### sub summe_und_durchschnitt { my ( $aRef, ) = @_; die "Please provide an array reference.\n" if not defined( $aRef ) or 'ARRAY' ne ref($aRef); my $summe = sum @$aRef; my $schnitt = $summe/@$aRef; return ( $summe, $schnitt ); } # main program # ########################################################################### my %A = ( name => 'Alfred', nahrung => "Sushi", konsum => [4, 2, 5, 7, 5, 3], ); # errechne Summe/Durchschnitt für $A{konsum} und gebe die Werte aus printf "Summe: %d, Schnitt: %.2f\n", summe_und_durchschnitt( $A{konsum} );
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
#!/usr/bin/perl use warnings; use strict; package Person { sub new { my $classname = shift; my $args = {@_}; my $self = { name => $args->{name}, betreff => $args->{betreff}, konsumref => $args->{konsumref} }; return bless($self, $classname); } sub showKonsum { my $self = shift; my @konsum = @{$self->{konsumref}}; my $i; print "\n"; print $self->{betreff} . ":\n"; print "Konsum ist:\n"; for $i (@konsum) { print "$i\n"; } print "\n"; print "Summe Konsum: " . $self->getSum() . "\n"; print "Durschnittlich: " . $self->getAverageKonsum() . "\n\n"; } sub getSum { my $self = shift; my @konsum = @{$self->{konsumref}}; my $sum = 0; my $i; for $i (@konsum) { $sum += $i; } return $sum; } sub getAverageKonsum { my $self = shift; my @konsum = @{$self->{konsumref}}; my $konsumlen = @konsum; my $sum = $self->getSum(); return $sum / $konsumlen; } } my $A = Person->new(name => "Alfred", betreff => "Monatliche Sushibarbesuche im halben Jahr", konsumref => [4, 2, 5, 7, 5, 3]); $A->showKonsum();
2017-10-20T08:49:13 Wild.CardDas ist schon etwas lang und viel Schreibarbeit, dafür dass man nur die Summe und Schnitt haben will ^^
modedit Editiert von GwenDragon: Vollzitat entfernt
2017-10-20T18:48:47 RaubtierMan kann sich aber fragen, ob es die Aufgabe einer Klasse "Person" ist, Durchschnitte zu berechnen... Für mich gehört das nicht dazu.
2017-10-20T23:59:55 rostiDarum gehts ja auch gar nicht. Vielmehr gehts darum, abstrakte Datentypen in Instanzen abzubilden und diesbezügliche Berechnungen zu eigenen Methoden zu machen. Genau das ist die Zweckbestimmung einer objektorientierten Programmierung. MfG
2017-10-21T16:17:14 hlubenow2017-10-20T23:59:55 rostiDarum gehts ja auch gar nicht. Vielmehr gehts darum, abstrakte Datentypen in Instanzen abzubilden und diesbezügliche Berechnungen zu eigenen Methoden zu machen. Genau das ist die Zweckbestimmung einer objektorientierten Programmierung. MfG
Das sehe ich auch so. Er wird ja voraussichtlich noch andere Personen als "Alfred" definieren, die dieselben oder ähnliche Eigenschaften haben, das heißt, für die ein Durschnitt der Sushibarbesuche berechnet werden soll.
Da lohnen sich die paar Zeilen Code mehr. Macht es übersichtlich, und vor allem kann man diese Objekte ganz einfach insgesamt an andere Funktionen übergeben, ohne sich groß um Dereferenzierungen Gedanken machen zu müssen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
# Instanz der Package main erstellen my $main = bless{ name => 'Alfred', betreff => "Monatliche Sushibarbesuche im halben Jahr", konsum => [4, 2, 5, 7, 5, 3] }; # und mit dieser Instanz eine Methode aufrufen printf("Summe: %d, Durchschnitt: %2.2f\n", $main->calc); sub calc{ my $self = shift; my $sum = 0; foreach my $amt( @{$self->{konsum}} ){ $sum += $amt; } my $avg = $sum / scalar @{$self->{konsum}}; return ($sum, $avg); }