Αποστολέας Θέμα: Μετατροπή από αρχή_επανάληψης σε Για  (Αναγνώστηκε 180 φορές)

georgia_kitsou

  • Οπαδός
  • **
  • Μηνύματα: 18
Μετατροπή από αρχή_επανάληψης σε Για
« στις: 12 Ιαν 2018, 01:59:46 μμ »

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

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

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

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

dski

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 166
Απ: Μετατροπή από αρχή_επανάληψης σε Για
« Απάντηση #1 στις: 12 Ιαν 2018, 02:16:59 μμ »
Δεν ξέρω αν έχεις κάτι διαφορετικό στο μυαλό σου αλλά εγώ θα έγραφα κάτι σαν:

α <- 0
Για ι από 1 μέχρι 41 με_βήμα 2
  α <- α + ι^2
Τέλος_επανάληψης
« Τελευταία τροποποίηση: 12 Ιαν 2018, 02:49:40 μμ από dski »

bugman

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 213
  • The Bug Eater
    • Πληροφορική Προγραμματισμός
Απ: Μετατροπή από αρχή_επανάληψης σε Για
« Απάντηση #2 στις: 14 Ιαν 2018, 10:26:20 πμ »
Δεν γίνεται μετατροπή. Το 41 στη προηγούμενη απάντηση βγήκε με τρέξιμο του κώδικα που "μετατράπηκε". Η μετατροπή  πρέπει να γίνει χωρίς να απαιτείται τρέξιμο του κώδικα. Αν αλλάξουμε την συνθήκη στην μέχρις ότου τότε στο πρόγραμμα με την Για δεν θα έχουμε μια απλή αλλαγή, αλλά απαιτείται να τρέξουμε το πρόγραμμα, το αρχικό, να βρούμε το I και  να το μεταφέρουμε.

dski

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

Γενικότερα, όταν καλείται κάποιος να μετατρέψει κάποιο κώδικα δεν πρέπει να "δει" πως λειτουργεί ο κώδικας; (λ.χ. ποιες είναι οι ακραίες τιμές των μεταβλητών κτλ). Δεν υπάρχει πάντα κάποιος αυτόματος τρόπος μετατροπής μιας δομής σε μια άλλη. Χρειάζεται να "τρέξεις" τον κώδικα για να δεις τι κάνει και πως λειτουργεί. Δεν καταλαβαίνω γιατί η μετατροπή πρέπει να γίνεται χωρίς να απαιτείται τρέξιμο του κώδικα.
« Τελευταία τροποποίηση: 14 Ιαν 2018, 11:42:47 μμ από dski »

bugman

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 213
  • The Bug Eater
    • Πληροφορική Προγραμματισμός
Απ: Μετατροπή από αρχή_επανάληψης σε Για
« Απάντηση #4 στις: 15 Ιαν 2018, 08:48:42 πμ »
Στο πρώτο πρόγραμμα υπάρχουν ορισμένες σταθερές, στο δεύτερο υπάρχουν διαφορετικές σταθερές.  Πράγματι στο πρώτο πρόγραμμα γνωρίζουμε τι τιμές θα πάρει το i και φτιάχνεις ένα ισοδύναμο πρόγραμμα...όπως το εξηγεις, απλά το ανάποδο δεν μπορείς να το κάνεις...να φτιάξεις το πρώτο από το δεύτερο, αν δεν ξέρεις το πρώτο, γιατί κάτι χάθηκε στην μετατροπή!

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

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


Με το τρόπο που έκανες την μετατροπή θα μπορούσες να παραλείψεις την Για, και να δώσεις απευθείας την τιμή του α, όπως και του ι. Στην ουσία η μόνη εντολή που μας ενδιαφέρει είναι η εμφάνισε και είναι εκτός επανάληψης..Δηλαδή εκτελείται μια φορά...
« Τελευταία τροποποίηση: 15 Ιαν 2018, 09:11:29 πμ από bugman »