Προβλήματα στα Υποπρογράμματα

Άσκηση 4
Μία τάξη αποτελείται από 30 μαθητές, κάθε ένας από τους οποίος συμμετείχε σε ένα διαγώνισμα.
Α. Να γίνει πρόγραμμα το οποίο:

  1. θα διαβάζει τους βαθμούς των 30 μαθητών σε έναν πίνακα ΒΑΘ[30] και τα ονόματα τους σε έναν πίνακα ΟΝ_ΜΑΘ[30].
  2. θα εμφανίζει πόσοι μαθητές βαθμολογήθηκαν κάτω από τον μέσο όρο με την βοήθεια των υποπρογραμμάτων ΜΟ και ΠΛΗΘΟΣ_ΚΑΤΩ_ΑΠΟ_ΜΟ που περιγράφονται παρακάτω.
  3. θα εμφανίζει τους καλύτερους μαθητές μέσω του υποπρογράμματος ΕΜΦΑΝΙΣΕ_ΚΑΛΥΤΕΡΟΥΣ_ΜΑΘΗΤΕΣ που περιγράφεται παρακάτω

Β. Στη συνέχεια να κάνετε τα υποπρογράμματα:

  1. ΜΟ που θα δέχεται τις βαθμολογίες των μαθητών και θα υπολογίζει και επιστρέφει το μέσο όρο τους.
  2. ΠΛΗΘΟΣ_ΚΑΤΩ_ΑΠΟ_ΜΟ που θα υπολογίζει και επιστρέφει το πλήθος των μαθητών που πήραν βαθμό μικρότερο από τον μέσο όρο της τάξης.
  3. ΕΜΦΑΝΙΣΕ_ΚΑΛΥΤΕΡΟΥΣ_ΜΑΘΗΤΕΣ που θα εμφανίζει το όνομα των μαθητών που πήραν τον μέγιστο βαθμό που εμφανίστηκε στην τάξη.

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

ΣΥΝΑΡΤΗΣΗ ΜΟ(βαθμός):ΠΡΑΓΜΑΤΙΚΗ
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: βαθμός[30], α
  ΑΚΕΡΑΙΕΣ: i
ΑΡΧΗ
  α <- 0
  ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 30
    α <- α + βαθμός[i]
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΜΌ <- α / 30
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

ΣΥΝΑΡΤΗΣΗ ΠΛΗΘΟΣ_ΚΑΤΩ_ΑΠΟ_ΜΕΣΟ_ΟΡΟ(βαθμός, μέσος):ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: βαθμός[30], μέσος
  ΑΚΕΡΑΙΕΣ: i, πλήθος
ΑΡΧΗ
  πλήθος <- 0
  ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 30
    ΑΝ βαθμός[i] < μέσος ΤΟΤΕ
      πλήθος <- πλήθος + 1
    ΤΕΛΟΣ_ΑΝ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΠΛΗΘΟΣ_ΚΑΤΩ_ΑΠΟ_ΜΕΣΟ_ΟΡΟ <- πλήθος
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

ΔΙΑΔΙΚΑΣΙΑ ΕΜΦΑΝΙΣΕ_ΚΑΛΥΤΕΡΟΥΣ_ΜΑΘΗΤΕΣ(βαθμός, ονόματα)
ΜΕΤΑΒΛΗΤΕΣ
  ΧΑΡΑΚΤΗΡΕΣ: ονόματα[30]
  ΠΡΑΓΜΑΤΙΚΕΣ: βαθμός[30], μέγιστος
  ΑΚΕΡΑΙΕΣ:: i, σύνολο
ΑΡΧΗ
  μέγιστος <-βαθμός[1]
  ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 30
    ΑΝ (βαθμός[i] > μέγιστος)
      μέγιστος <- βαθμός[i]
    ΤΕΛΟΣ_ΑΝ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

  ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 30
    ΑΝ βαθμός[i] = μέγιστος ΤΟΤΕ
      ΓΡΑΨΕ ονόματα[i]
    ΤΕΛΟΣ_ΑΝ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ

ΠΡΟΓΡΑΜΜΑ μαθητές
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: ΒΑΘ[30], Μ_Ο
  ΧΑΡΑΚΤΗΡΕΣ: ΟΝ_ΜΑΘ [30]
  ΑΚΕΡΑΙΕΣ: i, σύνολο
ΑΡΧΗ
  ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 30
    ΔΙΑΒΑΣΕ ΒΑΘ[i]
    ΔΙΑΒΑΣΕ ΟΝ_ΜΑΘ[i]
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  Μ_Ο <- ΜΟ(ΒΑΘ)
  σύνολο <- ΠΛΗΘΟΣ_ΚΑΤΩ_ΑΠΟ_ΜΕΣΟ_ΟΡΟ(ΒΑΘ, Μ_Ο)
  ΓΡΑΨΕ σύνολο
  ΚΑΛΕΣΕ ΕΜΦΑΝΙΣΕ_ΚΑΛΥΤΕΡΟΥΣ_ΜΑΘΗΤΕΣ(ΒΑΘ, ΟΝ_ΜΑΘ)
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

Άσκηση 5
Μία αίθουσα κινηματογράφου αποτελείται από 15 σειρές καθισμάτων. Κάθε σειρά καθισμάτων περιλαμβάνει 30 καθίσματα.
Η 1η σειρά βρίσκεται μπροστά στην αίθουσα, ενώ αντίστοιχα η 15η στο πίσω μέρος της αίθουσας.
Για τον λόγο αυτό υπάρχει ένας πίνακας ΘΕΣΕΙΣ[15, 30] που αναπαριστά τις μέχρι τώρα δεσμευμένες θέσεις. Έτσι, το στοιχείο ΘΕΣΕΙΣ[i,j] αναπαριστά την j θέση της i σειράς. Τιμή 0 σε αυτό το στοιχείο σημαίνει πως η θέση δεν έχει ακόμη δεσμευθεί, ενώ τιμή 1 σημαίνει πως η θέση είναι δεσμευμένη.
Να γίνει πρόγραμμα το οποίο:

  1. Θα γεμίζει τον πίνακα ΘΕΣΕΙΣ με μηδενικά (0).
  2. Για κάθε πελάτη,
    α.θα διαβάζει τον αριθμό των εισιτηρίων που θέλει να αγοράσει. Κατά την ανάγνωση να πραγματοποιείται έλεγχος εγκυρότητας ώστε ο αριθμός των εισιτηρίων να είναι μεταξύ 1 και 4 ή -1.
    β. θα καλεί το υποπρόγραμμα ΒΡΕΣ_ΚΑΛΥΤΕΡΕΣ_ΘΕΣΕΙΣ με την βοήθεια του οποίου θα εμφανίζει σε ποια σειρά και σε ποιες θέσεις έγινε η κράτηση ή κατάλληλο μήνυμα σε περίπτωση που ήταν αδύνατο να βρεθούν θέσεις μέσα στην αίθουσα,
    γ. να ενημερώνει τις κατάλληλες θέσεις του πίνακα ΘΕΣΕΙΣ εφόσον πραγματοποιήθηκε η κράτηση
    δ. να σταματάει όταν η αίθουσα γεμίσει ή δοθεί η τιμή -1 για αριθμό εισιτηρίων
  3. Να εμφανίζει τον αριθμό των αδιάθετων θέσεων.
  4. Να γίνει το υποπρόγραμμα ΒΡΕΣ_ΚΑΛΥΤΕΡΕΣ_ΘΕΣΕΙΣ που θα δέχεται τον πίνακα ΘΕΣΕΙΣ και τον αριθμό των εισιτηρίων προς κράτηση. Το υποπρόγραμμα θα αναζητά τις καλύτερες διαδοχικές θέσεις και θα πρέπει να βρίσκονται όλες στην ίδια σειρά, ξεκινώντας πάντα από την τελευταία σειρά. Το υποπρόγραμμα να επιστρέφει τον αριθμό της σειράς και την πρώτη θέση από το σύνολο των θέσεων που εντοπίστηκαν προς κράτηση. Αν δεν βρέθηκαν θέσεις, τότε να επιστρέφει 0 και 0 για αριθμό σειράς και θέσης αντίστοιχα.

Λύση

ΠΡΟΓΡΑΜΜΑ κινηματογράφος
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: i, j, ΘΕΣΕΙΣ[15, 30], σειρά, θέση, εισ, διατέθηκαν
ΑΡΧΗ
  ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 15
    ΓΙΑ j ΑΠΟ 1 ΜΕΧΡΙ 30
      ΘΕΣΕΙΣ[i, j] <- 0
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
 
  διατέθηκαν <- 0
  ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
    ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
      ΔΙΑΒΑΣΕ εισ
    ΜΕΧΡΙΣ_ΟΤΟΥ εισ >= 1 ΚΑΙ εισ <= 4 Η εισ = -1
    ΑΝ εισ > 0 ΤΟΤΕ
      ΚΑΛΕΣΕ ΒΡΕΣ_ΚΑΛΥΤΕΡΕΣ_ΘΕΣΕΙΣ(ΘΕΣΕΙΣ, εισ, σειρά, θέση) 
      ΑΝ σειρά <> 0 ΚΑΙ θέση <> 0 ΤΟΤΕ
        ΓΡΑΨΕ "Βρέθηκαν εισιτήρια στην σειρά ", σειρά, " από την θέση ", θέση, " μέχρι την θέση ", (θέση + εισ - 1) 
        ΓΙΑ j ΑΠΟ θέση ΜΕΧΡΙ θέση + εισ - 1
          ΘΕΣΕΙΣ[σειρά, j] <- 1
        ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
        διατέθηκαν <- διατέθηκαν + εισ
      ΑΛΛΙΩΣ
        ΓΡΑΨΕ "Δεν βρέθηκαν ", εισ, " διαδοχικές θέσεις σε κάποια σειρά"
      ΤΕΛΟΣ_ΑΝ
    ΤΕΛΟΣ_ΑΝ
  ΜΕΧΡΙΣ_ΟΤΟΥ διατέθηκαν = 15*30 Η εισ = -1
 
  ΓΡΑΨΕ "Έμειναν αδιάθετες ", 15*30 - διατέθηκαν, " θέσεις!"
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ κινηματογράφος
 
ΔΙΑΔΙΚΑΣΙΑ ΒΡΕΣ_ΚΑΛΥΤΕΡΕΣ_ΘΕΣΕΙΣ(ΘΕΣΕΙΣ, εισ, σειρά, θέση) 
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: i, j, ΘΕΣΕΙΣ[15, 30], σειρά, θέση, εισ, κ, πλ
  ΛΟΓΙΚΕΣ: βρέθηκε, βρέθηκε2
ΑΡΧΗ
  σειρά <- 0
  θέση <- 0
 
  i <- 15
  βρέθηκε <- ΨΕΥΔΗΣ
  ΟΣΟ (i >= 1 ΚΑΙ βρέθηκε = ΨΕΥΔΗΣ) ΕΠΑΝΑΛΑΒΕ
    j <- 1
    πλ <- 0
    ΟΣΟ j <= 30 ΚΑΙ βρέθηκε = ΨΕΥΔΗΣ ΕΠΑΝΑΛΑΒΕ
      ΑΝ ΘΕΣΕΙΣ[i, j] = 0 ΤΟΤΕ
        πλ <- πλ + 1
        ΑΝ πλ = εισ ΤΟΤΕ
          βρέθηκε <- ΑΛΗΘΗΣ
          σειρά <- i
          θέση <- j - εισ + 1
        ΤΕΛΟΣ_ΑΝ
      ΤΕΛΟΣ_ΑΝ
      j <- j + 1
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    i <- i - 1
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ