Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]11072[/thread]

for-Schleife $i variabel gestalten



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Alvin
 2007-12-28 12:44
#104191 #104191
User since
2007-12-28
9 Artikel
BenutzerIn
[default_avatar]
Hallo,

bin leider nicht der große Programmierexperte, hoffe aber, dass Ihr mir weiter helfen könnt.

Ich möchte gerne eine Bevölkerungsentwicklung von Tieren über 10 Jahre simulieren und möchte, dass Tiere ab einem bestimmten Alter sterben und welche geboren werden.

Hier eine kleine Primitivversion meines Programmes

$n=100 #Anfangsanzahl an Tieren
for ($i=0; $i<=$n; $i++){
$age[$i]=int(rand(10));
}

for ($t=0; $t<=9; $t++){ #Zeitraum 10 Jahre
for ($i=0; $i<=$n; $i++){
if ($age[$i]>=10){
Tier soll sterben, also $i soll weg
$age[$i]++; #Tiere werden pro Jahr ein Jahr älter
}
}

Wie schaff ich es, dass z.B. Tier mit $i=14 was $age[14]=10 Jahre hat, nicht mehr bei $i mitgezählt wird. Anders gefragt: wie kann ich bestimmte $i in der for-schleife auschneiden?
Hat da einer einen Tipp? Bitte bedenken bin Anfänger!!!
renee
 2007-12-28 13:17
#104198 #104198
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wenn es einfach reicht, wenn die Sachen nicht mehr angezeigt werden, dann kannst Du next verwenden:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
$n=100 #Anfangsanzahl an Tieren
for ($i=0; $i<=$n; $i++){
    $age[$i]=int(rand(10));
}

for ($t=0; $t<=9; $t++){ #Zeitraum 10 Jahre
    for ($i=0; $i<=$n; $i++){
        if ($age[$i]>=10){
            next;
            $age[$i]++; #Tiere werden pro Jahr ein Jahr älter
        }
    }
}


Übrigens kannst Du for-Schleifen etwas schöner schreiben:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
$n=100 #Anfangsanzahl an Tieren
for my $i ( 0 .. $n ){
    $age[$i] = int(rand(10));
} 

for my $t ( 0 .. 9 ){ #Zeitraum 10 Jahre
    for my $i ( 0 .. $n ){
        if ($age[$i]>=10){
            next;
            $age[$i]++; #Tiere werden pro Jahr ein Jahr älter
        }
    }
}


Mit zahl .. zahl2 wird eine Liste von Zahlen erstellt, die von zahl bis zahl2 geht.

und man kann direkt über die Elemente "laufen":
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
$n=100 #Anfangsanzahl an Tieren
for my $i ( 0 .. $n ){
    $age[$i] = int(rand(10));
} 

for my $t ( 0 .. 9 ){ #Zeitraum 10 Jahre
    for my $alter ( @age ){
        if ($alter >= 10){
            next;
            $alter++; #Tiere werden pro Jahr ein Jahr älter
        }
    }
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
#Kein Kommentar
 2007-12-28 14:14
#104204 #104204
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
renee+2007-12-28 12:17:54--
Code (perl): (dl )
1
2
3
4
        if ($alter >= 10){
            next;
            $alter++; #Tiere werden pro Jahr ein Jahr älter
        }


was bringt das $alter++ nach dem next?
das wird doch gar nicht mehr ausgeführt.
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
renee
 2007-12-28 14:38
#104210 #104210
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
stimmt, das muss außerhalb der Bedingung und der inneren Schleife stehen... Ist mir durch einen Copy&paste-Fehler passiert... sorry
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Alvin
 2007-12-28 18:17
#104218 #104218
User since
2007-12-28
9 Artikel
BenutzerIn
[default_avatar]
Danke erstmal fürs anhübschen! :o)
werde es mal mit dem next probieren! Hoffe es geht so.
RPerl
 2007-12-28 20:18
#104223 #104223
User since
2006-11-26
384 Artikel
BenutzerIn

user image
Wenn ich die Aufgabenstellung so richtig verstanden habe, koenntest Du auch die Tiere ueber > 10 aus dem array loeschen.
Dafuer koenntest Du dir mal splice() ansehen.

Ansonsten -> renees Loesung nutzen =)

Gruß

rperl
renee
 2007-12-28 21:03
#104225 #104225
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wenn Du splice benutzen willst, musst Du allerdings das Array umgekehrt durchlaufen, sonst gibt es Probleme...

Code (perl): (dl )
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
#!/usr/bin/perl

use strict;
#use warnings;
use Data::Dumper;

my @array = (1..10);

for my $i ( 0..$#array ){
    if( $array[$i] % 2 == 0 ){
        splice @array,$i,1;
    }
    else{
        print $array[$i],"\n";
    }
}

print "=" x 50, "\n";
@array = (1..10);

for my $i ( reverse 0..$#array ){
    if( $array[$i] % 2 == 0 ){
        splice @array,$i,1;
    }
    else{
        print $array[$i],"\n";
    }
}


Ausgabe:

Code: (dl )
1
2
3
4
5
6
7
8
C:\>splice.pl
1
==================================================
9
7
5
3
1
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Alvin
 2007-12-29 11:08
#104232 #104232
User since
2007-12-28
9 Artikel
BenutzerIn
[default_avatar]
Hi,

also am Ende möchte ich eine Graphik erstellen mit der Anzahl der Tiere gegen die Zeit aufgetragen. Die einfachste Variante ist sicherlich einen Zähler mitlaufen zu lassen und immer 1 dazu zu addieren wenn Geburt und -- wenn ein Tier älter ist als 10. Aber ist bei größeren Projekten wohl weniger rechenintensiv, wenn ich die alten Tiere rausnehme. An den splice-befehl hatte ich auch schon gedacht, wusste aber nicht wie der bei $i in der for-schleife funktioniert. Muss ich mir dann mal genauer angucken. Was mein Problem war/ist mit splice, mal ein Beispiel ich habe:

age[$i]->age[1]=3; age[2]=10; age[3]=8 ->age[$i]++

wenn ich jetzt age[2] rausnehme und im nächsten Jahr wieder in for-schleife $i durchlaufen lasse, hat er dann in age[1]=4 und in age[2]=9 stehen, also das alte age[1] und age[3] + 1 Jahr älter?

Danke nochmal für die Anregungen!!!
renee
 2007-12-29 12:16
#104234 #104234
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
So vielleicht:
Code (perl): (dl )
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
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my $n=5; #Anfangsanzahl an Tieren
my @age;

for my $i ( 0 .. $n ){
    $age[$i] = int(rand(10));

}

print "Beginn: ", Dumper(\@age),"\n";

for my $t ( 0 .. 3 ){ #Zeitraum 10 Jahre
    for my $i ( reverse 0 .. $n ){
        $age[$i]++;
        if ($age[$i] >= 11){
            splice @age, $i, 1;
        }
    }
    print "Nach ", $t+1, " Jahren: ", Dumper(\@age),"\n";
}


Ausgabe:
Code: (dl )
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
Beginn: $VAR1 = [
1,
4,
5,
6,
9,
2
];

Nach 1 Jahren: $VAR1 = [
2,
5,
6,
7,
10,
3
];

Nach 2 Jahren: $VAR1 = [
3,
6,
7,
8,
4
];

Nach 3 Jahren: $VAR1 = [
4,
7,
8,
9,
5,
1
];

Nach 4 Jahren: $VAR1 = [
5,
8,
9,
10,
6,
2
];


Man sieht, dass nach dem zweiten Jahr ein Tier gestorben ist, im dritten Jahr eins neu geboren wurde...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
RPerl
 2007-12-29 12:22
#104235 #104235
User since
2006-11-26
384 Artikel
BenutzerIn

user image
Ich denke ich haette es auch so in der Art gemacht.
Nur das ist mir unklar:

Code (perl): (dl )
for my $t ( 0 .. 3 ){ #Zeitraum 10 Jahre

Wieso 10 Jahre? Bzw wieso 3?
Sorry fuer die bloede Frage ;-)


Gruß

rperl
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2007-12-28 12:44.