Schrift
[thread]7750[/thread]

Code Verkürzen?

Leser: 1


<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Froschpopo
 2006-03-02 02:32
#63373 #63373
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Hat jemand ne Idee, wie man folgenden Code noch etwas kürzer fassen kann?

Horoskope:
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
    my ($day, $month) = @ZZZ;
if ($day >= 1 && $day <= 20 && $month == 1)
{
return 'Steinbock';
}
elsif ($day >= 21 && $day <= 31 && $month == 1)
{
return 'Wassermann';
}
elsif ($day >= 1 && $day <= 19 && $month == 2)
{
return 'Wassermann';
}
elsif ($day >= 20 && $day <= 29 && $month == 2)
{
return 'Fisch';
}
elsif ($day >= 1 && $day <= 20 && $month == 3)
{
return 'Fisch';
}
elsif ($day >= 21 && $day <= 31 && $month == 3)
{
return 'Widder';
}
elsif ($day >= 1 && $day <= 20 && $month == 4)
{
return 'Widder';
}
elsif ($day >= 21 && $day <= 30 && $month == 4)
{
return 'Stier';
}
elsif ($day >= 1 && $day <= 20 && $month == 5)
{
return 'Stier';
}
elsif ($day >= 21 && $day <= 31 && $month == 5)
{
return 'Zwillinge';
}
elsif ($day >= 1 && $day <= 21 && $month == 6)
{
return 'Zwillinge';
}
elsif ($day >= 21 && $day <= 30 && $month == 6)
{
return 'Krebs';
}
elsif ($day >= 1 && $day <= 22 && $month == 7)
{
return 'Krebs';
}
elsif ($day >= 23 && $day <= 31 && $month == 7)
{
return 'L&ouml;we';
}
elsif ($day >= 1 && $day <= 23 && $month == 8)
{
return 'L&ouml;we';
}
elsif ($day >= 24 && $day <= 31 && $month == 8)
{
return 'Jungfrau';
}
elsif ($day >= 1 && $day <= 23 && $month == 9)
{
return 'Jungfrau';
}
elsif ($day >= 24 && $day <= 30 && $month == 9)
{
return 'Waage';
}
elsif ($day >= 1 && $day <= 23 && $month == 10)
{
return 'Waage';
}
elsif ($day >= 24 && $day <= 31 && $month == 10)
{
return 'Skorpion';
}
elsif ($day >= 1 && $day <= 22 && $month == 11)
{
return 'Skorpion';
}
elsif ($day >= 23 && $day <= 30 && $month == 11)
{
return 'Sch&uuml;tze';
}
elsif ($day >= 1 && $day <= 21 && $month == 12)
{
return 'Sch&uuml;tze';
}
elsif ($day >= 22 && $day <= 31 && $month == 12)
{
return 'Steinbock';
}
\n\n

<!--EDIT|Froschpopo|1141259672-->
Ronnie
 2006-03-02 07:21
#63374 #63374
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Viel schöner wird es nicht:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl

use strict;
use warnings;


sub testZZZx {
my ($day, $month) = @ZZZ;

return 'Steinbock' if $month == 1 and $day < 21;
return 'Wassermann' if $month == 1 and $day >= 21
or $month == 2 and $day < 22; #usw.

return 'FALSE';
}

print testZZZx(11, 1), "\n", testZZZx(23, 1), "\n",
testZZZx(11, 2), "\n", testZZZx(25, 2), "\n";
GwenDragon
 2006-03-02 11:55
#63375 #63375
User since
2005-01-17
14761 Artikel
Admin1
[Homepage]
user image
Was ist an deinem Code mit Subroutine aus zu setzen?
Wenn du es schön willst, mache eine Schleife drum.
Dubu
 2006-03-02 13:20
#63376 #63376
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Wenn das Datum schon an anderer Stelle auf Korrektheit geprüft wurde, kann man den Code etwas kürzer, übersichtlicher und schneller schreiben:
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
sub sternzeichen {
   my ($day, $month) = @ZZZ;
   my $md = $month*100+$day;   # Ein Wert aus Monat und Tag

   return (
       # Zahlen immer *ohne* führende Null!
       $md <   101 ? undef :           # < 01.01. => Fehler
       $md <=  120 ? 'Steinbock' :     # bis 20.01.
       $md <=  219 ? 'Wassermann' :    # bis 19.02.
       $md <=  320 ? 'Fisch' :         # bis 20.03.
       $md <=  420 ? 'Widder' :        # bis 20.04.
       $md <=  520 ? 'Stier' :         # bis 20.05.
       $md <=  621 ? 'Zwillinge' :     # bis 21.06.
       $md <=  722 ? 'Krebs' :         # bis 22.07.
       $md <=  823 ? 'L&ouml;we' :     # bis 23.08.
       $md <=  923 ? 'Jungfrau' :      # bis 23.09.
       $md <= 1023 ? 'Waage' :         # bis 23.10.
       $md <= 1122 ? 'Skorpion' :      # bis 22.11.
       $md <= 1221 ? 'Sch&uuml;tze' :  # bis 21.12.
       $md <= 1231 ? 'Steinbock' :     # bis 31.12.
       undef                           # > 31.12. => Fehler
   );
}

Dabei ist aber Vorsicht geboten: Man verspürt vielleicht den Drang, der Übersichtlichkeit halber die Daten vor Oktober als "0219", "0320" etc. zu schreiben. Eine führende Null macht aus den Dezimalzahlen aber Oktalzahlen und die ganzen Vergleiche stimmen nicht mehr!


PS: Fsck! Jetzt gehen gar keine Unterstriche mehr im Forum, die werden komplett durch "ZZZ" ersetzt! esskar, was hast du angestellt?
ptk
 2006-03-02 18:09
#63377 #63377
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Was für ein Zufall! Vor drei Tagen oder so habe ich die gleiche Sternzeichen-Sache benötigt. Ich habe eine Tabelle verwendet, in der die Intervalle eingetragen waren. Vielleicht sollte man ein CPAN-Modul draus machen :-)
Froschpopo
 2006-03-02 18:26
#63378 #63378
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
der obige code is voll funktional :) War mir nur etwas zu lang :D
Froschpopo
 2006-03-02 18:38
#63379 #63379
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
warum darf man denn $month nicht als "04" übergeben? Die nachstehende rechnung macht daraus doch sowieso eine einheitliche zahl: my $md = $month*100+$day;

da wird doch 03 automatisch zu 3, oder etwa nicht?
FC
 2006-03-02 21:48
#63380 #63380
User since
2005-01-25
8 Artikel
BenutzerIn
[default_avatar]
vielleicht nicht schön, aber es sieht so aus, als würde es gehen :)
http://phpfi.com/105234
Dubu
 2006-03-02 22:41
#63381 #63381
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=Froschpopo,02.03.2006, 17:38]warum darf man denn $month nicht als "04" übergeben?
[/quote]
Das habe ich doch gar nicht gesagt.
Du sollst nur die Zahlkonstanten im Programm nicht mit Null anfangen lassen. Das bezieht sich auf die 101, 120, 219 etc. die in den Vergleichen benutzt werden.

Quote
Die nachstehende rechnung macht daraus doch sowieso eine einheitliche zahl: my $md = $month*100+$day;

da wird doch 03 automatisch zu 3, oder etwa nicht?

Bei 03 und 3 macht es tatsächlich keinen Unterschied.
Aber man schaue sich das an:
Quote
~> perl -le 'my $var = "011"; print 0+$var'
11
~> perl -le 'my $var = 011; print 0+$var'
9

Hoppla!
Wenn ein String als Zahl interpretiert wird, dann als Dezimalzahl, auch wenn er mit Null anfängt. "Wörtliche" Zahlen im Quelltext werden aber als Oktalzahlen interpretiert, wenn sie mit einer Null anfangen.
(Aber man sollte natürlich keine Zahlkonstanten als String schreiben, wenn es nicht nötig ist.)

Wenn in einer vorgeblichen Oktalzahl Ziffern größer 7 auftauchen, tritt Perl auch sofort auf die Bremse:
Code: (dl )
1
2
~> perl -le 'my $var = 09; print $var'
Illegal octal digit '9' at -e line 1, at end of line


Ansonsten geht Perl aber gnadenlos davon aus, dass man wirklich meint, was man schreibt.
renee
 2006-03-03 14:03
#63382 #63382
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@ptk: Wäre vielleicht keine schlechte Idee, mir ist in den letzten Wochen das auch schon mehrfach untergekommen...
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/
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2006-03-02 02:32.