Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Abbiamo guidato per diversi giorni la Alpine A290, la prima elettrica del nuovo corso della marca. Non è solo una Renault 5 sotto steroidi, ha una sua identità e vuole farsi guidare
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Abbiamo provato a fondo il nuovo Magic 8 Lite di HONOR, e per farlo siamo volati fino a Marrakech , dove abbiamo testato la resistenza di questo smartphone in ogni condizione possibile ed immaginabile. Il risultato? Uno smartphone praticamente indistruttibile e con un'autonomia davvero ottima. Ma c'è molto altro da sapere su Magic 8 Lite, ve lo raccontiamo in questa recensione completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 22-11-2011, 19:47   #1
mistergks
Senior Member
 
L'Avatar di mistergks
 
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;
}
mistergks è offline   Rispondi citando il messaggio o parte di esso
Old 22-11-2011, 21:56   #2
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 23-11-2011, 00:21   #3
mistergks
Senior Member
 
L'Avatar di mistergks
 
Iscritto dal: Mar 2011
Messaggi: 1050
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
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?
mistergks è offline   Rispondi citando il messaggio o parte di esso
Old 23-11-2011, 11:15   #4
Mommolo
Member
 
Iscritto dal: Nov 2011
Messaggi: 158
Quote:
Originariamente inviato da mistergks Guarda i messaggi
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

Codice:
char scomponi(char *parole){
     char *s=strtok(parole, ',');
     while(s!= NULL){
               p=strtok(NULL, ',');
               }
     return s;
}
cosa dovrebbe fare nelle tue intenzioni?
Mommolo è offline   Rispondi citando il messaggio o parte di esso
Old 23-11-2011, 12:53   #5
mistergks
Senior Member
 
L'Avatar di mistergks
 
Iscritto dal: Mar 2011
Messaggi: 1050
Quote:
Originariamente inviato da Mommolo Guarda i messaggi
Alla fine l'hashmap la fai con una tabella, quindi credo sia fattibilissimo.
La funzione

Codice:
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!
mistergks è offline   Rispondi citando il messaggio o parte di esso
Old 23-11-2011, 13:10   #6
Mommolo
Member
 
Iscritto dal: Nov 2011
Messaggi: 158
Quote:
Originariamente inviato da mistergks Guarda i messaggi
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
Mommolo è offline   Rispondi citando il messaggio o parte di esso
Old 23-11-2011, 13:37   #7
mistergks
Senior Member
 
L'Avatar di mistergks
 
Iscritto dal: Mar 2011
Messaggi: 1050
Quote:
Originariamente inviato da Mommolo Guarda i messaggi
Be', di dividere lo divide.
Non so dove mette il risultato, però divide
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?
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];
                     }
             }
mistergks è offline   Rispondi citando il messaggio o parte di esso
Old 23-11-2011, 13:42   #8
Mommolo
Member
 
Iscritto dal: Nov 2011
Messaggi: 158
Quote:
Originariamente inviato da mistergks Guarda i messaggi
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?
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];
                     }
             }
L'avevo capito
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;
}
quando scrivi
Codice:
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
Mommolo è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Oracle NetSuite si potenzia con nuove fu...
Musica generata con l'IA: Sony lavora a ...
Cyberpunk 2077 in versione PC su smartph...
BYD si gioca un grosso jolly: pronta Rac...
Samsung annuncia l'arrivo in Italia dei ...
Offerta lancio Pixel 10a: come ottenere ...
Google presenta Pixel 10a: poche le novi...
Caos F1 2026: 14 monoposto senza omologa...
Tesla festeggia il primo Cybercab prodot...
Desktop piccolo e potente? NZXT H2 Flow ...
Polestar spinge sull'acceleratore: arriv...
Nuovo record mondiale nel fotovoltaico: ...
L'ultimo baluardo cade: fine supporto pe...
'Il mondo non ha mai visto nulla di simi...
La Commissione europea mette sotto indag...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 05:24.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v