ΣΥΝΑΡΤΗΣΗ ΑΘΡ(Π, I): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: I, J, S, Π[4, 4]
ΑΡΧΗ
S <- 0
ΓΙΑ J ΑΠΟ 1 ΜΕΧΡΙ 4
S <- S + Π[I, J]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΑΘΡ <- S
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ
Αν βάλεις ανάποδα τους δείκτες μέσα στην αγκύλη;Δεν είναι αυτό που ήθελα. Η ΙΔΙΑ συνάρτηση (ή διαδικασία ) , διαφορετική όμως κλήση
Νίκο καλησπέραΜανώλη ευχαριστώ για την απάντηση.
Αν προσθέσεις μια παράμετρο στην συνάρτηση;;
Συνάρτηση Φ( Α, κ, λ) :ακεραια
......
Αρχη
Αθρ<--0
Αν λ=1 τότε
Για μ από 1 μέχρι 4
Αθρ<-- Αθρ+ Α[κ, μ]
Τελος_Επαναληψης
Αλλιώς
Για μ από 1 μέχρι 4
Αθρ<--Αθρ+Α[μ, κ]
Τελος_Επαναληψης
Τέλος_αν
Φ<-- Αθρ
Τελος_Συναρτησης
ΣΥΝΑΡΤΗΣΗ ΑΘΡ(Π, I, Γ): ΑΚΕΡΑΙΑ
! Γ=0 => στήλες, Γ=1 => γραμμές
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: I, J, S, Π[4, 4], Γ
ΑΡΧΗ
S <- 0
ΓΙΑ J ΑΠΟ 1 ΜΕΧΡΙ 4
S <- S + Π[I*Γ + J*(1 - Γ), J*Γ + I*(1 - Γ)]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΑΘΡ <- S
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ
δεν είμαι σίγουρος αν τελικά Νίκος δέχτηκε την απάντηση του Μανώλη,
η οποία βρίσκω ότι τον καλύπτει...
αλλά αν για κάποιο λόγο επιμένεις Νίκο η συνάρτηση να έχει μόνο ένα ΓΙΑ, έχω μία πρότασηΚώδικας: Bash
Συνάρτηση αθροισμα(Π,Ι,χ): πραγματική ... αρχή !η παράμετρος χ θα είναι είτε 1 για άθροισμα της γραμμής Ι είτε 0 για άθροισμα της στήλης Ι !αντίστοιχα το ψ θα είναι είτε 0 για άθροισμα της γραμμής Ι είτε 1 για άθροισμα της στήλης Ι αν χ <> 0 τότε χ <-- 1 τέλος_αν ψ = 1-χ Σ <-- 0 για κ από 1 μέχρι 4 Σ <-- Σ + χ*Π[Ι,κ] + ψ*Π[κ,Ι] τέλος_επανάληψης άθροισμα <-- Σ τέλος_συνάρτησης
Στο πέρασμα με αναφορά δίνουμε νέο όνομα για ίδιο περιεχόμενο. Οι αναφορές γενικά δεν μπορούν να αλλάξουν. Αν το Χ είναι αναφορά του Ζ δεν μπορεί να αλλάξει για να δείχνει το Υ. Ο λόγος που γίνεται αυτό είναι λειτουργικός, δηλαδή θέλουμε το πέρασμα με αναφορά να διατηρεί την αναφορά, ώστε να πάρουμε επιστροφή τιμής.+1
Στις μεταβλητές που λέγονται αναφορές σε τιμή και όχι τιμές, μπορούμε να αλλάξουμε αναφορά. Εδώ για να μην μπερδεύουμε το πέρασμα με αναφορά, σε κλήση, με την αναφορά σε τιμή, μπορούμε να λέμε δείκτη την αναφορά σε τιμή.
Το ενδιαφέρον είναι ότι μια αναφορά σε τιμή μπορούμε να την περάσουμε σε κλήση με τιμή ή με αναφορά, ανάλογα με το πώς έχουμε σχεδιάσει το πρόγραμμα! Όταν την περάσουμε με τιμή, αυτό που αντιγράφεται είναι ο δείκτης. Έτσι έχουμε μια νέα αναφορά σε τιμή που δείχνει την ίδια τιμή, τον ίδιο χώρο της, ώστε κάθε αλλαγή να φανεί και πίσω, εκτός από μία περίπτωση. Μια αναφορά σε τιμή μπορεί να αλλάξει αναφορά. Αν λοιπόν γίνει αλλαγή αναφοράς τότε αυτό που περάσαμε με τιμή χάνει την αναφορά του! Στο πέρασμα με αναφορά, μιας αναφοράς σε τιμή, έχουμε όλο το πακέτο, δηλαδή και να αλλάξουμε το περιεχόμενο, την τιμή, και την αναφορά σε άλλη τιμή και αυτά θα φανούν στην επιστροφή από τη κλήση σε αυτό που περάσαμε.
Η ΓΛΩΣΣΑ του Λυκείου δεν έχει μεταβλητές που κρατάνε αναφορές σε τιμές. Όλες οι μεταβλητές είναι τιμές. Στις συναρτήσεις έχουμε πάντα πέρασμα με τιμή, ενώ στις διαδικασίες με αναφορά (δεν ισχύει αν περάσουμε έκφραση και όχι μεταβλητή για παράμετρο). Αν χρησιμοποιήσουμε το (Α) αντί για Α στη κλήση διαδικασίας περνάμε την Α με τιμή, γιατί έχουμε έκφραση (παράσταση όχι σκέτο όνομα).
Αν μπορούσαμε στη ΓΛΩΣΣΑ να βάζουμε σε πίνακες αναφορές σε τιμές (δείκτες), τότε θα μπορούσαμε να είχαμε δύο πίνακες 4Χ4 με 16+16 δείκτες, αλλά μόνο 16 τιμές. Με μια συνάρτηση που θα έπαιρνε με τιμή τον πίνακα , σε νέο πίνακα με αντιγραφή αναφορών, και επιλογή μιας γραμμής θα παίρναμε το άθροισμά της. Μια τέτοια συνάρτηση θα έπαιρνε τον πίνακα και τον αριθμό γραμμής. Η αλλαγή σε στήλη ουσιαστικά γίνεται με την επιλογή του άλλου πίνακα που περιέχειαναφορές σε ίδιες τιμές με το πρώτο.
Αν θέλει κάποιος να απλοποιήσει το παραπάνω, θα μπορούσε να κρατάει δύο διαφορετικούς πίνακες, και σε κάθε έναν θα έχει τις τιμές ώστε να ισχύει Α[I,J]=B[J, I]. Άρα για πίνακα 4Χ4 κάνουμε δυο, τους γεμίζουμε με το δεύτερο να έχει αντίστροφα τους δείκτες, και με μια συνάρτηση όπως αναφέρθηκε πριν και χρήση του πίνακα για γραμμές ή στήλες παίρνουμε το άθροισμα συγκεκριμένης γραμμής ή στήλης.
ΠΡΟΓΡΑΜΜΑ ΑΣΚ
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: I, J, Π[4, 4], Σ[8]
ΑΡΧΗ
ΓΙΑ I ΑΠΟ 1 ΜΕΧΡΙ 4
ΓΙΑ J ΑΠΟ 1 ΜΕΧΡΙ 4
ΔΙΑΒΑΣΕ Π[I, J]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΙΑ I ΑΠΟ 1 ΜΕΧΡΙ 8
Σ[I] <- ΑΘΡ(Π, I)
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΙΑ I ΑΠΟ 1 ΜΕΧΡΙ 8
ΓΡΑΨΕ Σ[I]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
ΣΥΝΑΡΤΗΣΗ ΑΘΡ(Π, I): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: I, J, S, Π[4, 4]
ΑΡΧΗ
S <- 0
ΓΙΑ J ΑΠΟ 1 ΜΕΧΡΙ 4
S <- S + (I <=4)*Π[I, J] + (I>4)*Π[J, I mod 4]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΑΘΡ <- S
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ
ΣΥΝΑΡΤΗΣΗ ΑΘΡ(Π, I): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: I, J, K, S, Π[4, 4]
ΑΡΧΗ
K <- ((I - 1) div 4 + 1) mod 2
S <- 0
ΓΙΑ J ΑΠΟ 1 ΜΕΧΡΙ 4
S <- S + K* Π[(I - 1) mod 4 + 1, J] + (1 - K)* Π[J, (I - 1) mod 4 + 1]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΑΘΡ <- S
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ
Σπάω το κεφάλι εδώ και πολύ ώρα για να μπορέσω να βρω μια καλή λύση για τον υπολογισμό του αθροίσματος κατά γραμμές και κατά στήλες σε δισδιάστατο πίνακα καλώντας την ίδια Συνάρτηση.Κώδικας: [Επιλογή]ΣΥΝΑΡΤΗΣΗ ΑΘΡ(Π, I): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: I, J, S, Π[4, 4]
ΑΡΧΗ
S <- 0
ΓΙΑ J ΑΠΟ 1 ΜΕΧΡΙ 4
S <- S + Π[I, J]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΑΘΡ <- S
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ
Στον κώδικα υπάρχει ένας πίνακας Π[4,4] και θα ήθελα με διαφορετική κλήση να υπολογίσω το άθροισμα κατά γραμμές και το άθροισμα κατά στήλες. Ή η λύση είναι μπροστά στα μάτια μου ή ....
Παίζει κάτι με καμία αντιμετάθεση παραμέτρων ή κάτι παρόμοιο στη ΓΛΩΣΣΑ; ???
Ναι αυτό είναι. Ευχαριστώ.Κώδικας: [Επιλογή]ΣΥΝΑΡΤΗΣΗ ΑΘΡ(Π, I): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: I, J, K, S, Π[4, 4]
ΑΡΧΗ
K <- ((I - 1) div 4 + 1) mod 2
S <- 0
ΓΙΑ J ΑΠΟ 1 ΜΕΧΡΙ 4
S <- S + K* Π[(I - 1) mod 4 + 1, J] + (1 - K)* Π[J, (I - 1) mod 4 + 1]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΑΘΡ <- S
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ