Thread Punkterechnungsprogramm (8 answers)
Opened by DieZahl at 2017-07-22 13:13

hlubenow
 2017-07-22 14:57
#187005 #187005
User since
2009-02-22
875 Artikel
BenutzerIn
[default_avatar]
Guest DieZahl
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
#!usr/bin/perl -w

use 5.014;

my $t = <STDIN>;                                                        
my $classmax = &clm($t, 49, 99, 199, 299, 500); 

sub clm {
  my($c) = shift @_;                                                    
    if (@_ != 5) {                                                      
    print "Something went wrong";                       
      foreach (@_) {                                            
        if ($c < $_) {                                  
        my(@div) = shift @_;                    
        } elsif ($c > $_) {                             
          my $divi = @div;                      
          my $re1 = $t / $divi;         
          my $zre = $divi - 1;          
          my $re2 = $re1 * $zre;                
        print "Your points are $re2\n";
      }
    }
  }
}

WTF? Deine Einrückungen stimmen nicht, aber was noch schlimmer ist, Deine geschweiften Klammern stimmen nicht. Das "if" geht ganz runter.

- Funktionsaufrufe sind heute ohne "&".
- Nach "my" braucht man keine runden Klammern.
- Bei dem "if" willst Du wohl die Anzahl der Elemente des Arrays, die bekommt man aber anders, bei "@_" entweder "$#_ + 1" oder "my $alen = @_;".
- Überhaupt sollte man "@_" lieber ersetzen.
- Mit "$_" sollte man auch nur ausnahmsweise arbeiten. "$_" ist nicht ein Teil von "@_".

Danach wird es leider so Kraut und Rüben, daß ich gar nicht mehr verstehe, was Du machen willst.
Ich kann daher nur erstmal das verbessern, was ich sehe. Aber es wird daher immer noch nicht laufen.
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 warnings;
use strict;

my $t = <STDIN>;                                                        
my $classmax = clm($t, 49, 99, 199, 299, 500); 

sub clm {
    my $c = shift; # Wenn man shift ohne Argument verwendet, bezieht es sich automatisch auf @_
    my @a = @_;
    if ($#a != 4) {                                                     
        print "Something went wrong.\n";
        exit;
    }
    my $i;
    foreach $i (@a) {                                           
        if ($c < $i) {                                  
            my @div = shift @a; # Ich hab' keine Ahnung, was das bewirkt (vermutlich bekommt das Array @div das erste Element von @a). Bestimmt aber nicht das, was Du willst.
        } elsif ($c > $i) {
            my $divi = @div; # Damit wird $divi auf die Anzahl der Elemente von @div gesetzt. Wolltest Du das?
            my $re1 = $t / $divi;               
            my $zre = $divi - 1;                
            my $re2 = $re1 * $zre;
        }
        print "Your points are $re2\n";
    }
}

View full thread Punkterechnungsprogramm