|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
[c++] ESERCIZIO ARRAY DI PUNTATORI CHAR
Ho svolto questo esercizio...mi compila ma mi da un errore "il programma ha smesso di funzionare ecc..." in fase di esecuzione! Cosa non va??
La tua amica Renata Limbranata è nei guai. Si è sposata solo pochi giorni fa eppure il suo matrimonio sembra già andare a rotoli. Suo marito passa la maggior parte del giorno al computer a scrivere mail di lavoro (dice lui!), ma lei è molto sospettosa, non riesce a credere che si sia portato il lavoro anche in viaggio di nozze… E così ha deciso! Approfittando delle assenze del marito ti ha inoltrato tutte le sue mail (circa un centinaio), pregandoti di leggerle e farle sapere se, come sospetta lei, il marito ha un’amante. Tu però, che conosci Renata e che sai quanto possa essere paranoica a volte, decidi di non sprecare belle giornate a leggere mail con molta probabilità noiose e di affidarti alle tue abilità informatiche per risparmiare tempo. A tale scopo, si scriva in C++ un programma completo opportunamente modularizzato in funzioni che, dato in input l’elenco delle mail di Renata (che per semplicità si può implementare come array di stringhe) conti quante sono le mail in cui è contenuta almeno una tra le seguenti parole: amore, tesoro, cucciolotto, trottolino. MIA SOLUZIONE: Codice:
#include <iostream>
using namespace std;
int confronta(char *email[], char *parole[]);
int main(){
int numero_email=0;
char *email[10]={"Ciao amore come va","senti tesoro", "sei un cretino" };
char *parole[10]={"amore","tesoro","cucciolotto", "trottolino"};
numero_email=confronta(email,parole);
cout<<"Il numero delle email sospette è:"<<numero_email<<endl;
system("pause");
return 0;
}
int confronta(char *email[], char *parole[]){
int conta=0;
for(int i=0; email[i]; i++){
for(int j=0; parole[i]; j++){
if(email[i] == parole[j])
conta++;
}
}
return conta;
}
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Soprassederò sull'opportunamente modularizzato e sul fatto che è poco C++
Un errore evidente è che confronti le stringe che usi, che sono quelle del C, con l'operatore ==. Dovresti usare la funzione strcmp. Altrimenti, anziché usare le stringe del C(char*), potresti usare quelle definite nella standard library del C++(string) e continuare ad usare ==. Un altro errore, questa volta logico, è che il numero di mail sospette sarà sempre 0, a meno di avere intere mail uguali ad una delle parole da ricercare. Ultima modifica di ndakota : 04-03-2012 alle 14:50. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
Quindi metto la strcmp()...ok
Mentre per l errore logico come risolvo? Inviato dal mio GT-I9003 usando Tapatalk |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Usa la funzione strstr. A questo punto strcmp non ti serve più
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
Ma a me serve un modo di far restituire alla funzione il risultato di conta che sarebbe il numero delle enail che contengoni una parola tra quelle
Inviato dal mio GT-I9003 usando Tapatalk |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
Ma a me serve un modo di far restituire alla funzione il risultato di conta che sarebbe il numero delle enail che contengoni una parola tra quelle
Inviato dal mio GT-I9003 usando Tapatalk |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Codice:
if(strstr(parole[j], email[i]))
conta++;
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
E' quello che vuoi eh. Poi se vuoi contare al massimo 1 per ogni mail c'è solo una piccola modificare da fare e mi sembra che a questo punto puoi anche fartela da solo
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
Quote:
Codice:
#include <iostream>
using namespace std;
int confronta(char *email[], char *parole[]);
int main(){
int numero_email=0;
char *email[4]={"Ciao amore come va","senti tesoro", "sei un cretino" };
char *parole[5]={"amore","tesoro","cucciolotto", "trottolino"};
numero_email=confronta(email,parole);
cout<<"Il numero delle email sospette e':"<<numero_email<<endl;
system("pause");
return 0;
}
int confronta(char *email[], char *parole[]){
int conta=0;
for(int i=0; email[i]; i++){
for(int j=0; parole[j]; j++){
if(strstr(parole[j], email[i]))
conta++;
}
}
return conta;
}
|
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Ho fatto caso ora alle condizioni dei for. Perchè le hai fatte così?
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
Quote:
Comunque ho fatto una prova con la strcmp() e mi restituisce 12...cioè il numero delle lettere di tutte le parole contenute in tutte le email.. sarebbero "amore" e "tesoro".. ed evidentemente mette un carattere in piu o conta lo spazio.. Ora... a me servirebbe contare quante email contengono una di quelle parole specificate! Come faccio? Ultima modifica di mistergks : 05-03-2012 alle 13:53. |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Scusa, gli argomenti di strstr dovevano essere passati all'inverso.
A me così funziona Codice:
#include <iostream>
#include <cstring>
using namespace std;
int confronta(const char *email[], const char *parole[]);
int main(){
int numero_email=0;
const char *email[3]={"Ciao amore come va","senti tesoro", "sei un cretino" };
const char *parole[4]={"amore","tesoro","cucciolotto", "trottolino"};
numero_email=confronta(email,parole);
cout<<"Il numero delle email sospette e':"<<numero_email<<endl;
return 0;
}
int confronta(const char *email[], const char *parole[]){
int conta=0;
for(int i=0; i < 3; i++){
for(int j=0; j < 4; j++){
if(strstr(email[i], parole[j]))
conta++;
}
}
return conta;
}
Codice:
g++ -Wall -o es es.cpp Codice:
./es Codice:
Il numero delle email sospette e':2 Qualche nota sparsa: Ho riaddato la dimensione degli array a quella che usavi effettivamente Ho aggiunto la libreria cstring per poter usare strstr() o strcmp() Ho invertito come detto gli argomenti a strstr() Ho cambiato le condizioni dei for Ultima modifica di ndakota : 05-03-2012 alle 16:16. |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
Ora funziona anche a me!! Però mi rimangono dei dubbi:
1)perché gli array char li hai dichiarati const? Ho provato a cancellare const da dichiarazioni e funzione ma mi da errori di compilazione 2)se volesso farlo generico e quindi senza sapere la size degli array? I cicli for sarebbero sbagliati..perchè dovrebbero continuare su tutti gli elementi 3)la strstr() non so se posso usarla! C'é un altro metodo?! |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
1) E' buona norma aggiungerlo negli argomenti di funzione se non devi modificarli. Così ti proteggi da modifiche accidentali. In ogni caso togliendoli tutti non dovrebbe darti errore, credo al massimo warning.
2) Negli array stile C non c'è modo di sapere la dimensione. Modo C++ C++(sì, due volte) Codice:
vector<string> parole;
// gli metto dentro degli elementi
for(int i = 0; i < parole.size(); i++) {
Codice:
const int dim = 5;
char* parole[dim] = { ... };
confronta(parole, dim);
// nella funzione confronta
for(int i = 0; i < dim; i++) {
Codice:
const int dim = 5;
// nel main
char* parole[dim] = { ... };
confronta(parole);
// nella funzione confronta
for(int i = 0; i < dim; i++) {
3) Certo.. Puoi ad esempio scorrere la mail carattere per carattere finchè non becchi l'iniziale della parola(se c'è, almeno sembra essere abbastanza efficiente) e controllare che sia quella. E' un po' intricato ma un buon esercizio |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
Ho provato a fare una versione con input generico... cioè le email le inserisce l'utente..e ho messo una variabile int che riceve la lunghezza dell'array email.
Ho compilato ed eseguito...mi fa inserire le email ma appena premo INVIO mi crasha e smette di funzionare terminandosi. Cos'è che non va?! Se può servire...ho compilato con windows.. Codice:
#include <iostream>
#include <cstring>
using namespace std;
int confronta(char *email[], char *parole[], int size);
int main(){
int numero_email=0;
char *email[20];
char *parole[]={"amore","tesoro","cucciolotto", "trottolino"};
int size=0;
cout<<"inserisci le emails: "<<endl;
cin.getline(*email,20);
size=strlen(*email);
numero_email=confronta(email,parole,size);
cout<<"Il numero delle email sospette e':"<<numero_email<<endl;
system("pause");
return 0;
}
int confronta(char *email[], char *parole[], int size){
int conta=0;
for(int i=0; i < size; i++){
for(int j=0; j < size; j++){
if(strstr(email[i], parole[j]))
conta++;
}
}
return conta;
}
|
|
|
|
|
|
#17 | |
|
Member
Iscritto dal: Nov 2006
Messaggi: 201
|
Quote:
|
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
Quote:
Codice:
int confronta(char *email[], char *parole[], int size){
int conta=0;
for(int i=0; i < size; i++){
for(int j=0; j < 4; j++){
if(strstr(email[i], parole[j]))
conta++;
}
}
return conta;
}
|
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Le sfaccettature dei metodi di i/o sono davvero molte, però non mi sembra proprio corretto l'utilizzo che fai delle stringhe stile c per immettere le email. Una stringa stile c altro non è che un array di char che termina con un carattere NULL ('\0'). La si può pertanto utilizzare con un puntatore char al primo elemento di tale array (il nome di un array, d'altro canto, altro non è che un puntatore al primo elemento dell'array). Tu dichiari una serie di puntatori:
Codice:
char *mail[20]; Un puntatore char non è una stringa, se non viene inizializzato, cioè se ad esso non viene assegnata un'area di memoria contenente per l'appunto una stringa null-termined. Per esempio: Codice:
const char *parola = "questo è un literal!"; Tornando al tuo esempio, se devi inserire delle stringhe a runtime (inserendole da tastiera) o utilizzi la classe delle librerie standard "string" che gestisce l'allocazione di memoria da sè, oppure allochi tu staticamente della memoria per le stringhe che andrai ad inserire. Mettiamo per esempio che vuoi gestire un massimo di 5 mail contenente ognuna un massimo di 200 caratteri. Allora dovrai scrivere così: Codice:
char mail[5][200];
for (int i = 0; i < 5; i++) {
cin.getline(mail[i],200);
}
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
Quote:
Ma quello che hai proposto tu non è una matrice di char?! non ho ben capito come funziona Forse intendi una cosa del genere? Codice:
#include <iostream>
#include <cstring>
using namespace std;
int confronta(char email[5][200], char *parole[], int size);
int main(){
int numero_email=0;
char email[5][20];
char *parole[]={"amore","tesoro","cucciolotto", "trottolino"};
int size=0;
cout<<"inserisci le emails: "<<endl;
for(int i=0; i<5; i++)
cin.getline(email[i],20);
cout<<"Il numero delle email sospette e':"<<confronta(email,*parole,size)<<endl;
system("pause");
return 0;
}
int confronta(char email[5][200], char *parole[], int size){
int conta=0;
for(int i=0; i < size; i++){
for(int j=0; j < 4; j++){
if(strstr(email[i], parole[j]))
conta++;
}
}
return conta;
}
Ultima modifica di mistergks : 08-03-2012 alle 11:58. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:02.




















