Επιλογή Σελίδας

Να γραφεί πρόγραμμα το οποίο να προσθέτει δύο κλάσματα. Το πρόγραμμα δέχεται τέσσερις ακεραίους αριθμούς, τους παρονομαστές και τους αριθμητές των δύο κλασμάτων, υπολογίζει και εκτυπώνει τον αριθμητή και τον παρονομαστή του αποτελέσματος. Α/Β + Γ/Δ = Ε/Ζ

Υπόδειξη: Ενώ το πρόβλημα αρχικά φαίνεται απλό, η υλοποίησή του είναι αρκετά πολύπλοκη. Αρχικά πρέπει να απλοποιηθούν τα κλάσματα, στη συνέχεια να γίνουν ομώνυμα, να προστεθούν οι αριθμητές και τέλος να απλοποιηθεί το αποτέλεσμα. Οι διαδικασίες αυτές απαιτούν τον υπολογισμό του ΜΚΔ (για την απλοποίηση) και του ΕΚΠ για τη μετατροπή των κλασμάτων σε ομώνυμα. Να χρησιμοποιήσετε τις συναρτήσεις της άσκησης ΔΕ1.

ΛΥΣΗ

ΠΡΟΓΡΑΜΜΑ Πρόσθεση_Κλασμάτων
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: Α, Β, Γ, Δ, ΕΨ, Ζ
ΑΡΧΗ
ΚΑΛΕΣΕ εισαγωγή_δεδ(Α,Β,Γ,Δ)
!Πιθανώς να βελτιώνεται η απόδοση του αλγορίθμου
!αν καλέσω την απλοποίηση και για τα αρχικά κλάσματα, εκτός του αποτελέσματος
ΚΑΛΕΣΕ πρόσθεση_κλασ(Α,Β,Γ,Δ,ΕΨ,Ζ)
ΚΑΛΕΣΕ απλοποίηση(ΕΨ,Ζ)
ΚΑΛΕΣΕ εμφάνιση_αποτ(ΕΨ,Ζ)
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

ΔΙΑΔΙΚΑΣΙΑ πρόσθεση_κλασ(α,β,γ,δ,εψ,ζ)
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: α,β,γ,δ,εψ,ζ
ΑΡΧΗ
ΚΑΛΕΣΕ Ομώνυμα(α,β,γ,δ)
εψ<--α+γ
ζ<--β
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ

ΔΙΑΔΙΚΑΣΙΑ απλοποίηση(εψ,ζ)
ΜΕΤΑΒΛΗΤΕΣ 
ΑΚΕΡΑΙΕΣ: εψ, ζ, μ
ΑΡΧΗ
μ<-- ΜΚΔ(εψ, ζ)
! ακέραια διαίρεση αντί κανονικής, για λόγους συμβατότητας τύπων(εκτός των στόχων του μαθήματος)
! όχι σωστό γιατί α/β δεν ισοδυναμεί με α div β. Θα πρότεινα στη λύση σας τη χρήση του (/)
εψ <-- εψ DIV  μ
ζ <-- ζ DIV μ
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ

ΔΙΑΔΙΚΑΣΙΑ Ομώνυμα(α,β,γ,δ)
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: α,β,γ,δ,ελκπ
ΑΡΧΗ
ΑΝ β <> δ ΤΟΤΕ
   ελκπ<--ΕΚΠ(β,δ)
! ακέραια διαιρεση(DIV) αντί απλής(/) για λόγους συμβατότητας τύπων (εκτός των στόχων του μαθήματος)
! όχι απόλυτα σωστό γιατί α/β δεν ισοδυναμεί με α div β. Θα πρότεινα στη λύση σας τη χρήση του (/)
   α<--α*ελκπ DIV β
   γ<--γ*ελκπ DIV δ
   β<--ελκπ
   δ<--ελκπ
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ

ΔΙΑΔΙΚΑΣΙΑ εισαγωγή_δεδ(α, β, γ, δ)
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: α, β, γ, δ
ΑΡΧΗ
ΓΡΑΨΕ 'Δώσε αριθμητή 1ου κλάσματος'
ΔΙΑΒΑΣΕ α
ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
    ΓΡΑΨΕ 'Δώσε παρονομαστή 1ου κλάσματος'
    ΔΙΑΒΑΣΕ β
ΜΕΧΡΙΣ_ΟΤΟΥ β<>0
ΓΡΑΨΕ 'Δώσε αριθμητή 2ου κλάσματος' 
ΔΙΑΒΑΣΕ γ
ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
    ΓΡΑΨΕ 'Δώσε παρονομαστή 2ου κλάσματος'
    ΔΙΑΒΑΣΕ δ
ΜΕΧΡΙΣ_ΟΤΟΥ δ<>0
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ

ΔΙΑΔΙΚΑΣΙΑ εμφάνιση_αποτ(κ, λ)
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: κ, λ
ΑΡΧΗ
ΓΡΑΨΕ 'To αποτέλεσμα είναι ', κ, ' / ', λ
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ

ΣΥΝΑΡΤΗΣΗ ΜΚΔ(x,y): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: x,y, temp, i
ΛΟΓΙΚΕΣ: βρέθηκε
ΑΡΧΗ
βρέθηκε<--ψευδής
ΑΝ x-y<0 ΤΟΤΕ
   temp <-- y
   y<-- x
   x <-- temp
ΤΕΛΟΣ_ΑΝ
i<-- y
ΟΣΟ (βρέθηκε = ψευδής) ΕΠΑΝΑΛΑΒΕ
     ΑΝ (x mod i = 0) ΚΑΙ (y mod i = 0) ΤΟΤΕ
         ΜΚΔ <-- i
         βρέθηκε <-- αληθής
     ΤΕΛΟΣ_ΑΝ
     i<-- i - 1
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

! x * y = ΕΚΠ (x, y) * ΜΚΔ (x, y)
ΣΥΝΑΡΤΗΣΗ ΕΚΠ(x,y): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: x,y
ΠΡΑΓΜΑΤΙΚΕΣ: temp
ΑΡΧΗ
! ακέραια διαίρεση(DIV), αντί απλής(/), για λόγους ασυμβατότητας τύπων (εκτός των στόχων του μαθήματος)
! όχι απόλυτα σωστό γιατί α/β δεν ισοδυναμεί με α div β. Θα πρότεινα στη λύση σας τη χρήση του (/)
 ΕΚΠ <-- x*y DIV ΜΚΔ(x,y) 
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ 

Αναφορά: Μπορείτε να μελετήσετε, επίσης, τις λύσεις που προτείνονται στο φόρουμ της ΓΛΩΣΣΟΜΑΘΕΙΑΣ ΕΔΩ.

Share This