Δε θα απαντήσω την πολύ ενδιαφέρουσα ερώτηση:
Γιατί ένα πρόγραμμα συμπεριφέρεται διαφορετικά με το ίδιο input σε δύο διαφορετικούς υπολογιστές;
γιατί δεν έχω λόγο να πιστεύω ότι αυτό συμβαίνει στην περίπτωση του ερωτώντος. Για την ακρίβεια, έχω λόγο να πιστεύω ότι δε συμβαίνει αυτό, καθώς έχω δει τον κώδικα της υποβολής του. :-)
Όταν ένα πρόγραμμα που το υποβάλλουμε στον grader δε γίνεται δεκτό, δηλαδή ο grader κρίνει ότι είναι εσφαλμένη λύση του προβλήματος και μας το κοκκινίζει κάπως έτσι:
τότε το πρώτο πράγμα που κάνουμε είναι να πατήσουμε πάνω στο σύνδεσμο της υποβολής για να δούμε τι δεν πήγε καλά. Στην περίπτωση του ερωτώντος, οδηγούμαστε σε μία σελίδα με κάτι σαν αυτό:
Αυτό μάς λέει ότι έτρεξαν 6 testcases και ότι ήταν όλα αποτυχημένα. Μάλιστα, τα testcases αυτά απέτυχαν με σφάλμα εκτέλεσης. Αν πατήσουμε στο σύνδεσμο "Προβολή" στο πρώτο από αυτά (γενικά, σε κάποιο που είναι ορατό --- ενδέχεται να υπάρχουν και testcases που δεν είναι ορατά), τότε σε αυτή την περίπτωση βλέπουμε:
Στην αρχή βλέπουμε την είσοδο του προγράμματος, εν προκειμένω:
5
+ 1 3 1 4
* 2 3 12 7
/ 3 8 -2 11
- 1 3 4 6
- 2 3 4 6
Στη συνέχεια, βλέπουμε την αναμενόμενη έξοδο:
0 7 12
1 1 7
-2 1 16
-0 1 3
0 0 1
και ο grader μάς πληροφορεί ότι το πρόγραμμά μας "είτε τύπωσε μία ισοδύναμη με αυτήν έξοδο, είτε δεν τύπωσε καθόλου έξοδο (π.χ. συνέβη κάποιο σφάλμα εκτέλεσης)." Εμείς ήδη γνωρίζουμε ότι συνέβη το δεύτερο, δηλαδή το σφάλμα εκτέλεσης.
Πηγαίνουμε λοιπόν τώρα πίσω στο novice και δοκιμάζουμε να εκτελέσουμε το πρόγραμμά μας και να του δώσουμε ακριβώς αυτή την είσοδο που προκάλεσε το πρόβλημα. Στην περίπτωση του ερωτώντος, το πρόγραμμα θα τερματιστεί με σφάλμα εκτέλεσης:
PZhelp runtime error: cannot read an integer number
Αυτό σημαίνει ότι πήγε να διαβάσει έναν ακέραιο αριθμό (με τη READ_INT
) και αυτό δε στάθηκε δυνατό γιατί οι επόμενος μη κενός χαρακτήρας στην είσοδο δεν ήταν ψηφίο. Πραγματικά, αν ο ερωτών κοιτάξει λίγο το πρόγραμμά του, πιθανώς θα δει ότι έχει γράψει τον εξής κώδικα:
N = READ_INT();
FOR (i, 1 TO N) {
symbol = getchar();
SKIP_LINE();
a = READ_INT();
...
Αφού διαβαστεί το N
(5) η πρώτη επανάληψη του βρόχου διαβάζει το symbol
(+) και στη συνέχεια το SKIP_LINE()
πετάει όλη την υπόλοιπη γραμμή της εισόδου, δηλαδή τα 1 3 1 4
. Στη συνέχεια, το a = READ_INT()
αρχίζει να διαβάζει την επόμενη γραμμή και ο πρώτος χαρακτήρας που βλέπει είναι το σύμβολο της πράξης *
. Αυτό προκαλεί το σφάλμα εκτέλεσης.
Τι πρέπει να κάνει ο ερωτών; Να διορθώσει το πρόγραμμά του, αφαιρώντας ή μετακινώντας το SKIP_LINE()
που δημιουργεί το πρόβλημα.