Torna indietro   Hardware Upgrade Forum > Software > Programmazione

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.
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
WF-1000X M6 è la sesta generazione di auricolare in-ear sviluppata da Sony, un prodotto che punta a coniugare facilità di utilizzo con una elevata qualità di riproduzione dei contenuti audio e una cura nella riduzione del rumore ambientale che sia da riferimento
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake ha presentato diverse novità per la sua piattaforma legate all'intelligenza artificiale. Quella forse più eclatante è una collaborazione con OpenAI, ma non mancano diverse nuove funzionalità che rendono la piattaforma più flessibile e in grado di rispondere meglio alle esigenze in continuo cambiamento delle aziende
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


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...
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
NIO stabilisce il nuovo record di scambi...
Dell Private Cloud sempre più ape...
Ennesimo incidente per la guida autonoma...
Dopo le maniglie, è il turno dei ...
Addio incendi incontrollati? Svolt dice ...
WINDTRE si mette in proprio: vender&agra...
The Mandalorian & Grogu: il trailer ...
OpenClaw sotto attacco: i malware infost...
Resident Evil Requiem: pre-load dal 25 f...
Vaticano, la Messa si traduce in 60 ling...
Kia prepara il facelift della Kia EV5: n...
La nuova Alpine A110 elettrica sfrutterà...
Il nuovo entry level della gamma MacBook...
Panasonic 55'' QLED con Dolby Vision e F...
TOP 250 PLUS e TOP 300 PLUS ritornano: v...
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: 18:00.


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