Γενικό Λύκειο > Τμηματικός προγραμματισμός

Υλοποίηση Ακέραιου Μέρους

<< < (2/4) > >>

George Eco:
Η δομή επανάληψης ΓΙΑ με βήμα 1.0 κάνει όλη τη δουλεία.


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

ΣΥΝΑΡΤΗΣΗ ακεραιοποίηση(α): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: ι
  ΠΡΑΓΜΑΤΙΚΕΣ: α, κ
ΑΡΧΗ
  ι <- 0
  κ <- 0.0 ! κ = μετρητής ακεραίων μονάδων
  ΓΙΑ κ ΑΠΟ 1.0 ΜΕΧΡΙ Α_Τ(α) ΜΕ_ΒΗΜΑ 1.0
    ι <- ι + 1 ! Το βήμα 1.0 αποκλείει το δεκαδικό μέρος
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

  ΑΝ α < 0.0 ΤΟΤΕ
    ι <- ι*-1 ! Επαναφορά προσήμου
  ΤΕΛΟΣ_ΑΝ
  ακεραιοποίηση <- ι ! Επιστροφή ακεραίου
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

--- Τέλος κώδικα ---

Πώς σας φαίνεται;

akalest0s:

--- Παράθεση από: George Eco στις 02 Φεβ 2020, 07:01:53 πμ ---Πώς σας φαίνεται;

--- Τέλος παράθεσης ---
Τελείως λάθος.





μια χαρά είναι  8)

George Eco:
Δε σου κρύβω συνάδελφε πως δεν είδα στην αρχή τη πιο κάτω γραμμή του σχόλιού σου και την πάτησα!
Λέω, γιατί το αποκαλεί τελείως λάθος; Είχα κάνει και double check τα πάντα, όχι τίποτα άλλο.
Μου την έφερες!  ;D ;D ;D

gthal:

--- Παράθεση από: George Eco στις 02 Φεβ 2020, 07:01:53 πμ ---Πώς σας φαίνεται;

--- Τέλος παράθεσης ---
Ωραία και απλή η ιδέα!
Δύο παρατηρήσεις όμως:
1) Για τους αρνητικούς τι γίνεται;  πχ Α_Μ(-4)=-4  αλλά Α_Μ(-4.1)=-5, καθώς το Α_Μ(χ) είναι ο μικρότερος ακέραιος που δεν υπερβαίνει τον χ (εξαρτάται από την υλοποίηση βέβαια, αλλά και ο διερμηνευτής έτσι το υλοποιεί απ' ότι βλέπω). Οπότε χρειάζεται λίγο μαγείρεμα η τελευταία ΑΝ
2) Υπάρχει ζήτημα αποδοτικότητας βέβαια: έδωσα το 123456789.01 ας πούμε και δεν πήρα απάντηση ούτε σε ένα λεπτό... (είναι και λίγο παλιό το μηχάνημά μου βέβαια ...  :P )

Στον παρακάτω κώδικα αξιοποιώ την ιδέα σου επαναληπτικά ως εξής:
για τον 352,61 πχ :
διαιρώ μέχρι να γίνει μικρότερος του 1, για να μετρήσω τα ακέραια ψηφία (έστω cnt)
οπότε έχω τον 0,35261
στη συνέχεια πολ/σιάζω ξανά τόσες φορές (cnt=3) και κάθε φορά προσεγγίζω το καινούριο δεκαδικό κομμάτι με τη μέθοδό σου
πχ στην 1η επανάληψη έχω το 3,5261 και με τη μέθοδό σου φτάνω στο 3
στη 2η επανάληψη έχω το το 35,261  και αυτή τη φορά ξεκινώ από το 30 (δεκαπλασιάζοντας το προηγούμενο αποτέλεσμα) και φτάνω στο 35
στην 3η επανάληψη έχω το 352,61 και αυτή τη φορά ξεκινώ από το 350 (δεκαπλασιάζοντας το προηγούμενο αποτέλεσμα) και φτάνω στο 352


--- Κώδικας: ---ΣΥΝΑΡΤΗΣΗ ΑΜ(y):ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: x, y ,cnt
  ΑΚΕΡΑΙΕΣ: result , c, r, k
ΑΡΧΗ
    x <- Α_Τ(y)
    ! διαιρώ επαναληπτικά για να μετρήσω τα ακέραια ψηφία
    cnt <- 0
    ΟΣΟ x>=1 ΕΠΑΝΑΛΑΒΕ
      x <- x/10
      cnt <- cnt+1
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    ! ξαναπολ/σιάζω επαναληπτικά, προσεγγίζοντας το κάθε ψηφίο
    result <- 0
    ΓΙΑ c ΑΠΟ 1 ΜΕΧΡΙ cnt
      x <- x*10
      result <- result*10
      r <- result
      ΓΙΑ k ΑΠΟ result+1 ΜΕΧΡΙ x
        r <- r+1
      ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
      result <- r
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    ! προσαρμογές για τους αρνητικούς
    ΑΝ y<0 ΤΟΤΕ
      result <- -result
      ΑΝ result<>y ΤΟΤΕ
        result <- result -1
      ΤΕΛΟΣ_ΑΝ
    ΤΕΛΟΣ_ΑΝ
    ΑΜ <- result
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ
--- Τέλος κώδικα ---

edit: αυτό που λέω για την υλοποίηση της Α_Μ(χ) στο διερμηνευτή δεν είναι ακριβές. Μόλις τώρα είδα ότι υπάρχει επιλογή που εγώ έχω ενεργοποιημένη. Δε θυμάμαι αν υπάρχει οδηγία από το υπουργείο για την Α_Μ των αρνητικών

progmat:
Σας ευχαριστώ πολύ  όλους για την ενασχόληση!

Πλοήγηση

[0] Λίστα μηνυμάτων

[#] Επόμενη σελίδα

[*] Προηγούμενη σελίδα

Μετάβαση στην πλήρη έκδοση