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

C++ provlima kai kiriws me string.....amesi voitheia


blackeye

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

Δημοσ.

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])

Δημοσ.

Πολλές κενές γραμμές ρε γμτ:( και διαβάζεται δύσκολα ο κώδικας. Όχι ότι είναι δύσκολος.. απλά δεν έχουμε εύκολα σημεία αναφοράς σε γραμμές..

 

Λοιπόν, το πρόβλημά σου είναι ότι η 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:

Δημοσ.

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:::::

Δημοσ.

Βασικά εγώ θα απέφευγα την λύση της 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 και πες μου τι εγίνε κ;

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...