Εργαστήριο Τεχνολογίας Λογισμικού
+6 votes
362 views

Edit by nickie: Η ερώτηση αυτή αρχικά είχε τίτλο:

Στην ασκηση της 3ης σειρας ενω δοκιμαζοντας το στο putty το προγραμμα δουλευει, δεν το δεχεται στο grader

και περιεχόμενο ένα screen shot με τον κώδικα της λύσης της 3ης άσκησης που υπέβαλε ο ερωτών.

Τροποποιήθηκε έτσι ώστε να είναι σύμφωνη με τα ήθη και τα έθιμα ενός Q&A site που σέβεται τον εαυτό του. Επειδή πολλοί από εσάς μπορεί να μην τα γνωρίζετε, θα υπάρξει σύντομα σχετικό post.


Το πρόγραμμά μου δουλεύει όταν το τρέχω στο novice αλλά δεν το δέχεται ο grader. Τι μπορεί να φταίει;

in progintro by (210 points)
edited by | 362 views
0

Νομίζω το πιο κλασσικό εδώ είναι το να έχεις βάλει μέσα στο πρόγραμμα σχόλια στα ελληνικά, το οποίο δεν αρέσει ιδιαίτερα στον grader :P Για άλλες πιθανές αιτίες δεν γνωρίζω.

+3

Και όμως! Φήμες θέλουν το πρόβλημα με τα ελληνικά σχόλια να έχει λυθεί!

Edit: Να σημειώσω ότι τα ελληνικά σχόλια προκαλούσαν σφάλμα στη μεταγλώττιση, όχι σφάλμα χρόνου εκτέλεσης / διαφορετικά αποτελέσματα.

0

Και σε εμένα στο πρόβλημα της σειράς 3 στο 6ο testcase ενώ στο novice στην τελευταία διαίρεση μου βγάζει error στο grader όχι

1 Answer

+9 votes

Δε θα απαντήσω την πολύ ενδιαφέρουσα ερώτηση:

Γιατί ένα πρόγραμμα συμπεριφέρεται διαφορετικά με το ίδιο input σε δύο διαφορετικούς υπολογιστές;

γιατί δεν έχω λόγο να πιστεύω ότι αυτό συμβαίνει στην περίπτωση του ερωτώντος. Για την ακρίβεια, έχω λόγο να πιστεύω ότι δε συμβαίνει αυτό, καθώς έχω δει τον κώδικα της υποβολής του. :-)


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

εσφαλμένη υποβολή

τότε το πρώτο πράγμα που κάνουμε είναι να πατήσουμε πάνω στο σύνδεσμο της υποβολής για να δούμε τι δεν πήγε καλά. Στην περίπτωση του ερωτώντος, οδηγούμαστε σε μία σελίδα με κάτι σαν αυτό:

τα testcases αναλυτικά

Αυτό μάς λέει ότι έτρεξαν 6 testcases και ότι ήταν όλα αποτυχημένα. Μάλιστα, τα testcases αυτά απέτυχαν με σφάλμα εκτέλεσης. Αν πατήσουμε στο σύνδεσμο "Προβολή" στο πρώτο από αυτά (γενικά, σε κάποιο που είναι ορατό --- ενδέχεται να υπάρχουν και testcases που δεν είναι ορατά), τότε σε αυτή την περίπτωση βλέπουμε:

πρώτο testcase

Στην αρχή βλέπουμε την είσοδο του προγράμματος, εν προκειμένω:

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() που δημιουργεί το πρόβλημα.

by (9.4k points)

298 questions

287 answers

287 comments

3.2k users