Μέσος όρος 100 αριθμών με περιορισμούς

Ξεκίνησε από bugman, 19 Μαρ 2019, 07:49:02 ΜΜ

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

bugman

Είναι εύκολο να βγάλει κανείς τον μέσο όρο 100 αριθμών, αλλά όχι αν υπάρχουν περιορισμοί!

Ζητάμε ένα πρόγραμμα σε ΓΛΩΣΣΑ όπου θα διαβάζει εκατό πραγματικούς αριθμούς, και αφού διαγράψει τους τρεις μεγαλύτερους και τους τρεις μικρότερους θα βγάζει τον μέσο όρο από τους υπόλοιπους 94 αριθμούς. Το προγραμματιστικό περιβάλλον, της άσκησης, δεν υποστηρίζει πίνακες, έτσι η κωδικοποίηση σε ΓΛΩΣΣΑ θα πρέπει να μην περιέχει πίνακες, και η διαδικασία να γίνεται με ένα πέρασμα. Οι αριθμοί στο άθροισμά τους δεν ξεπερνούν τα όρια των πραγματικών.

methenitis

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

σ←0
Για ι απο 1 μεχρι 100
   διαβασε χ
   σ←σ+χ
   αν ι =1 τοτε
      μαχ1←χ
      μαχ2←χ
      μαχ3←χ
      μιν1←χ
      μιν2←χ
      μιν3←χ
   τελος_αν
   Αν χ>μαχ1 τοτε
      μαχ3←μαχ2
      μαχ2←μαχ1
      μαχ1←χ
   αλλιως_αν χ>μαχ2 τοτε
      μαχ3←μαχ2
      μαχ2←χ
   αλλιως_αν χ>μαχ3 τοτε
      μαχ3←χ
   τελος_αν
   Αν χ<μιν1 τοτε
      μιν3←μιν2
      μιν2←μιν1
      μιν1←χ
   αλλιως_αν χ<μιν2 τοτε
      μιν3←μιν2
      μιν2←χ
   αλλιως_αν χ<μιν3 τοτε
      μιν3←χ
   τελος_αν
τελος_επαναληψης
κ←(σ-(μαχ1+μαχ2+μαχ3+μιν1+μιν2+μιν3))/94
γραψε κ

bugman

Είναι πιο δύσκολο απ' ότι φαίνεται. Ασφαλώς η λύση σου είναι λάθος. Ας δούμε και άλλες λύσεις.

ikariofil

διαβασε χ1, χ2, χ3
Αν χ1>χ2 και χ1>χ3 τότε
    μαχ1←χ1
    Αν χ2>χ3 τότε
        μαχ2←χ2
        μαχ3←χ3
    Αλλιώς
        μαχ2←χ3
        μαχ3←χ2
    Τέλος_αν
Αλλιώς_Αν χ2>χ1 και χ2>χ3 τότε
    μαχ1←χ2
    Αν χ1>χ3 τότε
        μαχ2←χ1
        μαχ3←χ3
    Αλλιώς
        μαχ2←χ3
        μαχ3←χ1
    Τέλος_αν
Αλλιώς
    μαχ1←χ3
    Αν χ1>χ2 τότε
        μαχ2←χ1
        μαχ3←χ2
    Αλλιώς
        μαχ2←χ2
        μαχ3←χ1
    Τέλος_αν
Τέλος_αν
Αν χ1<χ2 και χ1<χ3 τότε
    μιν1←χ1
    Αν χ2<χ3 τότε
        μιν2←χ2
        μιν3←χ3
    Αλλιώς
        μιν2←χ3
        μιν3←χ2
    Τέλος_αν
Αλλιώς_Αν χ2<χ1 και χ2<χ3 τότε
    μιν1←χ2
    Αν χ1<χ3 τότε
        μιν2←χ1
        μιν3←χ3
    Αλλιώς
        μιν2←χ3
        μιν3←χ1
    Τέλος_αν
Αλλιώς
    μιν1←χ3
    Αν χ1<χ2 τότε
        μιν2←χ1
        μιν3←χ2
    Αλλιώς
        μιν2←χ2
        μιν3←χ1
    Τέλος_αν
Τέλος_αν
σ←χ1+χ2+χ3
Για ι απο 4 μεχρι 100
   διαβασε χ
   σ←σ+χ
   Αν χ>μαχ1 τοτε
      μαχ3←μαχ2
      μαχ2←μαχ1
      μαχ1←χ
   αλλιως_αν χ>μαχ2 τοτε
      μαχ3←μαχ2
      μαχ2←χ
   αλλιως_αν χ>μαχ3 τοτε
      μαχ3←χ
   τελος_αν
   Αν χ<μιν1 τοτε
      μιν3←μιν2
      μιν2←μιν1
      μιν1←χ
   αλλιως_αν χ<μιν2 τοτε
      μιν3←μιν2
      μιν2←χ
   αλλιως_αν χ<μιν3 τοτε
      μιν3←χ
   τελος_αν
τελος_επαναληψης
κ←(σ-(μαχ1+μαχ2+μαχ3+μιν1+μιν2+μιν3)) / 94
γραψε κ

methenitis

Παράθεση από: bugman στις 20 Μαρ 2019, 01:28:53 ΜΜ
Είναι πιο δύσκολο απ' ότι φαίνεται. Ασφαλώς η λύση σου είναι λάθος. Ας δούμε και άλλες λύσεις.

Μάλλον δεν έχω καταλάβει καλά. Το έτρεξα για 20 αριθμούς και δεν είδα κάτι λάθος.

Υπάρχει κάτι που χάνω?? Στην εκφώνηση εννοώ.

υ.γ. Ειχα ξεχάσει να διαιρέσω για το μο αλλά δεν νομίζω να αναφέρεσαι σε αυτο.

ntzios kostas

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

bugman

Σωστός ο ntzios kostas. Για την άλλη λύση που δόθηκε, κρατώ σιγή ιχθύος. Πάντως καλό είναι μαζί με τον κώδικα να δίνεται και μια επεξήγηση για κάθε μεταβλητή, περί της χρησιμότητάς της.
Δηλαδή θα ήθελα "σημειώσεις" στο κώδικα!

methenitis

#7
Μπορείτε να μου πείτε ενα παράδειγμα τιμών (δεδομένων ,έστω οτι θα δώσει 10 τιμές )που θα ειναι το λάθος γιατι κάτι μου διαφεύγει.


Σημείωση:Το βρήκα το παράδειγμα :)

methenitis

#8
Λογικά τώρα ειναι οκ...Ελπίζω


αλγοριθμος α1
σ←0
Για ι απο 1 μεχρι 100
   διαβασε χ
   σ←σ+χ
   αν ι =1 τοτε!αρχικοποιήση την πρώτη ,μονο τα max
      μαχ1←χ !το πρωτο μεγαλυτερο
      μαχ2←χ !το δευτερο μεγαλυτερ
      μαχ3←χ  !το τρίτο μεγαλυτερο   
   αλλιως_αν ι=2 τοτε!δευτερη θέτει σαν πρώτο max1 ή δευτερο στο max2
      Αν χ>μαχ1 τοτε
         μαχ1←χ
      αλλιως
         μαχ2←χ
      Τελος_αν
   αλλιως_αν ι=3 τοτε
      Αν χ>μαχ1 τοτε
            μαχ3←μαχ2
            μαχ2←μαχ1
            μαχ1←χ
         αλλιως_αν χ>μαχ2 τοτε
            μαχ3←μαχ2
            μαχ2←χ
        αλλιως!εδώ δεν χρειάζεται να ελέγξει. Πρέπει να το αλλάξει.
            μαχ3←χ
         τελος_αν
!τα μεγιστα στα ελάχιστα ανάποδα.
   μιν1←μαχ3 !το μικροτερο απο ολα
   μιν2←μαχ2 !το δευτερο μικρότερο
   μιν3←μαχ1 ! το τρίτο μικροτερο
   αλλιως !για ι>3
         Αν χ>μαχ1 τοτε
            μαχ3←μαχ2
            μαχ2←μαχ1
            μαχ1←χ
         αλλιως_αν χ>μαχ2 τοτε
            μαχ3←μαχ2
            μαχ2←χ
         αλλιως_αν χ>μαχ3 τοτε
            μαχ3←χ
         τελος_αν
         Αν χ<μιν1 τοτε
            μιν3←μιν2
            μιν2←μιν1
            μιν1←χ
         αλλιως_αν χ<μιν2 τοτε
           μιν3←μιν2
            μιν2←χ
        αλλιως_αν χ<μιν3 τοτε
            μιν3←χ
         τελος_αν
τελος_αν
τελος_επαναληψης
κ←(σ-(μαχ1+μαχ2+μαχ3+μιν1+μιν2+μιν3))/94
γραψε κ
τελος α1

bugman

#9
 Είναι σωστό!
(εγώ έκανα πριν λάθος στην εκτέλεση)

Απλά είναι καλύτερο να έχει την Αν ι>3 σαν πρώτη Αν, γιατί αυτή θα παίξει περισσότερες φορές. Εδώ υπάρχει και η εναλλακτική να έχουμε για τους πρώτους 3 αριθμούς ξεχωριστή επανάληψη πριν από τους επόμενους 97. Κάτι που κάνει ο Ηλίας παραπάνω!
Επίσης να προσθέσω ότι η απλή αντιγραφή τον μαχ1...μαχ3 στα μιν1...μιν3 είναι καλύτερη από τον υπολογισμό ξανά που κάνει ο Ηλίας!


bugman

Η δική μου λύση με ταξινόμηση με μεταβλητές! (έτσι για να υπάρχει και κάτι άλλο)

Αλγόριθμος α2
σ←0
Διάβασε α1,α2,α3,α5,α6,α7
σ←α1+α2+α3+α5+α6+α7
Για ι απο 7 μεχρι 100
   Διάβασε α4
   σ←σ+α4
   οκ←Αληθές
   Όσο οκ Επανάλαβε
      οκ←Ψευδές
      Αν α1>α2 Τότε
         π←α1
         α1←α2
         α2←π
         οκ←Αληθές
      Τέλος_αν
      Αν α2>α3 Τότε
         π←α2
         α2←α3
         α3←π
         οκ←Αληθές
      Τέλος_αν
      Αν α3>α4 Τότε
         π←α3
         α3←α4
         α4←π
         οκ←Αληθές
      Τέλος_αν
      Αν α4>α5 Τότε
         π←α4
         α4←α5
         α5←π
         οκ←Αληθές
      Τέλος_αν
      Αν α5>α6 Τότε
         π←α5
         α5←α6
         α6←π
         οκ←Αληθές
      Τέλος_αν
      Αν α6>α7 Τότε
         π←α6
         α6←α7
         α7←π
         οκ←Αληθές
      Τέλος_αν
   Τελος_επαναληψης
Τελος_επαναληψης
κ←(σ-α1-α2-α3-α5-α6-α7)/94
Γράψε κ
Τέλος α2

ikariofil

Merthenitis έχω την εντύπωση ότι αν ο πρώτος αριθμός (ι=1) είναι ο μεγαλύτερος όλων δεν θα παίξει

bugman

Το έχω δοκιμάσει και παίζει!
Όπως τα έχει ορίσει, το μαχ1 είναι ο μεγαλύτερος και το μιν1 είναι ο μικρότερος.
Το έχω δοκιμάσει με 1 έως 99 + ένα 99 ακόμα, και ανακατεμένα, και με 1 συν 1 έως 99 και ανακατεμένα.

ikariofil

Φαίνεται σωστό ύστερα από τις τελευταίες διορθώσεις

ssimaiof

Να δώσω και εγώ μία λύση στο πιο γενικευμένο πρόβλημα :
Να υπολογιστεί ο μέσος όρος ν αριθμών χωρίς να υπολογιστούν οι κ μεγαλύτεροι και κ μικρότεροι αριθμοί.
Ενδεικτικοί Περιορισμοί   20 <= ν <= 1000,   0 <= κ <= 10
Βασίζεται στην Ταξινόμηση Ευθείας Εισαγωγής (Straight Insertion Sort) τροποποιημένη βέβαια για τις ανάγκες της άσκησης.

ΠΡΟΓΡΑΜΜΑ Εξαίρεση_Κ_Max_Min
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: ν, κ, i, t1, t2
  ΠΡΑΓΜΑΤΙΚΕΣ: α, Αθρ, ΜΟ, Max[11], Min[11] 
ΑΡΧΗ
  ΓΡΑΨΕ 'Δώστε πλήθος αριθμών ν :  '
  ΔΙΑΒΑΣΕ ν
  ΟΣΟ ν < 20 Η ν > 1000 ΕΠΑΝΑΛΑΒΕ
    ΓΡΑΨΕ 'ΛΑΘΟΣ !!   Πρέπει 20 <= ν <= 1000'
    ΓΡΑΨΕ 'Ξαναδώστε πλήθος αριθμών ν :  '
    ΔΙΑΒΑΣΕ ν
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

  ΓΡΑΨΕ 'Δώστε πλήθος αριθμών προς εξαίρεση κ :  '
  ΔΙΑΒΑΣΕ κ
  ΟΣΟ κ < 0 Η κ > 10 ΕΠΑΝΑΛΑΒΕ
    ΓΡΑΨΕ 'ΛΑΘΟΣ !!   Πρέπει 0 <= κ <= 10'
    ΓΡΑΨΕ 'Ξαναδώστε πλήθος αριθμών προς εξαίρεση κ :  '
    ΔΙΑΒΑΣΕ κ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

  ΓΡΑΨΕ 'Δώστε τον 1ο αριθμό :  '
  ΔΙΑΒΑΣΕ α
  Min[1] <- α
  Max[1] <- α
  Αθρ <- α
  ΓΙΑ i ΑΠΟ 2 ΜΕΧΡΙ ν
    ΓΡΑΨΕ 'Δώστε τον ', i, 'ο αριθμό :  '
    ΔΙΑΒΑΣΕ α
    Αθρ <- Αθρ + α
    ΑΝ i <= κ ΤΟΤΕ
      t1 <- i - 1
    ΑΛΛΙΩΣ
      t1 <- κ
    ΤΕΛΟΣ_ΑΝ
    t2 <- t1
    ΚΑΛΕΣΕ Ρύθμισε_Max(Max, α, t1) 
    ΚΑΛΕΣΕ Ρύθμισε_Min(Min, α, t2) 
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

  ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ κ
    Αθρ <- Αθρ - Max[i] - Min[i] 
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΑΝ ν = κ + κ ΤΟΤΕ
    ΓΡΑΨΕ 'Δεν υπάρχουν αριθμοί για μέσο όρο'
  ΑΛΛΙΩΣ
    ΜΟ <- Αθρ/(ν - κ - κ) 
    ΓΡΑΨΕ 'Μέσος Όρος = ', ΜΟ
  ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

ΔΙΑΔΙΚΑΣΙΑ Ρύθμισε_Max(Max, α, t) 
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: t
  ΠΡΑΓΜΑΤΙΚΕΣ: α, Max[11] 
  ΛΟΓΙΚΕΣ: L
ΑΡΧΗ
  L <- α > Max[t] 
  ΟΣΟ L ΕΠΑΝΑΛΑΒΕ
    Max[t + 1] <- Max[t] 
    t <- t - 1
    ΑΝ t = 0 ΤΟΤΕ
      L <- ΨΕΥΔΗΣ
    ΑΛΛΙΩΣ
      L <- α > Max[t] 
    ΤΕΛΟΣ_ΑΝ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  Max[t + 1] <- α
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ

ΔΙΑΔΙΚΑΣΙΑ Ρύθμισε_Min(Min, α, t) 
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: t
  ΠΡΑΓΜΑΤΙΚΕΣ: α, Min[11] 
  ΛΟΓΙΚΕΣ: L
ΑΡΧΗ
  L <- α < Min[t] 
  ΟΣΟ L ΕΠΑΝΑΛΑΒΕ
    Min[t + 1] <- Min[t] 
    t <- t - 1
    ΑΝ t = 0 ΤΟΤΕ
      L <- ΨΕΥΔΗΣ
    ΑΛΛΙΩΣ
      L <- α < Min[t] 
    ΤΕΛΟΣ_ΑΝ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  Min[t + 1] <- α
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ
Σταύρος Σημαιοφορίδης