αρνητικό βήμα στη ΓΙΑ

Ξεκίνησε από thanosgn, 31 Ιαν 2012, 09:02:40 ΜΜ

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

_sleeper

Κάποια σχόλια και από μένα όσον αφορά αυτό το θέμα, το οποίο θεωρώ ότι είναι αρκετά αμφιλεγόμενο. Κατ' αρχήν στο ούτε στο βιβλίο μαθητή, ούτε σε αυτό του καθηγητή αναφέρει ρητά ότι το βήμα είναι αυτό που καθορίζει τη συνθήκη ή το αντίστροφο. Βλέποντας το πράγμα καθαρά προγραμματιστικά, το Για i από 1 μέχρι 10 με_βήμα -1 θα δημιουργήσει ατέρμων βρόχο, αυτό είναι προφανές. Το πρόβλημα είναι ότι σε pascal, από την οποία παράχθηκε η "ΓΛΩΣΣΑ" έχει ελαφρώς διαφορετικό τρόπο στη διατύπωση της Για, αφού δεν υποστηρίζει βήμα, πέρα από το 1 ή το -1 κι αυτό με περίεργο τρόπο (to ή downto). Στην περίπτωση που κάνουμε for i:=1 downto 10 do, η pascal θεωρεί πως δε γίνεται να κατέβει και να καταλήξει από το 1 στο 10, οπότε δεν εκτελείται ποτέ. Παρόλα αυτά σε όλες τις άλλες γλώσσες προγραμματισμού η λογική λέει, ότι το βήμα δεν έχει να κάνει με τη συνθήκη (και πολύ σωστά κάνει, θα συμπληρώσω εγώ).

Εν πάση περιπτώσει, αν πάμε the pascal way θα έχουμε 0 επαναλήψεις. Αν το πάρουμε από κάθε άλλη άποψη θα έχουμε infinite loop.
what better place than here, what better time than now!

Νίκος Αδαμόπουλος

Παράθεση από: _sleeper στις 18 Φεβ 2013, 04:51:41 ΜΜ
Το πρόβλημα είναι ότι σε pascal, από την οποία παράχθηκε η "ΓΛΩΣΣΑ" έχει ελαφρώς διαφορετικό τρόπο στη διατύπωση της Για, αφού δεν υποστηρίζει βήμα, πέρα από το 1 ή το -1 κι αυτό με περίεργο τρόπο (to ή downto). Στην περίπτωση που κάνουμε for i:=1 downto 10 do, η pascal θεωρεί πως δε γίνεται να κατέβει και να καταλήξει από το 1 στο 10, οπότε δεν εκτελείται ποτέ. Παρόλα αυτά σε όλες τις άλλες γλώσσες προγραμματισμού η λογική λέει, ότι το βήμα δεν έχει να κάνει με τη συνθήκη (και πολύ σωστά κάνει, θα συμπληρώσω εγώ).

Εν πάση περιπτώσει, αν πάμε the pascal way θα έχουμε 0 επαναλήψεις. Αν το πάρουμε από κάθε άλλη άποψη θα έχουμε infinite loop.

Το ζήτημα με το αρνητικό βήμα έχει συζητηθεί αρκετές φορές στο Στέκι και αλλού και θεωρείται λήξαν...

Από πού όμως προκύπτει ότι η ΓΛΩΣΣΑ έχει δημιουργηθεί από την pascal; Το συμπέρασμά σου είναι κάπως... αυθαίρετο! Όπως έχω ξαναγράψει, εμένα πιο πολύ  μου μοιάζει με VB. Πάντως η ΓΙΑ της ΑΕΠΠ ταιριάζει απόλυτα με το for loop της γλώσσας αυτής ( http://msdn.microsoft.com/en-us/library/vstudio/5z06z1kb.aspx ).

For counter [ As datatype ] = start To end [ Step step ]
    [ statements ]
Next [ counter ]


Μάλιστα αντιγράφω και υπογραμμίζω μερικά αποσπάσματα που σχετίζονται με τα προαναφερόμενα σε αυτή τη συζήτηση:

When a For...Next loop starts, Visual Basic evaluates start, end, and step. Visual Basic evaluates these values only at this time and then assigns start to counter. Before the statement block runs, Visual Basic compares counter to end. If counter is already larger than the end value (or smaller if step is negative), the For loop ends and control passes to the statement that follows the Next statement. Otherwise, the statement block runs.

Each time Visual Basic encounters the Next statement, it increments counter by step and returns to the For statement. Again it compares counter to end, and again it either runs the block or exits the loop, depending on the result. This process continues until counter passes end or an Exit For statement is encountered.

The loop doesn't stop until counter has passed end. If counter is equal to end, the loop continues. The comparison that determines whether to run the block is counter <= end if step is positive and counter >= end if step is negative.

If you change the value of counter while inside a loop, your code might be more difficult to read and debug. Changing the value of start, end, or step doesn't affect the iteration values that were determined when the loop was first entered.


_sleeper

Παράθεση από: Νίκος Αδαμόπουλος στις 18 Φεβ 2013, 07:07:46 ΜΜ
Το ζήτημα με το αρνητικό βήμα έχει συζητηθεί αρκετές φορές στο Στέκι και αλλού και θεωρείται λήξαν...

Από πού όμως προκύπτει ότι η ΓΛΩΣΣΑ έχει δημιουργηθεί από την pascal; Το συμπέρασμά σου είναι κάπως... αυθαίρετο! Όπως έχω ξαναγράψει, εμένα πιο πολύ  μου μοιάζει με VB. Πάντως η ΓΙΑ της ΑΕΠΠ ταιριάζει απόλυτα με το for loop της γλώσσας αυτής ( http://msdn.microsoft.com/en-us/library/vstudio/5z06z1kb.aspx ).


Το συμπέρασμα μου δεν είναι καθόλου αυθαίρετο, προκύπτει από την σχεδόν ολόιδια προσέγγιση στη δομή των προγραμμάτων, όπως επίσης και των υποπρογραμμάτων (π.χ. διαχωρισμός ΔΙΑΔΙΚΑΣΙΑΣ-ΣΥΝΑΡΤΗΣΗΣ) και την πανομοιότυπη δομή τους. Οι ομοιότητες ΓΛΩΣΣΑΣ - PASCAL είναι τόσες, που μια απλή μετάφραση από τα αγγλικά στα ελληνικά ενός προγράμματος pascal, μπορεί να γίνει σχεδόν χωρίς καμία αλλαγή πρόγραμμα σε ΓΛΩΣΣΑ. Και ούτε καν θα υπεισέλθω στο ότι η VB είναι γλώσσα για GUIs, που καμία σχέση δεν έχει με τον "κλασικό" προγραμματισμό που μαθαίνουν τα παιδιά. Θα δεχτώ ότι η Για ταιριάζει περισσότερο με τη λογική που έχει η for της VB, αλλά το ότι η ΓΛΩΣΣΑ εμπνεύστηκε από την VB δεν έχει καμία βάση.
what better place than here, what better time than now!

evry

Τα υποπρογράμματα ΓΛΩΣΣΑΣ - PASCAL δεν έχουν καμία σχέση μεταξύ τους. Το ότι έχουν το ίδιο όνομα δε σημαίνει ότι είναι ίδια. Δεν υπάρχουν παράμετροι εισόδου εξόδου (by value, by reference με το var αν τα θυμάμαι καλά)
και το σημαντικότερο από όλα ο μηχανισμός μεταβίβασης παραμέτρων δεν έχει καμία σχέση με αυτόν της pascal.
Άσε που αν δεν κάνω λάθος στην pascal επιτρέπεται να διαβάζεις μέσα σε συνάρτηση, ενώ στη δική μας ΓΛΩΣΣΑ όχι.

Όσο για τη δομή των προγραμμάτων στην οποία αναφέρεσαι νομίζω ότι συναντιέται και σε πολλές άλλες διαδικασιακές γλώσσες προγραμματισμού, δεν είναι αποκλειστικό προνόμιο της pascal

Παράθεση από: _sleeper στις 18 Φεβ 2013, 11:37:34 ΜΜ
Το συμπέρασμα μου δεν είναι καθόλου αυθαίρετο, προκύπτει από την σχεδόν ολόιδια προσέγγιση στη δομή των προγραμμάτων, όπως επίσης και των υποπρογραμμάτων (π.χ. διαχωρισμός ΔΙΑΔΙΚΑΣΙΑΣ-ΣΥΝΑΡΤΗΣΗΣ) και την πανομοιότυπη δομή τους.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

Νίκος Αδαμόπουλος

Παράθεση από: _sleeper στις 18 Φεβ 2013, 11:37:34 ΜΜ
Το συμπέρασμα μου δεν είναι καθόλου αυθαίρετο, προκύπτει από την σχεδόν ολόιδια προσέγγιση στη δομή των προγραμμάτων...

Δεν με πείθεις... Στην vb έχουμε οριοθέτηση του τέλους των εντολών με λέξεις όπως EndIf, EndSelect, ... ανάλογα με τις Τέλος_αν, Τέλος_επιλογών, ... Στην pascal τα block εντολών οριοθετούνται με begin - end, που είναι τελείως διαφορετικό. Με την pascal ταιριάζει η ψευδογλώσσα του σχετικού μαθήματος των ΕΠΑΛ. Μάλιστα οι συνάδελφοι που ξεκίνησαν να τη διδάσκουν, και που είχαν υπόψη τους την ψευδογλώσσα της ΑΕΠΠ, έπαθαν μεγάλη ήττα μέχρι να συνειδητοποιήσουν τη διαφορετική σύνταξη των εντολών... Δες τις σχετικές συζητήσεις στο Στέκι.


Παράθεση από: _sleeper στις 18 Φεβ 2013, 11:37:34 ΜΜ
Θα δεχτώ ότι η Για ταιριάζει περισσότερο με τη λογική που έχει η for της VB, αλλά το ότι η ΓΛΩΣΣΑ εμπνεύστηκε από την VB δεν έχει καμία βάση.

Δεν ταιριάζει απλώς περισσότερο, είναι ολόιδια.

Ας αφήσουμε την ΓΙΑ. Πες μου για την εντολή ΑΝ με τις διάφορες παραλλαγές της. Δες την αντίστοιχη εντολή στην VB: ολόιδια, σε όλες τις παραλλαγές της. Υπάρχει πολλαπλή Αν στην pascal;

If condition [ Then ]
    [ statements ]
[ ElseIf elseifcondition [ Then ]
    [ elseifstatements ] ]
[ Else
    [ elsestatements ] ]
End If
-or-
If condition Then [ statements ] [ Else [ elsestatements ] ]

Gnirut

Το πρόβλημα δεν είναι αν η ΓΛΩΣΣΑ προέρχεται από την PASCAL, από την VB ή κι από τις δύο. Ούτως ή άλλως οι περισσότερες γλώσσες προγραμματισμού έχουν τις βάσεις τους σε προγενέστερες από αυτές γλωσσες.

Το πρόβλημα είναι ότι έπειτα από τόσα χρόνια κάποιος μαθητής ή καθηγήτης για να βρει άκρη με την ακριβή λειτουργία της ΓΛΩΣΣΑΣ πρέπει να διαβάσει το μισό Στέκι και κανα δυο άλλα blogs.

Όλα αυτά που συζητούνται εδώ και σε άλλα sites έπρεπε να είχαν ενσωματωθεί και διατυπωθεί με σαφήνεια στο σχολικό βιβλίο εδώ και καιρό.

_sleeper

Παραθέτω ένα ενδεικτικό πρόγραμμα σε PASCAL, αναφορικά με τις διαφορές/ομοιότητες στη δομή προγραμμάτων σε PASCAL και σε ΓΛΩΣΣΑ, στο οποίο, επίσης, γίνεται προφανές πως μπορεί να χρησιμοποιηθεί η if σε πολλαπλή επιλογή :

program epixeirisi;
var
	i,ogos_dedomenon:integer;
	onoma:string[20];
	xreosi,syn_xreosi,m_o,athrisma:real;
begin
	athrisma:=0;
	for i:=1 to 50 do
		begin
			writeln('dose onoma');
			readln(onoma);
			writeln('dose ogo dedomenon');
			readln(ogos_dedomenon);
			if (ogos_dedomenon<=2) then
				xreosi:=ogos_dedomenon*10
			else if (ogos_dedomenon>=3) and (ogos_dedomenon<=6) then
				xreosi:=(ogos_dedomenon-2)*2.5+20
			else if(ogos_dedomenon>=7) then
				xreosi:=(ogos_dedomenon-6)*1.5+30;
			syn_xreosi:=xreosi+3;
			writeln(onoma);
			writeln(syn_xreosi:4:2);
			athrisma:= athrisma+syn_xreosi;
		end;
	m_o:=athrisma/50;
	writeln(m_o:4:2);
end.


Τα υποπρογράμματα σε PASCAL και σε ΓΛΩΣΣΑ έχουν πάρα πολλά κοινά επαναλαμβάνω, για να μην πω ότι είναι πανομοιότυπα. Το πέρασμα παραμέτρων σε όλες τις γλώσσες προγραμματισμού είναι ίδιος, κι εξαρτάται από το αν έχουμε passing by value, by reference ή by pointer. Στις συναρτήσεις σε PASCAL δεν έχουμε πέρασμα by reference, by default, παρά μόνο by value, όπως ισχύει και στη ΓΛΩΣΣΑ. Από την άλλη στις ΔΙΑΔΙΚΑΣΙΕΣ ισχύει σχεδόν ό,τι ισχύει και στην PASCAL, έχουμε δηλαδή μια απλοποιημένη μορφή τους, κατά την οποία όλες οι παράμετροι είναι by reference. Απορώ πως βγαίνει το συμπέρασμα ότι είναι δύο εντελώς διαφορετικά πράγματα.
what better place than here, what better time than now!

Νίκος Αδαμόπουλος

Παράθεση από: _sleeper στις 28 Φεβ 2013, 04:39:13 ΜΜ
Παραθέτω ένα ενδεικτικό πρόγραμμα σε PASCAL, αναφορικά με τις διαφορές/ομοιότητες στη δομή προγραμμάτων σε PASCAL και σε ΓΛΩΣΣΑ, στο οποίο, επίσης, γίνεται προφανές πως μπορεί να χρησιμοποιηθεί η if σε πολλαπλή επιλογή :

Πάντως η if που παραθέτεις είναι εμφωλευμένη και όχι πολλαπλή... Απλά στην pascal οι πολλαπλές επιλογές δημιουργούνται μέσω εμφωλευμένων if... Αν και είναι τεχνικό το ζήτημα, παρόλα αυτά αν θέλουμε να ακριβολογούμε δεν γίνεται να ταιριάξει απόλυτα η if της pascal με την Αν της ΑΕΠΠ. Αν θέλεις μπορείς να δεις μέσα στο Στέκι στις σχετικές συζητήσεις του μαθήματος του Δομημένου Προγραμματισμού των ΕΠΑΛ, όπου εκεί η ψευδογλώσσα είναι πράγματι pascal-like και η κανονική γλώσσα είναι η ίδια η pascal.

evry

Παράθεση από: _sleeper στις 28 Φεβ 2013, 04:39:13 ΜΜ
Στις συναρτήσεις σε PASCAL δεν έχουμε πέρασμα by reference, by default, παρά μόνο by value, όπως ισχύει και στη ΓΛΩΣΣΑ. Από την άλλη στις ΔΙΑΔΙΚΑΣΙΕΣ ισχύει σχεδόν ό,τι ισχύει και στην PASCAL, έχουμε δηλαδή μια απλοποιημένη μορφή τους, κατά την οποία όλες οι παράμετροι είναι by reference. Απορώ πως βγαίνει το συμπέρασμα ότι είναι δύο εντελώς διαφορετικά πράγματα.

Αυτό που λες παραπάνω είναι λάθος. Το πέρασμα παραμέτρων στη ΓΛΩΣΣΑ δεν είναι ούτε by reference ούτε by value, είναι ένας σπάνιος τρόπος μεταβίβασης παραμέτρων γνωστός ως
Call-by-copy-restore ή call-by-value-result ή call-by-value-return.
Αν διαβάσεις προσεκτικά το σχετικό παράδειγμα του βιβλίου θα το δεις.
Σχετική συζήτηση έχει ξαναγίνει και στο παρακάτω thread, όπου μπορείς να βρεις και κάποιες παραπομπές, για να μην τα ξαναγράφω
https://alkisg.mysch.gr/steki/index.php?topic=2622.msg22700#msg22700

ΥΓ. Επίσης δε νομίζω ότι υπάρχει πέρασμα by pointer, αυτό είναι γνωστό στη βιβλιογραφία από κάποιους συγγραφείς σαν simulated by reference αν τα θυμάμαι καλά, δηλαδή και αυτό θεωρείται by reference, μια και οι αναφορές ουσιαστικά είναι pointers (βλέπε το null pointer exception που πέταγε η Java ενώ δεν έχει pointers, (δεν ξέρω αν το κάνει ακόμα))
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr