Αποστολέας Θέμα: Άθροισμα κατά γραμμές και κατά στήλες σε πίνακα με Συναρτηση  (Αναγνώστηκε 340 φορές)

nikolasmer

  • Ομάδα Νέου Λυκείου
  • *
  • Μηνύματα: 534
  • There can be only one...may it be AEPP.
Σπάω το κεφάλι εδώ και πολύ ώρα για να μπορέσω να βρω μια καλή λύση για τον υπολογισμό του αθροίσματος κατά γραμμές και κατά στήλες σε δισδιάστατο πίνακα καλώντας την ίδια Συνάρτηση.
Κώδικας: [Επιλογή]
ΣΥΝΑΡΤΗΣΗ ΑΘΡ(Π, I): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: I, J, S, Π[4, 4]
ΑΡΧΗ
  S <- 0
  ΓΙΑ J ΑΠΟ 1 ΜΕΧΡΙ 4
    S <- S + Π[I, J]
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΑΘΡ <- S
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ
 

Στον κώδικα υπάρχει ένας πίνακας Π[4,4] και θα ήθελα με διαφορετική κλήση να υπολογίσω το άθροισμα κατά γραμμές και το άθροισμα κατά στήλες. Ή η λύση είναι μπροστά στα μάτια μου ή ....
Παίζει κάτι με καμία αντιμετάθεση παραμέτρων ή κάτι παρόμοιο στη ΓΛΩΣΣΑ; ???
Απ' τα τσακάλια δεν γλυτώνεις μ'ευχές ή παρακάλια
(Κ. Βάρναλης)

Μερεντίτης Νικόλαος
Καθηγητής Πληροφορικής - Φροντιστής

petrosp13

  • Ομάδα Νέου Λυκείου
  • *
  • Μηνύματα: 2167
Αν βάλεις ανάποδα τους δείκτες μέσα στην αγκύλη;
Παπαδόπουλος Πέτρος
Καθηγητής Πληροφορικής

nikolasmer

  • Ομάδα Νέου Λυκείου
  • *
  • Μηνύματα: 534
  • There can be only one...may it be AEPP.
Αν βάλεις ανάποδα τους δείκτες μέσα στην αγκύλη;
Δεν είναι αυτό που ήθελα.  Η ΙΔΙΑ συνάρτηση (ή διαδικασία ) , διαφορετική όμως κλήση
Απ' τα τσακάλια δεν γλυτώνεις μ'ευχές ή παρακάλια
(Κ. Βάρναλης)

Μερεντίτης Νικόλαος
Καθηγητής Πληροφορικής - Φροντιστής

Λαμπράκης Μανώλης

  • Ομάδα διαγωνισμάτων 2017
  • *
  • Μηνύματα: 595
Νίκο καλησπέρα

Αν προσθέσεις μια παράμετρο στην συνάρτηση;;
Συνάρτηση Φ( Α, κ, λ) :ακεραια
......
Αρχη
  Αθρ<--0
  Αν λ=1 τότε
     Για μ από 1 μέχρι 4
         Αθρ<-- Αθρ+ Α[κ, μ]
     Τελος_Επαναληψης
  Αλλιώς
    Για μ από 1 μέχρι 4
       Αθρ<--Αθρ+Α[μ, κ]
     Τελος_Επαναληψης
   Τέλος_αν
   Φ<-- Αθρ
Τελος_Συναρτησης
     

nikolasmer

  • Ομάδα Νέου Λυκείου
  • *
  • Μηνύματα: 534
  • There can be only one...may it be AEPP.
Νίκο καλησπέρα

Αν προσθέσεις μια παράμετρο στην συνάρτηση;;
Συνάρτηση Φ( Α, κ, λ) :ακεραια
......
Αρχη
  Αθρ<--0
  Αν λ=1 τότε
     Για μ από 1 μέχρι 4
         Αθρ<-- Αθρ+ Α[κ, μ]
     Τελος_Επαναληψης
  Αλλιώς
    Για μ από 1 μέχρι 4
       Αθρ<--Αθρ+Α[μ, κ]
     Τελος_Επαναληψης
   Τέλος_αν
   Φ<-- Αθρ
Τελος_Συναρτησης
     
Μανώλη ευχαριστώ για την απάντηση.
Ξέρω γίνομαι εκνευριστικος. Αλλά στο μυαλό μου είχα την παραπάνω συνάρτηση (στο πρώτο μου post) αλλά με διαφορετική κλήση . Μια για τις γραμμές και μια για τις στήλες. Με μια επανάληψη μέσα στο σώμα της.
Σε κάποια φάση σκέφτηκα καμιά αντιμετάθεση τιμών παραμέτρων αλλά αυτή δεν θα ήταν πάρα μόνο αυτό ...μια αντιμετάθεση τιμών . Όχι μεταβλητών. Χαχα.
Τέλος πάντων .  Μάλλον δε γίνεται στη ΓΛΩΣΣΑ .
Απ' τα τσακάλια δεν γλυτώνεις μ'ευχές ή παρακάλια
(Κ. Βάρναλης)

Μερεντίτης Νικόλαος
Καθηγητής Πληροφορικής - Φροντιστής

Λαμπράκης Μανώλης

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

alkisg

  • Τεχνικός / καθαρίστρια
  • *****
  • Μηνύματα: 4831
    • alkisg@im.sch.gr
    • Ο Διερμηνευτής της ΓΛΩΣΣΑΣ
Γίνεται με πολύπλοκες πράξεις δεικτών, αλλά όχι έτσι απλά που το σκέφτεσαι. Π.χ. αν έπιασα σωστά τους δείκτες, γιατί είναι και αργάμιση:

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


bugman

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 328
  • The Bug Eater
    • Πληροφορική Προγραμματισμός
Αν ο πίνακας είναι μονοδιάστατος από 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

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


Κώδικας: Bash
  1. Συνάρτηση αθροισμα(Π,Ι,χ): πραγματική
  2. ...
  3. αρχή
  4. !η παράμετρος χ θα είναι είτε 1 για άθροισμα της γραμμής Ι είτε 0 για άθροισμα της στήλης Ι
  5. !αντίστοιχα το ψ θα είναι είτε 0 για άθροισμα της γραμμής Ι είτε 1 για άθροισμα της στήλης Ι
  6.  
  7.   αν χ <> 0 τότε
  8.     χ <-- 1
  9.   τέλος_αν
  10.   ψ = 1
  11.  
  12.   Σ <-- 0
  13.   για κ από 1 μέχρι 4
  14.     Σ <-- Σ + χ*Π[Ι,κ] + ψ*Π[κ,Ι]
  15.   τέλος_επανάληψης
  16.   άθροισμα <-- Σ
  17. τέλος_συνάρτησης



nikolasmer

  • Ομάδα Νέου Λυκείου
  • *
  • Μηνύματα: 534
  • There can be only one...may it be AEPP.
δεν είμαι σίγουρος αν τελικά Νίκος δέχτηκε την απάντηση του Μανώλη,
η οποία βρίσκω ότι τον καλύπτει...
αλλά αν για κάποιο λόγο επιμένεις Νίκο η συνάρτηση να έχει μόνο ένα ΓΙΑ, έχω μία πρόταση


Κώδικας: Bash
  1. Συνάρτηση αθροισμα(Π,Ι,χ): πραγματική
  2. ...
  3. αρχή
  4. !η παράμετρος χ θα είναι είτε 1 για άθροισμα της γραμμής Ι είτε 0 για άθροισμα της στήλης Ι
  5. !αντίστοιχα το ψ θα είναι είτε 0 για άθροισμα της γραμμής Ι είτε 1 για άθροισμα της στήλης Ι
  6.  
  7.   αν χ <> 0 τότε
  8.     χ <-- 1
  9.   τέλος_αν
  10.   ψ = 1
  11.  
  12.   Σ <-- 0
  13.   για κ από 1 μέχρι 4
  14.     Σ <-- Σ + χ*Π[Ι,κ] + ψ*Π[κ,Ι]
  15.   τέλος_επανάληψης
  16.   άθροισμα <-- Σ
  17. τέλος_συνάρτησης




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

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

Μερεντίτης Νικόλαος
Καθηγητής Πληροφορικής - Φροντιστής

bugman

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 328
  • The Bug Eater
    • Πληροφορική Προγραμματισμός
Στο πέρασμα με αναφορά δίνουμε νέο όνομα για ίδιο περιεχόμενο. Οι αναφορές γενικά δεν μπορούν να αλλάξουν. Αν το Χ είναι αναφορά του Ζ δεν μπορεί να αλλάξει για να δείχνει το Υ. Ο λόγος που γίνεται αυτό είναι λειτουργικός, δηλαδή θέλουμε το πέρασμα με αναφορά να διατηρεί την αναφορά, ώστε να πάρουμε επιστροφή τιμής.

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

Το ενδιαφέρον είναι ότι μια αναφορά σε τιμή μπορούμε να την περάσουμε σε κλήση με τιμή ή με αναφορά, ανάλογα με το πώς έχουμε σχεδιάσει το πρόγραμμα! Όταν την περάσουμε με τιμή, αυτό που αντιγράφεται είναι ο δείκτης. Έτσι έχουμε μια  νέα αναφορά σε τιμή που δείχνει την ίδια τιμή, τον ίδιο χώρο της, ώστε κάθε αλλαγή να φανεί και πίσω, εκτός από μία περίπτωση. Μια αναφορά σε τιμή μπορεί να αλλάξει αναφορά. Αν λοιπόν γίνει αλλαγή αναφοράς τότε αυτό που περάσαμε με τιμή χάνει την αναφορά του! Στο πέρασμα με αναφορά, μιας αναφοράς σε τιμή, έχουμε όλο το πακέτο, δηλαδή και να αλλάξουμε το περιεχόμενο, την τιμή, και την αναφορά σε άλλη τιμή και αυτά θα φανούν στην επιστροφή από τη κλήση σε αυτό που περάσαμε.

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

Αν μπορούσαμε στη ΓΛΩΣΣΑ να βάζουμε σε πίνακες αναφορές σε τιμές (δείκτες), τότε θα μπορούσαμε να είχαμε δύο πίνακες 4Χ4 με 16+16 δείκτες, αλλά μόνο 16 τιμές. Με μια συνάρτηση που θα έπαιρνε με τιμή τον πίνακα , σε νέο πίνακα με αντιγραφή αναφορών, και επιλογή μιας γραμμής θα παίρναμε το άθροισμά της. Μια τέτοια συνάρτηση θα έπαιρνε τον πίνακα και τον αριθμό γραμμής. Η αλλαγή σε στήλη ουσιαστικά γίνεται με την επιλογή του άλλου πίνακα που περιέχειαναφορές σε ίδιες τιμές με το πρώτο.

Αν θέλει κάποιος να απλοποιήσει το παραπάνω, θα μπορούσε να κρατάει δύο διαφορετικούς πίνακες,  και σε κάθε έναν θα έχει τις τιμές ώστε να ισχύει Α[I,J]=B[J, I]. Άρα για πίνακα 4Χ4 κάνουμε δυο, τους γεμίζουμε με το δεύτερο να έχει αντίστροφα τους δείκτες, και με μια συνάρτηση όπως αναφέρθηκε πριν και χρήση του πίνακα για γραμμές ή στήλες παίρνουμε το άθροισμα συγκεκριμένης γραμμής ή στήλης.

nikolasmer

  • Ομάδα Νέου Λυκείου
  • *
  • Μηνύματα: 534
  • There can be only one...may it be AEPP.
Στο πέρασμα με αναφορά δίνουμε νέο όνομα για ίδιο περιεχόμενο. Οι αναφορές γενικά δεν μπορούν να αλλάξουν. Αν το Χ είναι αναφορά του Ζ δεν μπορεί να αλλάξει για να δείχνει το Υ. Ο λόγος που γίνεται αυτό είναι λειτουργικός, δηλαδή θέλουμε το πέρασμα με αναφορά να διατηρεί την αναφορά, ώστε να πάρουμε επιστροφή τιμής.

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

Το ενδιαφέρον είναι ότι μια αναφορά σε τιμή μπορούμε να την περάσουμε σε κλήση με τιμή ή με αναφορά, ανάλογα με το πώς έχουμε σχεδιάσει το πρόγραμμα! Όταν την περάσουμε με τιμή, αυτό που αντιγράφεται είναι ο δείκτης. Έτσι έχουμε μια  νέα αναφορά σε τιμή που δείχνει την ίδια τιμή, τον ίδιο χώρο της, ώστε κάθε αλλαγή να φανεί και πίσω, εκτός από μία περίπτωση. Μια αναφορά σε τιμή μπορεί να αλλάξει αναφορά. Αν λοιπόν γίνει αλλαγή αναφοράς τότε αυτό που περάσαμε με τιμή χάνει την αναφορά του! Στο πέρασμα με αναφορά, μιας αναφοράς σε τιμή, έχουμε όλο το πακέτο, δηλαδή και να αλλάξουμε το περιεχόμενο, την τιμή, και την αναφορά σε άλλη τιμή και αυτά θα φανούν στην επιστροφή από τη κλήση σε αυτό που περάσαμε.

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

Αν μπορούσαμε στη ΓΛΩΣΣΑ να βάζουμε σε πίνακες αναφορές σε τιμές (δείκτες), τότε θα μπορούσαμε να είχαμε δύο πίνακες 4Χ4 με 16+16 δείκτες, αλλά μόνο 16 τιμές. Με μια συνάρτηση που θα έπαιρνε με τιμή τον πίνακα , σε νέο πίνακα με αντιγραφή αναφορών, και επιλογή μιας γραμμής θα παίρναμε το άθροισμά της. Μια τέτοια συνάρτηση θα έπαιρνε τον πίνακα και τον αριθμό γραμμής. Η αλλαγή σε στήλη ουσιαστικά γίνεται με την επιλογή του άλλου πίνακα που περιέχειαναφορές σε ίδιες τιμές με το πρώτο.

Αν θέλει κάποιος να απλοποιήσει το παραπάνω, θα μπορούσε να κρατάει δύο διαφορετικούς πίνακες,  και σε κάθε έναν θα έχει τις τιμές ώστε να ισχύει Α[I,J]=B[J, I]. Άρα για πίνακα 4Χ4 κάνουμε δυο, τους γεμίζουμε με το δεύτερο να έχει αντίστροφα τους δείκτες, και με μια συνάρτηση όπως αναφέρθηκε πριν και χρήση του πίνακα για γραμμές ή στήλες παίρνουμε το άθροισμα συγκεκριμένης γραμμής ή στήλης.
+1
Απ' τα τσακάλια δεν γλυτώνεις μ'ευχές ή παρακάλια
(Κ. Βάρναλης)

Μερεντίτης Νικόλαος
Καθηγητής Πληροφορικής - Φροντιστής

nikolasmer

  • Ομάδα Νέου Λυκείου
  • *
  • Μηνύματα: 534
  • There can be only one...may it be AEPP.
Είμαι κοντά αλλά και πάλι πολύ μακριά από αυτό που θα ήταν το ιδανικό.
Μετά από τις ιδέες των συναδέλφων κατέληξα στον εξής κώδικα:
Κώδικας: [Επιλογή]
ΠΡΟΓΡΑΜΜΑ ΑΣΚ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: 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
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

Δεν υπάρχει casting στη ΓΛΩΣΣΑ οπότε πως θα μπορούσα να το υλοποιήσω. :-\
Απ' τα τσακάλια δεν γλυτώνεις μ'ευχές ή παρακάλια
(Κ. Βάρναλης)

Μερεντίτης Νικόλαος
Καθηγητής Πληροφορικής - Φροντιστής

ssimaiof

  • Πληροφορικοί Δυτικής Μακεδονίας
  • *
  • Μηνύματα: 22
Κώδικας: [Επιλογή]
ΣΥΝΑΡΤΗΣΗ ΑΘΡ(Π, 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
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

bugman

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 328
  • The Bug Eater
    • Πληροφορική Προγραμματισμός
Χρησιμοποιείς μια μεταβλητή για δυο στοιχεία, το I.  Γίνεται, αλλά δεν είναι σωστό από θέμα καλής πρακτικής.
Αν θες κάτι πολύ μικρό, μπορείς να εξαιρέσεις και την συνάρτηση, και τον 4Χ4 πίνακα.
Ξεκινάς ορίζοντας 9μεταβλητές, Γ1,Γ,2, Γ3, Γ4, Σ1, Σ2, Σ3, Σ4 και μια Ι
Βάζεις στα Σ1 έως Σ4 τιμή 0.
Για τέσσερις φορές (με τη I, δεν θα την χρησιμοποιήσουμε αλλού),
Διαβάζουμε τέσσερις τιμές, και τυπώνουμε το άθροισμά τους Γ1+Γ2+Γ3+Γ4.
Αυξάνουμε τα Σ1 έως Σ4 κατά Γ1 έως Γ4.
Μετά την επανάληψη τυπώνουμε τα Σ1 έως Σ4.
Διαπίστωση. Το πρόγραμμα δουλεύει, αλλά αν θέλουμε να αλλάξουμε μέγεθος πρέπει να μειώσουμε ή να αυξήσουμε μεταβλητές.
Φυσικά και στα προηγούμενα προγράμματα με χρήση πίνακα και συνάρτησης, υποχρεωτικά δίνουμε μέγεθος πίνακα, τόσο στην αρχή του προγράμματος, όσο και του υποπρογράμματος (εδώ συνάρτηση). Το απαιτεί η ΓΛΩΣΣΑ, είναι περιορισμός της.
Όμως μπορεί κάποιος να φτιάξει έναν πίνακα 10×10 και μια μεταβλητή που θα δείχνει το μέγιστο, Μ, όπου με Μ=3 θα έχουμε από 0 μέχρι Μ ή αλλιώς 4 επαναλήψεις, και ομοίως για  μια φωλιασμένη επανάληψη.
Επειδή σε συναρτήσεις δεν βάζουμε εντολές εισόδου και εξόδου (πάλι περιορισμό της ΓΛΩΣΣΑΣ), θα πρέπει να χρησιμοποιήσουμε διαδικασία, όπου σε αυτήν θα διαβάζουμε μια γραμμή και θα εμφανίζουμε το άθροισμά. Ουσιαστικά δεν θέλουμε το 10×10 πίνακα, αλλά μόνο ένα Σ[10] όπου το Σ είναι ο αθροιστής στήλης.
Στη διαδικασία θα δώσουμε το πίνακα και τον αριθμό στηλών, που θα έχουμε πάρει μια φορά με έλεγχο ακέραιου από 1 έως 10 και διόρθωση -1, λόγω βάσης πίνακα που είναι το μηδέν.

Εντός της διαδικασίας σε μια ΣΟΥΜΑ θα προσθέτουμε το κάθε νέο Γ, και το Σ θα το αυξάνουμε κατά Γ. Πριν επιστρέψει η ροή εκτέλεσης από το υποπρόγραμμα θα εμφανίζει την ΣΟΎΜΑ ως άθροισμά γραμμής. Μόλις τελειώσει η επανάληψη που καλεί την διαδικασία,  θα έχουν γίνει οι εισαγωγές του πίνακα θα έχουν εξαχθεί οι σούμες ανά γραμμή, θα έχουν ολοκληρωθεί οι σούμες στο πίνακα. Αρκεί μια επανάληψη για να εμφανίσουμε τις σούμες ανά στήλη.
Διαπίστωση. Ενώ το πρόγραμμα ζητάει αθροίσματα στηλών και γραμμών, και υποθέτει έναν πίνακα τιμών, δεν είναι απαραίτητος, στον αλγόριθμο που περιέγραψα, κρατάμε πίνακα με σούμες (αθροίσματα) στηλών, ενώ βγάζουμε άμεσα τα αθροίσματα γραμμών.
Δεν έδωσα τα προγράμματα, το αφήνω για άσκηση, μεταγραφής αλγόριθμου σε πρόγραμμα στη ΓΛΩΣΣΑ.