Τρίτη 1 Δεκεμβρίου 2015

Έλεγχος Μαγικού Πίνακα ν διαστάσεων (Νέο και με Κλάση)

Διόρθωση:
Γενικά οι παλαιές αναθεωρήσεις με τις νέες έχουν ~99.9% συμβατότητα Εδώ το πρόγραμμα με τη κλάση χρησιμοποιεί την "κάλεσε" για να καλέσει μια συνάρτηση. Αυτό γίνεται μεν αλλά έχει μια αλλαγή. Αν επιστρέψουμε αριθμό άλλο από 0 τότε αυτός ειναι αριθμός λάθους! Για να αποφύγουμε τον έλεγχο, καλούμε την συνάρτηση σαν κενή, χωρίς δηλαδή επιστροφή τιμής.

Η συνάρτηση ΈλεγχοςΜαγικού() δουλεύει για κάθε πίνακα ν*ν. Υπολογίζει αθροίσματα στηλών, γραμμών και διαγωνίων
Εδώ δίνουμε έναν πίνακα 3Χ3.
Στο παράδειγμα τυπώνει -1 μετά 0 και μετά -1 (τον ξαναφτιάχνει σωστό).
Έχουμε εδώ μια συνάρτηση σε συνάρτηση. Η Άθροισμα() είναι βοηθητική συνάρτηση.
Θα έπρεπε να την ορίσουμε γενική για να την είχαμε απ΄έξω από την ΈλεγχοςΜαγικού() ή να την δύναμε με αναφορά (Η Μ2000 περνάει με αναφορά και συναρτήσεις)

Συνάρτηση ΈλεγχοςΜαγικού {
      Διαβασε &Α()
      ν=Διάσταση(Α(),1)
      Αν Διάσταση(Α(),2)<>ν τότε έξοδος
      Συνάρτηση Άθροισμα {
            καθαρο Σούμα
            Διάβασε &π(), Θχ,Θυ, Πχ, Πυ, Επ
            Για Επ=Επ-1 εως 0
                  Σούμα+=π(Θχ,Θυ)
                  Θχ+=Πχ
                  Θυ+=Πυ
            Επόμενο Επ
            =Σούμα
      }
      Μαγικός=Άθροισμα(&Α(),ν-1,0,-1,1,ν)
      οκ=αληθές
      για ι=0 εως ν-1
            οκ=Άθροισμα(&Α(),0,ι,1,0,ν)=Μαγικός και οκ
            οκ=Άθροισμα(&Α(),ι,0,0,1,ν)=Μαγικός και οκ
      επόμενο ι
      =Άθροισμα(&Α(),0,0,1,1,ν)=Μαγικός και οκ
}
Αναφορά {Ένα τετράγωνο θεωρείται μαγικό αν το άθροισμα των αριθμών των γραμμών, των στηλών και των διαγωνίων του είναι σταθερός αριθμός.}
Πίνακας β(3,3)
      β(0,0)=4,9,2
      β(1,0)=3,5,7
      β(2,0)=8,1,6
Τύπωσε ΈλεγχοςΜαγικού(&β())
β(2,1)++
Τύπωσε ΈλεγχοςΜαγικού(&β())
β(2,1)--
Τύπωσε ΈλεγχοςΜαγικού(&β())




Παρακάτω η συνάρτηση Άθροισμα() δίνεται με αναφορά στην ΈλεγχοςΜαγικού()

Συνάρτηση Άθροισμα {
      καθαρο Σούμα
      Διάβασε &π(), Θχ,Θυ, Πχ, Πυ, Επ
      Για Επ=Επ-1 εως 0
            Σούμα+=π(Θχ,Θυ)
            Θχ+=Πχ
            Θυ+=Πυ
      Επόμενο Επ
      =Σούμα
}
Συνάρτηση ΈλεγχοςΜαγικού {
      Διαβασε &Α(), &Όλο()
      ν=Διάσταση(Α(),1)
      Αν Διάσταση(Α(),2)<>ν τότε έξοδος
      Μαγικός=Όλο(&Α(),ν-1,0,-1,1,ν)
      οκ=αληθές
      για ι=0 εως ν-1
            οκ=Όλο(&Α(),0,ι,1,0,ν)=Μαγικός και οκ
            οκ=Όλο(&Α(),ι,0,0,1,ν)=Μαγικός και οκ
      επόμενο ι
      =Όλο(&Α(),0,0,1,1,ν)=Μαγικός και οκ
}
Αναφορά {Ένα τετράγωνο θεωρείται μαγικό αν το άθροισμα των αριθμών των γραμμών, των στηλών και των διαγωνίων του είναι σταθερός αριθμός.}
Πίνακας β(3,3)
      β(0,0)=4,9,2
      β(1,0)=3,5,7
      β(2,0)=8,1,6
Τύπωσε ΈλεγχοςΜαγικού(&β(),&Άθροισμα())
β(2,1)++
Τύπωσε ΈλεγχοςΜαγικού(&β(),&Άθροισμα())
β(2,1)--
Τύπωσε ΈλεγχοςΜαγικού(&β(),&Άθροισμα())


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

Κλάση ΜαγικόςΠίνακας {
      Πίνακας Α()
      ΜαγικόςΑριθμός
      Τμήμα ΜαγικόςΠίνακας {
      ν=μέγεθος.σωρού
      ν1=ακ(ρίζα(ν))
      αν ν1>=1 τότε {
            Πίνακας .Α(ν1*ν1) ' τον κάνω μονοδιάστατο
            Για ι=0 έως ν1*ν1-1 : Διάβασε .Α(ι) : Επόμενο ι
            Πίνακας .Α(ν1,ν1) ' τον κάνω ν1Χν1
            Κάλεσε κενή .Έλεγχος()
      }
      }
      Συνάρτηση Άθροισμα {
            καθαρο Σούμα
            Διάβασε Θχ,Θυ, Πχ, Πυ, Επ
            Για Επ=Επ-1 εως 0
                  Σούμα+=.Α(Θχ,Θυ)
                  Θχ+=Πχ
                  Θυ+=Πυ
            Επόμενο Επ
            =Σούμα
      }
      Συνάρτηση Ν {=Διάσταση(.Α(),1)}
      Συνάρτηση ΈλεγχοςΜαγικού {
            Διάβασε &σειρά()
            αν Διάσταση(.Α())=0 τότε έξοδος
            ν=.Ν()
            .ΜαγικόςΑριθμός<=σειρά(ν-1,0,-1,1,ν)
            οκ=αληθές
            για ι=0 εως ν-1
                  οκ=σειρά(0,ι,1,0,ν)=.ΜαγικόςΑριθμός και οκ
                  οκ=σειρά(ι,0,0,1,ν)=.ΜαγικόςΑριθμός και οκ
            επόμενο ι
            =σειρά(0,0,1,1,ν)=.ΜαγικόςΑριθμός και οκ
      }
      Συνάρτηση Έλεγχος {
            =.ΈλεγχοςΜαγικού(&.Άθροισμα())
      }
}
Αναφορά {Ένα τετράγωνο θεωρείται μαγικό αν το άθροισμα των αριθμών των γραμμών, των στηλών και των διαγωνίων του είναι σταθερός αριθμός.}
β=ΜαγικόςΠίνακας(4,9,2,3,5,7,8,1,6)
Τύπωσε $(4),"Μαγικός Αριθμός ";β.ΜαγικόςΑριθμός
Τύπωσε "Πίνακας τάξης ";β.Ν()
Τύπωσε β.Έλεγχος()
β.Α(2,1)++
Τύπωσε β.Έλεγχος()
β.Α(2,1)--
Τύπωσε β.Έλεγχος()



Αυτό εδώ είναι η παραλλαγή στο προηγούμενο έτσι η ΈλεγχοςΜαγικού() φεύγει και γίνεται απ' ευθείας Έλεγχος()
Επίσης η Σειρά() που ήταν αναφορά της Άθροισε γίνεται .Άθροισε() δηλαδή κλήση χωρίς αναφορά.
Την αναφορά την έβαλα για να δείξω ότι γίνεται! Δεν χρειάζεται όμως!

      Συνάρτηση Άθροισμα {
            καθαρο Σούμα
            Διάβασε Θχ,Θυ, Πχ, Πυ, Επ
            Για Επ=Επ-1 εως 0
                  Σούμα+=.Α(Θχ,Θυ)
                  Θχ+=Πχ
                  Θυ+=Πυ
            Επόμενο Επ
            =Σούμα
      }
      Συνάρτηση Ν {=Διάσταση(.Α(),1)}
      Συνάρτηση Έλεγχος {
            αν Διάσταση(.Α())=0 τότε έξοδος
            ν=.Ν()
            .ΜαγικόςΑριθμός<=.Άθροισμα(ν-1,0,-1,1,ν)
            οκ=αληθές
            για ι=0 εως ν-1
                  οκ=.Άθροισμα(0,ι,1,0,ν)=.ΜαγικόςΑριθμός και οκ
                  οκ=.Άθροισμα(ι,0,0,1,ν)=.ΜαγικόςΑριθμός και οκ
            επόμενο ι
            =.Άθροισμα(0,0,1,1,ν)=.ΜαγικόςΑριθμός και οκ
      }

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.