Δραστηριότητα 4, κεφ 8 (σελ 151)

Ξεκίνησε από dimitra, 21 Ιαν 2017, 05:38:31 ΜΜ

« προηγούμενο - επόμενο »

dimitra

Η δραστηριότητα λέει:
ΠαράθεσηΝα γράψετε μια συνάρτηση isSubstring(string, substring), η οποία θα ελέγχει αν η συμβολοσειρά subString περιέχεται στη συμβολοσειρά string και αν ναι, θα επιστρέφει True. Στη συνέχεια, να χρησιμοποιήσετε αυτή τη συνάρτηση, για να βρείτε πόσες φορές εμφανίζεται μια συμβολοσειρά μέσα σε μια άλλη.

Το πρώτο σκέλος είναι εύκολο, αφού χρείαζεται να γίνει μόνο ένας έλεγχος με το in. Το δεύτερο σκέλος απ' ό,τι καταλαβαίνω δεν έχει να κάνει με το πρώτο, έτσι δεν είναι; Επίσης δεν μπορούμε να χρησιμοποιήσουμε sting slicing που θα έκανε τα πράγματα πιο εύκολα (ή μπορούμε;) και σίγουρα δεν μπορούμε να χρησιμοποιήσουμε τη μέθοδο count της string που θα έλυνε το πρόβλημα σε μια γραμμή.

Ο κώδικας που σκέφτηκα εγώ (για το δεύτερο σκέλος) είναι ο εξής:
def subString(word, subWord):
    times=0
    indexWord=0 #για τη διάσχιση της λέξης
    while indexWord <= len(word)-len(subWord):
        indexSubWord=0 #για τη διάσχιση της υπολέξης, μηδενίζει κάθε φορά στην αρχή της σύγκρισης
        curIndexWord=indexWord
        while indexSubWord!=len(subWord) and word[curIndexWord]==subWord[indexSubWord]: #μέχρι να βρούμε ένα διαφορετικό ή ένα ταίριασμα
            curIndexWord=curIndexWord+1
            indexSubWord=indexSubWord+1
        if indexSubWord==len(subWord): #επιτυχές ταίριασμα
            times=times+1
        indexWord=indexWord+1
    return times

word=raw_input("Δώσε μια λέξη:")
subWord=raw_input("Δώσε τη λέξη που θέλεις να δεις πόσες φορές υπάρχει στην προηγούμενη: ")
t=subString(word, subWord)
print "Η λέξη ", subWord, "εμφανίστηκε ", t, " φορές στη λέξη ", word


Τον δοκίμασα και τρέχει, αλλά μου φαίνεται πολύπλοκος. Έχει κανείς καμιά πιο εύκολη λύση; Γιατί αν είναι έτσι όπως το σκέφτηκα δεν με βλέπω να το κάνω στους μαθητές μου!  :)
Ενιαίο, δημόσιο και δωρεάν δωδεκάχρονο σχολείο.

evry

Πολύ σωστές όλες οι παρατηρήσεις σου, η εκφώνηση της άσκησης θα αλλάξει.
Η προτεινόμενη λύση είναι η παρακάτω.
Προφανώς πρόκειται για αρκετά απαιτητική άσκηση.
Για αυτό καλό είναι να τη σπάσουμε σε δυο συναρτήσεις, μια που ελέγχει για το πρόθεμα και μια άλλη που τη χρησιμοποιεί.

Κώδικας: python
# Αυτό μπορεί να γίνει με χρήση του τελεστή in πολύ απλά
def isSubstring( string, substring):
    return substring in string

# Ελέγχει αν το substring εμφανίζεται στο string ξεκινώντας από τη θέση start
def isPrefix(string, substring, start):
    i = start
    j = 0
    count = 0
    while j < len(substring) and i < len(string) :
        if string[ i ] == substring[ j ] :
            count = count + 1
        i = i + 1
        j = j + 1
            
    return  count == len(substring)

# εκτελουμε για κάθε θέση του string την προηγουμένη συνάρτηση
# και έτσι υπολογίζουμε πόσες φορές εμφανίζεται το substring στο String
def findSubstring( string, substring):
    pos = 0
    count = 0

    while pos < len(string) :
        if isPrefix(string, substring, pos):
            count = count + 1
        pos = pos + 1
    
    return count
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

dimitra

Ευχαριστώ πολύ για την απάντηση!
Νομίζω ότι ο αλγόριθμος που σκεφτήκαμε είναι ο ίδιος, απλά ο δικός σου κώδικας είναι πολύ πιο "κομψός". Είναι δύσκολη άσκηση, τουλάχιστον για τους μαθητές  μου.
ευχαριστώ και πάλι
Ενιαίο, δημόσιο και δωρεάν δωδεκάχρονο σχολείο.

evry

Επίσης στην δραστηριότητα 5 η φράση "Ο αλγόριθμος θα τερματίζει όταν αδειάζει η στοίβα" δεν ισχύει.
Θα διορθωθεί.
Μια σωστή εκφώνηση θα μπορούσε να είναι:

Να γράψετε ένα πρόγραμμα το οποίο θα διαβάζει αριθμούς από το πληκτρολόγιο, μέχρι να δοθεί ο αριθμός 0. Κάθε φορά που θα διαβάζει έναν θετικό αριθμό, θα τον
προσθέτει σε μια στοίβα. Όταν διαβάζει έναν αρνητικό αριθμό θα αφαιρεί τόσους αριθμούς από τη στοίβα, όσο είναι η τιμή του αριθμού εκτός αν δεν υπάρχουν τόσοι αριθμοί στην στοίβα, οπότε θα εμφανίζει σχετικό μήνυμα. Στο τέλος θα εμφανίζει τα περιεχόμενα της στοίβας.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

pmouz

#4
Μια λύση και από εμένα χρησιμοποιώντας τη συνάρτηση isSubstring() που αναφέρει η άσκηση.

def isSubstring(string,substring):
    return substring in string

def countSubstring(string,substring):
    n = len(substring)
    N = len(string)
    counter = 0

    if isSubstring(string,substring) == False:
        return counter

    for i in range(N-n+1):
        result = ''
        for j in range(n):          #Anti gia to slicing tou string
            result += string[i+j]
        if result == substring:                
            counter+=1
    return counter

s = 'hellotherethisisascriptinpythonlanghellotherethisisascriptinpythonlanghello'
subs = 'hello'
print countSubstring(s,subs)

taxata

Ο τελεστής ":" για τα αντικείμενα τύπου string υπάρχει στο βιβλίο της Β (βλ σελ 79) και είναι και στην αντίστοιχη διδακτέα ύλη της τάξης B', αλλά όχι της Γ'. Συνεπώς είναι συνετό αφενός να μην αποτελεί αντικείμενο εξέτασης στη Γ, αλλά αφετέρου να μπορεί να χρησιμοποιηθεί σε επίλυση άσκησης πχ σε πανελλαδικές. Αυτός νομίζω είναι ένας γενικός κανόνας που πρέπει να ακολουθείται, όπως κάνουν εδώ και καιρό άλλες επιστήμες με συνέχεια σε μαθήματα Α, Β, Γ τάξη.
Σε διαφορετική περίπτωση ακροβατούμε επικίνδυνα.
Τάσος_Χατζηπαπαδόπουλος
Κύριε δεν έχω internet
http://users.sch.gr/chatzipap/

pmouz

Παράθεση από: taxata στις 05 Μαρ 2017, 08:40:49 ΜΜ
Ο τελεστής ":" για τα αντικείμενα τύπου string υπάρχει στο βιβλίο της Β (βλ σελ 79) και είναι και στην αντίστοιχη διδακτέα ύλη της τάξης B', αλλά όχι της Γ'. Συνεπώς είναι συνετό αφενός να μην αποτελεί αντικείμενο εξέτασης στη Γ, αλλά αφετέρου να μπορεί να χρησιμοποιηθεί σε επίλυση άσκησης πχ σε πανελλαδικές. Αυτός νομίζω είναι ένας γενικός κανόνας που πρέπει να ακολουθείται, όπως κάνουν εδώ και καιρό άλλες επιστήμες με συνέχεια σε μαθήματα Α, Β, Γ τάξη.
Σε διαφορετική περίπτωση ακροβατούμε επικίνδυνα.
Ήθελα να το ρωτήσω για το slicing στα strings. Με μια ματιά δεν το είδα στο βιβλίο της Γ'. Αφού λες ότι υπάρχει στο βιβλίο της Β', θα έπρεπε να υπάρχει και στης Γ'. Θα είναι προς όφελος του μαθήματος και θα βοηθούσε αρκετά στη διαχείριση των strings.

taxata

#7
Δεν είναι μόνο ο τελεστής : με τις χρήσεις του για slicing ή και τη δημιουργία αντιγράφου ([:]) που δεν αναφέρονται,  αλλά και άλλες μέθοδοι όπως .find() .lower() .capitalize() αλλά φαντάζομαι ότι επειδή ειπώθηκαν στη Β' στη Γ' γίνεται αναφορά στα βασικά των συμβολοσειρών, αλλά θα επαναλάβω θα μου φαινόταν παράλογο εφόσον υπάρχουν στη Β' να μη μπορούν να χρησιμοποιηθούν στη Γ'.
Τάσος_Χατζηπαπαδόπουλος
Κύριε δεν έχω internet
http://users.sch.gr/chatzipap/