Problem bei ersten python versuchen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
BlackPython
User
Beiträge: 16
Registriert: Samstag 15. Oktober 2011, 09:22

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 :)
Krabman318
User
Beiträge: 21
Registriert: Sonntag 14. August 2011, 14:36

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 "*" 
Benutzeravatar
/me
User
Beiträge: 3552
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
BlackPython
User
Beiträge: 16
Registriert: Samstag 15. Oktober 2011, 09:22

vielen dank
aber gibt es statt str noch eine andere moeglichkeit?
weil str befehle haben wir noch nicht gelernt
Krabman318
User
Beiträge: 21
Registriert: Sonntag 14. August 2011, 14:36

@/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 "*"
BlackPython
User
Beiträge: 16
Registriert: Samstag 15. Oktober 2011, 09:22

ok danke
aber hat noch jemand eine antwort auf 2.?
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:
BlackPython
User
Beiträge: 16
Registriert: Samstag 15. Oktober 2011, 09:22

hast recht :oops: :?
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()`.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

@BlackJack, vorlernen tut man doch nicht!
the more they change the more they stay the same
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dav1d hat geschrieben:@BlackJack, vorlernen tut man doch nicht!
Kommt sehr darauf in, inwiefern man an den Unterrichtsinhalten interessiert ist.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Die zweite Aufgabe lässt sich doch sehr einfach über eine Schleife lösen.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

@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)
the more they change the more they stay the same
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")}'
;)
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}'
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')))))))
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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 ;)
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))
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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..
the more they change the more they stay the same
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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).
Zuletzt geändert von Hyperion am Donnerstag 20. Oktober 2011, 23:07, insgesamt 1-mal geändert.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten