[tema] sterge cuvinte cu prefix cu separator intre ele
#1
Posted 24 March 2017 - 18:18
Un șir cu maximum 255 de caractere conține cuvinte formate numai din litere mici ale alfabetului englez. Fiecare cuvânt este urmat de un caracter *. Scrieți un program C/C++ care citește un astfel de șir și afișează pe ecran șirul obținut prin eliminarea tuturor cuvintelor din șir care au ca sufix primul cuvânt din șir, ca în exemplu. Un cuvânt a este sufix pentru cuvântul b dacă există un cuvânt c de lungime mai mare sau egală cu 0, astfel încât, prin alipirea cuvântului a la sfârșitul cuvântului c, se obține cuvântul b.
Exemplu. Pentru șirul: este*soarele*coboara*peste*creste*la*apus*amestecand*norii* se va afișa: *soarele*coboara***la*apus*amestecand*norii* #include <iostream> #include<cstring> using namespace std; int main() { char a[255],rez[100]=""; cin.get(a,255); int i,cor,j; for (i=0 ; a[i]!='*';++i)rez[i]=a[i]; rez[i]='*'; do{ cor=strstr(a,rez)-a; j=i; while(a[cor]!='*'&&cor!=0) { cor--; j++; } strcpy(a+cor,a+cor+j); }while(strstr(a,rez)); cout<<a; return 0; } imi afiseaza *soarele*coboara*la*apus*amestecand*norii* si inca ceva, de ce mi-ar da crash daca nu as initializa sirul de rezerva cu null ( "" , /0 , etc ) la inceput ? aveam lag si am dat click de 2 ori pe post new topic. stergeti dublura, greseala mea |
#2
Posted 24 March 2017 - 19:33
C sau C++? Unde mai vad strstr si cin.get in aceeasi sursa, inchid topicul.
|
#3
Posted 24 March 2017 - 19:39
#4
Posted 24 March 2017 - 21:27
#5
Posted 24 March 2017 - 22:03
VladBtz, on 24 martie 2017 - 18:18, said:
si inca ceva, de ce mi-ar da crash daca nu as initializa sirul de rezerva cu null ( "" , /0 , etc ) la inceput ? Functiile ce le apelezi au niste preconditii, daca nu le respecti, nu te respecta nici ele. Ce nume de variabile sunt astea: a, cor, rez? De ce rez are doar 100 elemente? Ma astept la un asemenea cod de la unul nou pe forum, dar tu participi pe aici de ceva ani... Edited by dani.user, 24 March 2017 - 22:04. |
#6
Posted 24 March 2017 - 23:32
dani.user, on 24 martie 2017 - 22:03, said:
Functiile ce le apelezi au niste preconditii, daca nu le respecti, nu te respecta nici ele. Ce nume de variabile sunt astea: a, cor, rez? De ce rez are doar 100 elemente? Ma astept la un asemenea cod de la unul nou pe forum, dar tu participi pe aici de ceva ani... La simularea de bac am fost depunctat in mod crunt pentru ca nu s-a inteles codul, la modul ca cei care corectau nu stiau ca if ( a) inseamna if (a!=0) . La bac nu vreau sa ma mai arda prostii, incerc sa scriu cod ca la bac ca sa nu mai pierd puncte aiurea. Rez e o variabila de rezerva unde stochez primul cuvant, are 100 de locuri ca sa nu stau sa aflu dimensiunea length a cuvantului, apoi sa declar char rez[length] si sa stochez primul cuvant in ea. Cor e de la coordonate si a e o notatie impamantenita in rezolvarile de bac . Preconditia de care zici e ca stringu se initializeaza cu null daca nu il initializez si apoi nu pot sa suprascriu acel null pur si simplu ? Edited by VladBtz, 24 March 2017 - 23:33. |
#7
Posted 24 March 2017 - 23:38
Quote
La simularea de bac am fost depunctat in mod crunt pentru ca nu s-a inteles codul, la modul ca cei care corectau nu stiau ca if ( a) inseamna if (a!=0) . La bac nu vreau sa ma mai arda prostii, incerc sa scriu cod ca la bac ca sa nu mai pierd puncte aiurea. |
#8
Posted 25 March 2017 - 00:15
sftpdt, on 24 martie 2017 - 21:27, said:
Totuşi ce ai făcut acolo? Eu aş fi separat folosind strtok. strcpy(rez, strtok(a, '*')); char *p ,*q; p=strtok(s,d); while(p){ q=strtok(NULL,d); ..... p=q; } p si q sunt "capetele" care incadreaza un cuvant, acum, daca gasesc "este" in acel cuvant, cum fac sa il sterg ? strcpy(p, p +strlen(p)-1); Baggins, on 24 martie 2017 - 23:38, said:
Wow. Și eu am făcut asta la simulare, dar nu mi s-a spus nimic. E grav dacă ceea ce spui e adevărat. off topic Edited by VladBtz, 25 March 2017 - 00:07. |
#9
Posted 25 March 2017 - 01:35
suntem si noi consecventi ?
VladBtz, on 24 februarie 2017 - 23:32, said:
invata sa le dai variabilelor un nume mai sugestiv Quote la modul ca cei care corectau nu stiau ca if ( a) inseamna if (a!=0) Quote Rez e o variabila de rezerva unde stochez primul cuvant, are 100 de locuri ca sa nu stau sa aflu dimensiunea length a cuvantului Quote un cuvânt c de lungime mai mare sau egală cu 0 ori exista ori nu ? la modul general, problema suna cam asa Quote for each word from sentance, where delimiter is '*' if word contains sufix, where sufix is 1st of sentence remove word from sentance Edited by MarianG, 25 March 2017 - 01:54. |
#10
Posted 25 March 2017 - 09:54
VladBtz, on 24 martie 2017 - 23:32, said:
Preconditia de care zici e ca stringu se initializeaza cu null daca nu il initializez si apoi nu pot sa suprascriu acel null pur si simplu ? Preconditia e ca stringul sa aibe un 0 unde consideri tu ca e capatul. Altfel functia nu stie cat e de lung si tot cauta, pana acceseaza memorie nealocata sau citeste prostii, etc. In ce moment introduci acel 0 e irelevant, doar sa fie inainte de a apela functii gen str* |
|
#11
Posted 25 March 2017 - 11:09
VladBtz, on 25 martie 2017 - 00:15, said: strcpy(rez, strtok(a, '*')); char *strtok (char *str, const char *delimiters); VladBtz, on 25 martie 2017 - 00:15, said: strcpy(rez, strtok(a, '*'));p si q sunt "capetele" care incadreaza un cuvant, acum, daca gasesc "este" in acel cuvant, cum fac sa il sterg ? strcpy(p, p +strlen(p)-1); off topic Eu ziceam gen să iei un şir separat în care inserezi rezultatele cu strcat. Mi se pare mult mai uşor de urmărit aşa. VladBtz, on 24 martie 2017 - 23:32, said: La simularea de bac am fost depunctat in mod crunt pentru ca nu s-a inteles codul, la modul ca cei care corectau nu stiau ca if ( a) inseamna if (a!=0) . Cum am mai zis, aşa e sistemul. Caută să scrii cod care să-l înţeleagă şi unul paralel cu realitatea care cine ştie cum a ajuns prof de info şi corectează la bac. |
#12
Posted 25 March 2017 - 15:29
Nu trebuie sa modifice șirul inițial, doar sa afișeze fara sufix.
|
#13
Posted 25 March 2017 - 16:47
MarianG, on 25 martie 2017 - 15:29, said:
Nu trebuie sa modifice șirul inițial, doar sa afișeze fara sufix. e problema de bac, se subintelege ca se modifica pentru ca asa vrea ministeru sa se subinteleaga. sftpdt, on 25 martie 2017 - 11:09, said:
Trebuie să modifici neapărat şirul iniţial? Caz în care nu aş folosi strtok. Eu ziceam gen să iei un şir separat în care inserezi rezultatele cu strcat. Mi se pare mult mai uşor de urmărit aşa. tot cu p si q am facut int main() { char s[256], rez[256], *p, *q; int i,j; scanf("%s",s); strcpy(rez,"*"); p=strtok(s,"*"); q=strtok(NULL,"*"); while(q) { i=strlen(p)-1; j=strlen(q)-1; while(p[i]==q[j] && i>=0 && j>=0) { i--; j--; } if(i>0) strcat(rez,q); strcat(rez,"*"); q=strtok(NULL,"*"); } strcpy(s,rez); printf("%s",s); return 0; } Edited by VladBtz, 25 March 2017 - 17:02. |
#14
Posted 25 March 2017 - 16:53
Daca tot vrei sa modifici șirul creezi o funcție care primește pointer la sir, și delimitatorul.
|
#15
Posted 25 March 2017 - 18:49
Daca vrei sa faci treaba in-place, o poti face parcurgand o singura data fiecare caracter, fara nici o functie gen strlen, strcat sau alte asemenea (si fara a le reinventa).
|
|
#16
Posted 26 March 2017 - 01:07
dani.user, on 25 martie 2017 - 18:49, said:
Daca vrei sa faci treaba in-place, o poti face parcurgand o singura data fiecare caracter, fara nici o functie gen strlen, strcat sau alte asemenea (si fara a le reinventa). si cum fac asta ? tot folosesc o variabila ca sa salvez primul cuvant ? sau... int stop=0, coord,j; for(int i; s[i]!=NULL; ++i) { if(s[i]=='*' &stop==0 ) { coord=i-1; stop=1; } else if(stop==1 && s[i]= '*') { for( j=coord;j>=0&&s[j] != s[i-j]; j --) ; if (j) strcpy( ................ ); } } Edited by VladBtz, 26 March 2017 - 01:13. |
#17
Posted 26 March 2017 - 02:40
Primul cuvânt va fi tot timpul în acelasi loc, de la zero la primul asterix.
Edited by MarianG, 26 March 2017 - 09:49. |
#18
Posted 26 March 2017 - 10:25
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users