Γενικό Λύκειο > Συναρτήσεις

Άθροισμα κατά γραμμές και κατά στήλες σε πίνακα με Συναρτηση

<< < (2/6) > >>

Λαμπράκης Μανώλης:
Νίκο έτσι που το σκέφτομαι, νομίζω πως επειδή η παράμετρος Ι είναι παντα στις γραμμές του πίνακα, δεν μπορεί να αλλάξει και να γίνει κάπως στήλες.. Πχ αν έχουμε μια συνάρτηση που υπολογίζει το Max, εσύ ζητάς πχ να αλλάξεις τον τελεστή από > σε < και να υπολογίζει το min... Αν δεν κάνω κάποιο λάθος ολα αυτά... Οπότε μάλλον πρέπει κάτι να αλλάξεις

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


--- Κώδικας: ---ΣΥΝΑΡΤΗΣΗ ΑΘΡ(Π, I, Γ): ΑΚΕΡΑΙΑ
! Γ=0 => στήλες, Γ=1 => γραμμές
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: I, J, S, Π[4, 4], Γ
ΑΡΧΗ
  S <- 0
  ΓΙΑ J ΑΠΟ 1 ΜΕΧΡΙ 4
    S <- S + Π[I*Γ + J*(1 - Γ), J*Γ + I*(1 - Γ)]
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΑΘΡ <- S
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

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

bugman:
Αν ο πίνακας είναι μονοδιάστατος από 0 έως 15 τότε με δυο τύπους μπορεί κανείς να τον διαβάζει ως δισδιάστατο, όπου ο ένας τύπος είναι I+J*4 (ας τον λέμε οριζόντιο) και ο άλλος ο I*4+j (ας τον λέμε κάθετο). Δηλαδή δεν χρειάζεται να περιστρέψουμε το πίνακα, αλλά αλλάζουμε το τρόπο που διαβάζουμε από αυτόν. Αν θέλει κανείς να διαβάζει από δεξιά προς αριστερά, σε οριζόντια διάταξη χρησιμοποιούμε το 3-I+J*4 (γιατί για Ι=0 δίνει 3, για 1 δίνει 2, για 2 δίνει 1 και για 3 δίνει 0) και το  για κάθετη διάταξη το τύπο (3-i)*4+J.

Για τους δυο τύπους δείτε πως δουλεύει:
Έστω ότι από 0 έως 3 έχουμε τα 1,2,3,4 και όλα τα άλλα είναι 0. Ο πρώτος τύπος δίνει για J=0, μετράμε από I=0  μέχρι 3 και το αποτέλεσμα είναι 1+2+3+4. Με το δεύτερο τύπο για j=0 θα πάρουμε τους δείκτες 0*4, 1*4, 2*4, 3*4 ή 0, 4, 8, 12, και τα νούμερα 1+0+0+0. Με J=1 θα πάρουμε τους δείκτες 1,5,9,13 και τιμές τα 2, 0, 0, 0 κ.ο.κ.

Το πρόβλημα με τη ΓΛΩΣΣΑ είναι ότι δεν μπορούμε να περάσουμε συνάρτηση σε παράμετρο, αλλά μπορούμε να περάσουμε μια μεταβλητή που θα δηλώνει ποια συνάρτηση θα διαβάζουμε, επειδή οι συναρτήσεις είναι καθολικές (καλούνται από παντού).

Ένα άλλο ζήτημα που λύνεται με μονοδιάστατο πίνακα, με προσπέλαση με τύπο για δισδιάστατο πίνακα, είναι η προσθήκη γραμμών ή στηλών. Ορίζουμε παραπάνω στοιχεία στο πίνακα μέχρι ένα μέγιστο αριθμό στηλών ή γραμμών. Δυσκολεύει λίγο επειδή στους τύπους πρέπει να ορίζουμε το τρέχον μέγεθος σαν ορίσματα στις συναρτήσεις μετατροπής από δυο διαστάσεις σε μια. Εδώ η οριζόντια διάταξη χρησιμεύει για να προσθέτουμε γραμμές ενώ η κάθετη διάταξη για να προσθέτουμε στήλες. Δεν μπορούμε να τα έχουμε και τα δύο. Ο μονοδιάστατος πίνακας έχει συνεχόμενα στοιχεία που κάνουν γραμμές ή στήλες, δεν μπορεί να έχει και τα δύο. Όπως και να έχει όμως ο τρόπος να τα διαβάσουμε κατά στήλες ή κατά γραμμές γίνεται όπως περιγράφτηκε στην αρχή.
Στη πραγματικότητα δεν υπάρχουν πολυδιάστατοι πίνακες στην μνήμη του υπολογιστή. Η μνήμη είναι μονοδιάστατη, και ο διερμηνευτής εκτελεί έναν από τους δυο τύπους διάταξης. Εφόσον η ΓΛΩΣΣΑ δεν δίνει τρόπο να αλλάξουμε μέγεθος στο πίνακα, δεν έχει σημασία ποια διάταξη χρησιμοποιεί! Αν όμως επιλέξουμε έναν μονοδιάστατο πίνακα για να τον προσπελάσουμε με δικό μας τρόπο, τότε θα πρέπει να επιλέξουμε μια διάταξη πχ το I+J*4 ή το I*4+J. Αν θέλαμε τριών διαστάσεων πίνακα τότε θα πρέπει να προσθέσουμε έναν όρο πχ I+J*4+K*4*4  για πίνακα [4,4,4] ή 4*4*4 ή 64 στοιχείων. Αν θέλαμε έναν πίνακα  2*3*4 στοιχεία θα είχαμε το I+J*2+K*2*3 σαν τύπος για ένα μονοδιάστατο 24 στοιχείων, από 0 έως 23, όπου το μέγιστο θα το παίρναμε με 1+2*2+3*2*3 ή 1+4+18=23.


epsilonXi:
δεν είμαι σίγουρος αν τελικά Νίκος δέχτηκε την απάντηση του Μανώλη,
η οποία βρίσκω ότι τον καλύπτει...
αλλά αν για κάποιο λόγο επιμένεις Νίκο η συνάρτηση να έχει μόνο ένα ΓΙΑ, έχω μία πρόταση



--- Κώδικας: Bash ---Συνάρτηση αθροισμα(Π,Ι,χ): πραγματική...αρχή!η παράμετρος χ θα είναι είτε 1 για άθροισμα της γραμμής Ι είτε 0 για άθροισμα της στήλης Ι!αντίστοιχα το ψ θα είναι είτε 0 για άθροισμα της γραμμής Ι είτε 1 για άθροισμα της στήλης Ι   αν χ <> 0 τότε     χ <-- 1  τέλος_αν  ψ = 1-χ   Σ <-- 0  για κ από 1 μέχρι 4    Σ <-- Σ + χ*Π[Ι,κ] + ψ*Π[κ,Ι]  τέλος_επανάληψης  άθροισμα <-- Στέλος_συνάρτησης

nikolasmer:

--- Παράθεση από: epsilonXi στις 16 Απρ 2019, 09:26:09 πμ ---δεν είμαι σίγουρος αν τελικά Νίκος δέχτηκε την απάντηση του Μανώλη,
η οποία βρίσκω ότι τον καλύπτει...
αλλά αν για κάποιο λόγο επιμένεις Νίκο η συνάρτηση να έχει μόνο ένα ΓΙΑ, έχω μία πρόταση



--- Κώδικας: Bash ---Συνάρτηση αθροισμα(Π,Ι,χ): πραγματική...αρχή!η παράμετρος χ θα είναι είτε 1 για άθροισμα της γραμμής Ι είτε 0 για άθροισμα της στήλης Ι!αντίστοιχα το ψ θα είναι είτε 0 για άθροισμα της γραμμής Ι είτε 1 για άθροισμα της στήλης Ι   αν χ <> 0 τότε     χ <-- 1  τέλος_αν  ψ = 1-χ   Σ <-- 0  για κ από 1 μέχρι 4    Σ <-- Σ + χ*Π[Ι,κ] + ψ*Π[κ,Ι]  τέλος_επανάληψης  άθροισμα <-- Στέλος_συνάρτησης



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

Αυτό είναι υπέροχο. Κάτι τέτοιο ήθελα. Ίσως με ένα διακόπτη (true false ) σαν τρίτη παράμετρο. Τέλειο πραγματικά. Ευχαριστώ για μια ακόμη φορά.

Κάτι ακόμα. Υπάρχει η δυνατότητα σε κάποια γλώσσα προγραμματισμού να μπορεί να γίνει αλλαγή στις μεταβλητές αλλά όχι στις τιμές τους; Παράδειγμα έτσι όπως το σκέφτομαι να γίνει τίποτα με pointers η τίποτα σχετικό με casting. Ειλικρινά μπορεί να λέω και χαζαμαρες.

Πλοήγηση

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

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

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

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