PDA

View Full Version : [C++] cancellare determinate parole da una frase


mistergks
22-11-2011, 18:47
Ho dubbi su questo esercizio. cosa sbaglio??
Ho una frase iniziale(memorizzata in un array di char magari..ad esempio "importante ridurre il debito") e una lista di parole(es: "dame, rudi, tinte, birre, il)
Voglio cancellare le lettere di ogni parola all'interno della frase. ad esempio con la prima parola "dame" la frase diventerà: "iportnt riurre il debito". farò cosi per ogni parola. Quando tutte le parole sono state considerate, la frase iniziale risulterà modificata cosi: "po r to"

il mio codice:


#include <iostream>
using namespace std;

void cancella(char frase[], char parole[], char nuovafrase[]);
char scomponi(char *parole);


int main(){
char frase[1000];
char parole[50], nuovafrase[1000];
cout<<"inserisci la frase iniziale"<<endl;
cin.getline(frase,1000);
cancella(frase, parole, nuovafrase);
cout<<nuovafrase;

return 0;
}

void cancella(char frase[], char parole[], char nuovafrase[]){
int x=0;
scomponi(parole);
for(int k=0; k<strlen(parole); k++){
for(int i=0; i<strlen(frase); i++){
if(frase[i]!= parole[k])
nuovafrase[x++]=frase[i];
}
}

char scomponi(char *parole){
char *s=strtok(parole, ',');
while(s!= NULL){
p=strtok(NULL, ',');
}
return s;
}

gugoXX
22-11-2011, 20:56
Io partirei unendo insieme tutte le parole da cancellare, dato che il risultato sarebbe identico.

dame, rudi, tinte, birre, il

doventerebbe

dameruitnbl

E procederei costruendo quindi l'algoritmo con in ingresso un singolo elenco unico di lettere da cancellare.



Poi, per l'implementazione dell'algoritmo, costruire l'HashMap di tale elenco, ovvero quella struttura che in O(1) ti dice se una lettera e' compresa oppure no all'interno dell'elenco. Il costo di costruzione e' O(M), dove M e' la lunghezza totale dell'elenco di parole da cancellare.
Poi inizierei a ciclare sulle lettere della frase target, e per ciascuna lettera mi chiederei se tale lettera e' da tenere oppure no, entrando nella HashMap di cui sopra.
Costo di questo step e' O(N*1), dove N e' la lunghezza totale della frase inziale.

In buona sostanza questo algoritmo sarebbe O(N+M), mentre il tuo sopra, altrettanto valido, O(M*N)

Sono andato troppo in la'?

mistergks
22-11-2011, 23:21
Io partirei unendo insieme tutte le parole da cancellare, dato che il risultato sarebbe identico.

dame, rudi, tinte, birre, il

doventerebbe

dameruitnbl

E procederei costruendo quindi l'algoritmo con in ingresso un singolo elenco unico di lettere da cancellare.



Poi, per l'implementazione dell'algoritmo, costruire l'HashMap di tale elenco, ovvero quella struttura che in O(1) ti dice se una lettera e' compresa oppure no all'interno dell'elenco. Il costo di costruzione e' O(M), dove M e' la lunghezza totale dell'elenco di parole da cancellare.
Poi inizierei a ciclare sulle lettere della frase target, e per ciascuna lettera mi chiederei se tale lettera e' da tenere oppure no, entrando nella HashMap di cui sopra.
Costo di questo step e' O(N*1), dove N e' la lunghezza totale della frase inziale.

In buona sostanza questo algoritmo sarebbe O(N+M), mentre il tuo sopra, altrettanto valido, O(M*N)

Sono andato troppo in la'?

ho capito quello di cui parli perchè ho seguito un corso di programmazione piu avanzato, però questo è un esercizio per un esame di fondamenti della programmazione..quindi non si possono usare tabelle hash, alberi, grafi, liste ecc... si possono usare solo array di qualsiasi tipo di dato..

Ma comunque qual'è l'errore nel mio codice?

Mommolo
23-11-2011, 10:15
ho capito quello di cui parli perchè ho seguito un corso di programmazione piu avanzato, però questo è un esercizio per un esame di fondamenti della programmazione..quindi non si possono usare tabelle hash, alberi, grafi, liste ecc... si possono usare solo array di qualsiasi tipo di dato..

Ma comunque qual'è l'errore nel mio codice?

Alla fine l'hashmap la fai con una tabella, quindi credo sia fattibilissimo.
La funzione

char scomponi(char *parole){
char *s=strtok(parole, ',');
while(s!= NULL){
p=strtok(NULL, ',');
}
return s;
}
cosa dovrebbe fare nelle tue intenzioni?

mistergks
23-11-2011, 11:53
Alla fine l'hashmap la fai con una tabella, quindi credo sia fattibilissimo.
La funzione

char scomponi(char *parole){
char *s=strtok(parole, ',');
while(s!= NULL){
p=strtok(NULL, ',');
}
return s;
}
cosa dovrebbe fare nelle tue intenzioni?

dovrebbe dividere l'array che contiene le parole separate da virgola(dame,rudi ecc..). Cioè devo poter considerare una parola alla volta!

Mommolo
23-11-2011, 12:10
dovrebbe dividere l'array che contiene le parole separate da virgola(dame,rudi ecc..). Cioè devo poter considerare una parola alla volta!

Be', di dividere lo divide.
Non so dove mette il risultato, però divide :D

mistergks
23-11-2011, 12:37
Be', di dividere lo divide.
Non so dove mette il risultato, però divide :D

mi servirebbe qua il risultato.. nella seguente funzione il pezzo di codice in grassetto...cioè quella parole[k] dovrebbe contenere una parola per volta!
dove sbaglio?

void cancella(char frase[], char parole[], char nuovafrase[]){
int x=0;
scomponi(parole);
for(int k=0; k<strlen(parole); k++){
for(int i=0; i<strlen(frase); i++){
if(frase[i]!= parole[k])
nuovafrase[x++]=frase[i];
}
}

Mommolo
23-11-2011, 12:42
mi servirebbe qua il risultato.. nella seguente funzione il pezzo di codice in grassetto...cioè quella parole[k] dovrebbe contenere una parola per volta!
dove sbaglio?

void cancella(char frase[], char parole[], char nuovafrase[]){
int x=0;
scomponi(parole);
for(int k=0; k<strlen(parole); k++){
for(int i=0; i<strlen(frase); i++){
if(frase[i]!= parole[k])
nuovafrase[x++]=frase[i];
}
}


L'avevo capito :D
Come ti dicevo, il problema (o forse uno dei problemi) è che il risultato della strtok non capisco dove va a finire.


char scomponi(char *parole){
char *s=strtok(parole, ',');
while(s!= NULL){
p=strtok(NULL, ',');
}
return s;
}

quando scrivi

p=strtok(NULL, ',');

chi è p?
Non vedo nemmeno la dichiarazione.
Prendere le parole e unirle in un unico array secondo me è più immediato.
gugoXX invece ti ha dato la soluzione migliore :)