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

Γενικό Λύκειο => Μονοδιάστατοι πίνακες => Γ΄ Λυκείου => Αναζήτηση => Μήνυμα ξεκίνησε από: nikolasmer στις 13 Δεκ 2025, 05:01:48 ΜΜ

Τίτλος: Δυαδική Αναζήτηση και μετά σειριακή;
Αποστολή από: nikolasmer στις 13 Δεκ 2025, 05:01:48 ΜΜ
Έβγαλα ένα θεματάκι για ένα διαγώνισμα, κλασικότατο το 1ο ερώτημα , Δυαδική με κένά. Και έπειτα εύρεση όλων των θέσεων εμφάνισης του στοιχείου χωρίς τη χρήση δομής επιλογής. Κάτι είχα στο μυαλό μου σαν απάντηση για το 2ο ερώτημα, να κάνει σεριακή αριστερά και έπειτα δεξιά του στοιχείου αλλά μπορεί να είναι και ακριανό οπότε πάλι θέλει έλεγχο με επιλογή  (το βαλα μια μονάδα έτσι για την τιμή). Να το βγάλω ή υπάρχει τρόπος;

Β2. 1. Ο πίνακας Α[Ν] περιέχει ακέραια στοιχεία ταξινομημένα σε αύξουσα σειρά και μπορεί να περιέχει και ίδιες τιμές (διπλότυπα). Να συμπληρώσετε τα κενά στο παρακάτω τμήμα προγράμματος ώστε αυτό να βρίσκει και να εμφανίζει τη θέση εμφάνισης του στοιχείου key που αναζητείται ή το μήνυμα «ΔΕΝ ΒΡΕΘΗΚΕ» σε αντίστοιχη περίπτωση, εφαρμόζοντας τον αλγόριθμο της Δυαδικής Αναζήτησης.
flag ß  ...(1)...
θ ß 0
 left
ß 1
 right
ß N
 
ΟΣΟ ...(2)...  ΚΑΙ (left <= right) ΕΠΑΝΑΛΑΒΕ
    mid
ß ...(3)...
    ΑΝ A[mid] = key ΤΟΤΕ
      flag
<- ΑΛΗΘΗΣ
      θ ß mid
   
ΑΛΛΙΩΣ_ΑΝ A[mid] > key ΤΟΤΕ
      right
ß ...(4)...
    ΑΛΛΙΩΣ
  left ß ...(5)...
  ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΑΝ ...(6)... ΤΟΤΕ
    ΓΡΑΨΕ θ
 
ΑΛΛΙΩΣ
    ΓΡΑΨΕ "ΔΕΝ ΒΡΕΘΗΚΕ"
ΤΕΛΟΣ_ΑΝ
Μονάδες 6
2. Αφήνοντας το παραπάνω τμήμα προγράμματος ως έχει, συμπληρώστε με τον κατάλληλο κώδικα ώστε να υπολογίζει και να εμφανίζει όλες τις θέσεις που υπάρχει το στοιχείο key στον πίνακα Α[Ν], χωρίς τη χρήση δομής επιλογής. 
Μονάδες 1
Τίτλος: Απ: Δυαδική Αναζήτηση και μετά σειριακή;
Αποστολή από: pgrontas στις 14 Δεκ 2025, 05:43:17 ΜΜ
Με δομή επιλογής δεν βλέπω κάτι, αλλά αν κάποιος χρησιμοποιήσει ΌΣΟ δεν είναι το ίδιο πράγμα; με την έννοια ότι το ΌΣΟ είναι ένα επαναλαμβανόμενο ΑΝ).
Τίτλος: Απ: Δυαδική Αναζήτηση και μετά σειριακή;
Αποστολή από: nikolasmer στις 14 Δεκ 2025, 07:19:27 ΜΜ
Σκεφτόμουν οτι μπορεί να βγεί εκτός πίνακα. Έχεις κάτι στο μυαλό σου Παναγιώτη;
Χωρίς όμως να μπλέξουμε με πλήρεις απτιμήσεις λογικών τελεστών και τα ρέστα.
Τίτλος: Απ: Δυαδική Αναζήτηση και μετά σειριακή;
Αποστολή από: ssimaiof στις 14 Δεκ 2025, 08:23:25 ΜΜ
Μπορούμε απλώς να μιμηθούμε την ΑΝ με την ΟΣΟ. Δεν ξέρω αν είναι αυτό που θέλεις εμένα όμως δεν μου πολυαρέσει σαν λογική θέματος.
Κώδικας [Επιλογή]
    i <- θ
    ΟΣΟ i > 1 ΚΑΙ Α[i] = key ΕΠΑΝΑΛΑΒΕ
      ΓΡΑΨΕ i
      i <- i - 1
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    Flag <- ΨΕΥΔΗΣ
    ΟΣΟ Flag = ΨΕΥΔΗΣ ΚΑΙ Α[i] = key ΕΠΑΝΑΛΑΒΕ
      ΓΡΑΨΕ i
      Flag <- ΑΛΗΘΗΣ
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    i <- θ + 1
    ΟΣΟ i < Ν ΚΑΙ Α[i] = key ΕΠΑΝΑΛΑΒΕ
      ΓΡΑΨΕ i
      i <- i + 1
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    Flag <- ΨΕΥΔΗΣ
    ΟΣΟ Flag = ΨΕΥΔΗΣ ΚΑΙ Α[i] = key ΕΠΑΝΑΛΑΒΕ
      ΓΡΑΨΕ i
      Flag <- ΑΛΗΘΗΣ
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ


Τίτλος: Απ: Δυαδική Αναζήτηση και μετά σειριακή;
Αποστολή από: nikolasmer στις 14 Δεκ 2025, 08:53:43 ΜΜ
Παράθεση από: ssimaiof στις 14 Δεκ 2025, 08:23:25 ΜΜΜπορούμε απλώς να μιμηθούμε την ΑΝ με την ΟΣΟ. Δεν ξέρω αν είναι αυτό που θέλεις εμένα όμως δεν μου πολυαρέσει σαν λογική θέματος.
Κώδικας [Επιλογή]
    i <- θ
    ΟΣΟ i > 1 ΚΑΙ Α[i] = key ΕΠΑΝΑΛΑΒΕ
      ΓΡΑΨΕ i
      i <- i - 1
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    Flag <- ΨΕΥΔΗΣ
    ΟΣΟ Flag = ΨΕΥΔΗΣ ΚΑΙ Α[i] = key ΕΠΑΝΑΛΑΒΕ
      ΓΡΑΨΕ i
      Flag <- ΑΛΗΘΗΣ
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    i <- θ + 1
    ΟΣΟ i < Ν ΚΑΙ Α[i] = key ΕΠΑΝΑΛΑΒΕ
      ΓΡΑΨΕ i
      i <- i + 1
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    Flag <- ΨΕΥΔΗΣ
    ΟΣΟ Flag = ΨΕΥΔΗΣ ΚΑΙ Α[i] = key ΕΠΑΝΑΛΑΒΕ
      ΓΡΑΨΕ i
      Flag <- ΑΛΗΘΗΣ
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ



Πολύ καλό. Πάρα πολύ καλό Στάυρο. :D  Με τη φλαγκ αναγκάζεις μια εκτέλεση και κλειδώνεις και αριστερά και δεξιά. Δεν θα το σκεφτόμουν ποτέ. Ευχαριστώ.

Βλακεία λοιπόν.
Αλλάζω την εκφώνηση.
Νεα εκφώνηση στο Β2.

Β2. Ο πίνακας A[Ν] περιέχει ακέραια στοιχεία ταξινομημένα σε αύξουσα σειρά και μπορεί να περιέχει και ίδιες τιμές (διπλότυπα). Να συμπληρώσετε τα κενά στο παρακάτω τμήμα προγράμματος ώστε:
·        να εφαρμόζει τον αλγόριθμο της Δυαδικής Αναζήτησης και να εντοπίζει τη θέση της πρώτης (αριστερότερης) εμφάνισης του στοιχείου key,
·        και εφόσον το στοιχείο βρεθεί, να εφαρμόζει δεύτερη Δυαδική Αναζήτηση στο κατάλληλο τμήμα του πίνακα ώστε να εντοπίζει τη θέση της τελευταίας (δεξιότερης) εμφάνισης του key.
Στη συνέχεια να εμφανίζει:
·        τη θέση της πρώτης εμφάνισης,
·        τη θέση της τελευταίας εμφάνισης,
·        και το πλήθος εμφανίσεων του key.
Αν το στοιχείο δεν υπάρχει στον πίνακα, να εμφανίζει «ΔΕΝ ΒΡΕΘΗΚΕ».

flag ß ...(1)...
 θ_αριστερά
ß 0
left ß 1
right ß N
! 1η Δυαδική Αναζήτηση: βρίσκει την πρώτη (αριστερότερη) εμφάνιση
ΟΣΟ left <= right ΕΠΑΝΑΛΑΒΕ
mid ß ...(2)...
 
ΑΝ A[mid] = key ΤΟΤΕ
flag ß ΑΛΗΘΗΣ
θ_αριστερά ß mid
right ß ...(3)...
 
ΑΛΛΙΩΣ_ΑΝ A[mid] < key ΤΟΤΕ
left ß ...(4)...
ΑΛΛΙΩΣ
right ß ...(5)...
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΑΝ ...(6)... ΤΟΤΕ
! 2η Δυαδική Αναζήτηση: βρίσκει την τελευταία (δεξιότερη) εμφάνιση
left ß ...(7)...
right ß N
ΟΣΟ left <= right ΕΠΑΝΑΛΑΒΕ
mid ß ...( 8 )...
ΑΝ A[mid] = key ΤΟΤΕ
...(9)...
left ß mid + 1
ΑΛΛΙΩΣ_ΑΝ ...(10)... ΤΟΤΕ
      right
ß mid - 1
    ΑΛΛΙΩΣ
      ...(11)...
    ΤΕΛΟΣ_ΑΝ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  πλήθος ß ...(12)... 
  ΓΡΑΨΕ θ_αριστερά
 
ΓΡΑΨΕ θ_δεξιά
 
ΓΡΑΨΕ πλήθος
ΑΛΛΙΩΣ
ΓΡΑΨΕ "ΔΕΝ ΒΡΕΘΗΚΕ"
ΤΕΛΟΣ_ΑΝ


ΕΔΩ (https://alkisg.mysch.gr/steki/index.php?topic=9779.0) όλο το διαγώνισμα.
Τίτλος: Απ: Δυαδική Αναζήτηση και μετά σειριακή;
Αποστολή από: pgrontas στις 15 Δεκ 2025, 10:37:31 ΠΜ
Παράθεση από: nikolasmer στις 14 Δεκ 2025, 07:19:27 ΜΜΣκεφτόμουν οτι μπορεί να βγεί εκτός πίνακα. Έχεις κάτι στο μυαλό σου Παναγιώτη;
Χωρίς όμως να μπλέξουμε με πλήρεις απτιμήσεις λογικών τελεστών και τα ρέστα.

Σκεφτόμουν πάνω κάτω αυτό που προτάθηκε, με τη διαφορά ότι θα έβαζα την συνθήκη Α[ι] = key σε εμφωλευμένη όσο αντί για το ΑΝ.