Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix
HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix
Un proiettore economico, che fa della portabilità e immediatezza i suoi punti di forza. Adatto per una camera da letto o per la casa vacanze, è basato su sistema proprietario Linux ma offre piena compatibilità ufficiale a Netflix
ASUS ProArt GoPro Edition è il notebook compatto per chi crea
ASUS ProArt GoPro Edition è il notebook compatto per chi crea
Un notebook sviluppato in collaborazione con GoPro ma che risponde al meglio alle necessità di tutti coloro che creano contenuti video: robustezza, design, potenza di calcolo e funzionalità si abbinano al meglio tra di loro, pur se a prezzo di un costo elevato per via della tanta memoria onboard
Fable e Sol a confronto: due cartoni animati creati su un PC con RTX 3090
Fable e Sol a confronto: due cartoni animati creati su un PC con RTX 3090
Ho affidato ai due modelli lo stesso mestiere ma non lo stesso identico prompt: trasformare una storia illustrata in un video usando una RTX 3090 e modelli locali. Ne sono usciti due film, due applicazioni e due idee opposte di efficienza. Fucina, progettata con Fable 5, colpisce di più nei primi secondi. Storyboard Studio, costruito con ChatGPT/Codex, regge meglio sulla distanza e vince il confronto complessivo, ma di stretta misura
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 22-11-2011, 18: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, 20: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 21:05.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 22-11-2011, 23: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, 10: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, 11: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, 12: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, 12: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, 12: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


HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix HONOR CHOICE Projector Air Pro: piccolo, portati...
ASUS ProArt GoPro Edition è il notebook compatto per chi crea ASUS ProArt GoPro Edition è il notebook c...
Fable e Sol a confronto: due cartoni animati creati su un PC con RTX 3090 Fable e Sol a confronto: due cartoni animati cre...
Il tablet rugged leggero e sottile: Lenovo ThinkTab X11 offre resistenza, doppia USB-C e batteria rimovibile Il tablet rugged leggero e sottile: Lenovo Think...
AMD Advancing AI 2026: l'hardware AMD per le elaborazioni IA del futuro, tra GPU, CPU e robot AMD Advancing AI 2026: l'hardware AMD per le ela...
Anche Foxconn abbandona VMware e sceglie...
Windows 11 migliora l'accessibilit&agrav...
WhatsApp introduce il nuovo widget per i...
Blink Mini da 12,99€ e Pan-Tilt a 19,99€...
Oracle porta le applicazioni agentiche d...
Guizzo di fine mese Amazon: tutte le off...
ROG Strix Aiolos: SSD esterni con veloci...
PS Plus Essential, annunciati i giochi g...
Il 70% della Gen Z non uscirebbe con chi...
Noleggio sociale, c'è una sorpres...
Zeekr 9X sbarca in Europa con motore Sup...
Neuralink mostra un nuovo test: la carro...
Wallbox 22 kW a 262€: ecco perché...
Russia, mandato di arresto internazional...
The Elder Scrolls III: Morrowind diventa...
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: 12:37.


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