Λειτουργια της συναρτησης Α_Μ()

Ξεκίνησε από Scubakoumpa, 07 Μαρ 2025, 03:55:49 ΠΜ

« προηγούμενο - επόμενο »

Scubakoumpa

Ως ενας μαθητης 3ης λυκειου, παω φροντηστηριο (ασυνήθιστο το ξερω), και ετσι λοιπον σε ενα μαθημα ο
καθηγητης μου αποφασισε να τρολαρει λιγο το τμημα μου στο κεφαλαιο τον υποπρογραμματων
οταν μας ρωτησε πως θα φτιαχναμε την συναρτηση Α_Μ(χ) ΧΩΡΙΣ να χρησιμοποιουμε την ετοιμη στην συναρτηση.
Φυσικα του ειπαμε οτι ειναι απλο και αρχισαμε να του λεμε προφορικα μια απαντηση της μορφης

ΣΥΝΑΡΤΗΣΗ ΑΜ(Χ):ΑΚΕΡΑΙΑ
-------τμημα δηλωσεων-----
ΑΡΧΗ
ΑΝ Χ=Α_Μ(Χ) ΤΟΤΕ
....οπα
 
εκει καταλαβαμε(πολυ γρηγορα μαλιστα)
οτι δεν μπορουσαμε να σκεφτουμε κανενα τροπο να την φτιαξουμε και μας την εσπασε γιατι
φυσικα και αποφασισε ο καθηγητης να μας τρολαρει στο ΤΕΛΟΣ του μαθηματος.
Ετσι λοιπον σκεφτομουν πως θα γινοταν η συναρτηση μεχρι να φτασω 
σπιτι αλλα δεν ειχα την ευκαιρια να δοκιμασω να φτιαξω ενα προγραμμα με την λειτουργια της Α_Μ(Χ) 
(δεν ειχα χρονο) οποτε το ξεχασα για λιγες μερες.
Μια μερα ξαφνικα το βραδυ μου ξαναεπιστρεφει η απορια (εψαχνα δικαιολογια για να μην διαβασω αλλο)
και αρχισα να το ψαχνω πως γινεται η Α_Μ(Χ) στο παρασκινιο, και βρηκα διαφορες απαντησεις π.χ 
στην Pascal ενας τροπος ειναι Χ div 1 (δεν γινεται στην γλωσσα εφοσον χ πραγματικος αριθμος)
σε διαφορες αλλες γλωσσες εχει την floor(x) και αλλες διαφορες απαντησεις που δεν μπουρουσα
 να υλοιποιησω στην γλωσσα η δεν ηταν αυτο που εψαχνα.
Μετα απο αρκετο ψαξιμο ανακαλυπτω την λυση με bit manipulation που μπορω να δω καπως τραβηγμενα 
μια λυση, και ετσι αρχιζω να φτιαχνω ενα προγραμμα οπου  να μπορει να χωρισει το ακεραιο και δεκαδικο μερος.
Η λογικη του προγραμματος ειναι ως εξης:
 δεχεται εναν πραγματικο αριθμο και τον μετατρεπει σε float16 (σε χαρακτηρες)
(16 μπιτς οχι περισσοτερα γιατι δεν ηθελα να βγει μεγαλο)
 1 μπιτ για προσημο, νομιζω 5-6 για ακεραιο μερος και τα υπολοιπα για το δεκαδικο 
και απλα τα bit που ειναι υπευθυνα για το δεκαδικο μερος τα αποθηκευει σε μια αλλη μεταβλητη
και τα εκχωρει στην αρχικη ως μηδεν (δεν το εχω υλοποιησει)
το προγραμμα ειναι ως εξης:
Σημειωση: για να δουλεψει το προγραμμα πρεπει να ενεργοποιηθει η συνενωση αλφαριθμητικων(οπως γινεται στις εικονες)
ΠΡΟΓΡΑΜΜΑ ΑκεραιοΜερος16μπιτ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: μπιτ, ι, ΑΜ, ξ, τεμπ
  ΠΡΑΓΜΑΤΙΚΕΣ: χ, υπ, αθρ
  ΧΑΡΑΚΤΗΡΕΣ: μπιτχαρ
ΑΡΧΗ
  ΔΙΑΒΑΣΕ χ
  αθρ <- 0
  μπιτχαρ <- ''      ! 015sign x14x13x12x11x10x9exponent 080706050403020100float
  ΑΝ χ < 64 ΚΑΙ χ > -64 ΤΟΤΕ                                               !οριο
    ΑΝ χ < 0 ΤΟΤΕ                                                       !προσημο
      χ <- χ*-1
      μπιτχαρ <- μπιτχαρ + '1'
    ΑΛΛΙΩΣ
      μπιτχαρ <- μπιτχαρ + '0'
    ΤΕΛΟΣ_ΑΝ
    ΓΙΑ ι ΑΠΟ 5 ΜΕΧΡΙ 0 ΜΕ_ΒΗΜΑ -1
      υπ <- 2^ι                                                   !ακεραιο μερος
      ΑΝ χ >= 2^ι ΚΑΙ ΟΧΙ(αθρ <= χ ΚΑΙ αθρ > χ - 1) ΤΟΤΕ !Λογικο λαθος πχ:οταν βαζεις 29 ως εισοδο σου δινει 0011111 και οχι 0011101
        αθρ <- 2^ι + αθρ
        μπιτχαρ <- μπιτχαρ + '1'
      ΑΛΛΙΩΣ
        μπιτχαρ <- μπιτχαρ + '0'
      ΤΕΛΟΣ_ΑΝ
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
                                                                 !δεκαδικο μερος δεν το εχω φτιαξει ακομα
  ΑΛΛΙΩΣ
    ΓΡΑΨΕ 'εκτος οριου προγραμματος'
  ΤΕΛΟΣ_ΑΝ
  ΓΡΑΨΕ μπιτχαρ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
 ΔΕΝ το εχω τελειωσει γιατι μου πηρε πολυ ωρα να το φτασω σε αυτο σημειο και μετα απλα το ξεχασα.
Το προγραμμα εχει μερικα λογικα λαθη  και δεν εχω κανει το κομματι που μετατρεπει τους χαρακτηρες πισω σε ακεραιο 
αριθμο αλλα δουλευει (δεν ξερω πως) μεχρι ενα σημειο.Απλα ηθελα να ρωτησω Αμα γινεται κατι παρομοιο στο παρασκηνιο για την συναρτηση Α_Μ(χ) η πως γινεται οντως.Επισης εχω μια απορια για ενα σφαλμα που μου εβγαλε
οσο προσπαθουσα να υλοποιησω το προγραμμα.

ΠΡΟΓΡΑΜΜΑ  τεστ
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ:χ
ΑΡΧΗ
ΔΙΑΒΑΣΕ χ
χ<-2^χ
ΓΡΑΨΕ χ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
  
αυτο το κομματι κωδικα πεταει σφαλμα οτι δεν γινεται η αναθεση τιμης γιατι τα ορισματα ειναι διαφορετικου τυπου δεδομενου (εικονα)
«χ»: ακέραια μεταβλητή
«2^χ»: πραγματική έκφραση.
Μπορει καποιος να εξηγησει το σφαλμα; γιατι δεν καταλαβαινω το προβλημα εφοσον δεν καλω καμια διαδικασια για να αναφερθουν ορισματα.



George Eco

Για το σφάλμα: Υψωση σε δύναμη επιστρέφει πραγματικό. 2 ^ (1/2) είναι σα να λες ρίζα 2. Ο τελεστής δε νοιαζεται τι τελεστέους έχει αλλά τι τελεστέους ΜΠΟΡΕΙ να έχει, οπότε επιστρέφει πάντα πραγματικό τύπο.



Έχεις εναν Χ πραγματικό κι έναν χακ (χ ακέραιο)
ΔΙΑΒΑΣΕ χ
χακ <- 0
ΟΣΟ χ >= 1.0 ΕΠΑΝΑΛΑΒΕ
  χ <- χ - 1.0
  χακ <- χ+1
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ


Μόλις έκανες χ DIV 1 προσπερνώνωτας το πρόβλημα του πραγματικού τύπου του χ. Παίρνεις τον χακ και παίζεις μπαλίτσα.

Ωραίος ο Καθηγητής σας, ωραίος κι εσύ! Μη βασανίζεσαι άλλο.



alkisg

Από https://alkisg.mysch.gr/ΓΛΩΣΣΑ/Τελεστές/:

^ (δύναμη): ισχύει για τους ακέραιους και τους πραγματικούς. Το αποτέλεσμα είναι συνήθως πραγματικός αριθμός, εκτός αν ο εκθέτης είναι θετικός ακέραιος σταθερής αποτίμησης. Για παράδειγμα το 2^2 είναι ακέραιος, ενώ το 2^-2 πραγματικός (= 0.25). Έτσι στην γενική περίπτωση το 2^ι εκλαμβάνεται σαν πραγματικός αριθμός.

gpapargi

Αν δέχεσαι σαν είσοδο πραγματικό, μια ιδέα είναι να βρεις μεταξύ ποιων 2 διαδοχικών ακεραίων είναι ο δοσμένος πραγματικός. Αν ξέρεις τα όρια των αριθμών μπορείς να κάνεις μια δυαδική αναζήτηση και να βρεις άνω και κάτω ακέραιο φράγμα με διαφορά 1.

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

it_new


ΠΡΟΓΡΑΜΜΑ Άσκηση

ΜΕΤΑΒΛΗΤΕΣ

  ΠΡΑΓΜΑΤΙΚΕΣ: χ

  ΑΚΕΡΑΙΕΣ: π

ΑΡΧΗ

  ΔΙΑΒΑΣΕ χ

  ΓΡΑΨΕ Ακέραιο_Μέρος(χ) 



ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

ΣΥΝΑΡΤΗΣΗ Ακέραιο_Μέρος(χ): ΑΚΕΡΑΙΑ

ΜΕΤΑΒΛΗΤΕΣ

  ΠΡΑΓΜΑΤΙΚΕΣ: χ

  ΑΚΕΡΑΙΕΣ: π

ΑΡΧΗ

  π <- 0

  ΑΝ χ > 0 ΤΟΤΕ

    ΟΣΟ χ >= 1 ΕΠΑΝΑΛΑΒΕ

      χ <- χ - 1

      π <- π + 1

    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

    Ακέραιο_Μέρος <- π

  ΑΛΛΙΩΣ_ΑΝ χ < 0 ΤΟΤΕ

    ΟΣΟ χ < -1 ΕΠΑΝΑΛΑΒΕ

      χ <- χ + 1

      π <- π + 1

    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

    Ακέραιο_Μέρος <- -(π + 1) 

  ΑΛΛΙΩΣ

    Ακέραιο_Μέρος <- 0

  ΤΕΛΟΣ_ΑΝ



ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

gpapargi

Μπορείς και να ξεκινήσεις από το 0 και να ανεβαίνεις (ή να κατεβαίνεις) με αυξανόμενη δύναμη του 2 (2^ν με ν=0,1,2... όπου ν ο αριθμός επανάληψης) μέχρι να ξεπεράσεις τον δοσμένο αριθμό. Μόλις ξεπεράσεις κάνεις δυαδική αναζήτηση μεταξύ των 2 τελευταίων ορίων. Έχει λογαριθμική πολυπλοκότητα ως προς τον αριθμό εισόδου (ή γραμμική ως προς το μέγεθος εισόδου δηλ το πλήθος των ψηφίων εισόδου).
Γιώργος Παπαργύρης

Foto

Αν Χ ο πραγματικός τότε ο Χ DIv 1 δίνει τον ακέραιο.

gpapargi

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

Foto

Μεγάλη βλακεια αυτό. Ακέραια διαίρεση θα έπρεπε να σημαίνει ποσες φορές χωράει ο διαιρέτης στον διαιρετέο. Αν το div είναι τελεστής μόνο για ακέραιους τότε δεν θα έπρεπε να είχε άλλο αναγμωριστικο, από το / αφού υποχρεωτικά τα δύο ορίσματα είναι ακέραιοι.
Γενικά η ΓΛΩΣΣΑ φτιαχτηκε με πολλά λάθη.

Ωραία ας φτιαχτεί μια συνάρτηση που θα δίνει το πόσες φορές χωράει ο Πραγματικός Υ στον Πραγματικό Χ. 
Επίσης άλλη μια που να δίνει το υπόλοιπο.
 

George Eco

Ο κώδικας του it_new είναι ο πιο πλήρης.
Αν απ' αυτόν αφαιρέσεις το αποτέλεσμα επί το διαιρέτη από το διαιρετέο, τότε έχεις και το mod.

Foto

Δεν βλέπω στο κώδικα να κάνει κάτι για τα πρόσημα.

gpapargi

Παράθεση από: Foto στις 09 Μαρ 2025, 12:51:21 ΜΜΜεγάλη βλακεια αυτό. Ακέραια διαίρεση θα έπρεπε να σημαίνει ποσες φορές χωράει ο διαιρέτης στον διαιρετέο. Αν το div είναι τελεστής μόνο για ακέραιους τότε δεν θα έπρεπε να είχε άλλο αναγμωριστικο, από το / αφού υποχρεωτικά τα δύο ορίσματα είναι ακέραιοι.
Γενικά η ΓΛΩΣΣΑ φτιαχτηκε με πολλά λάθη.

Ωραία ας φτιαχτεί μια συνάρτηση που θα δίνει το πόσες φορές χωράει ο Πραγματικός Υ στον Πραγματικό Χ. 
Επίσης άλλη μια που να δίνει το υπόλοιπο.
Η ακέραια (ευκλείδεια) διαίρεση ορίστηκε έτσι από την αρχαιότητα για τις ανάγκες μοιρασιάς ακεραίων και παραμένει έτσι σήμερα στο πλαίσιο της θεωρίας αριθμών. Διαιρετέος , διαιρέτης, πηλίκο και υπόλοιπο  είναι ακέραιοι. Υπάρχει και η διαίρεση στο R που διαιρετέος, διαιρέτης και αποτέλεσμα (πηλίκο) είναι πραγματικοί, ενώ το υπόλοιπο δεν υπάρχει πια γιατί δεν έχει νόημα.

Αυτό που προτείνεις εσύ είναι μια παραλλαγή στην οποία  το πηλίκο είναι ακέραιο ενώ διαιρέτης, διαιρετέος και υπόλοιπο είναι πραγματικοί. Αυτό ουσιαστικά σημαίνει το να βρούμε πόσες φορές χωράει ο χ στον ψ και τι περισσεύει. Δεν υπάρχει κάτι τέτοιο ορισμένο αλλά το κάνουμε εύκολα με Α_Μ(ψ/χ). Όμως χρησιμοποιείς τη συνάρτηση Α_Μ(). 
Αν θέλεις να υλοποιήσεις τη διαίρεση που λες (με πηλίκο ακέραιο και τα άλλα πραγματικά) χωρίς το Α_Μ() θα πρέπει να τις μετρήσεις  τις φορές που χωράει το χ στο ψ, δηλαδή να κάνεις κάτι σαν αυτό που περιγράφουμε παραπάνω. Δε νομίζω ότι μπορείς να το γλιτώσεις γιατί δεν έχεις πρόσβαση στην εσωτερική αναπαράσταση του αριθμού ούτε να το έχεις σε πίνακα χαρακτήρων για να κόψεις τα δεκαδικά. 

Για μένα αυτό που έχει ενδιαφέρον στην υλοποίηση της Α_Μ() που ζήτησε ο μαθητής, είναι το να βρούμε πόσο γρήγορα μπορούμε να κάνουμε της μέτρηση.
Γιώργος Παπαργύρης

it_new

ΠΡΟΓΡΑΜΜΑ τεστ

ΜΕΤΑΒΛΗΤΕΣ

  ΠΡΑΓΜΑΤΙΚΕΣ: χ, τχ

  ΑΚΕΡΑΙΕΣ: π, χα



ΑΡΧΗ

  ΔΙΑΒΑΣΕ χ

  ΓΡΑΨΕ Ακέραιο_Μέρος(χ) 

ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ



ΣΥΝΑΡΤΗΣΗ Ακέραιο_Μέρος(χ): ΑΚΕΡΑΙΑ

ΜΕΤΑΒΛΗΤΕΣ

  ΠΡΑΓΜΑΤΙΚΕΣ: χ, τχ

  ΑΚΕΡΑΙΕΣ: π, χα

ΑΡΧΗ

  ΑΝ χ < 0 ΤΟΤΕ

    τχ <- -χ

  ΑΛΛΙΩΣ

    τχ <- χ

  ΤΕΛΟΣ_ΑΝ



  χα <- 0

  π <- 1



  ΟΣΟ χα + π <= τχ ΕΠΑΝΑΛΑΒΕ



    χα <- χα + π

    π <- π*2



  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ



  π <- π div 2

  ΟΣΟ π > 0 ΕΠΑΝΑΛΑΒΕ

    ΑΝ χα + π <= τχ ΤΟΤΕ

      χα <- χα + π

    ΤΕΛΟΣ_ΑΝ

    π <- π div 2

  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ



  ΑΝ χ < 0 ΚΑΙ χα = τχ ΤΟΤΕ

    χα <- -χα

  ΑΛΛΙΩΣ_ΑΝ χ < 0 ΤΟΤΕ

    χα <- -χα - 1

  ΤΕΛΟΣ_ΑΝ



  Ακέραιο_Μέρος <- χα



ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

Foto

Με τσ πρόσημα υπάρχουν δυο σχολές για το υπόλοιπο
Στην Ευκλείδεια διαίρεση το υπόλοιπο είναι πάντα θετικό.
Στην νορμάλ το υπόλοιπο μπορεί να βγει αρνητικό.
Σε κάθε περίπτωση ισχύει ο ίδιος κανονας:
Διαιρέτης Χ ακεραιοπηλικο + υπόλοιπο = Διαιρετέος.
Διαιρέτης, υπόλοιπο και Διαιρετέος ας είναι με ή χωρίς δεκαδικά. Αρκεί να λειτουργεί η επαλήθευση κσι το πηλίκο να είναι ακέραιο. Ακέραια διαίρεση σημαίνει ακέραιο πηλίκο όχι διαίρεση ακεραίων!
Δυστυχώς στη Γλώσσα έχονυν  γίνει σαλάτα ακόμα και οι μαθηματικές έννοιες.

Ένα κόλπο να γνωρίζει κανείς την τάξη μεγέθους ενός αριθμού είναι η χρήση του δεκαδικού λογαρίθμου.  Σκεφτείτε το γιατί.

gpapargi

Παράθεση από: Foto στις 15 Μαρ 2025, 02:38:14 ΜΜΜε τσ πρόσημα υπάρχουν δυο σχολές για το υπόλοιπο
Στην Ευκλείδεια διαίρεση το υπόλοιπο είναι πάντα θετικό.
Στην νορμάλ το υπόλοιπο μπορεί να βγει αρνητικό.
Σε κάθε περίπτωση ισχύει ο ίδιος κανονας:
Διαιρέτης Χ ακεραιοπηλικο + υπόλοιπο = Διαιρετέος.
Διαιρέτης, υπόλοιπο και Διαιρετέος ας είναι με ή χωρίς δεκαδικά. Αρκεί να λειτουργεί η επαλήθευση κσι το πηλίκο να είναι ακέραιο. Ακέραια διαίρεση σημαίνει ακέραιο πηλίκο όχι διαίρεση ακεραίων!
Δυστυχώς στη Γλώσσα έχονυν  γίνει σαλάτα ακόμα και οι μαθηματικές έννοιες.

Ένα κόλπο να γνωρίζει κανείς την τάξη μεγέθους ενός αριθμού είναι η χρήση του δεκαδικού λογαρίθμου.  Σκεφτείτε το γιατί.
Υπάρχει κάποιο reference για αυτά; Με βάση τα βιβλία μαθηματικών και συγκεκριμένα της θεωρίας Αριθμών (πχ Τσαγκάρης) το υπόλοιπο στην ευκλείδεια διαίρεση είναι ακέραιος θετικός ή μηδέν (φυσικός). Αν υπάρχει κάποια αναφορά σε βιβλίο θεωρίας αριθμών που να λέει για πραγματικό υπόλοιπο και μόνο το πηλίκο υποχρεωτικά ακέραιο,  να τη δούμε και να τη συζητήσουμε
Γιώργος Παπαργύρης