Προς το περιεχόμενο

Πρόβλημα με dev c++ ή με τον κώδικα;


veteranos123

Προτεινόμενες αναρτήσεις

Καλησπέρα. Εχθές έκανα το δεύτερο μάθημα στην σχολή πάνω στην γλώσσα προγραμματισμού 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;
}

post-219161-0-71781100-1426361066_thumb.png

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

1) μη χρησιμοποιεις dev c++. Είναι ένα παρατημένο project και ούτε όταν το πρόσεχαν δε δούλευε σωστά. MinGW ή gcc σκέτο. αν θες ντε και καλα ide βάλε codeblocks.

2) δεν νομίζω ο κομπαιλερ να είναι προβληματικός σε τόσο απλές ασκήσεις. μάλλον ο κώδικας είναι.

 

εδιτ, ναι τώρα που έβαλες τον κώδικα επαληθέυτηκα :)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Σωστά, το πρόβλημα ήταν τα αυτάκια που τα έβαλα λάθος εκ παραδρομής.

 

Όταν λες την λογική, τι εννοείς; Έχω κάνει κάπου λάθος;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

εννοει οτι η πρώτη if σου είναι λάθος

Θα το κοιτάξω πιο προσεκτικά και θα επανέλθω όταν το διορθώσω. Ευχαριστώ πάντως παιδιά. Σε λίγο επιστρέφω :)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

δοκιμασε να δίνεις τιμές για κάθε περίπτωση

 

ας πουμε

 

χ= 5 ψ=7 ζ=7  (ισοσκελες)

 

χ=5 ψ=5 ζ =7 (ισοσκελες)

 

χ=5 ψ=7 ζ=5 (ισοσκελες)

 

χ=3 ψ=3 ζ=3 (ισοπλευρο)

 

 

και δες τι βγάζει για αποτέλεσμα. Μετά ακολούθα τη λογική σου και δες που είναι τα λάθη σου

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το παρατήρησα και εγώ αλλά γιατί όταν βάζω στον κώδικα πρώτα την γραμμή για το ισοσκελές και μετά για το ισόπλευρο

 

και 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 τότε γίνεται αυτό που λέω παραπάνω, γιατί;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το παρατήρησα και εγώ αλλά γιατί όταν βάζω στον κώδικα πρώτα την γραμμή για το ισοσκελές και μετά για το ισόπλευρο

 

και 5 5 7 ή 5 5 5 τότε και στις δύο περιπτώσεις θα βγάλει ότι είναι ισοσκελές ενώ αν βάλω στον κώδικα πρώτα την γραμμή για το ισόπλευρο και μετά για το ισοσκελές δουλεύει σωστά.

 

Σαφώς εφόσον το ισόπλευρο είναι ισοσκελές, άρα πας να δεις πρώτα το ισοσκελές αυτή θα είναι και η απάντηση που θα πάρεις.

 

Πάντως η τελευταία εκδοχή που δίνεις δε φαίνεται κανένας λόγος για τον οποίο θα κράσαρε αν άλλαζες τη σειρά.

 

Επ' ευκαιρία στο x == y && x == z && y == z το παράκανες λίγο.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

μπραβο, λίγο το παράκανες όπως είπε ο defacer ( αν α=β και β=γ τότε δε χρειαζεσαι το α=γ :) ) αλλά είσαι σε καλό δρόμο.

Καλή αρχή.

 

Αργότερα όταν μάθεις συναρτήσεις και βάζεις τα πάντα μέσα τους και όχι στη main θα φτιάχνεις και συναρτήσεις που δίνουν διάφορες τιμές για να δοκιμάζεις τη λογική, αυτό που τώρα έκανες με το χέρι.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Moderators

Κάτι μικρό που θα σου πρότεινα εγώ είναι να χωρίζεις τις συνθήκες με παρενθέσεις. Αντί για

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 (ειδικά αν είσαι νέος/άπειρος και δεν είσαι σίγουρος για το τι κάνεις).

  • Like 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Υ.Γ.: Κάτι που μας είχαν πει στη σχολή, σε μια συζήτηση που είχαμε (γιατί είχε τεθεί παρόμοια ερώτηση, αν ο κώδικας ή ο compiler είναι λάθος) είναι ότι στο 99,99% των περιπτώσεων έχεις κάνει εσύ πατάτα κι ο compiler είναι μια χαρά. Μιας και οι compilers είναι τα πιο χρησιμοποιούμενα προγράμματα, είναι λίγο σπάνιο να βρεις κάτι που να μη σου δουλεύει και να φταίει ο compiler (ειδικά αν είσαι νέος/άπειρος και δεν είσαι σίγουρος για το τι κάνεις).

Το γνωστό "select is broken" για όποιον θέλει να το ψάξει :)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

μπραβο, λίγο το παράκανες όπως είπε ο 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.

Σας ευχαριστώ πολύ παιδιά όλους για την βοήθεια και τις χρήσιμες συμβουλές σας :)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...