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

Ξεκίνησε από nikolasmer, 15 Απρ 2019, 08:21:00 ΜΜ

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

Κωστας τζιαννης

Παράθεση από: nikolasmer στις 15 Απρ 2019, 08:21:00 ΜΜ
Σπάω το κεφάλι εδώ και πολύ ώρα για να μπορέσω να βρω μια καλή λύση για τον υπολογισμό του αθροίσματος κατά γραμμές και κατά στήλες σε δισδιάστατο πίνακα καλώντας την ίδια Συνάρτηση.
ΣΥΝΑΡΤΗΣΗ ΑΘΡ(Π, I): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: I, J, S, Π[4, 4] 
ΑΡΧΗ
  S <- 0
  ΓΙΑ J ΑΠΟ 1 ΜΕΧΡΙ 4
    S <- S + Π[I, J] 
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΑΘΡ <- S
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ
 

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

νικο για δες αυτη τη λογικη.οταν θες αθροισμα γραμμης πχ της γραμμης 2 δινεις 2.5 ενω αν θες τη στηλη 2 δινεις 2.

ΠΡΟΓΡΑΜΜΑ αθροισμαγρστ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: ι, ξ, πιν[4, 4]
  ΠΡΑΓΜΑΤΙΚΕΣ: γραμμη, σαμ
ΑΡΧΗ
  ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 4
    ΓΙΑ ξ ΑΠΟ 1 ΜΕΧΡΙ 4
      ΔΙΑΒΑΣΕ πιν[ι, ξ]
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

                                                !θα βρω το αθροισμα καθε γραμμης
  ΓΡΑΨΕ "αθροισμα καθε γραμμης"
  ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 4
    γραμμη <- ι + 0.5
    σαμ <- ΑΘΡ(πιν, γραμμη)
    ΓΡΑΨΕ σαμ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
                                                 !θα βρω το αθροισμα καθε στηλης
  ΓΡΑΨΕ "αθροισμα καθε στηλης"
  ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 4
    γραμμη <- ι
    σαμ <- ΑΘΡ(πιν, γραμμη)
    ΓΡΑΨΕ σαμ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

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


ΣΥΝΑΡΤΗΣΗ ΑΘΡ(Π, χ): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: κ, σ, Π[4, 4], θεση
  ΠΡΑΓΜΑΤΙΚΕΣ: χ
ΑΡΧΗ
  σ <- 0
  θεση <- Α_Μ(χ)
  ΓΙΑ κ ΑΠΟ 1 ΜΕΧΡΙ 4
    σ <- σ + Π[(1 - Α_Μ(θεση/χ))*θεση + κ*Α_Μ(θεση/χ), Α_Μ(θεση/χ)*θεση + κ*(1 - Α_Μ(θεση/χ))]
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΑΘΡ <- σ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ


nikolasmer

Παράθεση από: ssimaiof στις 18 Απρ 2019, 11:44:43 ΠΜ
ΣΥΝΑΡΤΗΣΗ ΑΘΡ(Π, 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
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

Ναι αυτό είναι. Ευχαριστώ.
Ευχαριστώ για τις απαντήσεις όλους.
Μερεντίτης Νικόλαος
Πληροφορικός

thaaanos

ΣΥΝΑΡΤΗΣΗ ΑΘΡ_ΠΙΝ(A, k): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: i, k, A[4, 4], sum
ΑΡΧΗ
  sum <- 0
  ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 4 ΜΕ ΒΗΜΑ k div Α_Τ(k) 
    sum <- sum + A[ i, k] 
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 4 ΜΕ ΒΗΜΑ -k div Α_Τ(k) 
    sum <- sum + A[-k, i] 
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΑΘΡ_ΠΙΝ <- sum
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ


use as  ΑΘΡ_ΠΙΝ(A, k) ή  ΑΘΡ_ΠΙΝ(A, -k) για άθροισμα γραμμών

ΥΓ εντάξει άργησα αλλα τώρα το είδα να μην δώσω και εγώ μια απάντηση;

batikiotis

Καλησπέρα σε όλους,
μια ερώτηση σχετικά με τη σύνταξη συνάρτησης. Η χρήση του ονόματος της συνάρτησης για εκχώρηση σε αυτό του επιστρεφόμενου αποτελέσματος γίνεται μια φορά στο τέλος ή δύναται να αναφέρεται όσες φορές χρειάζεται; πχ σε κάποια επιλογή ή σε κάποιο άθροισμα που υπολογίζεται με επανάληψη.
ευχαριστώ πολύ

petrosp13

Μπορεί να εμφανίζεται όσες φορές θέλουμε, αρκεί να μην υπάρχει δεξιά από το βελάκι γιατί προκαλεί αναδρομή
Παπαδόπουλος Πέτρος
Καθηγητής Πληροφορικής

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

Καλησπέρα σε όλους

είχα και εγώ μάι παρόμοια απορία .. όσες φορές θέλουμε υποθέτω μπορούμε σίγουρα αν έχουμε πχ

ΣΥΝΑΡΤΗΣΗ Φ(Α): ΧΑΡΑΚΤΗΡΑΣ
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ:Α
ΑΡΧΗ
   ΑΝ Α<0 ΤΟΤΕ
      Φ<--'ΑΡΝΗΤΙΚΟΣ'
   ΑΛΛΙΩΣ_ΑΝ Α=0 ΤΟΤΕ
      Φ<--'ΜΗΔΕΝ'
   ΑΛΛΙΩΣ
      Φ<--'ΘΕΤΙΚΟΣ'
   ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

θα μπορούμε όμως να έχουμε κάτι σαν το παρακάτω ??

ΣΥΝΑΡΤΗΣΗ Φ(Α): ΧΑΡΑΚΤΗΡΑΣ
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ:Α
ΑΡΧΗ
   ΑΝ Α<0 ΤΟΤΕ
      Φ<--'ΑΡΝΗΤΙΚΟΣ'
   ΑΛΛΙΩΣ_ΑΝ Α=0 ΤΟΤΕ
      Φ<--'ΜΗΔΕΝ'
   ΑΛΛΙΩΣ
      Φ<--'ΘΕΤΙΚΟΣ'
   ΤΕΛΟΣ_ΑΝ
   φ<--'ΑΚΥΡΟ'
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

Δηλαδή να πάρει τιμή και μετά να πάρει διαφορετική τιμή ?? δεν έχω δει κάπου τέτοιο παράδειγμα και νόμιζα πως δε γίνεται , αλλά δεν υπάρχει και κάπου

petrosp13

Δεν υπάρχει λόγος να απαγορεύεται κάτι τέτοιο
Η συνάρτηση αποθηκεύει μια τιμή στο όνομα της σαν μια κοινή μεταβλητή, οπότε μπορείς να αλλάξεις τιμή όπως νομίζεις
Παπαδόπουλος Πέτρος
Καθηγητής Πληροφορικής

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

απόλυτα λογικό μου ακούγεται, απλά μου έκανε εντύπωση πως δεν εχω δει  κάτι παρόμοιο σαν παράδειγμα

pgrontas

Παράθεση από: petrosp13 στις 16 Απρ 2021, 05:48:59 ΜΜ
Μπορεί να εμφανίζεται όσες φορές θέλουμε, αρκεί να μην υπάρχει δεξιά από το βελάκι γιατί προκαλεί αναδρομή

Το λέει κάπου αυτό στο βιβλίο; Αναδρομή θα προκαλούσε αν υπήρχε κλήση της συνάρτησης με παρενθέσεις, παραμέτρους και όχι απλή χρήση του ονόματος.
Προσωπικά θα δεχόμουν χρήση του ονόματος της συνάρτησης οπουδήποτε θα μπορούσε να μπει μεταβλητή.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

alkisg

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

Κάποιες ενδείξεις από το βιβλίο αναφέρω εδώ:
https://alkisg.mysch.gr/steki/index.php?topic=1284.msg8650#msg8650

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

pgrontas

Άλκη το γνωρίζω για τον Διερμηνευτή και είναι μια διαφωνία που έχω σε αυτό το σημείο.

Η οπτική μου δεν έχει σχέση με ανακάτεμα συμβολισμών από γλώσσες προγραμματισμού. Μάλλον το αντίθετο.
Δεν βλέπω κανένα λόγο το όνομα της συνάρτησης να μην μπορεί να είναι μία ειδική μεταβλητή μέσα σε αυτή, την οποία να μπορείς να κάνεις ό,τι θέλεις και να την έχεις είτε δεξιά είτε αριστερά από την εκχώρηση. Είναι εύκολο να το εξηγήσεις και δεν χαλάει τίποτα. Βέβαια δεν υπάρχει σχετική ρητή πρόβλεψη στο βιβλίο, αλλά ούτε και σχετική απαγόρευση.
Οπότε αν απαγορεύσεις να μπει στα δεξιά, τότε εισάγεις έναν αδικαιολόγητο για μένα περιορισμό μόνο και μόνο για να μοιάσεις στην Pascal (δεν βλέπω άλλο λόγο). Θεωρώ επίσης ότι αυτό το σημείο, δεν είναι και από τα καλύτερα της Pascal (οπότε γιατί να πρέπει να της μοιάσουμε;), αφού το όνομα του υποπρογράμματος είναι διαφορετική έννοια από την κλήση του και κατά συνέπεια πρέπει να συμβολίζονται διαφορετικά.
Αν κάποιτε μπει αναδρομή στην ύλη, τότε η υποχρεωτική παρένθεση στην κλήση θα σε βοηθήσει να τα ξεχωρίζεις.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

alkisg

> Το όνομα του υποπρογράμματος είναι διαφορετική έννοια από την κλήση του και κατά συνέπεια πρέπει να συμβολίζονται διαφορετικά.

Μισό να καταλάβω τι ακριβώς προτείνεις. Εμπλέκονται 3 πράγματα, η δήλωση, το όνομα και η κλήση του υποπρογράμματος. Αν έχουμε μια συνάρτηση χωρίς παραμέτρους, πού θα βάλουμε παρενθέσεις και πού όχι; Η δήλωση θα είναι ίδια με την κλήση ή με την έννοια του ονόματος;

> μόνο και μόνο για να μοιάσεις στην Pascal

Όντως εγώ είχα το σκεπτικό "τι να εννοούσαν άραγε οι συγγραφείς". Αν ήταν να μπούμε στη διαδικασία του "τι θα ήταν καλύτερο", τότε εγώ θα προτιμούσα αυτό που κάνουν οι μοντέρνες γλώσσες, όπου το όνομα της συνάρτησης είναι pointer, οπότε `x = function1; x = function2;` και μετά `x()` καλεί την function2.

> Δεν βλέπω κανένα λόγο το όνομα της συνάρτησης να μην μπορεί να είναι μία ειδική μεταβλητή

Αρκετά πράγματα στις γλώσσες προγραμματισμού έχουν υλοποιηθεί έτσι για λόγους βελτιστοποιήσεων, κι ας μας φαίνονται άβολα στην εκπαίδευση. Π.χ. σε κάποιες γλώσσες η ΕΠΙΛΕΞΕ δεν αντιστοιχεί με πολλαπλές ΑΝ για να μπορεί να γίνει μια φορά αποτίμηση της αρχικής έκφρασης. Σε άλλες, η ΓΙΑ δεν αντιστοιχεί με ΟΣΟ για να μπορεί να αποτιμηθεί μια φορά η τελική τιμή και το βήμα.
Αντίστοιχα νομίζω ότι στην Pascal πάρθηκε αυτή η απόφαση για να μην χρειάζεται να σπαταληθεί χώρος για τοπική μεταβλητή. Π.χ. στην Pascal είναι δυνατή η επιστροφή ενός πίνακα με χιλιάδες στοιχεία, το να δημιουργηθεί αυτόματα μια τέτοια μεταβλητή χωρίς να είναι σίγουρο ότι χρειάζεται, κοστίζει. Ενώ στις γλώσσες που χρησιμοποιούν την εντολή `return value`, δεν υπάρχει τέτοιο ζήτημα. Και βέβαια ούτε και στη ΓΛΩΣΣΑ αφού δεν επιτρέπεται συνάρτηση να επιστρέφει πίνακα...

pgrontas

Παράθεση από: alkisg στις 17 Απρ 2021, 04:17:23 ΜΜ
> Το όνομα του υποπρογράμματος είναι διαφορετική έννοια από την κλήση του και κατά συνέπεια πρέπει να συμβολίζονται διαφορετικά.

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

Καταλαβαίνω τι λες για τις βελτιστοποιήσεις. Αρκεί να μην σου χαλάνε το mental model, το οποίο στην εκπαίδευση είναι πιο σημαντικό.

Τέλος πάντων το νόημα της παρέμβασής μου είχε να κάνει με το ό,τι δεν βλέπω λόγο να εισάγουμε εναν περιορισμό - απαγόρευση που δεν αναφέρεται κάπου ρητά, ειδικά μάλιστα όταν αυτός μπορεί να περιπλέξει τα πράγματα (το όνομα της συνάρτησης είναι σαν μεταβλητή αλλά δεν είναι κιολας), δεν συγκρούεται με άλλη έννοια και δεν εξυπηρετεί κανέναν σκοπό τελικά.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

alkisg

Απλά όταν μπαίνουμε σε διαδικασία "πώς να ορίσουμε καλύτερα κάποιες λεπτομέρειες μιας γλώσσας" χωρίς να γράψουμε BNF κλπ... τότε ως αποτέλεσμα έχουμε 20+ χρόνια ασαφειών.
Ενώ αν οι συγγραφείς είχαν δηλώσει εξαρχής ότι "είναι εξελληνισμένη Pascal, τέλος", τότε μπορεί κάποια σημεία όπως αυτό που λες να ήταν ελαφρώς χειρότερα, άλλα όπως η αποφυγή του άθλιου μηχανισμού κλήσεων copy/restore να ήταν πολύ καλύτερα,
...όμως σίγουρα θα είχαμε γλυτώσει χιλιάδες ώρες να διυλίζουμε τον κώνωπα! Σημαντικότατο πλεονέκτημα!

dpa2006

Παράθεση από: alkisg στις 17 Απρ 2021, 04:42:14 ΜΜ
Απλά όταν μπαίνουμε σε διαδικασία "πώς να ορίσουμε καλύτερα κάποιες λεπτομέρειες μιας γλώσσας" χωρίς να γράψουμε BNF κλπ... τότε ως αποτέλεσμα έχουμε 20+ χρόνια ασαφειών.
Ενώ αν οι συγγραφείς είχαν δηλώσει εξαρχής ότι "είναι εξελληνισμένη Pascal, τέλος", τότε μπορεί κάποια σημεία όπως αυτό που λες να ήταν ελαφρώς χειρότερα, άλλα όπως η αποφυγή του άθλιου μηχανισμού κλήσεων copy/restore να ήταν πολύ καλύτερα,
...όμως σίγουρα θα είχαμε γλυτώσει χιλιάδες ώρες να διυλίζουμε τον κώνωπα! Σημαντικότατο πλεονέκτημα!

Με μια μικρή διαφωνία ως προς την Εξελληνισμένη Pascal...
Η Pascal δήλωνε τα Υποπρογράμματα πριν το Begin (αν θυμάμαι καλά...πέρασαν 30 χρόνια...) η C όμως δηλώνει υποπρογράμματα μετά το Τέλο Προγράμματος, και εδώ θα ήθελα ενιαία αντιμετώπιση σε Γλώσσα και Ψευδογλώσσα...
τέλος πάντων...
:)
Computer science (abbreviated CS or CompSci) is the scientific and practical approach to computation and its applications. It is the systematic study of the feasibility, structure, expression, and mechanization of the methodical processes (or algorithms) that underlie the acquisition, representation, processing, storage, communication of, and access to information, whether such information is encoded in bits and bytes in a computer memory or transcribed engines and protein structures in a human cell.source:http://en.wikipedia.org/wiki/Computer_science