| Subiectul anterior :: Subiectul următor |
| Autor |
Mesaj |
NoVaK Junior
Data înscrierii: 21/Dec/2009 Mesaje: 5
|
Trimis: Lun Dec 21, 2009 10:47 pm Titlul subiectului: HELP PLEASE ! Prelucrarea sirurilor caracteriale in C++; |
|
|
Salutare oameni buni.
Sunt student al cursului I de facultate. Studiez C++ de la inceputul semestrului si am facut progres considerabil in conceperea acestui limbaj. Fiinde printre cei mai "dezghetati" din grupa un elev m-a rugat sa-l ajut cu o problema. La prima vedere mi-a parut usoara insa cind m-am apucat s-o fac am intilnit greutati pe care nu le-am putut depasi. Mai pe scurt conditia problemei suna in felul urmator :
Pentru o propozitie data sa se calculeze fregventa repetarii fiecarui cuvint din aceasta propozitie.
Rog toti binevoitorii de pe acest forum sa contribue la elaborarea acestui program, chiar am nevoie urgent de el .
Multumesc anticipat.
P.S. Folosesc DevC++ 4.9.9.2 |
|
| Sus |
|
 |
jos8cal Avansat

Data înscrierii: 14/Feb/2007 Mesaje: 329
|
Trimis: Lun Dec 21, 2009 11:13 pm Titlul subiectului: |
|
|
Spargi propozitia in cuvinte, le bagi intr-un map (cuvint, frecventa) si la sfirsit parcurgi map-ul si afisezi frecventa.
pentru fiecare cuvint din propozitie
map[cuvint].frecventa++
pentru fiecare cuvint din map
afisezi map[cuvint].frecventa
Ultima modificare efectuată jos8cal la Lun Dec 21, 2009 11:25 pm, modificat de 2 ori în total |
|
| Sus |
|
 |
NoVaK Junior
Data înscrierii: 21/Dec/2009 Mesaje: 5
|
Trimis: Lun Dec 21, 2009 11:23 pm Titlul subiectului: |
|
|
| jos8cal a scris: | Spargi propozitia in cuvinte, le bagi intr-un map (cuvint, frecventa) si la sfirsit parcurgi map-ul si afisezi frecventa.
pentru fiecare cuvint din propozitie
map[cuvint].frecventa++
pentru fiecare cuvint din map
afisezi map[cuvint].frecventa |
Sorry, dar cred ca o secventa de cod mi-ar explica mai bine ce si cum sa fac. |
|
| Sus |
|
 |
jos8cal Avansat

Data înscrierii: 14/Feb/2007 Mesaje: 329
|
Trimis: Lun Dec 21, 2009 11:25 pm Titlul subiectului: |
|
|
LE mutat aici:
Idea cu map-ul este sa nu compari fiecare cuvint cu fiecare cuvint, ca vei avea o complexitate n^2. Asa ca folosesti un binary tree, map-ul din povestea de mai sus, sa reduci numarul de verificari. Cum probabil inca n-ati ajuns la map-uri in semestrul 1, vezi aici ce-i ala si daca razbesti o pagina, gasesti si codul pentru problema ta. |
|
| Sus |
|
 |
Adin Coder
Data înscrierii: 08/Iul/2007 Mesaje: 189
|
Trimis: Lun Dec 21, 2009 11:42 pm Titlul subiectului: |
|
|
| NoVaK a scris: | | Sorry, dar cred ca o secventa de cod mi-ar explica mai bine ce si cum sa fac. |
Nu crezi ca ar fi mai bine daca ai posta TU o secventa de cod, evident incompleta, dar din care sa se vada ca ai incercat ceva? Apoi ai putea pune intrebari la obiect, de genul: am propozitia in stringul s, cum fac sa o impart in cuvinte? |
|
| Sus |
|
 |
NoVaK Junior
Data înscrierii: 21/Dec/2009 Mesaje: 5
|
Trimis: Lun Dec 21, 2009 11:46 pm Titlul subiectului: |
|
|
| jos8cal a scris: | LE mutat aici:
Idea cu map-ul este sa nu compari fiecare cuvint cu fiecare cuvint, ca vei avea o complexitate n^2. Asa ca folosesti un binary tree, map-ul din povestea de mai sus, sa reduci numarul de verificari. Cum probabil inca n-ati ajuns la map-uri in semestrul 1, vezi aici ce-i ala si daca razbesti o pagina, gasesti si codul pentru problema ta. |
Prea sofisticat pentru nivelul meu.
Ca sa aveti ideie cit de n00b sunt, iata la ce m-am inglodat :
#include<conio.h>
#include<stdio.h>
#include<string.h>
int main(){
char prop[100],tab[100];
char **p;
int i,n=0;
puts("Introduceti propozitia: ");
gets(prop);
//-----------
p[n]=strtok(prop," .");
while (p[n]!=NULL)
{
n++;
p[n]=strtok(NULL," .");
}
//-----------
for (i=0;i<n;i++) printf("%s",&*p[i]);
getch();
}
Functioneaza insa putin folos din ea pina ce.  |
|
| Sus |
|
 |
jos8cal Avansat

Data înscrierii: 14/Feb/2007 Mesaje: 329
|
Trimis: Mar Dec 22, 2009 12:30 am Titlul subiectului: |
|
|
Functioneaza pe hirtie poate, ca altfel el crapa saracu de vai mama lui.
Inainte sa pui in tabloul p[n] vreo valoare, trebuie sa faci loc, adica sa-i aloci spatiu. Poti face dinamic cu malloc() sau sa aloci dupa ureche un tablou cu un numar din burta, cum ai facut la prop si tab, anume asa: char* p[100]; (adica presupui ca ai 100 de cuvinte).
Ce trebuie sa faci mai departe este sa mai faci o lista in care pui cuvinte unice cu frecventa lor. Parcurgi lista initiala si compari fiecare element cu lista asta noua. Daca ai pus deja cuvintul in lista noua, atunci incrementezi frecventa, daca nu, il pui ca nou cu frecventa 1. La sfirsit lista asta noua va contine cuvinte unice cu frecventa lor. |
|
| Sus |
|
 |
NoVaK Junior
Data înscrierii: 21/Dec/2009 Mesaje: 5
|
Trimis: Mar Dec 22, 2009 1:30 am Titlul subiectului: |
|
|
jos8cal,
dupa ce am luptat vreo ora cu incapatinarea mea, totusi am inceput sa analizez informatia de pe lincul prestat si ca sa vezi super utila mi-a fost lectura.
Deci totul functioneaza perfect.
#include<iostream>
#include<conio.h>
#include<stdio.h>
#include<string>
#include<map>
using namespace std;
int main(){
map <string, int> nrcuv;
char prop[100],proprez[100],ex[100];
char *p;
puts("Introduceti propozitia: ");
gets(prop);
strcpy(proprez,prop);
//-----------
p=strtok(prop," .");
while (p!=NULL)
{
nrcuv[p]++;
p=strtok(NULL," .");
}
//-----------
cout <<"----------\nCuvintele si frecventa repetarii lor sunt urmatoarele:\n";
p=strtok(proprez," .");
while (p!=NULL)
{
if (strstr(ex,p)==NULL){
cout << p <<"-"<< nrcuv[p]<<"\n";
strcat(ex,p);
}
p=strtok(NULL," .");
}
//-----------
getch();
}
Mi-a mai ramas o singura intrbare. Nu as dori sa mai parcurg odata in plus propozitia(proprez-propozitia de rezerva) excluzind cuvintele a caror frecventa deja afost afisata, doar pentru a afisa continutul mapei. De aici deduc intrebarea propriu-zisa:
cum sa parcurg mapa creata afisind fiecare cuvint si frecventa lui ?
Ultima modificare efectuată de către NoVaK la Mar Dec 22, 2009 1:53 am, modificat de 1 dată în total |
|
| Sus |
|
 |
jos8cal Avansat

Data înscrierii: 14/Feb/2007 Mesaje: 329
|
Trimis: Mar Dec 22, 2009 1:48 am Titlul subiectului: |
|
|
| Cod: | map <string, int>::iterator it;
for (it = nrcuv.begin(); it != nrcuv.end(); it++)
cout << it->first << ": " << it->second << '\n'; |
|
|
| Sus |
|
 |
NoVaK Junior
Data înscrierii: 21/Dec/2009 Mesaje: 5
|
Trimis: Mar Dec 22, 2009 1:58 am Titlul subiectului: |
|
|
| jos8cal a scris: | | Cod: | map <string, int>::iterator it;
for (it = nrcuv.begin(); it != nrcuv.end(); it++)
cout << it->first << ": " << it->second << '\n'; |
|
Mersi muuuuuuuuuuuuuult. Sunt in culmea fericirii
Daca colegul pune bere, ma impart cu tine  |
|
| Sus |
|
 |
alex_pascanu Coder
Data înscrierii: 12/Aug/2007 Mesaje: 202
|
Trimis: Mar Dec 22, 2009 9:16 am Titlul subiectului: |
|
|
| daca requirementul e fara STL sau alt class library ce faci? |
|
| Sus |
|
 |
Drakoo Junior
Data înscrierii: 21/Sep/2008 Mesaje: 39
|
Trimis: Mar Dec 22, 2009 4:21 pm Titlul subiectului: |
|
|
s-ar putea incerca o varianta mai putin eficienta.. dar mult mai usoara de inteles..
parcurgi odata propozitia... si pui fiecare cuvant intr-un sir .. ordonezi sirul si apoi verifici de cate ori se repeta un cuvand in acea secventa .. stiind ca el sunt alaturate.. deci nu ai sa mai regasesti acelasi cuvant in alta parte a secventei.. |
|
| Sus |
|
 |
jos8cal Avansat

Data înscrierii: 14/Feb/2007 Mesaje: 329
|
Trimis: Mar Dec 22, 2009 4:25 pm Titlul subiectului: |
|
|
| Pai asta face map-ul pe dedesupt, doar ca te scuteste sa mai parcurgi sirul ordonat dupa ce l-ai ordonat. Cu map-ul calculezi frecventa in timp ce ordonezi, aka bagi in map. |
|
| Sus |
|
 |
|