Πρόβλημα με τον compiler ή λάθος στην εντολή if?

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
stesia
Δημοσιεύσεις: 18
Εγγραφή: 02 Δεκ 2007 22:12
Τοποθεσία: Θεσσαλονίκη
Επικοινωνία:

Πρόβλημα με τον compiler ή λάθος στην εντολή if?

Δημοσίευση από stesia » 02 Δεκ 2007 23:48

Γεια σας και από μένα!
Λοιπόν έχω τον compiler Dev-C++(δεν ξέρω αν τελικά αυτό θα παίξει κανένα ρόλο απλά το αναφέρω). Στο πρόγραμμα που έκανα εκτελείται σε κάθε επανάληψη μόνο το πρώτο μέρος της εντολής if και τα υπόλοιπα αγνοούνται, με αποτέλεσμα να πέσω σε ατέρμονα βρόχο.
Αν κανείς μπορέσει να βρει το λάθος μου παρακαλώ πολύ ας μου το πει
(και δεν θα το ξανακάνω) :-? Μήπως φταίει ο compiler-παρηγορητική σκέψη ε?
Προσπαθώ να μάθω C++ εδώ και τόσο καιρό και συνεχώς κάπου κολλάω νομίζω ότι ποτέ δεν θα μπορέσω να κάνω ολοκληρωμένο κώδικα :cry:
Ευχαριστώ!
Συνημμένα
C_Mammals.rar
(816 Ψηφιολέξεις) Μεταφορτώθηκε 306 φορές

Programmer
Δημοσιεύσεις: 67
Εγγραφή: 22 Σεπ 2007 06:55

Πρόβλημα με τον compiler ή λάθος στην εντολή if?

Δημοσίευση από Programmer » 03 Δεκ 2007 00:12

Βρε συ! το while (choice = '0'); τι κάνει? το if (choice = '1') τί κάνει? ποιος είναι ο σχεσιακός τελεστής ελέγχου ισσότητας? το = ή το ==?
ελέγχεις αν το choice είναι ίσο με '0','1','2' κ.τ.λ. ή μήπως εκχωρείς στο choice τον χαρακτήρα'?
και πως θα τερματιστεί ο βρογχος ατην δεύτερη περίπτωση αφού ο χαρακτήρας '0','1',2'κ.τ.λ == true και για να τερματιστεί ένας βρόγχος της C++ πρέπει η έκφραση ελέγχου να επιστρέψει false?
τεσπα γράψε while (choice != '0');
και βάλε στην θέση των if το switch case... ή στα if τον τελεστή == (p.x if(choice == '1'))... για να δουλέψει...
p.x.
do
{
...
switch(choice)
{
case '0':
//no code
break;

case '1':
code...
break;

case '2':
code...
break;
k.t.l. ...
default:
message...
}
...
}while(choice != '0');

Υ.Γ. Μην νομίζεις ότι για τα λογικά σου λάθη ευθύνεται ο μεταγλωττιστής. Είναι πολύ σπάνιο να ευθύνεται πραγματικά ο μεταγλωττιστής και αυτό συμβαίνει μόνο σε περιπτώσεις σύγκρουσης ονομάτων (όταν ένα όνομα του προγράμματος συγκρούεται με ένα όνομα εσωτερικό του μεταγλωττιστή), σε περιπτώσεις αναδραστικών συναρτήσεων, και σε καποιες άλλες ακραίες περιπτώσεις. αλλά ποτέ σε τόσο απλά πράγματα...

Programmer
Δημοσιεύσεις: 67
Εγγραφή: 22 Σεπ 2007 06:55

Πρόβλημα με τον compiler ή λάθος στην εντολή if?

Δημοσίευση από Programmer » 03 Δεκ 2007 01:20

Είναι να απορέι κανέις... που βρίσκετε αυτόν τον κώδικα. Δεν είναι λογικό να ξέρετε τους δείκτες και τις τάξεις και να μην ξέρετε τους σχεσιακούς τελεστές και την χρήση του if - else... πχ. ο παρακάτω κώδικας μπορεί να τροποποιηθέι από ακολουθία if σε αλυσίδα if-else ή να γίνει εντολή switch. Επίσης αν προτιμηθέι το if else πρέπει να περιληφθεί και η περίπτωση '0' με ένα break για έξοδο από τον βρόγχο π.χ.
do
{
...
if( choice == '0' ) break;
else if(chice == '1' ) ...
else if(choice == '2' )... ktl
} while(true);

Τροποποίησε σύμφωνα με τις υποδείξεις τον κώδικα σου.....
do
{
int hlikia=0;
int baros=0;
int a=0;
int b=0;
cout<<"epilekste apo ta parakatw(0 gia eksodo)\nMENOY:\n1. skylos\n2. gata\n3. alogo\n4. goyroyni\n";
cin>>choice;
if (choice = '1')
{
dog rex;
mammals* pdog=&rex;
cout<<"dose hlikia \n";
cin>>hlikia;
pdog->setAge(hlikia);
a=pdog->getAge();
cout<<"hlikia tou rex: "<<a<<"\n";
cout<<"dose varos\n";
cin>>baros;
pdog->setWeight(baros);
b=pdog->getWeight();
cout<<"baros tou rex: "<<b<<"\n";
pdog->hxos();
}
if (choice = '2')
{
cat sisi;
mammals* pcat=&sisi;
cout<<"dose hlikia \n";
cin>>hlikia;
pcat->setAge(hlikia);
a=pcat->getAge();
cout<<"hlikia tis sisi: "<<a<<"\n";
cout<<"dose varos\n";
cin>>baros;
pcat->setWeight(baros);
b=pcat->getWeight();
cout<<"baros tis sisi: "<<b<<"\n";
pcat->hxos();
}
if (choice = '3')
{
horse pigasos;
mammals* phorse=&pigasos;
cout<<"dose hlikia \n";
cin>>hlikia;
phorse->setAge(hlikia);
a=phorse->getAge();
cout<<"hlikia tou pigasou: "<<a<<"\n";
cout<<"dose varos\n";
cin>>baros;
phorse->setWeight(baros);
b=phorse->getWeight();
cout<<"baros tou pigasou: "<<b<<"\n";
phorse->hxos();
}
if (choice = '4')
{
pig piggy;
mammals* ppig=&piggy;
cout<<"dose hlikia \n";
cin>>hlikia;
ppig->setAge(hlikia);
a=ppig->getAge();
cout<<"hlikia tou piggy: "<<a<<"\n";
cout<<"dose varos\n";
cin>>baros;
ppig->setWeight(baros);
b=ppig->getWeight();
cout<<"baros tou piggy: "<<b<<"\n";
ppig->hxos();
}
else
{
cout<<"doste sosti epilogh\n";
}
}
while (choice = '0');

Υ.Γ. Διάβασε (ναι αυτό το απεχθές πράγμα να κάνεις ), τα βασικά της C.

stesia
Δημοσιεύσεις: 18
Εγγραφή: 02 Δεκ 2007 22:12
Τοποθεσία: Θεσσαλονίκη
Επικοινωνία:

Πρόβλημα με τον compiler ή λάθος στην εντολή if?

Δημοσίευση από stesia » 03 Δεκ 2007 17:03

Ε πώς να το ξέρω δεν μας είπε κανείς τη διαφορά του = με το ==!
Τελικά τίποτα δεν μαθαίνεις από το πανεπιστήμιο αν δεν κάτσεις να διαβάσεις μόνος...
Τέλος πάντων, ευχαριστώ πολύ πολύ! Δούλεψε και με == και με το switch που το δοκίμασα!
Ευχαριστώ και πάλι!

stesia
Δημοσιεύσεις: 18
Εγγραφή: 02 Δεκ 2007 22:12
Τοποθεσία: Θεσσαλονίκη
Επικοινωνία:

Πρόβλημα με τον compiler ή λάθος στην εντολή if?

Δημοσίευση από stesia » 03 Δεκ 2007 17:06

Α! Ξέχασα να αναφέρω πως στην αρχή το είχα κάνει με if else αλλά τότε εκτελούσε μόνο το πρώτο μέρος της if (αυτό με το dog).Μετά που έσβησα τα else εκτελούσε όλα τα κομμάτια με τη σειρά ανεξάρτητα το τι έδινα σαν είσοδο.
Anyway το θέμα λύθηκε!

stesia
Δημοσιεύσεις: 18
Εγγραφή: 02 Δεκ 2007 22:12
Τοποθεσία: Θεσσαλονίκη
Επικοινωνία:

Πρόβλημα με τον compiler ή λάθος στην εντολή if?

Δημοσίευση από stesia » 03 Δεκ 2007 21:52

το μόνο που δεν μπόρεσα να καταλάβω είναι γιατί έπρεπε να μετατρέψω το int choice σε char choice για να τρέξει. :roll:

Programmer
Δημοσιεύσεις: 67
Εγγραφή: 22 Σεπ 2007 06:55

Πρόβλημα με τον compiler ή λάθος στην εντολή if?

Δημοσίευση από Programmer » 03 Δεκ 2007 23:52

stesia έγραψε:το μόνο που δεν μπόρεσα να καταλάβω είναι γιατί έπρεπε να μετατρέψω το int choice σε char choice για να τρέξει. :roll:
να σου κάνω και λίγη πλάκα...
γράψε για πλάκα και εκτέλεσε το παρακάτω...

int main()
{
int choice;
if( cout<<"dose kodiko 0 eos 5: ", cin>>choice, choice != (int) '0' )
cout << "o akeraios einai o " << choice << " o xarakthras einai o "<< (char) ('0' + choice) << " me kodiko xarakthra " << (int)('0' + choice ) << "\n";

return 0;
}

Μήν ανησυχείς... για το if( cout<<"dose kodiko ... ολόκληρο πρόγραμμα μπορείς να γράψεις στην έκφραση ενός if αν χρησιμοποιήσεις έκφραση του τελεστή κόμμα.

Τι θα σου βγάλει?
τον ακέραιο που θα δώσεις! και όχι τον χαρακτήρα! γιατί το cin και το cout συμπεριφέρονται ανάλογα με τον τύπο του αντικειμένου...
Το λάθος είναι πάλι δικό σου λογικό ή μαλλον λάθος αγνοίας...
δηλαδή αφού το choice το δήλωσες int στο cin θα παίρνει την τιμή του ακεραίου ενώ στο char choice την τιμή του χαρακτήρα (αυτές οι τιμες θα ειναι διαφορετικές).
δοκίμασε επίσης και το
int choice;
cin>>choice;
if (choice + '0' == '1') κ.τ.λ.

Πάντως η C και η C++ είναι πολύ απλές γλώσσες, αλλά λίγοι από ότι φαίνεται τις ξέρουν....

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Πρόβλημα με τον compiler ή λάθος στην εντολή if?

Δημοσίευση από cherouvim » 04 Δεκ 2007 08:53

Programmer έγραψε:Πάντως η C και η C++ είναι πολύ απλές γλώσσες, αλλά λίγοι από ότι φαίνεται τις ξέρουν....
Χμμμ. Είναι απλές πότε, και σε πιο επίπεδο; Όταν γράφεις thread pools, schedulers ή operating systems;

Και πόσο λίγοι και ποιοι άραγε τις ξέρουν;

Έτσι, μερικά φιλοσοφικά ερωτήματα για το καλημέρα ;)

stesia
Δημοσιεύσεις: 18
Εγγραφή: 02 Δεκ 2007 22:12
Τοποθεσία: Θεσσαλονίκη
Επικοινωνία:

Πρόβλημα με τον compiler ή λάθος στην εντολή if?

Δημοσίευση από stesia » 04 Δεκ 2007 13:40

φαίνεται ότι εσύ είσαι από αυτούς τους λίγους μακάρι και οι καθηγητές μου να ήταν έτσι. Ευχαριστώ για τις συμβουλές! Μια μέρα θα δίνω και εγώ :)
Η αλήθεια είναι ότι με προβληματίζει αυτό με το char και το int, θα ρωτήσω και τον καθηγητή να μου το εξηγήσει live. Πάντως με char τρέχει το προγραμματάκι!

Programmer
Δημοσιεύσεις: 67
Εγγραφή: 22 Σεπ 2007 06:55

Πρόβλημα με τον compiler ή λάθος στην εντολή if?

Δημοσίευση από Programmer » 04 Δεκ 2007 13:43

cherouvim έγραψε:
Programmer έγραψε:Πάντως η C και η C++ είναι πολύ απλές γλώσσες, αλλά λίγοι από ότι φαίνεται τις ξέρουν....
Χμμμ. Είναι απλές πότε, και σε πιο επίπεδο; Όταν γράφεις thread pools, schedulers ή operating systems;

Και πόσο λίγοι και ποιοι άραγε τις ξέρουν;

Έτσι, μερικά φιλοσοφικά ερωτήματα για το καλημέρα ;)
Είναι απλές στο επίπεδο της γλώσσας. Μπορούν να είναι πολύ σύνθετες στο επίπεδο των βιβλιοθηκών συναρτήσεων ή τάξεων.
Αυτά που αναφέρεις "thread pools, schedulers ή operating systems", είναι εφαρμογές και όχι οι γλώσσες... Η κάθε εφαρμογή έχει την δική της δυσκολία ανεξάρτητη από την γλώσσα που χρησιμοποιείς. Απλά η γλώσσα μπορεί να διευκολύνει ή να δυσκολεύει την γραφή της εφαρμογής.

Αυτά για τα φιλοσοφικά ερωτήματα...

πόσοι ξέρουν καλά C/C++?
Π.χ. Ερώτηση τεστ αν ξέρεις εσύ καλά...
πόσες κατηγορίες προτάσεων και πόσες κατηγορίες εκφράσεων μπορούμε να συναντήσουμε σε ένα πρόγραμμα της C ή της C++... (απαραίτητη γνώση για να μην γίνονται ανόητα λάθη και για να φεύγει η σύγχιση).

Αν δεν ξέρεις να σε βοηθήσω...

Programmer
Δημοσιεύσεις: 67
Εγγραφή: 22 Σεπ 2007 06:55

Πρόβλημα με τον compiler ή λάθος στην εντολή if?

Δημοσίευση από Programmer » 04 Δεκ 2007 13:54

stesia έγραψε:φαίνεται ότι εσύ είσαι από αυτούς τους λίγους μακάρι και οι καθηγητές μου να ήταν έτσι. Ευχαριστώ για τις συμβουλές! Μια μέρα θα δίνω και εγώ :)
Η αλήθεια είναι ότι με προβληματίζει αυτό με το char και το int, θα ρωτήσω και τον καθηγητή να μου το εξηγήσει live. Πάντως με char τρέχει το προγραμματάκι!
Το cin και cout είναι αντικέιμενα
extern istream cin;
extern ostream cout;
(όχι εντολές της C++). Δημιουργούνται αυτόματα όταν εκκινεί η εφαρμογή και σκοπό έχουν να διαχειριστούν την είσοδο-έξοδο του χρήστη.
Το cin συμπεριφέρεται παρόμοια με την συνάρτηση scanf της C όπου το γράμμα στις παραμέτρους μορφοποίησης καθορίζει τον τύπο της εξόδου... στο cin και στο cout η διερμηνεία που θα γίνει εξαρτάται από τον τύπο της εισόδου.
π.χ.
int choice;
scanf("%c", &choice); //An doseis to 1 to choice tha exei timi 49 (kodikos xaraktira 1)
printf("%d, %c\n", choice, (char)choice);
scanf("%d", &choice); //An doseis to 1 to choice tha exei timi 1
printf("%d\n", choice);

Το ίδιο σε C++
...
cin >> (char&) choice;
cout<< (char) choice << " " << choice <<"\n";

cin >> choice;
cout<< choice <<"\n";
...

δες και αυτό το προγραμματάκι...
int main()
{
int choice = 0;
char str[2] = { '\0' };

cout << "pata pliktro: \n";
cin.read(str, 1); //diavazei tin eisodo
choice = (int) str[0]; // dinei timi xaraktira sto choice
cout << "o kodikos einai " << choice << "\n";
cout << "o xaraktiras einai to " << (char)choice << "\n";


return 0;
}

Programmer
Δημοσιεύσεις: 67
Εγγραφή: 22 Σεπ 2007 06:55

Πρόβλημα με τον compiler ή λάθος στην εντολή if?

Δημοσίευση από Programmer » 04 Δεκ 2007 14:50

Και για να τελειώνει το ζήτημα με τον τύπο του τελεσταίου του τελεστή >> του αντικειμένου cin
Η βασική τάξη της istream η basic_istream ορίζει μεταξύ των άλλων και τους τελεστές

basic_istream& operator>>(bool& n);
basic_istream& operator>>(short& n);
basic_istream& operator>>(unsigned short& n);
basic_istream& operator>>(int& n);
basic_istream& operator>>(unsigned int& n);
basic_istream& operator>>(long& n);
basic_istream& operator>>(unsigned long& n);
basic_istream& operator>>(void *& n);
basic_istream& operator>>(float& n);
basic_istream& operator>>(double& n);
basic_istream& operator>>(long double& n);

πράγμα που σημαίνει ότι αναλογα με τον τύπο της εισόδου καλέιται και η ανάλογη συνάρτηση τελεστή. Επειδή η είσοδος είναι αναφορά, μετά την εκτέλεση της συνάρτησης τελεστή ο τελεστάιος θα περιέχει την τιμή που του έδωσε η συνάρτηση. Είναι φανερό ότι αν δώσεις τελεσταίο int η συνάρτηση θα μετατρέψει τήν είσοδο του πληκτρολογίου σε int. Αλλά θα τα καταλάβεις καλύτερα αυτά όταν μάθεις (αν δεν τα ξέρεις), για τον πολυμορφισμό των συναρτήσεων και την υπερφόρτωση τελεστών.
Τελευταία επεξεργασία από το μέλος Programmer την 04 Δεκ 2007 18:20, έχει επεξεργασθεί 5 φορές συνολικά.

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Πρόβλημα με τον compiler ή λάθος στην εντολή if?

Δημοσίευση από cherouvim » 04 Δεκ 2007 15:20

Programmer έγραψε:Π.χ. Ερώτηση τεστ αν ξέρεις εσύ καλά...
πόσες κατηγορίες προτάσεων και πόσες κατηγορίες εκφράσεων μπορούμε να συναντήσουμε σε ένα πρόγραμμα της C ή της C++... (απαραίτητη γνώση για να μην γίνονται ανόητα λάθη και για να φεύγει η σύγχιση).

Αν δεν ξέρεις να σε βοηθήσω...
Για βοήθα λοιπόν!

Programmer
Δημοσιεύσεις: 67
Εγγραφή: 22 Σεπ 2007 06:55

Πρόβλημα με τον compiler ή λάθος στην εντολή if?

Δημοσίευση από Programmer » 04 Δεκ 2007 16:03

cherouvim έγραψε:
Programmer έγραψε:Π.χ. Ερώτηση τεστ αν ξέρεις εσύ καλά...
πόσες κατηγορίες προτάσεων και πόσες κατηγορίες εκφράσεων μπορούμε να συναντήσουμε σε ένα πρόγραμμα της C ή της C++... (απαραίτητη γνώση για να μην γίνονται ανόητα λάθη και για να φεύγει η σύγχιση).

Αν δεν ξέρεις να σε βοηθήσω...
Για βοήθα λοιπόν!
άνοιξε νέο θέμα με την ερώτηση να σου το απαντήσω... Εδώ η απάντηση δεν θα έχει σχέση με το θέμα.

mariosal
Honorary Member
Δημοσιεύσεις: 1473
Εγγραφή: 09 Νοέμ 2007 23:55

Πρόβλημα με τον compiler ή λάθος στην εντολή if?

Δημοσίευση από mariosal » 16 Δεκ 2007 01:32

Από την Turbo pascal που ξέρω, νομίζω ότι το Int στην turbo pascal είναι το integer και το char και στη TF είναι το ίδιο. Το Integer στην TF είναι είδος μεταβλητής που πέρνει μόνο αριθμούς, οπότε μάλλον στη C/C++ η εντολή int θα διαβάζει αποκλειστικά μόνο αριθμούς και η char θα διαβάζει χαρακτήρες.

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες