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

Άσκηση 1
Ένας πωλητής λαϊκών αγορών διαθέτει 3 είδη φρούτων: πορτοκάλια, μπανάνες και ροδάκινα. Τα πορτοκάλια πωλούνται προς 0.60 ευρώ/κιλό, οι μπανάνες προς 1.70 ευρώ/κιλό και τα ροδάκινα προς 1.10 ευρώ/κιλό. Να γίνει πρόγραμμα που για κάθε πελάτη που προσέρχεται:
1) Διαβάζει τις ποσότητες σε κιλά για κάθε ένα από τα παραπάνω είδη. Όταν ένας πελάτης δεν αγοράσει κάποιο είδος τότε η αντίστοιχη ποσότητα είναι μηδέν κιλά.
2) Υπολογίζει και εμφανίζει το ποσό που πρέπει να πληρώσει ο καταναλωτής. Ο υπολογισμός θα γίνει με τη κλήση κατάλληλου υποπρογράμματος το οποίο θα υπολογίζει και επιστρέφει τα πληρωτέο ποσό.
3) Να επαναλαμβάνει την παραπάνω διαδικασία μέχρι να δοθεί για κάποια από το φρούτα αρνητική τιμή ως ποσότητα.
4) Στο τέλος θα εμφανίζει τα συνολικά έσοδα του πωλητή.

Λύση

ΠΡΟΓΡΑΜΜΑ μανάβης
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: ποσΠορτοκάλια, ποσΜπανάνες, ποσΡοδάκινα, έσοδα
ΑΡΧΗ
  έσοδα <- 0
  ΔΙΑΒΑΣΕ ποσΠορτοκάλια, ποσΜπανάνες, ποσΡοδάκινα
  ΟΣΟ ποσΠορτοκάλια >= 0 ΚΑΙ ποσΜπανάνες >= 0 ΚΑΙ ποσΡοδάκινα >= 0 ΕΠΑΝΑΛΑΒΕ
    έσοδα <- έσοδα + ΛΟΓΑΡΙΑΣΜΟΣ_ΠΕΛΑΤΗ(ποσΠορτοκάλια, ποσΜπανάνες, ποσΡοδάκινα) 
    ΔΙΑΒΑΣΕ ποσΠορτοκάλια, ποσΜπανάνες, ποσΡοδάκινα
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΓΡΑΨΕ "Συνολικά έσοδα: ", έσοδα, " ευρώ"
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
 
ΣΥΝΑΡΤΗΣΗ ΛΟΓΑΡΙΑΣΜΟΣ_ΠΕΛΑΤΗ(ποσΠορτοκάλια, ποσΜπανάνες, ποσΡοδάκινα): ΠΡΑΓΜΑΤΙΚΗ
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: ποσΠορτοκάλια, ποσΜπανάνες, ποσΡοδάκινα
ΑΡΧΗ
  ΛΟΓΑΡΙΑΣΜΟΣ_ΠΕΛΑΤΗ <- ποσΠορτοκάλια * 0.6 + ποσΜπανάνες * 1.7 + ποσΡοδάκινα * 1.1
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

Άσκηση 2
Σε κάποιο διαγωνισμό σφαιροβολίας, συμμετέχουν 15 αθλητές οι οποίοι έχουν δικαίωμα για 5 βολές. Η καλύτερη από τις 5 προσπάθειες του κάθε αθλητή συγκρίνεται με τις καλύτερες των άλλων αθλητών και νικητής βγαίνει αυτός που είχε την μεγαλύτερη βολή. Να γίνει πρόγραμμα το οποίο:
1) Να διαβάζει τα ονομάτων των αθλητών και κάθε μία από τις βολές τους.
2) Για κάθε αθλητή, να καλεί υποπρόγραμμα το οποίο θα υπολογίζει και επιστρέφει την καλύτερη από τις πέντε βολές του.
3) Να βρίσκει και να εμφανίζει τα ονόματα των τριών πρώτων αθλητών. Υποθέστε πως κάθε βολή έχει διαφορετική τιμή από τις υπόλοιπες.

Λύση

ΠΡΟΓΡΑΜΜΑ σφαιροβολία
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: i, j
  ΠΡΑΓΜΑΤΙΚΕΣ: βολες[5], καλύτερηΒολη[15], tmp1
  ΧΑΡΑΚΤΗΡΕΣ: ον[15], ονΚαλύτερου, tmp2
ΑΡΧΗ
  ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 15
    ΔΙΑΒΑΣΕ ον[i] 
    ΓΙΑ j ΑΠΟ 1 ΜΕΧΡΙ 5
      ΔΙΑΒΑΣΕ βολες[j] 
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    καλύτερηΒολη[i] <- maxΒολή(βολες) 
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΓΙΑ i ΑΠΟ 2 ΜΕΧΡΙ 15
    ΓΙΑ j ΑΠΟ 15 ΜΕΧΡΙ i ΜΕ ΒΗΜΑ -1
      ΑΝ καλύτερηΒολη[j] > καλύτερηΒολη[j - 1] ΤΟΤΕ
        tmp1 <- καλύτερηΒολη[j] 
        καλύτερηΒολη[j] <- καλύτερηΒολη[j - 1] 
        καλύτερηΒολη[j - 1] <- tmp1
        tmp2 <- ον[j] 
        ον[j] <- ον[j - 1] 
        ον[j - 1] <- tmp2
      ΤΕΛΟΣ_ΑΝ
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΓΡΑΨΕ ον[1], ον[2], ον[3] 
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
 
ΣΥΝΑΡΤΗΣΗ maxΒολή(βολες): ΠΡΑΓΜΑΤΙΚΗ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: i
  ΠΡΑΓΜΑΤΙΚΕΣ: βολες[5], max
ΑΡΧΗ
  max <- βολες[1] 
  ΓΙΑ i ΑΠΟ 2 ΜΕΧΡΙ 5
    ΑΝ βολες[i] > max ΤΟΤΕ
      max <- βολες[i] 
    ΤΕΛΟΣ_ΑΝ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  maxΒολή <- max
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

Άσκηση 3
Μία κτηνοτροφική μονάδα παράγει ημερησίως φρέσκο γάλα το οποίο διαθέτει σε συνεργαζόμενη γαλακτοβιομηχανία. Να γράψετε πρόγραμμα το οποίο:
1) Θα διαβάζει την ημερήσια ποσότητα γάλατος που παρήγαγε τον τελευταίο μήνα και θα το αποθηκεύει σε πίνακα 30 θέσεων.
2) Θα υπολογίζει και εμφανίζει τη συνολική μηνιαία παραγωγή γάλατος. Για τον υπολογισμό να δημιουργήσετε υποπρόγραμμα το οποίο θα δέχεται ως παράμετρο τον πίνακα της ημερήσιας παραγωγής και θα επιστρέφει το συνολικό άθροισμα.
3) Θα εντοπίζει τον αριθμό ημέρας με την μεγαλύτερη παραγωγή. Θεωρήστε ότι κάθε μέρα η ημερήσια παραγωγή είναι διαφορετική. Για τον υπολογισμό της μέγιστης παραγωγής να δημιουργήσετε υποπρόγραμμα το οποίο θα δέχεται ως παράμετρο τον πίνακα της ημερήσιας παραγωγής και θα επιστρέφει την θέση του πίνακα με την μεγαλύτερη τιμή.
4) Αν η 1η του μήνα ήταν Δευτέρα, να εμφανίζει ποια μέρα της εβδομάδας σημειώθηκε η μέγιστη παραγωγή. Για την εύρεση της ημέρας να δημιουργήσετε υποπρόγραμμα το οποίο θα δέχεται τον αριθμό της ημέρας και θα επιστρέφει το όνομά της.

Λύση

ΠΡΟΓΡΑΜΜΑ κτηνοτροφική_μονάδα
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: i, μεγ_θέση
  ΠΡΑΓΜΑΤΙΚΕΣ: παραγωγή[30], συν_ποσότητα
  ΧΑΡΑΚΤΗΡΕΣ: μεγ_μέρα
ΑΡΧΗ
  ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 30
    ΔΙΑΒΑΣΕ παραγωγή[i]
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  συν_ποσότητα <- ΑΘΡΟΙΣΜΑ(παραγωγή)
  ΓΡΑΨΕ συν_ποσότητα
  μεγ_θέση <- MAX_ΘΕΣΗ(παραγωγή)
  μεγ_μέρα <- ΜΑΧ_ΗΜΕΡΑ(μεγ_θέση)
  ΓΡΑΨΕ μεγ_μέρα
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
 
ΣΥΝΑΡΤΗΣΗ ΑΘΡΟΙΣΜΑ(ποσότητα):ΠΡΑΓΜΑΤΙΚΗ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: i
  ΠΡΑΓΜΑΤΙΚΕΣ: ποσότητα[30], Σ
ΑΡΧΗ
  Σ <- 0
  ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 30
    Σ <- Σ + ποσότητα[i]
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΑΘΡΟΙΣΜΑ <- Σ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ
 
ΣΥΝΑΡΤΗΣΗ MAX_ΘΕΣΗ(ποσότητα):ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: i, maxθ
  ΠΡΑΓΜΑΤΙΚΕΣ: ποσότητα[30]
ΑΡΧΗ
  maxθ <- 1
  ΓΙΑ i ΑΠΟ 2 ΜΕΧΡΙ 30
    ΑΝ ποσότητα[i] > ποσότητα[maxθ] ΤΟΤΕ
      maxθ <- i
    ΤΕΛΟΣ_ΑΝ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  MAX_ΘΕΣΗ <- maxθ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ
 
ΣΥΝΑΡΤΗΣΗ ΜΑΧ_ΗΜΕΡΑ(maxθ):ΧΑΡΑΚΤΗΡΑΣ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: μ, maxθ
  ΧΑΡΑΚΤΗΡΕΣ: μέρες[7]
ΑΡΧΗ
  μέρες[1] <- "Δευτέρα"
  μέρες[2] <- "Τρίτη"
  μέρες[3] <- "Τετάρτη"
  μέρες[4] <- "Πέμπτη"
  μέρες[5] <- "Παρασκευή"
  μέρες[6] <- "Σάββατο"
  μέρες[7] <- "Κυριακή"
  ! Πιθανά αποτελέσματα: 1 = Δευτέρα, 2 = Τρίτη, 3 = Τετάρτη ... 0 = Κυριακή
  μ <- maxθ MOD 7 
  ΑΝ μ = 0 ΤΟΤΕ
    μ <- 7
  ΤΕΛΟΣ_ΑΝ ! η εντολή ΑΝ θα μπορούσε να αποφευχθεί, αν προηγουμένως γράφαμε: μ <-((maxθ-1) MOD 7) + 1
 
  ΜΑΧ_ΗΜΕΡΑ <- μέρες[μ]
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

εναλλακτικά και πιο απλοϊκά η τελευταία συνάρτηση θα μπορούσε να είχε γραφεί ως εξής:

ΣΥΝΑΡΤΗΣΗ ΜΑΧ_ΗΜΕΡΑ(maxθ):ΧΑΡΑΚΤΗΡΑΣ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: μ, maxθ
ΑΡΧΗ
  ! Πιθανά αποτελέσματα: 1 = Δευτέρα, 2 = Τρίτη, 3 = Τετάρτη ... 0 = Κυριακή
  μ <- maxθ MOD 7 
  ΑΝ μ = 0 ΤΟΤΕ
    ΜΑΧ_ΗΜΕΡΑ <- "Κυριακή"  
  ΑΛΛΙΩΣ_ΑΝ μ = 1 ΤΟΤΕ
    ΜΑΧ_ΗΜΕΡΑ <- "Δευτέρα"  
  ΑΛΛΙΩΣ_ΑΝ μ = 2 ΤΟΤΕ
    ΜΑΧ_ΗΜΕΡΑ <- "Τρίτη"  
  ΑΛΛΙΩΣ_ΑΝ μ = 3 ΤΟΤΕ
    ΜΑΧ_ΗΜΕΡΑ <- "Τετάρτη"  
  ΑΛΛΙΩΣ_ΑΝ μ = 4 ΤΟΤΕ
    ΜΑΧ_ΗΜΕΡΑ <- "Πέμπτη"  
  ΑΛΛΙΩΣ_ΑΝ μ = 5 ΤΟΤΕ
    ΜΑΧ_ΗΜΕΡΑ <- "Παρασκευή"  
  ΑΛΛΙΩΣ
    ΜΑΧ_ΗΜΕΡΑ <- "Σαββάτο"  
  ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ