User since
2007-12-28
9
Artikel
BenutzerIn
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!!!
User since
2003-08-04
14371
Artikel
ModeratorIn
Wenn es einfach reicht, wenn die Sachen nicht mehr angezeigt werden, dann kannst Du
next verwenden:
1
2
3
4
5
6
7
8
9
10
11
12
13
$n=100
for ($i=0; $i<=$n; $i++){
$age[$i]=int(rand(10));
}
for ($t=0; $t<=9; $t++){
for ($i=0; $i<=$n; $i++){
if ($age[$i]>=10){
next;
$age[$i]++;
}
}
}
Übrigens kannst Du
for-Schleifen etwas schöner schreiben:
1
2
3
4
5
6
7
8
9
10
11
12
13
$n=100
for my $i ( 0 .. $n ){
$age[$i] = int(rand(10));
}
for my $t ( 0 .. 9 ){
for my $i ( 0 .. $n ){
if ($age[$i]>=10){
next;
$age[$i]++;
}
}
}
Mit
zahl .. zahl2 wird eine Liste von Zahlen erstellt, die von
zahl bis
zahl2 geht.
und man kann direkt über die Elemente "laufen":
1
2
3
4
5
6
7
8
9
10
11
12
13
$n=100
for my $i ( 0 .. $n ){
$age[$i] = int(rand(10));
}
for my $t ( 0 .. 9 ){
for my $alter ( @age ){
if ($alter >= 10){
next;
$alter++;
}
}
}
User since
2007-06-09
575
Artikel
HausmeisterIn
renee+2007-12-28 12:17:54--
if ($alter >= 10){
next;
$alter++;
}
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
User since
2003-08-04
14371
Artikel
ModeratorIn
stimmt, das muss außerhalb der Bedingung und der inneren Schleife stehen... Ist mir durch einen Copy&paste-Fehler passiert... sorry
User since
2007-12-28
9
Artikel
BenutzerIn
Danke erstmal fürs anhübschen! :o)
werde es mal mit dem next probieren! Hoffe es geht so.
User since
2006-11-26
384
Artikel
BenutzerIn
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
User since
2003-08-04
14371
Artikel
ModeratorIn
Wenn Du
splice benutzen willst, musst Du allerdings das Array umgekehrt durchlaufen, sonst gibt es Probleme...
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
use strict;
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:
C:\>splice.pl
1
==================================================
9
7
5
3
1
User since
2007-12-28
9
Artikel
BenutzerIn
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!!!
User since
2003-08-04
14371
Artikel
ModeratorIn
So vielleicht:
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
use strict;
use warnings;
use Data::Dumper;
my $n=5;
my @age;
for my $i ( 0 .. $n ){
$age[$i] = int(rand(10));
}
print "Beginn: ", Dumper(\@age),"\n";
for my $t ( 0 .. 3 ){
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:
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...
User since
2006-11-26
384
Artikel
BenutzerIn
Ich denke ich haette es auch so in der Art gemacht.
Nur das ist mir unklar:
Wieso 10 Jahre? Bzw wieso 3?
Sorry fuer die bloede Frage ;-)
Gruß
rperl