blackeye Δημοσ. 2 Δεκεμβρίου 2003 Δημοσ. 2 Δεκεμβρίου 2003 exw mia klasi employee(vasi dedomenwn...me liga logia)kai thelw na kanw mia eisagwgi onoma-epitheto-tilefono-address. SOURCE CODE : void manager_employee::insert_employee_dialog() { clrscr();boxMenu(); employee Q; char epilogi='i'; string nonoma, nepitheto, naddress, nphone; int nkwd; gotoxy(20,5); textattr(11); cprintf("YPHRESIA EISAGWGHS STOIXEIWN NEOY YPALLHLOY \r\n"); for(int i=0;i<80;i++) cout<<"-"; cout<<endl<<"Insert data "<<endl; do{ do{ cprintf("Onoma : "); getline(cin,nonoma,'\n'); if(!edwses_gramma(nonoma)) {clrscr;cout<<"To onoma prepei na exei mono psifia latinikou alfavitou"<<endl; cout<<"Ksanadwse... "<<endl;} }while(!edwses_gramma(nonoma)); do{ cprintf("Epitheto : "); getline(cin,nepitheto,'\n'); if(!edwses_gramma(nepitheto)) {clrscr;cout<<"To epitheto prepei na exei mono psifia latinikou alfavitou"<<endl; cout<<"Ksanadwse... "<<endl;} }while(!edwses_gramma(nepitheto)); if(double_records(nonoma,nepitheto)){ //An yparxei idi eggrafi me to idio onomatepwnymo tote ektypwnei enan dialogo if(double_records(nonoma,nepitheto)) {cout<<"Yparxei idi enans ypallilos me ta idia stoixeia,onoma kai epitheto "<<endl; cout<<"(A)bort ®etry (I)gnore ??? "<<endl; cin>>epilogi; } }// if(double_records(nonoma,nepitheto)) }while(epilogi=='r'||epilogi=='R'); if(epilogi=='i'||epilogi=='I') { do{ cprintf("Phone : "); getline(cin,nphone,'\n'); if(!edwses_digit(nphone)) {clrscr;cout<<"To phone exei mono psifia "<<endl; cout<<"Ksanadwse..."<<endl;} }while(!edwses_digit(nphone)); cprintf("Address : "); getline(cin,naddress,'\n'); //Pare mnimi gia tin eisagwgi //Ekxwrise tis katalliles times sto pinaka employee Q.onoma=nonoma; Q.epitheto=nepitheto; Q.address=naddress; Q.phone=nphone; Q.kwdikos=ergazomenos[arithmos_ergazomenwn-1].kwdikos+1; insert_employee(Q); save(); clrscr();boxMenu(); cout<<"H eisagwgi egine me epityxia "; cout<<"Piese ena pliktro gia synexeia...."; getch(); } else{clrscr(); cout<<"I diaidikasia eisagwgis akyrwthike apo ton xristi "<<endl; cout<<"Piese ena pliktro gia sinexeia "; getch(); } } Otan yparxei idi enas ypallilos me to idio onoma kai epitheto sou vgazei enan dialogo Abort Retry Ignore kai dialegeis opws merikes fores simvainei sta windows. An epilekseis Retry to getline(cin,nonoma,'\n') dexetai san orisma to keno apo mono tou kai kateytheian se paei sto neo epitheto. An epilekseis Ignore tote to tilefwno den sto zitaei kai sou zitaei kateytheian tin nea address. GIATI??GIATI??GIATI??GIATI??GIATI??GIATI??GIATI?? kai pws mporw na to ftiaksw?????? (An anti gia getline valw aplo cin leitourgei alla den exw elegxo gia to " "[keno])
GothicCrusader Δημοσ. 2 Δεκεμβρίου 2003 Δημοσ. 2 Δεκεμβρίου 2003 Πολλές κενές γραμμές ρε γμτ και διαβάζεται δύσκολα ο κώδικας. Όχι ότι είναι δύσκολος.. απλά δεν έχουμε εύκολα σημεία αναφοράς σε γραμμές.. Λοιπόν, το πρόβλημά σου είναι ότι η cin αφήνει τον newline character στο iostream οπότε η επόμενη getline όταν εκτελείται διαβάζει μόνο αυτόν τον χαρακτήρα και σταματά να διαβάζει το stream νομίζοντας ότι το stream τελειώνει. Λύσεις: πολλές και διάφορες. Ο πιο απλός τρόπος είναι να δηλώσεις μια μεταβλητή τύπου string π.χ. trailingnl. Κάθε φορά μετά την εκτέλεση της cin θα τραβάς τον newline character με την μεταβλητή αυτή ώστε να αφαιρείται από το iostream. Παράδειγμα: > ... ... //An yparxei idi eggrafi me to idio onomatepwnymo tote ektypwnei enan dialogo if ( double_records(nonoma,nepitheto) ) { cout<<"Yparxei idi enans ypallilos me ta idia stoixeia,onoma kai epitheto "<<endl; cout<<"(A)bort (R)etry (I)gnore ??? "<<endl; cin>>epilogi; getline(cin,trailingnl); // *** remove trailing newline character } }// if(double_records(nonoma,nepitheto)) }while(epilogi=='r'||epilogi=='R'); ... ... Η μπορείς να δοκιμάσεις την cin.ignore(5,'\n'); που επίσης θα αφαιρέσει τον χαρακτήρα που ακολουθεί. Αυτό που μου κάνει εντύπωση είναι ότι θα έπρεπε όταν πατάς Ι να παίρνεις και στο phone κενό, αλλά εσύ υποστηρίζεις ότι δεν τρέχει καθόλου ο κώδικας στο μπλοκ του if(epilogi=='i'||epilogi=='I') . Δεν ξέρω.. σκέφτομαι... :roll:
blackeye Δημοσ. 2 Δεκεμβρίου 2003 Μέλος Δημοσ. 2 Δεκεμβρίου 2003 to mono problem einai me to keno......m@l@[email protected] dokimasw to "cin.ignore(5,'\n')" kai tha sou ksanapostarw gia na sou pw......aplws twra to exw me cin k dexetai to keno........mia alli skepsi einai mia sinartisi BOOL chech_word(string s) { bool OK=false; char word[]={ola ta gramata tis alfavitou....A->Z} for(int i=0;i<=s.length();i++) {for(int k=0;k<52(mikos word pinaka);k++) {if(s!=word[k])OK=true; } } return OK; } Ti les:::::
GothicCrusader Δημοσ. 3 Δεκεμβρίου 2003 Δημοσ. 3 Δεκεμβρίου 2003 Βασικά εγώ θα απέφευγα την λύση της function. Φαντάσου πόσες πράξεις γίνονται και μάλιστα χωρίς καθόλου καλό λόγο. Εξέτασε και μόνο τα for loops που θα τρέχεις ΚΑΘΕ φορά που θες να δεις αν μια στοιχειοσειρά είναι εντάξει: for (int i=0; i<=s.length(); i++) { for (int k=0; k<52;k++) Λίγο βάρβαρο δεν είναι; Μιλάμε για (s.length * 52) ifs για κάθε string που θες να τρεξείς την συνάρτηση! Και η λογική του πίσω από αυτό δεν είναι πάρα πολύ καλή όταν με μία μόνο γραμμή έχεις το ίδιο αν όχι καλύτερο (και πολύ πιο ορθό) αποτέλεσμα. Προτίμησε μία από τις τρεις λύσεις: -getline(cin, tempvar) (αμέσως μετά την εκτέλεση της cin >> epilogi) btw, το δοκίμασες; δουλεύει; -cin.ignore ή -cin.clear Εγώ θα χρησιμοποιούσα την πρώτη. Το πρόβλημα πάντως το αντιμετωπίζεις γιατί χρησιμοποιείς στο ίδιο πρόγραμμα αναμειγμένα για input&output τόσο τελεστές όπως >> όσο και έτοιμες συναρτήσεις I/O στον κώδικά σου. Ο γενικός κανόνας είναι ότι αν χρησιμοποιήσεις μία φορά για input/output τελεστές των streams τότε περιορίζεσαι στους τελεστές των streams και αποφεύγεις τις υπόλοιπες I/O συναρτήσεις . Τέσπα, δοκίμασε την getline ή την cin.ignore και πες μου τι εγίνε κ;
blackeye Δημοσ. 3 Δεκεμβρίου 2003 Μέλος Δημοσ. 3 Δεκεμβρίου 2003 doulevei me tin cin.ignore mia xara..........me tin sinartisi to skeftika pali kai exeis dikio(s.length*52.....too much)kalo kouragio gia tin epomeni klasi.......... THANKS A LOT
GothicCrusader Δημοσ. 4 Δεκεμβρίου 2003 Δημοσ. 4 Δεκεμβρίου 2003 you re welcome:) :wink: καλή τύχη στις υπόλοιπες κλάσεις
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.