freestuff.gr αρχική σελίδα
 FAQFAQ    ΑναζήτησηΑναζήτηση   Λίστα ΜελώνΛίστα Μελών   Ομάδες ΜελώνΟμάδες Μελών   <b>Εγγραφή Μέλους</b>Εγγραφή Μέλους 
 ΠροφίλΠροφίλ   Επιλογές μέλους Επιλογές   Τα bookmarks μου Τα bookmarks μου   Προσωπικά μηνύματαΠροσωπικά μηνύματα 
  διαφήμιση  

Καλώς ήρθατε στο forum μας! Για να συμμετάσχετε στις συζητήσεις θα πρέπει να είσαστε μέλος. Γίνετε μέλος τώρα!.

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


 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++
Moderators:  Super-Moderators, WebDev Moderators
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 2 [17 Μηνύματα]      Bookmarks Tags: compiler Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
Σελίδα:  1, 2 Επόμενο
ΑποστολέαςΜήνυμα
stesia


Μέλος από: 02 Δεκ 2007
Μηνύματα: 18
Περιοχή: Θεσσαλονίκη
View users profile Visit posters website
ΜήνυμαΣτις: 02 Δεκ 2007 23:48    Θέμα: Πρόβλημα με τον compiler ή λάθος στην εντολή if?
Περιγραφή θέματος: Δεν μπορώ να καταλάβω γιατί εκτελείται μόνο το πρώτο κομμάτι της if και τα υπόλοιπα αγνοούνται.
Απάντηση με παράθεση  Mark this post and the followings unread

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



C_Mammals.rar
 Description:

Download
 Filename:  C_Mammals.rar
 Filesize:  816 Bytes
 Downloaded:  302 Time(s)

Programmer


Μέλος από: 22 Σεπ 2007
Μηνύματα: 67

View users profile
ΜήνυμαΣτις: 03 Δεκ 2007 00:12    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Βρε συ! το 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


Μέλος από: 22 Σεπ 2007
Μηνύματα: 67

View users profile
ΜήνυμαΣτις: 03 Δεκ 2007 01:20    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Είναι να απορέι κανέις... που βρίσκετε αυτόν τον κώδικα. Δεν είναι λογικό να ξέρετε τους δείκτες και τις τάξεις και να μην ξέρετε τους σχεσιακούς τελεστές και την χρήση του 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


Μέλος από: 02 Δεκ 2007
Μηνύματα: 18
Περιοχή: Θεσσαλονίκη
View users profile Visit posters website
ΜήνυμαΣτις: 03 Δεκ 2007 17:03    Θέμα: Μα ήταν τόσο απλό τελικά... Απάντηση με παράθεση  Mark this post and the followings unread

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


Μέλος από: 02 Δεκ 2007
Μηνύματα: 18
Περιοχή: Θεσσαλονίκη
View users profile Visit posters website
ΜήνυμαΣτις: 03 Δεκ 2007 17:06    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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


Μέλος από: 02 Δεκ 2007
Μηνύματα: 18
Περιοχή: Θεσσαλονίκη
View users profile Visit posters website
ΜήνυμαΣτις: 03 Δεκ 2007 21:52    Θέμα: giati char? Απάντηση με παράθεση  Mark this post and the followings unread

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


Μέλος από: 22 Σεπ 2007
Μηνύματα: 67

View users profile
ΜήνυμαΣτις: 03 Δεκ 2007 23:52    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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


να σου κάνω και λίγη πλάκα...
γράψε για πλάκα και εκτέλεσε το παρακάτω...

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

Μέλος από: 13 Ιουλ 2005
Βοηθήματα: 7
Νέα: 1
Scripts: 1
Μηνύματα: 256+

Περιοχή: Athens, Greece
View users profile Visit posters website
blog linkedin twitter 
ΜήνυμαΣτις: 04 Δεκ 2007 08:53    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

Χμμμ. Είναι απλές πότε, και σε πιο επίπεδο; Όταν γράφεις thread pools, schedulers ή operating systems;

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

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

_________________
blog
stesia


Μέλος από: 02 Δεκ 2007
Μηνύματα: 18
Περιοχή: Θεσσαλονίκη
View users profile Visit posters website
ΜήνυμαΣτις: 04 Δεκ 2007 13:40    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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


Μέλος από: 22 Σεπ 2007
Μηνύματα: 67

View users profile
ΜήνυμαΣτις: 04 Δεκ 2007 13:43    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

Χμμμ. Είναι απλές πότε, και σε πιο επίπεδο; Όταν γράφεις thread pools, schedulers ή operating systems;

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

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


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

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

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

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


Μέλος από: 22 Σεπ 2007
Μηνύματα: 67

View users profile
ΜήνυμαΣτις: 04 Δεκ 2007 13:54    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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


Μέλος από: 22 Σεπ 2007
Μηνύματα: 67

View users profile
ΜήνυμαΣτις: 04 Δεκ 2007 14:50    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Και για να τελειώνει το ζήτημα με τον τύπο του τελεσταίου του τελεστή >> του αντικειμένου 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. Αλλά θα τα καταλάβεις καλύτερα αυτά όταν μάθεις (αν δεν τα ξέρεις), για τον πολυμορφισμό των συναρτήσεων και την υπερφόρτωση τελεστών.

Last edited by Programmer on 04 Δεκ 2007 18:20, edited 5 times in total
cherouvim
Script Master

Μέλος από: 13 Ιουλ 2005
Βοηθήματα: 7
Νέα: 1
Scripts: 1
Μηνύματα: 256+

Περιοχή: Athens, Greece
View users profile Visit posters website
blog linkedin twitter 
ΜήνυμαΣτις: 04 Δεκ 2007 15:20    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

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

Για βοήθα λοιπόν!

_________________
blog
Programmer


Μέλος από: 22 Σεπ 2007
Μηνύματα: 67

View users profile
ΜήνυμαΣτις: 04 Δεκ 2007 16:03    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

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

Για βοήθα λοιπόν!


άνοιξε νέο θέμα με την ερώτηση να σου το απαντήσω... Εδώ η απάντηση δεν θα έχει σχέση με το θέμα.
mariosal
Honorary Member

Μέλος από: 09 Νοε 2007
Βοηθήματα: 1
Νέα: 2
Scripts: 1
Μηνύματα: 256+


View users profile
ΜήνυμαΣτις: 16 Δεκ 2007 01:32    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Από την Turbo pascal που ξέρω, νομίζω ότι το Int στην turbo pascal είναι το integer και το char και στη TF είναι το ίδιο. Το Integer στην TF είναι είδος μεταβλητής που πέρνει μόνο αριθμούς, οπότε μάλλον στη C/C++ η εντολή int θα διαβάζει αποκλειστικά μόνο αριθμούς και η char θα διαβάζει χαρακτήρες.
Εμφάνιση Μηνυμάτων:   
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 2 [17 Μηνύματα] Σελίδα:  1, 2 Επόμενο
Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++
Τώρα είναι 26 Μαρ 2017 18:53 | All times are UTC + 2


Email This Page to Someone! add to Favorites

     Powered by p h p B B © 2001,2005 p h p B B Group
Για άμεση επικοινωνία με τον διαχειριστή του freestuff.gr στο email: freestuff.gr(παπάκι)gmail.com


Copyright © 1999-2013 Freestuff.gr All Rights Reserved  
Version Aegean, designed by N. Tsaganos