Το Στέκι των Πληροφορικών

Επαγγελματικό Λύκειο => Γενικά => Προγραμματισμός Υπολογιστών => Μήνυμα ξεκίνησε από: dimitra στις 21 Ιαν 2017, 05:38:31 μμ

Τίτλος: Δραστηριότητα 4, κεφ 8 (σελ 151)
Αποστολή από: dimitra στις 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


Τον δοκίμασα και τρέχει, αλλά μου φαίνεται πολύπλοκος. Έχει κανείς καμιά πιο εύκολη λύση; Γιατί αν είναι έτσι όπως το σκέφτηκα δεν με βλέπω να το κάνω στους μαθητές μου!  :)
Τίτλος: Απ: Δραστηριότητα 4, κεφ 8 (σελ 151)
Αποστολή από: evry στις 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.  
Τίτλος: Απ: Δραστηριότητα 4, κεφ 8 (σελ 151)
Αποστολή από: dimitra στις 21 Ιαν 2017, 07:59:21 μμ
Ευχαριστώ πολύ για την απάντηση!
Νομίζω ότι ο αλγόριθμος που σκεφτήκαμε είναι ο ίδιος, απλά ο δικός σου κώδικας είναι πολύ πιο "κομψός". Είναι δύσκολη άσκηση, τουλάχιστον για τους μαθητές  μου.
ευχαριστώ και πάλι
Τίτλος: Απ: Δραστηριότητα 4, κεφ 8 (σελ 151)
Αποστολή από: evry στις 21 Ιαν 2017, 08:40:07 μμ
Επίσης στην δραστηριότητα 5 η φράση "Ο αλγόριθμος θα τερματίζει όταν αδειάζει η στοίβα" δεν ισχύει.
Θα διορθωθεί.
Μια σωστή εκφώνηση θα μπορούσε να είναι:

Να γράψετε ένα πρόγραμμα το οποίο θα διαβάζει αριθμούς από το πληκτρολόγιο, μέχρι να δοθεί ο αριθμός 0. Κάθε φορά που θα διαβάζει έναν θετικό αριθμό, θα τον
προσθέτει σε μια στοίβα. Όταν διαβάζει έναν αρνητικό αριθμό θα αφαιρεί τόσους αριθμούς από τη στοίβα, όσο είναι η τιμή του αριθμού εκτός αν δεν υπάρχουν τόσοι αριθμοί στην στοίβα, οπότε θα εμφανίζει σχετικό μήνυμα. Στο τέλος θα εμφανίζει τα περιεχόμενα της στοίβας.
Τίτλος: Απ: Δραστηριότητα 4, κεφ 8 (σελ 151)
Αποστολή από: pmouz στις 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)
Τίτλος: Απ: Δραστηριότητα 4, κεφ 8 (σελ 151)
Αποστολή από: taxata στις 05 Μάρ 2017, 08:40:49 μμ
Ο τελεστής ":" για τα αντικείμενα τύπου string υπάρχει στο βιβλίο της Β (βλ σελ 79) και είναι και στην αντίστοιχη διδακτέα ύλη της τάξης B', αλλά όχι της Γ'. Συνεπώς είναι συνετό αφενός να μην αποτελεί αντικείμενο εξέτασης στη Γ, αλλά αφετέρου να μπορεί να χρησιμοποιηθεί σε επίλυση άσκησης πχ σε πανελλαδικές. Αυτός νομίζω είναι ένας γενικός κανόνας που πρέπει να ακολουθείται, όπως κάνουν εδώ και καιρό άλλες επιστήμες με συνέχεια σε μαθήματα Α, Β, Γ τάξη.
Σε διαφορετική περίπτωση ακροβατούμε επικίνδυνα.
Τίτλος: Απ: Δραστηριότητα 4, κεφ 8 (σελ 151)
Αποστολή από: pmouz στις 05 Μάρ 2017, 09:39:32 μμ
Ο τελεστής ":" για τα αντικείμενα τύπου string υπάρχει στο βιβλίο της Β (βλ σελ 79) και είναι και στην αντίστοιχη διδακτέα ύλη της τάξης B', αλλά όχι της Γ'. Συνεπώς είναι συνετό αφενός να μην αποτελεί αντικείμενο εξέτασης στη Γ, αλλά αφετέρου να μπορεί να χρησιμοποιηθεί σε επίλυση άσκησης πχ σε πανελλαδικές. Αυτός νομίζω είναι ένας γενικός κανόνας που πρέπει να ακολουθείται, όπως κάνουν εδώ και καιρό άλλες επιστήμες με συνέχεια σε μαθήματα Α, Β, Γ τάξη.
Σε διαφορετική περίπτωση ακροβατούμε επικίνδυνα.
Ήθελα να το ρωτήσω για το slicing στα strings. Με μια ματιά δεν το είδα στο βιβλίο της Γ'. Αφού λες ότι υπάρχει στο βιβλίο της Β', θα έπρεπε να υπάρχει και στης Γ'. Θα είναι προς όφελος του μαθήματος και θα βοηθούσε αρκετά στη διαχείριση των strings.
Τίτλος: Απ: Δραστηριότητα 4, κεφ 8 (σελ 151)
Αποστολή από: taxata στις 06 Μάρ 2017, 01:59:27 πμ
Δεν είναι μόνο ο τελεστής : με τις χρήσεις του για slicing ή και τη δημιουργία αντιγράφου ([:]) που δεν αναφέρονται,  αλλά και άλλες μέθοδοι όπως .find() .lower() .capitalize() αλλά φαντάζομαι ότι επειδή ειπώθηκαν στη Β' στη Γ' γίνεται αναφορά στα βασικά των συμβολοσειρών, αλλά θα επαναλάβω θα μου φαινόταν παράλογο εφόσον υπάρχουν στη Β' να μη μπορούν να χρησιμοποιηθούν στη Γ'.