PDA

View Full Version : [c++] Sostituire vocali in stringa


Viola86
23-05-2007, 12:36
Salve a tutti, innanzitutto mi presento: sono Viola dalla provincia di Benevento, ho 20 anni e frequento il secondo anno di università.

Ho un problemino, anzi problemone, è ENORME! Dovrei consegnare un programma in c++ che data una stringa da input, sostituisca tutte le vocali con un asterisco (*).
Poi vabbè dovrei fare anche la documentazione e gli esempi di test, ma questi a programma fatto spero vengano da se.

Ho cercato molto su internet, programma per programma, thread per thread e non ho trovato nulla che facesse al caso mio. :(

So che è un programmino abbastanza semplice ed intuitivo e ho trovato molti programmini altrettanto semplici e fatti bene, completi di commenti.

Qualcuno di buon cuore non potrebbe aiutarmi in cambio della mia gratitudine eterna?
Grazie anche solo per aver letto il mio messaggio disperato. :)

andbin
23-05-2007, 13:30
Ho un problemino, anzi problemone, è ENORME! Dovrei consegnare un programma in c++ che data una stringa da input, sostituisca tutte le vocali con un asterisco (*).Ha già provato ad "abbozzare" il programma (anche se non completo)?
Per la sostituzione si tratta solo di scansionare la stringa carattere per carattere, fare un test per stabilire se il carattere è una vocale e in tal caso scrivere in quella posizione un carattere.

yorkeiser
23-05-2007, 13:37
Ti fornisco una soluzione parziale: sta a te analizzarla e vedere come piazzarla all'interno di una funzioncina che venga chiamata dal main e faccia la sostituzione

char * stringa;
stringa = (char*)malloc(...);
stringa = ...
int i=0;

while (*(stringa+i) != '\0')
{
if ( *(stringa+i) =='a' || *(stringa+i)=='e') || ...
*(stringa+i)='*';
i++;

}
printf("%s",stringa);
}

Viola86
23-05-2007, 13:45
Ha già provato ad "abbozzare" il programma (anche se non completo)?
Per la sostituzione si tratta solo di scansionare la stringa carattere per carattere, fare un test per stabilire se il carattere è una vocale e in tal caso scrivere in quella posizione un carattere.

Bah sono riuscita a scrivere giusto poche cose che son riuscita a carpire dalla rete...te le posto sperando possa aiutarmi. :\



const int MaxChars = 50;
bool IsVocale(char c);

int main()

{

char frase[MaxChars];
int len;

cout<<"Inserisci una frase (Max:"<<MaxChars<<" caratteri):";
gets(frase);

cout<<"Le vocali sono:";
len = strlen(frase);

tomminno
23-05-2007, 14:07
Bah sono riuscita a scrivere giusto poche cose che son riuscita a carpire dalla rete...te le posto sperando possa aiutarmi. :\



const int MaxChars = 50;
bool IsVocale(char c);

int main()

{

char frase[MaxChars];
int len;

cout<<"Inserisci una frase (Max:"<<MaxChars<<" caratteri):";
gets(frase);

cout<<"Le vocali sono:";
len = strlen(frase);

Ma visto che stiamo parlando di C++ perchè non usarlo fino in fondo?


...
string frase;
getline(cin, frase);

int pos = -1;
while ((pos = frase.find("a")) != string::npos)
{
frase.replace(pos,1,"*");
}
...

Ziosilvio
23-05-2007, 14:09
Attenzione che gets è insicura, e strlen non conteggia il carattere nullo finale...

Usa cin.getline al posto di gets.

Viola86
23-05-2007, 14:11
Tomminno, perdonami, ma non ho ben capito cosa volevi intendere.

Il primo pezzo che hai postato è una bozza (fa proprio schifo ed è incompleta e probabilmente piena di errori formali) mentre il secondo è ciò che ha postato yorkeiser.

Non so proprio come unirle anche perchè a quanto detto da ziosilvio io ho usato qualcosa che non va. :(

Viola86
23-05-2007, 14:13
Ah quasi dimenticavo...grazie infinite a tutti per le risposte! :)

yorkeiser
23-05-2007, 14:19
Tomminno, perdonami, ma non ho ben capito cosa volevi intendere.

Il primo pezzo che hai postato è una bozza (fa proprio schifo ed è incompleta e probabilmente piena di errori formali) mentre il secondo è ciò che ha postato yorkeiser.

Non so proprio come unirle anche perchè a quanto detto da ziosilvio io ho usato qualcosa che non va. :(

Cerca di leggere il codice e ti accorgi che sono due soluzioni diverse, anche se utilizzabili entrambe... ti cosiglio di darti una letta a un manuale (o quantomeno a un tutorial) sul c++ prima di scriverci programmi :)

tomminno
23-05-2007, 14:21
Tomminno, perdonami, ma non ho ben capito cosa volevi intendere.

Il primo pezzo che hai postato è una bozza (fa proprio schifo ed è incompleta e probabilmente piena di errori formali) mentre il secondo è ciò che ha postato yorkeiser.


La prima parte è il quote al tuo post :mbe:
Sei te che hai scritto un codice incompleto e pieno di errori!

Per quanto riguarda il codice scritto da me e quello di yorkeiser c'è un pò di differenza, in quanto lui ha postato codice C, io invece ho usato le funzioni messe a disposizione dal C++.

Viola86
23-05-2007, 14:23
Cerca di leggere il codice e ti accorgi che sono due soluzioni diverse, anche se utilizzabili entrambe... ti cosiglio di darti una letta a un manuale (o quantomeno a un tutorial) sul c++ prima di scriverci programmi :)

Lo so, e già posseggo il libro:
C++ Fondamenti di programmazione di Deitel&Deitel della Apogeo, il nuovo, la ristampa con la copertina con le formichine. Mi è stato detto che era abbastanza buono.

Cmq delle vostre risposte sono rimasta un po incasinata...contando che io non è che ne capisco più di tanto e quel poco che so è perchè un amico di corso mi ha aiutato...

Viola86
23-05-2007, 14:26
La prima parte è il quote al tuo post :mbe:
Sei te che hai scritto un codice incompleto e pieno di errori!

Per quanto riguarda il codice scritto da me e quello di yorkeiser c'è un pò di differenza, in quanto lui ha postato codice C, io invece ho usato le funzioni messe a disposizione dal C++.



Per carità non mi hai capita! Il primo pezzo è il mio! Quello che fa più schifo! :D Scusa per essere stata poco chiara. Cmq grazie ancora, ma come faccio a legare le due cose e a pulirle dagli errori per presentare un programma funzionante?

Cmq scusami ancora e grazie ancora a tutti per le risposte!:)

yorkeiser
23-05-2007, 14:35
Non devi legarle, devi scegliere una soluzione o l'altra. Ti consiglio di scegliere la soluzione di tomminno che è un po' più semplice da interpretare, però prenditi un attimo per leggerti sul manuale almeno cosa fanno le funzioni che lui ha utilizzato altrimenti non impari davvero nulla

Viola86
23-05-2007, 15:06
Non devi legarle, devi scegliere una soluzione o l'altra. Ti consiglio di scegliere la soluzione di tomminno che è un po' più semplice da interpretare, però prenditi un attimo per leggerti sul manuale almeno cosa fanno le funzioni che lui ha utilizzato altrimenti non impari davvero nulla

Guarda il manuale già ho iniziato a leggerlo da un pò e un pò sto capendo, ma la prima cosa che devo fare è consegnare il programma al prof via mail, poi studiarmi la parte per l'orale, praticamente studiarmi il mio programma per poi commentarglielo all'orale.

Per quanto riguarda quegli stralci di programma: quello che ho scritto io lo capisco ma probabilmente è pieno di errori e nn so dove mettere mano, mentre il pezzo che ha postato tommi non so come unirlo al mio pezzo e come far terminare il programma.

Sicuramente sono stata poco chiara. :\

Viola86
23-05-2007, 17:51
uppino plz :(

PGI-Bis
23-05-2007, 19:46
Quando i cavalli di razza titubano, tocca agli asini salire in cattedra. Eccomi :D.

Due premesse. La prima è che il Deitel rispetta la legge dei due volumi. Questa legge stabilisce che se un libro è diviso in due volumi allora tutto quello che ti serve è nel volume che non hai.

La seconda è che il Deitel tratta le stringhe nelle "tecniche avanzate di programmazione". Se in C++ le stringhe sono "tecniche avanzate" immagino che la concorrenza si studi alla NASA.

E un avvertimento. L'unica ragione per cui mi pregio di mostrarti l'intero codice è che essendo io un totale asino di programmazione C++ la mera copiatura di quanto scritto ti garantirebbe non solo il generale dileggio ma credo anche una punizione corporale.

Trovo comunque divertente l'idea di espormi al pubblico ludibrio.

#include <string>
#include <iostream>

/*
Ecco cosa fa il programma.

1. chiede all'utente di inserire una stringa
2. data la stringa inserita
2.1 per ogni suo carattere di indice i, con i da 0 al numero di caratteri
2.1.1 se il carattere è una vocale
2.1.1.1 rimpiazza il carattere in posizione i nella stringa con "*"
3. stampa la stringa
*/

using namespace std;

/** Questo l'ho copiato da te :D */
bool isVocale(char);

/** Questo è una delle 175 forme del main in C++. */
int main()
{

/** << in danimarca significa output. Nel resto del mondo non vuol dire un
accidenti. Per due talleri, indovinate di che nazionalità è l'inventore di
C++ */
cout << "Inserire una linea di testo e premere invio" << endl;

/** Potenzinterra, non ho mai capito se questa è una dichiarazione con
allocazione, una dichiarazione con assegnamento o una clamorosa svista */
string testo;

/** Questo è sicuramente sbagliato. Cercate di comprendermi. Ho visto
"getline", mi son detto sta a vedere che prende una linea di testo, e l'ho
buttato dentro. */
getline(cin, testo);

/** Questa è la meraviglia. size_t l'ho usato alla vaccinara. Va bene int,
char, byte, short, ho provato con float e mi da un warning! manco errore.*/
for(size_t i = 0; i < testo.length(); i++) {

/** Uso at perchè controlla l'indice di accesso. Lo so, è un'eresia:
vuoi mettere un bel buffer overflow...*/
char carattere = testo.at(i);

/** Ammetto di essere stato eccessivamente chiaro. Avrei dovuto chiamare
la funzione ivc o io, sovrascrivere l'operatore >I< e usare almeno tre
puntatori, uno per valore, uno per riferimento e uno per Ganesh. */
if(isVocale(carattere)) {

/** Avrei anche usato un carattere al posto della stringa ma
mi da un errore (const qualcosa). Posso usare un float per
rappresentare un indice ma non posso usare un char per rappresentare
un carattere. Sarà per questo che è "++"? */
testo.replace(i, 1, "*");
}
}

/** Questo o invia la stringa allo standard output o fa esplodere il
pianeta. Io vi ho avvertito. */
cout << testo << endl;

/** Questi due li ha messi dev-cpp e per l'amor del cielo non voglio neanche
sapere cosa siano. */
system("PAUSE");
return EXIT_SUCCESS;
}

/** Qui siamo ben oltre la mia capacità di comprensione. */
bool isVocale(char c) {
return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
}

Signori, buon divertimento :D.

Viola86
23-05-2007, 21:10
Oddio non avrei mai immaginato di riuscire a vedere il programma che mi serviva tutto bello scritto, ero veramente disperata.
Non sai adesso quanto sono contenta e quanto ti ringrazio!Come ringrazio tutti gli altri che si sono attivati nell'aiutarmi!

Cmq il programma l'ho testato e sembra funzionare alla perfezione!Perchè dici che non sei bravo??
I commenti sono stupendi! :P

Cmq grazie ancora di tutto, ora me lo ricontrollo fino alla nausea!E se c'è qualcosa che posso fare per te, anche se dubito fortemente, ti prego fammelo sapere!
Grazie ancora a tutti, ovviamente vi tengo aggiornati! ;)

tomminno
23-05-2007, 22:38
[code]
/** Questo è sicuramente sbagliato. Cercate di comprendermi. Ho visto
"getline", mi son detto sta a vedere che prende una linea di testo, e l'ho
buttato dentro. */
getline(cin, testo);



Visto il tono scherzoso dei commenti non sono riuscito a capire questo, comunque se fosse serio, quella "getline" esiste ed è una funzione globale di string, evita di usare le stringe C per la lettura da stream, non capisco perchè dovrebbe essere sicuramente sbagliato.

PGI-Bis
24-05-2007, 17:31
Tutti i commenti erano sull'allegro andante. Quello compreso. Vale come "è troppo facile per essere anche giusto".