Fakultätsschleife

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von donsimon1991, 06.02.2008.

  1. #1 donsimon1991, 06.02.2008
    Zuletzt bearbeitet: 07.02.2008
    donsimon1991

    donsimon1991 Eroberer

    Dabei seit:
    23.12.2007
    Beiträge:
    70
    Zustimmungen:
    0
    Ich hab in der SuFu nur einen Thread über Fakultät gefunden, aber der hat mir nicht weitergeholfen.

    Was ich schon geschafft habe:
    • die Fakultät von EINER Zahl berechnen
    • Fehlermeldungen ausgeben, wenn Null oder mehr als zwei Argumente übergeben wurden

    Was ich noch schaffen möchte:
    • eine Schleife erstellen, um die Fakultäten von $1 bis $2 zu berechnen und auszugeben

    So, und jetzt das Shell-Script (Bash):
    PHP:
    #!/bin/bash
    # Variablen initialisieren

    declare -i zahl1=$1
    declare -i zahl2=$2
    declare -i fakultaet1=1
    declare -i fakultaet2=1

    # Wenn $1<$2, dann von=$1 und bis=$2
    if [ $zahl1 -lt $zahl2 ]; then
        
    declare -i von=$zahl1
        
    declare -i bis=$zahl2
    # Wenn $1<$2, dann von=$2 und bis=$1
    elif $zahl1 -gt $zahl2 ]; then
        
    declare -i von=$zahl2
        
    declare -i bis=$zahl1
    fi

    # Ueberpruefen, wie viele Argumente uebergeben wurden
    case $# in
        
    0)
            
    # Es gibt KEIN Argument ==> Fehlermeldung ausgeben
            
    echo "Bitte uebergeben Sie als Argumente EINE oder ZWEI Zahlen.";;
        
    1)
            
    # Es gibt EIN Argument ==> Fakultaet von $1 berechnen und ausgeben
            
    while [ $zahl1 -gt 1 ]; do
                
    fakultaet1=$fakultaet1*$zahl1
                zahl1
    =$zahl1-1
            done
            
    echo "Fakultaet von" $"=" $fakultaet1;;
        
    2)
            
    # Es gibt ZWEI Argumente ==> Schleife mit allen Fakultaeten von $1 bis $2 berechnen und ausgeben
            
    while [ $von -le $bis ]; do
                while [ 
    $von -gt 1 ]; do
                    
    fakultaet2=$fakultaet2*$von
                    von
    =$von-1
                done
                
    echo $fakultaet2
                von
    =$von+1
            done
    ;;
        *)
            echo 
    "Sie duerfen nur eine oder zwei Zahlen als Parameter eingeben!";;
    esac
    Der entscheidende Teil ist also in dem "case-Block", wo die 2 steht. Ich hab den Code einfach PHP-Code eingebunden, ist doch ein befriedigendes Syntaxhighlighting. Darf ich das? :)
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Hans Dampf, 07.02.2008
    Hans Dampf

    Hans Dampf Jungspund

    Dabei seit:
    19.01.2008
    Beiträge:
    20
    Zustimmungen:
    0
    Bist Du sicher, daß das Rechnen funktioniert? Schau mal:
    Code:
    $ var=3+4; echo $var
    3+4
    $ ((var=3+4)); echo $var
    7
    
     
  4. #3 tuxlover, 07.02.2008
    tuxlover

    tuxlover Der den Tux knuddelt

    Dabei seit:
    26.10.2005
    Beiträge:
    2.106
    Zustimmungen:
    0
    Ort:
    berlin
    Code:
    "Bitte uebergeben Sie als Argumente 2 oder 3 Zahlen.";; 
    ...
    echo "Sie duerfen nur eine oder zwei Zahlen als Parameter eingeben!";; 
    
    ja was denn nun? :think:

    und die fakultät ist doch durch
    n!:= n*(n-1)*...*1 definiert, mit 1!:=1 0!:=1

    also wieso brauchst du mehr als eine zahl?

    das was du brechnen willst ist prod(i=a b)(i), wobei a die untere grenze und b die obere grenze und a, b aus N sind. das ist aber nicht die definition von fakultät.

    bist du also sicher das du das richtig machst, was du da machst?

    gruß tuxlover
     
  5. #4 donsimon1991, 07.02.2008
    donsimon1991

    donsimon1991 Eroberer

    Dabei seit:
    23.12.2007
    Beiträge:
    70
    Zustimmungen:
    0
    ich meine natürlich eine oder zwei Zahlen!

    die Fakultät an sich zu berechnen, kann ich ja schon. Da gebe ich dann zum Beispiel ./fakultaet 5 ein und dann wird Fakultaet = 120 ausgegeben. Wenn ich aber ./fakultaet 1 5 eingebe, dann soll folgendes bei rauskommen:
    Code:
    1
    2
    6
    24
    120
    
    Also die Fakultäten von 1 bis 5. Was ich noch ändern muss ist der Teil bei der case-Abfrage, wo die 2 steht.
     
  6. cremi

    cremi Dude

    Dabei seit:
    15.02.2004
    Beiträge:
    329
    Zustimmungen:
    0
    Ort:
    AUT/Ktn
    dann brauchst du ja nur eine schleife über deine fakultätsberechnung legen:

    Pseudocode:
    Code:
    for i=anfangswert : endwert
        fakultätsberechnung(i)
    
     
  7. #6 donsimon1991, 07.02.2008
    donsimon1991

    donsimon1991 Eroberer

    Dabei seit:
    23.12.2007
    Beiträge:
    70
    Zustimmungen:
    0
    Habs jetzt nochmal probiert, jetzt sieht der Code so aus:
    PHP:
    #!/bin/bash
    # Variablen initialisieren

    declare -i zahl1=$1
    declare -i zahl2=$2
    declare -i fakultaet1=1
    declare -i fakultaet2=1

    # Wenn $1<$2, dann von=$1 und bis=$2
    if [ $zahl1 -lt $zahl2 ]; then
        
    declare -i von=$zahl1
        
    declare -i bis=$zahl2
    # Wenn $1<$2, dann von=$2 und bis=$1
    elif $zahl1 -gt $zahl2 ]; then
        
    declare -i von=$zahl2
        
    declare -i bis=$zahl1
    fi

    # Variable fuer die Schleife
    declare -i count=$von

    # Ueberpruefen, wie viele Argumente uebergeben wurden
    case $# in
        
    0)
            
    # Es gibt KEIN Argument ==> Fehlermeldung ausgeben
            
    echo "Sie duerfen nur eine oder zwei Zahlen als Parameter eingeben!";;
        
    1)
            
    # Es gibt EIN Argument ==> Fakultaet von $1 berechnen und ausgeben
            
    while [ $zahl1 -gt 1 ]; do
                
    fakultaet1=$fakultaet1*$zahl1
                zahl1
    =$zahl1-1
            done
            
    echo "Fakultaet von" $"=" $fakultaet1;;
        
    2)
            
    # Es gibt ZWEI Argumente ==> Schleife mit allen Fakultaeten von $1 bis $2 berechnen und ausgeben
            
    while [ $count -le $bis ]; do
                while [ 
    $von -gt 1 ]; do
                    
    fakultaet2=$fakultaet2*$von
                    von
    =$von-1
                done
                
    echo $fakultaet2
                count
    =$count+1
            done
    ;;
        *)
            echo 
    "Sie duerfen nur eine oder zwei Zahlen als Parameter eingeben!";;
    esac
    Und wenn ich dann
    Code:
    ./fakultaet 5 8
    
    eingebe, kommt das dabei raus:
    Code:
    120
    120
    120
    120
    
    Also die Fakultät von 5 und das ganze dann vier mal. Hm, 5, 6, 7 und 8 sind genau vier Zahlen, hat es damit was zu tun?

    PS: Ich hasse logische Fehler! X(
     
  8. #7 tuxlover, 07.02.2008
    Zuletzt bearbeitet: 07.02.2008
    tuxlover

    tuxlover Der den Tux knuddelt

    Dabei seit:
    26.10.2005
    Beiträge:
    2.106
    Zustimmungen:
    0
    Ort:
    berlin
    Code:
       2) 
            until [ $bis -eq $von ]; do 
                fac=$(($fac*$bis))
                 ((bis-=1))
             done
    
    so müsste es gehen. viel spaß noch
     
  9. #8 donsimon1991, 07.02.2008
    donsimon1991

    donsimon1991 Eroberer

    Dabei seit:
    23.12.2007
    Beiträge:
    70
    Zustimmungen:
    0
    Ich hab das jetzt so übernommen wie du geschrieben hast. Wenn ich da
    Code:
    ./fakultaet 1 5
    
    eingebe, dann wird eine Endlosschleife mit 120 ausgegeben. Wo ist diesmal der Fehler?
     
  10. #9 Wolfgang, 07.02.2008
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo

    Ich mag dein Script nicht debuggen.
    Aber ein paar Hinweise zum Verständnis:
    Ganzzahlige Rechenoperationen in der bash werden mit dem Buildin $(( OPERATIO)) ausgeführt.
    Expire sollte nicht mehr verwendet werden, da es ein externer Prozess ist.
    Dazu habe ich aber an anderer Stelle schon etwas gesagt.

    Increment:
    Code:
    a=0;
    while [ $a -lt 10 ]; do echo $a; ((a++));done
    
    Decrement:
    Code:
    a=10;
    while [ $a -gt 0 ]; do echo $a; ((a--));done
    
    Mit Zuweisung:
    Code:
    a=10;b=0;
    while [ $a -gt 0 ]; do b=$((a--));echo $b;done
    
    Sowas funktioniert nicht wie du erwartest:
    Code:
    $ a=10;b=$a + 1; echo $b;
    bash: +: command not found
    0
    
    Das hier auch nicht:
    Code:
    $ a=10;a=$((-=1)); echo $a;
    bash: -=1: syntax error: operand expected (error token is "-=1")
    
    Müsstest du aber eigentlich gemerkt haben.

    Noch ein Tipp:
    Strukturier deinen Code so, dass du die gleiche Funtion nur einmal erstellst.
    Frage dann ab wie oft und womit sie verwendet werden soll.

    Die Abfrage wieviel Argumente sollte am Beginn stehen.
    Wenn nur ein Arg. da ist, ist die folgende Zuweisung schon sinnlos.
    Code:
    declare -i zahl2=$2 
    Dann fehlt dir eine Auswertung bei Gleichheit der Argumente.

    Das nur so als Tipp.

    Ach ja falls du nach diesem Tut vorgehst:
    Klick
    Das hat genau an diesen Stellen in der Bash (bis Ver 3.xx) einen Fehler!

    Gruß Wolfgang
     
  11. #10 tuxlover, 07.02.2008
    Zuletzt bearbeitet: 07.02.2008
    tuxlover

    tuxlover Der den Tux knuddelt

    Dabei seit:
    26.10.2005
    Beiträge:
    2.106
    Zustimmungen:
    0
    Ort:
    berlin
    Code:
    #!/bin/bash
    
    declare -i von=$1
    declare -i bis=$2
    
    if [ $bis -lt $von ]
    then
          unset bis
          declare -i bis=$1
          unset von
          declare -i von=$2
    fi
    
    until [ $bis -eq $von ]
    do
            fac=$(($fac*$bis))
            ((bis-=1))
    done
    echo $fac
    
    exit 0
    
    probiere das mal in nem neuen shellscript aus, und berichte mal ob das funktioniert hat.

    ach ja hier bietet sich an mit funktionen zu arbeiten.

    oops wie peinlich hatte auch nen fehler drin
     
  12. #11 donsimon1991, 07.02.2008
    donsimon1991

    donsimon1991 Eroberer

    Dabei seit:
    23.12.2007
    Beiträge:
    70
    Zustimmungen:
    0
    Da bekomme ich folgende Fehlermeldung:
    Code:
    line 16: *7: syntax error: operand expected (error token is "*7")
    
    Wie du wahrscheinlich schon gesehen hast, rechne ich in der shell ein bisschen anders. Gibt ja mehrere Möglichkeiten. Deswegen kann ich den Fehler nicht finden.

    :hilfe2:
     
  13. #12 tuxlover, 07.02.2008
    tuxlover

    tuxlover Der den Tux knuddelt

    Dabei seit:
    26.10.2005
    Beiträge:
    2.106
    Zustimmungen:
    0
    Ort:
    berlin
    keine ahnung muss jetzt los.

    nee warte mal setze mal vorher fac=1, dann müsste es gehen. ich probiere das später mal aus und sag dir dann meine lösung.

    allerdings ist shellscripting nicht gerade die beste methode um mathematische probleme zu lösen. wenn du das weiter machen willst solltest du auf C umsteigen.

    Code:
    
    #!/bin/bash
    
    declare -i von=$1
    declare -i bis=$2
    
    if [ $bis -lt $von ]
    then
          unset bis
          declare -i bis=$1
          unset von
          declare -i von=$2
    fi
    
    fac=1
    
    until [ $bis -eq $von ]
    do
            
            fac=$(($fac*$bis))
            ((bis-=1)) 
    done
    echo $fac
    
    exit 0
    
    du kannst ma deine shellscripte mit

    Code:
    sh -x ./name 
    starten. dann siehst du nämlich was da los ist.
     
  14. #13 marcellus, 07.02.2008
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    Das ist schön, dass du das kannst, aber du hast keine frage gestellt, ich das ist eher unüblich, da du ja gar keine reaktion herausrufst.

    Btw Wenn $1 und $2 gleich sind, was würde dein script machen?
     
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. #14 tuxlover, 07.02.2008
    tuxlover

    tuxlover Der den Tux knuddelt

    Dabei seit:
    26.10.2005
    Beiträge:
    2.106
    Zustimmungen:
    0
    Ort:
    berlin
    wtf was will uns der autor damit sagen? :think:
     
  17. #15 marcellus, 07.02.2008
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    Huch ich hab den thread länger offen gehabt und so auf den ersten blick hat das script ganz passabel ausgesehen, deswegen bin ich von einer art "hey schau mal was ich tolles kann" thread ausgegangen

    sry
     
Thema:

Fakultätsschleife