Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Cum sterg mails din Promotions

Vanzare cumparare fara transfer b...

Receptie ciudata, in functie de t...

Dupa 20 ani de facultate, am uita...
 Mobile.de ofera imprumut de bani ...

problema test grila

Digi24 a disparut de pe TV Lg

Drept de proprietate intelectuala...
 Jante noi shitbox

Trinitas TV 4K

Dacia 1316 cu 6 usi ...

Frecventa modificata radio
 Un nou pericol pt batrani

Ar trebui sa vindem imobiliarele ...

Dupa renuntarea la aparat dentar

pelerinaj in Balcik
 

[tema] sterge cuvinte cu prefix cu separator intre ele

- - - - -
  • Please log in to reply
21 replies to this topic

#1
VladBtz

VladBtz

    Active Member

  • Grup: Members
  • Posts: 1,702
  • Înscris: 24.09.2014
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
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,239
  • Înscris: 24.02.2007
C sau C++? Unde mai vad strstr si cin.get in aceeasi sursa, inchid topicul.

#3
VladBtz

VladBtz

    Active Member

  • Grup: Members
  • Posts: 1,702
  • Înscris: 24.09.2014

 dani.user, on 24 martie 2017 - 19:33, said:

C sau C++? Unde mai vad strstr si cin.get in aceeasi sursa, inchid topicul.

C.

scanf( "%s", a) ;
printf("%s", &a);

#4
sftpdt

sftpdt

    Senior Member

  • Grup: Senior Members
  • Posts: 3,665
  • Înscris: 29.08.2013

 VladBtz, on 24 martie 2017 - 19:39, said:

scanf( "%s", a) ;
printf("%s", &a);

Numele unui şir reprezintă un pointer spre începutul şirului. a sau &a au aceeaşi valoare dacă nu mă înşel :D.
Totuşi ce ai făcut acolo?
Eu aş fi separat folosind strtok.

#5
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,239
  • Înscris: 24.02.2007

 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
VladBtz

VladBtz

    Active Member

  • Grup: Members
  • Posts: 1,702
  • Înscris: 24.09.2014

 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
Baggins

Baggins

    Member

  • Grup: Members
  • Posts: 264
  • Înscris: 09.10.2014

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

#8
VladBtz

VladBtz

    Active Member

  • Grup: Members
  • Posts: 1,702
  • Înscris: 24.09.2014

 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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,444
  • Înscris: 10.08.2005
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)
cand e vorba sa respectam o cerinta atunci o respectam, chiar daca tine coding style,

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
de ce sa muncim cand putem s-o carpim

Quote

un cuvânt c de lungime mai mare sau egală cu 0
daca exista un cuvant de lungime zero ?
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
toata treaba este cum iti construiesti lista de cuvinte si cum determini daca un cuvant contine sufixul de interes,

Edited by MarianG, 25 March 2017 - 01:54.


#10
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,239
  • Înscris: 24.02.2007

 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
sftpdt

sftpdt

    Senior Member

  • Grup: Senior Members
  • Posts: 3,665
  • Înscris: 29.08.2013

 VladBtz, on 25 martie 2017 - 00:15, said:

strcpy(rez, strtok(a, '*'));
Prototipul funcţiei strtok e
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
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.

 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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,444
  • Înscris: 10.08.2005
Nu trebuie sa modifice șirul inițial, doar sa afișeze fara sufix.

#13
VladBtz

VladBtz

    Active Member

  • Grup: Members
  • Posts: 1,702
  • Înscris: 24.09.2014

 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 Posted Image

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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,444
  • Înscris: 10.08.2005
Daca tot vrei sa modifici șirul creezi o funcție care primește pointer la sir, și delimitatorul.

#15
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,239
  • Înscris: 24.02.2007
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
VladBtz

VladBtz

    Active Member

  • Grup: Members
  • Posts: 1,702
  • Înscris: 24.09.2014

 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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,444
  • Înscris: 10.08.2005
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
VladBtz

VladBtz

    Active Member

  • Grup: Members
  • Posts: 1,702
  • Înscris: 24.09.2014

 MarianG, on 26 martie 2017 - 02:40, said:

Primul cuvânt va fi tot timpul în acelasi loc, de la zero la primul asterix.

si am luat pozitia dinainte de asterix cu coord. acum ce pun la strcpy ?

Anunturi

Bun venit pe Forumul Softpedia!

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate