Αποστολέας Θέμα: Δραστηριότητα 4, κεφ 8 (σελ 151)  (Αναγνώστηκε 1708 φορές)

dimitra

  • Βετεράνος
  • ****
  • Μηνύματα: 98
Δραστηριότητα 4, κεφ 8 (σελ 151)
« στις: 21 Ιαν 2017, 05:38:31 μμ »
Η δραστηριότητα λέει:
Παράθεση
Να γράψετε μια συνάρτηση 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

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 3153
  • to Iterate is human to Recurse divine
Απ: Δραστηριότητα 4, κεφ 8 (σελ 151)
« Απάντηση #1 στις: 21 Ιαν 2017, 06:58:27 μμ »
Πολύ σωστές όλες οι παρατηρήσεις σου, η εκφώνηση της άσκησης θα αλλάξει.
Η προτεινόμενη λύση είναι η παρακάτω.
Προφανώς πρόκειται για αρκετά απαιτητική άσκηση.
Για αυτό καλό είναι να τη σπάσουμε σε δυο συναρτήσεις, μια που ελέγχει για το πρόθεμα και μια άλλη που τη χρησιμοποιεί.

Κώδικας: Python
  1. # Αυτό μπορεί να γίνει με χρήση του τελεστή in πολύ απλά
  2. def isSubstring( string, substring):
  3.     return substring in string
  4.  
  5. # Ελέγχει αν το substring εμφανίζεται στο string ξεκινώντας από τη θέση start
  6. def isPrefix(string, substring, start):
  7.     i = start
  8.     j = 0
  9.     count = 0
  10.     while j < len(substring) and i < len(string) :
  11.         if string[ i ] == substring[ j ] :
  12.             count = count + 1
  13.         i = i + 1
  14.         j = j + 1
  15.            
  16.     return  count == len(substring)
  17.  
  18. # εκτελουμε για κάθε θέση του string την προηγουμένη συνάρτηση
  19. # και έτσι υπολογίζουμε πόσες φορές εμφανίζεται το substring στο String
  20. def findSubstring( string, substring):
  21.     pos = 0
  22.     count = 0
  23.  
  24.     while pos < len(string) :
  25.         if isPrefix(string, substring, pos):
  26.             count = count + 1
  27.         pos = pos + 1
  28.    
  29.     return count
  30.  
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

dimitra

  • Βετεράνος
  • ****
  • Μηνύματα: 98
Απ: Δραστηριότητα 4, κεφ 8 (σελ 151)
« Απάντηση #2 στις: 21 Ιαν 2017, 07:59:21 μμ »
Ευχαριστώ πολύ για την απάντηση!
Νομίζω ότι ο αλγόριθμος που σκεφτήκαμε είναι ο ίδιος, απλά ο δικός σου κώδικας είναι πολύ πιο "κομψός". Είναι δύσκολη άσκηση, τουλάχιστον για τους μαθητές  μου.
ευχαριστώ και πάλι
Ενιαίο, δημόσιο και δωρεάν δωδεκάχρονο σχολείο.

evry

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 3153
  • to Iterate is human to Recurse divine
Απ: Δραστηριότητα 4, κεφ 8 (σελ 151)
« Απάντηση #3 στις: 21 Ιαν 2017, 08:40:07 μμ »
Επίσης στην δραστηριότητα 5 η φράση "Ο αλγόριθμος θα τερματίζει όταν αδειάζει η στοίβα" δεν ισχύει.
Θα διορθωθεί.
Μια σωστή εκφώνηση θα μπορούσε να είναι:

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

pmouz

  • Θαμώνας
  • ***
  • Μηνύματα: 33
Απ: Δραστηριότητα 4, κεφ 8 (σελ 151)
« Απάντηση #4 στις: 05 Μάρ 2017, 08:22:07 μμ »
Μια λύση και από εμένα χρησιμοποιώντας τη συνάρτηση 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)
« Τελευταία τροποποίηση: 08 Μάρ 2017, 08:27:04 μμ από pmouz »

taxata

  • Βετεράνος
  • ****
  • Μηνύματα: 95
  • Live long and prosper \\//
    • Πληροφορική στο ΕΠΑΛ
Απ: Δραστηριότητα 4, κεφ 8 (σελ 151)
« Απάντηση #5 στις: 05 Μάρ 2017, 08:40:49 μμ »
Ο τελεστής ":" για τα αντικείμενα τύπου string υπάρχει στο βιβλίο της Β (βλ σελ 79) και είναι και στην αντίστοιχη διδακτέα ύλη της τάξης B', αλλά όχι της Γ'. Συνεπώς είναι συνετό αφενός να μην αποτελεί αντικείμενο εξέτασης στη Γ, αλλά αφετέρου να μπορεί να χρησιμοποιηθεί σε επίλυση άσκησης πχ σε πανελλαδικές. Αυτός νομίζω είναι ένας γενικός κανόνας που πρέπει να ακολουθείται, όπως κάνουν εδώ και καιρό άλλες επιστήμες με συνέχεια σε μαθήματα Α, Β, Γ τάξη.
Σε διαφορετική περίπτωση ακροβατούμε επικίνδυνα.
Τάσος_Χατζηπαπαδόπουλος
http://users.sch.gr/chatzipap/

pmouz

  • Θαμώνας
  • ***
  • Μηνύματα: 33
Απ: Δραστηριότητα 4, κεφ 8 (σελ 151)
« Απάντηση #6 στις: 05 Μάρ 2017, 09:39:32 μμ »
Ο τελεστής ":" για τα αντικείμενα τύπου string υπάρχει στο βιβλίο της Β (βλ σελ 79) και είναι και στην αντίστοιχη διδακτέα ύλη της τάξης B', αλλά όχι της Γ'. Συνεπώς είναι συνετό αφενός να μην αποτελεί αντικείμενο εξέτασης στη Γ, αλλά αφετέρου να μπορεί να χρησιμοποιηθεί σε επίλυση άσκησης πχ σε πανελλαδικές. Αυτός νομίζω είναι ένας γενικός κανόνας που πρέπει να ακολουθείται, όπως κάνουν εδώ και καιρό άλλες επιστήμες με συνέχεια σε μαθήματα Α, Β, Γ τάξη.
Σε διαφορετική περίπτωση ακροβατούμε επικίνδυνα.
Ήθελα να το ρωτήσω για το slicing στα strings. Με μια ματιά δεν το είδα στο βιβλίο της Γ'. Αφού λες ότι υπάρχει στο βιβλίο της Β', θα έπρεπε να υπάρχει και στης Γ'. Θα είναι προς όφελος του μαθήματος και θα βοηθούσε αρκετά στη διαχείριση των strings.

taxata

  • Βετεράνος
  • ****
  • Μηνύματα: 95
  • Live long and prosper \\//
    • Πληροφορική στο ΕΠΑΛ
Απ: Δραστηριότητα 4, κεφ 8 (σελ 151)
« Απάντηση #7 στις: 06 Μάρ 2017, 01:59:27 πμ »
Δεν είναι μόνο ο τελεστής : με τις χρήσεις του για slicing ή και τη δημιουργία αντιγράφου ([:]) που δεν αναφέρονται,  αλλά και άλλες μέθοδοι όπως .find() .lower() .capitalize() αλλά φαντάζομαι ότι επειδή ειπώθηκαν στη Β' στη Γ' γίνεται αναφορά στα βασικά των συμβολοσειρών, αλλά θα επαναλάβω θα μου φαινόταν παράλογο εφόσον υπάρχουν στη Β' να μη μπορούν να χρησιμοποιηθούν στη Γ'.
« Τελευταία τροποποίηση: 06 Μάρ 2017, 02:11:13 πμ από taxata »
Τάσος_Χατζηπαπαδόπουλος
http://users.sch.gr/chatzipap/