veteranos123 Δημοσ. 14 Μαρτίου 2015 Δημοσ. 14 Μαρτίου 2015 Καλησπέρα. Εχθές έκανα το δεύτερο μάθημα στην σχολή πάνω στην γλώσσα προγραμματισμού C. μας βάλανε μια άσκηση που να υπολογίζει αν ένα τρίγωνο είναι ισόπλευρο ή σκαληνό ή ισοσκελές. Έφτιαξα τον κώδικα, το αποθήκευσα και μόλις το τρέχω ανοίγει το command, δίνω τις πλευρές και μόλις πατάω "enter" βγάζει μήνυμα ότι το στοιχείο 1 (όνομα του αρχείου),exe "σταμάτησε να λειτουργεί". Δοκίμασα και άλλους κώδικες που κάναμε στην σχολή και δεν υπήρξε κάποιο πρόβλημα. Σαν πρόγραμμα χρησιμοποιώ το dev c++ 5.9.2 Τι μπορεί να φταίει; Ευχαριστώ εκ των προτέρων. Ο κώδικας #include <stdio.h> #include <stdlib.h> int main() { int x,y,z; printf ("Dwse tis pleures tou trigwnou \n"); scanf ("%d %d %d, &x, &y, &z"); if (x==y&&x==z||y==z) printf ("To trigwno einai isoskeles \n"); else if (x==y&&x==z&&y==z) printf ("To trigwno einai isopleuro \n"); else printf ("To trigwno einai skalino \n"); return 0; }
geomagas Δημοσ. 14 Μαρτίου 2015 Δημοσ. 14 Μαρτίου 2015 Διόρθωσε τη scanf() σου. (και μετά τη λογική του προγράμματός σου) 1
Pantelwolf Δημοσ. 14 Μαρτίου 2015 Δημοσ. 14 Μαρτίου 2015 1) μη χρησιμοποιεις dev c++. Είναι ένα παρατημένο project και ούτε όταν το πρόσεχαν δε δούλευε σωστά. MinGW ή gcc σκέτο. αν θες ντε και καλα ide βάλε codeblocks. 2) δεν νομίζω ο κομπαιλερ να είναι προβληματικός σε τόσο απλές ασκήσεις. μάλλον ο κώδικας είναι. εδιτ, ναι τώρα που έβαλες τον κώδικα επαληθέυτηκα
lion2486 Δημοσ. 14 Μαρτίου 2015 Δημοσ. 14 Μαρτίου 2015 Διώρθωσε την scanf ! scanf ("%d %d %d, &x, &y, &z"); scanf ("%d %d %d", &x, &y, &z);
veteranos123 Δημοσ. 14 Μαρτίου 2015 Μέλος Δημοσ. 14 Μαρτίου 2015 Σωστά, το πρόβλημα ήταν τα αυτάκια που τα έβαλα λάθος εκ παραδρομής. Όταν λες την λογική, τι εννοείς; Έχω κάνει κάπου λάθος;
veteranos123 Δημοσ. 14 Μαρτίου 2015 Μέλος Δημοσ. 14 Μαρτίου 2015 εννοει οτι η πρώτη if σου είναι λάθος Θα το κοιτάξω πιο προσεκτικά και θα επανέλθω όταν το διορθώσω. Ευχαριστώ πάντως παιδιά. Σε λίγο επιστρέφω
geomagas Δημοσ. 14 Μαρτίου 2015 Δημοσ. 14 Μαρτίου 2015 εννοει οτι η πρώτη if σου είναι λάθος ...και η δεύτερη έχει redundancy.
Pantelwolf Δημοσ. 14 Μαρτίου 2015 Δημοσ. 14 Μαρτίου 2015 δοκιμασε να δίνεις τιμές για κάθε περίπτωση ας πουμε χ= 5 ψ=7 ζ=7 (ισοσκελες) χ=5 ψ=5 ζ =7 (ισοσκελες) χ=5 ψ=7 ζ=5 (ισοσκελες) χ=3 ψ=3 ζ=3 (ισοπλευρο) και δες τι βγάζει για αποτέλεσμα. Μετά ακολούθα τη λογική σου και δες που είναι τα λάθη σου
veteranos123 Δημοσ. 14 Μαρτίου 2015 Μέλος Δημοσ. 14 Μαρτίου 2015 Το παρατήρησα και εγώ αλλά γιατί όταν βάζω στον κώδικα πρώτα την γραμμή για το ισοσκελές και μετά για το ισόπλευρο και 5 5 7 ή 5 5 5 τότε και στις δύο περιπτώσεις θα βγάλει ότι είναι ισοσκελές ενώ αν βάλω στον κώδικα πρώτα την γραμμή για το ισόπλευρο και μετά για το ισοσκελές δουλεύει σωστά. Το έφτιαξα και δουλεύει σωστά τώρα #include <stdio.h> #include <stdlib.h> int main() { int x,y,z; printf("Dwse 3 pleures tou trigonou\n"); scanf("%d %d %d",&x,&y,&z); if (x==y && x==z && y==z) printf("To trigwno einai isopleuro\n"); else if (x==y || x==z || y==z) printf("To trigwno einai isoskeles\n"); else printf("To trigwno einai skalino\n"); system("pause"); return 0; } αλλά αν κάνω τράμπα τα δύο if μαζί με τα printf τότε γίνεται αυτό που λέω παραπάνω, γιατί;
defacer Δημοσ. 14 Μαρτίου 2015 Δημοσ. 14 Μαρτίου 2015 Το παρατήρησα και εγώ αλλά γιατί όταν βάζω στον κώδικα πρώτα την γραμμή για το ισοσκελές και μετά για το ισόπλευρο και 5 5 7 ή 5 5 5 τότε και στις δύο περιπτώσεις θα βγάλει ότι είναι ισοσκελές ενώ αν βάλω στον κώδικα πρώτα την γραμμή για το ισόπλευρο και μετά για το ισοσκελές δουλεύει σωστά. Σαφώς εφόσον το ισόπλευρο είναι ισοσκελές, άρα πας να δεις πρώτα το ισοσκελές αυτή θα είναι και η απάντηση που θα πάρεις. Πάντως η τελευταία εκδοχή που δίνεις δε φαίνεται κανένας λόγος για τον οποίο θα κράσαρε αν άλλαζες τη σειρά. Επ' ευκαιρία στο x == y && x == z && y == z το παράκανες λίγο.
Pantelwolf Δημοσ. 14 Μαρτίου 2015 Δημοσ. 14 Μαρτίου 2015 μπραβο, λίγο το παράκανες όπως είπε ο defacer ( αν α=β και β=γ τότε δε χρειαζεσαι το α=γ ) αλλά είσαι σε καλό δρόμο. Καλή αρχή. Αργότερα όταν μάθεις συναρτήσεις και βάζεις τα πάντα μέσα τους και όχι στη main θα φτιάχνεις και συναρτήσεις που δίνουν διάφορες τιμές για να δοκιμάζεις τη λογική, αυτό που τώρα έκανες με το χέρι.
Moderators Kercyn Δημοσ. 14 Μαρτίου 2015 Moderators Δημοσ. 14 Μαρτίου 2015 Κάτι μικρό που θα σου πρότεινα εγώ είναι να χωρίζεις τις συνθήκες με παρενθέσεις. Αντί για if (x == y && x == z && y == z) να το γράψεις έτσι: if ((x==y) && (x==z) && (y==z)) Μπορεί στο παράδειγμα εδώ (το οποίο είναι όντως μακρύτερο απ' ό,τι πρέπει, όπως σου είπαν κι άλλοι) να είναι προφανές, αλλά σ' αυτό που είχες γράψει στην αρχή ((x==y&&x==z||y==z)) δεν είναι τόσο. Τουλάχιστον εγώ δε θυμάμαι αν θα εκτελεστεί πρώτα το x==y && x==z και το αποτέλεσμα αυτού θα γίνει OR με το y==z ή αν θα γίνει το x==y AND το αποτέλεσμα του x==z || y==z. Μπορώ πολύ γρήγορα να δω ποιο απ' τα δύο ισχύει αν ανατρέξω σε κάποια λίστα με τα order of operations, αλλά είναι ένα extra βήμα που μπορείς να παραλείψεις πολύ εύκολα και χωρίς κανένα μειονέκτημα. Υ.Γ.: Κάτι που μας είχαν πει στη σχολή, σε μια συζήτηση που είχαμε (γιατί είχε τεθεί παρόμοια ερώτηση, αν ο κώδικας ή ο compiler είναι λάθος) είναι ότι στο 99,99% των περιπτώσεων έχεις κάνει εσύ πατάτα κι ο compiler είναι μια χαρά. Μιας και οι compilers είναι τα πιο χρησιμοποιούμενα προγράμματα, είναι λίγο σπάνιο να βρεις κάτι που να μη σου δουλεύει και να φταίει ο compiler (ειδικά αν είσαι νέος/άπειρος και δεν είσαι σίγουρος για το τι κάνεις). 2
imitheos Δημοσ. 14 Μαρτίου 2015 Δημοσ. 14 Μαρτίου 2015 Υ.Γ.: Κάτι που μας είχαν πει στη σχολή, σε μια συζήτηση που είχαμε (γιατί είχε τεθεί παρόμοια ερώτηση, αν ο κώδικας ή ο compiler είναι λάθος) είναι ότι στο 99,99% των περιπτώσεων έχεις κάνει εσύ πατάτα κι ο compiler είναι μια χαρά. Μιας και οι compilers είναι τα πιο χρησιμοποιούμενα προγράμματα, είναι λίγο σπάνιο να βρεις κάτι που να μη σου δουλεύει και να φταίει ο compiler (ειδικά αν είσαι νέος/άπειρος και δεν είσαι σίγουρος για το τι κάνεις). Το γνωστό "select is broken" για όποιον θέλει να το ψάξει
veteranos123 Δημοσ. 14 Μαρτίου 2015 Μέλος Δημοσ. 14 Μαρτίου 2015 μπραβο, λίγο το παράκανες όπως είπε ο defacer ( αν α=β και β=γ τότε δε χρειαζεσαι το α=γ ) αλλά είσαι σε καλό δρόμο. Καλή αρχή. Αργότερα όταν μάθεις συναρτήσεις και βάζεις τα πάντα μέσα τους και όχι στη main θα φτιάχνεις και συναρτήσεις που δίνουν διάφορες τιμές για να δοκιμάζεις τη λογική, αυτό που τώρα έκανες με το χέρι. Γενικά μου αρέσει να τα κάνω αναλυτικά Κάτι μικρό που θα σου πρότεινα εγώ είναι να χωρίζεις τις συνθήκες με παρενθέσεις. Αντί για if (x == y && x == z && y == z) να το γράψεις έτσι: if ((x==y) && (x==z) && (y==z)) Μπορεί στο παράδειγμα εδώ (το οποίο είναι όντως μακρύτερο απ' ό,τι πρέπει, όπως σου είπαν κι άλλοι) να είναι προφανές, αλλά σ' αυτό που είχες γράψει στην αρχή ((x==y&&x==z||y==z)) δεν είναι τόσο. Τουλάχιστον εγώ δε θυμάμαι αν θα εκτελεστεί πρώτα το x==y && x==z και το αποτέλεσμα αυτού θα γίνει OR με το y==z ή αν θα γίνει το x==y AND το αποτέλεσμα του x==z || y==z. Μπορώ πολύ γρήγορα να δω ποιο απ' τα δύο ισχύει αν ανατρέξω σε κάποια λίστα με τα order of operations, αλλά είναι ένα extra βήμα που μπορείς να παραλείψεις πολύ εύκολα και χωρίς κανένα μειονέκτημα. Υ.Γ.: Κάτι που μας είχαν πει στη σχολή, σε μια συζήτηση που είχαμε (γιατί είχε τεθεί παρόμοια ερώτηση, αν ο κώδικας ή ο compiler είναι λάθος) είναι ότι στο 99,99% των περιπτώσεων έχεις κάνει εσύ πατάτα κι ο compiler είναι μια χαρά. Μιας και οι compilers είναι τα πιο χρησιμοποιούμενα προγράμματα, είναι λίγο σπάνιο να βρεις κάτι που να μη σου δουλεύει και να φταίει ο compiler (ειδικά αν είσαι νέος/άπειρος και δεν είσαι σίγουρος για το τι κάνεις). κατάλαβα. Δλδ δεν θα ξέρει ποιό να εκτελέσει πρώτα; Όντως δύσκολο να φταίει ο compiler. Σας ευχαριστώ πολύ παιδιά όλους για την βοήθεια και τις χρήσιμες συμβουλές σας
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα