Μετατροπή από αρχή_επανάληψης σε Για

Ξεκίνησε από georgia_kitsou, 12 Ιαν 2018, 01:59:46 ΜΜ

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

georgia_kitsou


Καλημέρα σας και καλή χρονιά,

Ήθελα να ρωτήσω, το παρακάτω τμήμα κώδικα, μετατρέπεται ισοδύναμα σε Για, ή όχι;

α ← 0
i ← 1
Αρχή_επανάληψης
α ← α + i ^ 2
i ← i + 2
Μέχρις_ότου i div 7 > 5
Εμφάνισε α

Ευχαριστώ πολύ,

dski

#1
Δεν ξέρω αν έχεις κάτι διαφορετικό στο μυαλό σου αλλά εγώ θα έγραφα κάτι σαν:

α <- 0
Για ι από 1 μέχρι 41 με_βήμα 2
  α <- α + ι^2
Τέλος_επανάληψης

bugman

Δεν γίνεται μετατροπή. Το 41 στη προηγούμενη απάντηση βγήκε με τρέξιμο του κώδικα που "μετατράπηκε". Η μετατροπή  πρέπει να γίνει χωρίς να απαιτείται τρέξιμο του κώδικα. Αν αλλάξουμε την συνθήκη στην μέχρις ότου τότε στο πρόγραμμα με την Για δεν θα έχουμε μια απλή αλλαγή, αλλά απαιτείται να τρέξουμε το πρόγραμμα, το αρχικό, να βρούμε το I και  να το μεταφέρουμε.

dski

#3
Τι εννοείς δε γίνεται η μετατροπή; Τα δύο τμήματα κώδικα παίρνουν τις ίδιες αρχικές τιμές για α και i, παράγουν την ίδια έξοδο ενώ και οι μεταβλητές α και i λαμβάνουν τις ίδιες τιμές κατά την εκτέλεση. Αν εννοείς ότι γενικά δεν είναι πάντα εφικτή η μετατροπή της Επανάλαβε...Μέχρις_ότου σε Για...από...μέχρι ή ότι αν η συνθήκη τερματισμού ήταν μια άλλη δεν θα ήταν δυνατή η μετατροπή το δέχομαι αλλά στην συγκεκριμένη περίπτωση νομίζω το πράγμα είναι απλό και ξεκάθαρο. Ακόμα και για τον έλεγχο της συνθήκης τερματισμού που γράφεις γιατί πρέπει να τρέξω όλο το πρόγραμμα για να καταλήξω ότι i div 7 > 5 είναι ψευδές για i<=41; Δεν είναι κάτι που ισχύει γενικά;

Γενικότερα, όταν καλείται κάποιος να μετατρέψει κάποιο κώδικα δεν πρέπει να "δει" πως λειτουργεί ο κώδικας; (λ.χ. ποιες είναι οι ακραίες τιμές των μεταβλητών κτλ). Δεν υπάρχει πάντα κάποιος αυτόματος τρόπος μετατροπής μιας δομής σε μια άλλη. Χρειάζεται να "τρέξεις" τον κώδικα για να δεις τι κάνει και πως λειτουργεί. Δεν καταλαβαίνω γιατί η μετατροπή πρέπει να γίνεται χωρίς να απαιτείται τρέξιμο του κώδικα.

bugman

#4
Στο πρώτο πρόγραμμα υπάρχουν ορισμένες σταθερές, στο δεύτερο υπάρχουν διαφορετικές σταθερές.  Πράγματι στο πρώτο πρόγραμμα γνωρίζουμε τι τιμές θα πάρει το i και φτιάχνεις ένα ισοδύναμο πρόγραμμα...όπως το εξηγεις, απλά το ανάποδο δεν μπορείς να το κάνεις...να φτιάξεις το πρώτο από το δεύτερο, αν δεν ξέρεις το πρώτο, γιατί κάτι χάθηκε στην μετατροπή!

Αν σου πω να αλλάξεις και στα δύο προγράμματα την αρχική τιμή του i σε 100, θα έχουν το ίδιο αποτέλεσμα;

Όχι, γιατί η Για δεν θα εκτελεστεί, ενώ η έως ότου θα εκτελεστεί, μια φορά.
Εγώ κοιτώ την λειτουργία του κώδικα, άρα δοκιμάζω την ισοδυναμία με αλλαγές σταθερών, ως αρχικές τιμές.


Με το τρόπο που έκανες την μετατροπή θα μπορούσες να παραλείψεις την Για, και να δώσεις απευθείας την τιμή του α, όπως και του ι. Στην ουσία η μόνη εντολή που μας ενδιαφέρει είναι η εμφάνισε και είναι εκτός επανάληψης..Δηλαδή εκτελείται μια φορά...

Καρκαμάνης Γεώργιος

Παράθεση από: georgia_kitsou στις 12 Ιαν 2018, 01:59:46 ΜΜ
Καλημέρα σας και καλή χρονιά,

Ήθελα να ρωτήσω, το παρακάτω τμήμα κώδικα, μετατρέπεται ισοδύναμα σε Για, ή όχι;

α ← 0
i ← 1
Αρχή_επανάληψης
α ← α + i ^ 2
i ← i + 2
Μέχρις_ότου i div 7 > 5
Εμφάνισε α

Ευχαριστώ πολύ,

Γενικά στις εντολές Μέχρις_οτου και Οσο όταν οι συνθήκες είναι σύνθετες, ή όταν περιέχουν πράξεις δεν μπορούν να μετατραπούν σε ισοδύναμες ΓΙΑ με την ίδια συνθήκη.

gpapargi

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