|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
[C++] cancellare determinate parole da una frase
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: 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;
}
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
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'?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 22-11-2011 alle 22:05. |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
Quote:
Ma comunque qual'è l'errore nel mio codice? |
|
|
|
|
|
|
#4 | |
|
Member
Iscritto dal: Nov 2011
Messaggi: 158
|
Quote:
La funzione Codice:
char scomponi(char *parole){
char *s=strtok(parole, ',');
while(s!= NULL){
p=strtok(NULL, ',');
}
return s;
}
|
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
dovrebbe dividere l'array che contiene le parole separate da virgola(dame,rudi ecc..). Cioè devo poter considerare una parola alla volta!
|
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Nov 2011
Messaggi: 158
|
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
Quote:
dove sbaglio? Codice:
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];
}
}
|
|
|
|
|
|
|
#8 | |
|
Member
Iscritto dal: Nov 2011
Messaggi: 158
|
Quote:
Come ti dicevo, il problema (o forse uno dei problemi) è che il risultato della strtok non capisco dove va a finire. Codice:
char scomponi(char *parole){
char *s=strtok(parole, ',');
while(s!= NULL){
p=strtok(NULL, ',');
}
return s;
}
Codice:
p=strtok(NULL, ','); 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 |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:00.




















