|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 9
|
[c++] Sostituire vocali in stringa
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. |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
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
Codice:
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);
}
__________________
Il sole è giallo |
|
|
|
|
|
#4 | |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 9
|
Quote:
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); |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Codice:
...
string frase;
getline(cin, frase);
int pos = -1;
while ((pos = frase.find("a")) != string::npos)
{
frase.replace(pos,1,"*");
}
...
|
|
|
|
|
|
|
#6 |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Attenzione che gets è insicura, e strlen non conteggia il carattere nullo finale...
Usa cin.getline al posto di gets.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
|
|
|
|
#7 |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 9
|
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. |
|
|
|
|
|
#8 |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 9
|
Ah quasi dimenticavo...grazie infinite a tutti per le risposte!
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
Quote:
__________________
Il sole è giallo |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
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++. |
|
|
|
|
|
|
#11 | |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 9
|
Quote:
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... |
|
|
|
|
|
|
#12 | |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 9
|
Quote:
Per carità non mi hai capita! Il primo pezzo è il mio! Quello che fa più schifo! Cmq scusami ancora e grazie ancora a tutti per le risposte! |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
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
__________________
Il sole è giallo |
|
|
|
|
|
#14 | |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 9
|
Quote:
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. :\ |
|
|
|
|
|
|
#15 |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 9
|
uppino plz
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Quando i cavalli di razza titubano, tocca agli asini salire in cattedra. Eccomi
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. Codice:
#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';
}
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#17 |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 9
|
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! |
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
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. |
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Tutti i commenti erano sull'allegro andante. Quello compreso. Vale come "è troppo facile per essere anche giusto".
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:52.




















