Seite 1 von 2

Problem bei ersten python versuchen

Verfasst: Samstag 15. Oktober 2011, 09:40
von BlackPython
Hallo,
ich bin neu im forum und ich habe ein problem mit meinen ersten python versuchen:

1. Ein Programm soll die Zahlen 1 bis 100 ausgeben. Alle Zahlen, die einen 7er an der Einer- oder an der Zehnerstelle enthalten, sollen durch "*" ersetzt werden, ebenso alle Zahlen, die durch 7 teilbar sind.

2. Gib eine Tabelle mit x und x! aus. x! heißt Fakultät oder Faktorielle und ist das Produkt der natürlichen Zahlen von 1 bis x. 0! ist gleich 1.
Form der Tabelle:

0!=1
1!=1
2!=2
3!=6 usw.

Das war Hausübung und ich weiss nicht wie ich das machen soll :S
und da ich neuling bin bitte ich um einfache codes :P

bei 1. hab ichs wie folgt ausprobiert:

Code: Alles auswählen

for i in range(1,70):
    if i%7:
        print i
    else:
        print "*"
for i in range(70,80):
    if i<80 and 69<i:
        print "*"
    else:
        print i
for i in range(80,101):
    if i%7:
        print i
    else:
        print "*" 
aber dann fehlen noch die Zahlen, die einen 7er als einerstelle haben :/

bitte um hilfe..
mfg Blacki :)

Re: Problem bei ersten python versuchen

Verfasst: Samstag 15. Oktober 2011, 10:37
von Krabman318
Zu 1.:
Das müsste funktionieren:

Code: Alles auswählen

for i in range(1,70):
    if "7" in str(i):
        print "*"
    elif i%7:
        print i
    else:
        print "*"
for i in range(70,80):
    if "7" in str(i):
        print "*"
    else:
        print i
for i in range(80,101):
    if "7" in str(i):
        print "*"
    elif i%7:
        print i
    else:
        print "*" 

Re: Problem bei ersten python versuchen

Verfasst: Samstag 15. Oktober 2011, 10:48
von /me
Wozu denn den Bereich in Einzelteile aufsplitten?

Der korrekte Ansatz besteht allerdings in der Tat darin, die Zahl mit str() in einen String zu verwandeln.

Re: Problem bei ersten python versuchen

Verfasst: Samstag 15. Oktober 2011, 10:50
von BlackPython
vielen dank
aber gibt es statt str noch eine andere moeglichkeit?
weil str befehle haben wir noch nicht gelernt

Re: Problem bei ersten python versuchen

Verfasst: Samstag 15. Oktober 2011, 10:51
von Krabman318
@/me:
Stimmt,

Code: Alles auswählen

for i in range(1,101):
    if "7" in str(i):
        print "*"
    elif i%7:
        print i
    else:
        print "*"
reicht völlig aus.

EDIT:
@BlackPython:
Ohne "str(i)" geht auch

Code: Alles auswählen

for i in range(1,101):
    if i > 9 and not (i - 7)%10:
        print "*"
    elif i%7:
        print i
    else:
        print "*"

Re: Problem bei ersten python versuchen

Verfasst: Samstag 15. Oktober 2011, 10:59
von BlackPython
ok danke
aber hat noch jemand eine antwort auf 2.?

Re: Problem bei ersten python versuchen

Verfasst: Samstag 15. Oktober 2011, 11:08
von BlackJack
@BlackPython: Da das nach Python 2.x aussieht, solltest Du Dir `xrange()` statt `range()` angewöhnen, wenn Du die Liste mit Zahlen gar nicht als Liste im Ganzen benötigst.

Für die zweite Aufgabe müsstest Du Dir halt eine Fakultätsfunktion schreiben.

Edit: Und jetzt kommt wahrscheinlich wieder die Antwort dass ihr Funktionen noch nicht hattet… :roll:

Re: Problem bei ersten python versuchen

Verfasst: Samstag 15. Oktober 2011, 11:43
von BlackPython
hast recht :oops: :?

Re: Problem bei ersten python versuchen

Verfasst: Samstag 15. Oktober 2011, 11:54
von BlackJack
@BlackPython: Dann schreib Dir halt eine Fakultätsfunktion und bette den Funktionskörper an der Stelle ein, wo sonst der Aufruf stehen würde. Oder zeig etwas Eigeninitiative und verwende Funktionen bevor sie im Unterricht angesprochen wurden. Das gleiche gilt auch für grundlegende Funktionen wie `str()`.

Re: Problem bei ersten python versuchen

Verfasst: Samstag 15. Oktober 2011, 13:45
von Dav1d
@BlackJack, vorlernen tut man doch nicht!

Re: Problem bei ersten python versuchen

Verfasst: Samstag 15. Oktober 2011, 14:25
von snafu
Dav1d hat geschrieben:@BlackJack, vorlernen tut man doch nicht!
Kommt sehr darauf in, inwiefern man an den Unterrichtsinhalten interessiert ist.

Re: Problem bei ersten python versuchen

Verfasst: Samstag 15. Oktober 2011, 15:13
von jbs
Die zweite Aufgabe lässt sich doch sehr einfach über eine Schleife lösen.

Re: Problem bei ersten python versuchen

Verfasst: Samstag 15. Oktober 2011, 16:42
von Dav1d
@snafu, bei uns ist/war vorlernen verpönt, zum einen von den (Plural von Lehrer), zum anderen galt man dann als Streber (gut seit der Oberstufe hat sich das etwas geändert)

Re: Problem bei ersten python versuchen

Verfasst: Samstag 15. Oktober 2011, 17:15
von problembär
jbs hat geschrieben:Die zweite Aufgabe lässt sich doch sehr einfach über eine Schleife lösen.

Code: Alles auswählen

perl -e 'for(0..10){$x=1;for $u (1..$_){$x*=$u}print("$_! = $x\n")}'
;)

Re: Problem bei ersten python versuchen

Verfasst: Samstag 15. Oktober 2011, 19:18
von BlackJack
@problembär: Das waren jetzt aber *zwei* Schleifen. Mit *einer* ist es kürzer:

Code: Alles auswählen

perl -e '$x=1;for(0..10){print("$_! = $x\n");$x*=$_+1}'

Re: Problem bei ersten python versuchen

Verfasst: Samstag 15. Oktober 2011, 20:33
von BlackJack
Scheme-Lösungen (mit Bigloo getestet).

Problem 1:

Code: Alles auswählen

(define (dividable-by-7 n)
    (zero? (modulo n 7)))

(define (contains-digit-7 n)
    (string-contains (number->string n) "7"))

(define (print-numbers a b)
    (let ((test (lambda (n) (or (dividable-by-7 n) (contains-digit-7 n)))))
        (let loop ((i a))
            (if (<= i b)
                (begin
                    (print (if (test i) "*" i))
                    (loop (+ i 1)))))))
Problem 2:

Code: Alles auswählen

(define (print-fak-tab n)
    (let loop ((x 0) (r 1))
        (if (<= x n)
            (begin
                (print x "! = " r)
                (let ((x' (+ x 1)))
                    (loop x' (* r x')))))))

Re: Problem bei ersten python versuchen

Verfasst: Samstag 15. Oktober 2011, 21:17
von DasIch
Hab es mal in Haskell gelöst.

Problem 1:

Code: Alles auswählen

divisibleBy7 :: Integer -> Bool
divisibleBy7 n = n `mod` 7 == 0

containsDigit7 :: Show a => a -> Bool
containsDigit7 n = '7' `elem` (show n)

printNumber :: Integer -> IO ()
printNumber n
        | divisibleBy7 n || containsDigit7 n = putStrLn "*"
        | otherwise                          = putStrLn $ show n

main :: IO ()
main = mapM_ printNumber [1..100]
Problem 2:

Code: Alles auswählen

import System.Environment (getArgs)

main :: IO ()
main = do
	args <- getArgs
	let x = getX args
        mapM_ printLine [1..x]
        where printLine n = putStrLn $ (show n) ++ "! = " ++ show (factorial n)

getX :: [String] -> Integer
getX []    = 10
getX (x:_) = read x

factorial :: Integer -> Integer
factorial n = product [1..n]
Ich komme übrigens ganz ohne Schleife aus ;)

Re: Problem bei ersten python versuchen

Verfasst: Samstag 15. Oktober 2011, 21:33
von BlackJack
@DasIch: Meine Lösung kommt auch ohne Schleifen aus. Die lokale Funktion `loop` hätte ich auch anders nennen können. :-)

Edit: Und das Ganze in Io.

Problem 1:

Code: Alles auswählen

Range

Number isDivisibleBy7 := method(self mod(7) == 0)
Number containsDigit7 := method(self asString contains("7" at(0)))

1 to(100) foreach(i, if(i isDivisibleBy7 or(i containsDigit7), "*", i) println)
Problem 2:

Code: Alles auswählen

Range
x := 1; 1 to(10) foreach(i, (i .. "! = " .. x) println; x = x * (i + 1))

Re: Problem bei ersten python versuchen

Verfasst: Sonntag 16. Oktober 2011, 13:10
von Dav1d
Problem 1 in D:

Code: Alles auswählen

import std.stdio : writefln;
import std.conv : to;


bool divisible_by_7(int n) {
    return (n % 7) == 0;
}

bool contains_digit_7(int n) {
    foreach(char c; to!(string)(n)) {
        if(c == '7') { return true; }
    }
    return false;
}

void main() {
    for(int i = 1; i < 101; i++) {
        if(divisible_by_7(i) || contains_digit_7(i)) {
            writefln("*");
        } else {
            writefln("%d", i);
        }
    }
}
2 folgt evt. später, ich muss weg :P

PS:/ Ich könnte statt der schleifen auch map verwenden..

Re: Problem bei ersten python versuchen

Verfasst: Sonntag 16. Oktober 2011, 14:08
von Hyperion
Ok, hier mal im Commodore BASIC V2.0:

Code: Alles auswählen

10 fori=1to100:di=i/7:i$=str$(i):ou$=str$(i)
20 if(di=int(di) or mid$(i$,2,1)="7" or right$(i$,1)="7") then ou$="*"
30 print ou$;:next
Hier in Kleinbuchstaben, damit man es mittels `petcat` konvertieren kann:

Code: Alles auswählen

petcat -w2 -o test7.prg -- test7.bas 
Getestet im VICE 2.2 (x64).