STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

di il
30 risposte

30 Risposte - Pagina 2

  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    Chiedo scusa a tutti, non è un momento facile, ho avuto una reazione esagerata, penso possa capitare a tutti..
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    No non capita a tutti
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    Ok, continuiamo in topic.
    Ricorda un paio di cose:
    - molti di quelli che scrivono cercando di aiutare sono professionisti cioè lavorano e dedicano parte del loro tempo per aiutare gratis il prossimo
    - leggere il codice altrui richiede tempo
    - una risposta sintetica non è una risposta "cattiva", se il compilatore ti dice "Sintax Error in line 10" si limita ad esporre un fatto, non fa commenti!

    Rileggi i commenti precedenti, se non sono chiari cerca di spiegarci cosa non capisci, semplice!
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    FND1 ha scritto:


    Nippolo ha scritto:


    Aggiungo che l'impostazione logica del programma può essere notevolmente semplificata.
    In che modo?
    Sia m una variabile intera.
    Scandisci la stringa carattere per carattere, se si tratta di una consonante allora aumenti m di un'unità, se si tratta invece di una vocale prima controlli se m == M e poi riazzeri m.
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    Nippolo ha scritto:


    FND1 ha scritto:


    Nippolo ha scritto:


    Aggiungo che l'impostazione logica del programma può essere notevolmente semplificata.
    In che modo?
    Sia m una variabile intera.
    Scandisci la stringa carattere per carattere, se si tratta di una consonante allora aumenti m di un'unità, se si tratta invece di una vocale prima controlli se m == M e poi riazzeri m.
    Grazie mille per l'osservazione, domani riscrivo il programma!
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    nicolap ha scritto:


    Ok, continuiamo in topic.
    Ricorda un paio di cose:
    - molti di quelli che scrivono cercando di aiutare sono professionisti cioè lavorano e dedicano parte del loro tempo per aiutare gratis il prossimo
    - leggere il codice altrui richiede tempo
    - una risposta sintetica non è una risposta "cattiva", se il compilatore ti dice "Sintax Error in line 10" si limita ad esporre un fatto, non fa commenti!

    Rileggi i commenti precedenti, se non sono chiari cerca di spiegarci cosa non capisci, semplice!
    Hai perfettamente ragione e non capita spesso che io abbia una reazione spropositata, in ogni caso apprezzo qualsiasi tipo di risposta e capisco perfettamente che ci possano essere professionisti che dedicano il loro tempo magari in queste risposte, non concepisco però osservazioni banali come la e accentata che mi è stata fatta precedentemente, professionisti e non, siamo sempre persone che hanno una dignità, persone che studiano o che hanno studiato, che hanno formazione ed una cultura,chi programma in c++ e va a fare delle stampe o usa semplicemente dei caratteri sa benissimo che ci potranno essere errori con la è e non con la e', il succo del discorso sempre quello è, scusa per il piccolo sfogo e grazie dei consigli!
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    Ciao ,
    Vorrei provarci anche io. Non credo di suggerire nulla visto che sono all'inizio
    riporto qui il testo:

    FND1 ha scritto:


    Ciao a tutti, ho il seguente programma da scrivere: scrivere un programma in C++ che, letti da input un intero positivo N, un intero positivo M e una stringa di al più 100 caratteri, stampi “OK” se esistono almeno N vocali che precedono di esattamente M consonanti un’altra vocale e stampi “NO” altrimenti. Si può supporre che la stringa contenga solo lettere dell’alfabeto minuscole.
    mi sembra di capire che le vocali per il testo sono tutte uguali. Vuole trovare almeno un tot di vocali seguite da una tot esatto di consonanti a loro volta seguite da almeno una vocale.(1)

    Visto che le vocali sono tutte uguali , io le converto in un unico carattere. Lo stesso vale per le consonanti.
    Mantengo numero di vocali e consonanti presenti nella stringa originale. Vuole una stringa di 100 chars, ma per fare un esempio , la scegliere più breve.
    M e N che sono i valori scelti dall'utente che andranno a formare un pattern

    esempio : allego immagine , non mi fa scrivere certi caratteri , non so quali
    esempio.jpg
    esempio.jpg

    voi che ne pensate?
    
    #include "pch.h"
    #include <iostream>      
    #include <string>        
    #include <cstddef>       
    #include <algorithm>
    using namespace std;
    
    int main()
    {
    	int nVocali;
    	cout << "Digitare un intero positivo N vocali:> ";
    	cin >> nVocali;
    	int nConsonanti;
    	cout << "Digitare un intero positivo N consonanti:> ";
    	cin >> nConsonanti;
    	cout << endl;
    	//Stringa di esempio
    	string centoChars("Xaaaacccexxxiiiivvvoxxxeeeekkk");
    	cout << "Stringa originale: " << centoChars << endl;
    	char delimitatore = 'z';
    	centoChars += delimitatore;
    	
    	//Convertiamo tutte le vocali in '$'
    	std::size_t vocali= centoChars.find_first_of("aeiou");
    	while (vocali != string::npos)
    	{
    		centoChars[vocali] = '$';
    		vocali = centoChars.find_first_of("aeiou", vocali + 1);
    	}
    	//Convertiamo anche le consonanti. Otteniamo l'indice di ogni carattere di centoChars.
    	//Tutti i caratteri diversi da $ diventano consonanti.
    	int pos;
    	for (char& id : centoChars) {
    		pos = &id - &centoChars[0];
    		if (id != '$') 	centoChars.replace(pos, 1, "+"); 
    	}
    	//Creiamo il nostro pattern con dimensioni dipendenti dalle scelte precedenti dell'utente
    	string pattern = string(nVocali, '$') + string(nConsonanti, '+');
    	cout << "Stringa convertita: " << centoChars << endl;
    	cout << "Pattern: " << pattern << endl;
    
    	//Inizio la ricerca del pattern
    	size_t patternPos = centoChars.find(pattern);
    	char checkVocaleDopoConsonanti = centoChars.at(patternPos + pattern.length());
    	if (checkVocaleDopoConsonanti == '$') cout << "Trovato pattern alla pos: " << patternPos << endl;
    
    	while (patternPos != string::npos) {
    		patternPos = centoChars.find(pattern, patternPos + 1);
    		checkVocaleDopoConsonanti = centoChars.at(patternPos + pattern.length());
    		if (checkVocaleDopoConsonanti == '$') cout << "Trovato pattern alla pos: " << patternPos << endl;
    	}
    	return 0;
    }
    
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    None ha scritto:


    Costruisco il pattern:
    Se N=4 e M=3, dove N rappresentano le vocali e M le consonanti
    pattern : $$$$+++
    Io ho interpretato la traccia diversamente, ossia M rappresenta il numero di consonanti che vanno a formare una sequenza delimitata agli estremi da due vocali (per M=3 e utilizzando la tua simbologia il pattern sarebbe +$$$+), mentre N rappresenta il numero minimo di sequenze/pattern da trovare.

    Per esempio considerando il seguente input
    N=2
    M=3
    stringa: aaqqqa
    il programma secondo la mia interpretazione dovrebbe restituire NO, mentre secondo la tua interpretazione dovrebbe restituire OK.

    Considerando invece il seguente input
    N=2
    M=3
    stringa: aqqqaqqqa
    il programma secondo la mia interpretazione dovrebbe restituire OK, mentre secondo la tua interpretazione dovrebbe restituire NO.
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    Ciao ,

    magari non ho capito niente
    Quello che mi ha convinto ( o tratto in inganno ) è questa frase :
    stampi “OK” se esistono almeno N vocali che precedono di esattamente M consonanti un’altra vocale e stampi “NO” altrimenti
    Quando dice "almeno" N vocali non dice "una" vocale. Speriamo rispondi FND1
    Se è come dici te , lo posso modificare
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    Ciao, allego i test case allegati alla traccia:

    Esempio 1.
    Se in input si ha N=4, M=3 e la stringa è
    cnakdnabrevcpohfbakdnoiucnic
    il programma dovrà stampare “OK”. Infatti, le 4 vocali evidenziate in rosso: a, e, o, a, distano tra loro di
    esattamente 3 consonanti:
    • La prima a precede di tre consonanti k, d, n la seconda a;
    • La e precede la o di tre consonanti v,c,p;
    • La o precede di tre consonanti h,f,b, la terza a
    • La terza a precede la seconda o di tre sono i consonanti k, d, n.
    Esempio 2.
    Se in input si ha N=3, M=4 e la stringa è
    cnakdnfabreuvcpohlfbakdnoiucnic
    il programma dovrà stampare “NO”. Infatti, ci sono solo 2 vocali che precedeno di esattamente 4
    consonanti un’altra vocale (la prima e l’ultima a) .
    Esempio 3.
    Se in input si ha N=1, M=3 e la stringa è
    canakdn
    il programma dovrà stampare “NO”.
    Esempio 4.
    Se in input si ha N=1, M=3 e la stringa è
    canakdne
    il programma dovrà stampare “OK”.
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    Allora avevo interpretato bene la traccia!

    @FND1 poi hai modificato il programma?
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    Nippolo ha scritto:


    Allora avevo interpretato bene la traccia!

    @FND1 poi hai modificato il programma?

    Ok allora provo a modificarlo. Se ho capito bene avrò sempre una vocale agli "estremi" della sequenza , mentre nel mezzo un
    numero di consonanti pari a M. Se trovo N sequenze , posso scrivere "OK"
    Ho fatto esercizio anche sbagliando
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    Non vedendo nessuna risposta da FND1 , posta la mia rivista
    
    bool sequenza(string str, int nConsonanti, int nVocali) {
    
    	//Convertiamo tutte le vocali in '$'
    	std::size_t vocali = str.find_first_of("aeiou");
    	while (vocali != string::npos)
    	{
    		str[vocali] = '$';
    		vocali = str.find_first_of("aeiou", vocali + 1);
    	}
    	//Convertiamo anche le consonanti. Otteniamo l'indice di ogni carattere di str.
    	//Tutti i caratteri diversi da $ diventano consonanti.
    	int pos;
    	for (char& id : str) {
    		pos = &id - &str[0];
    		if (id != '$') 	str.replace(pos, 1, "+");
    	}
    	//Creiamo il nostro pattern con un numero di consonanti impostato dall'utente (M)
    	string pattern = string(1, '$') + string(nConsonanti, '+') + string(1, '$');
    	cout << pattern << endl;
    
    	//Inizio la ricerca del pattern
    	size_t patternPos = str.find(pattern);
    	int contN = 0;
    	while (patternPos != string::npos)
    	{
    		contN++;
    		patternPos = str.find(pattern, patternPos + 1);
    	}
    	return contN>=nVocali;
    }
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    Io invece intendevo semplicemente qualcosa del genere:
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    bool is_vocale(const char c)
    {
        if(c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
        {
            return true;
        }
        return false;
    }
    
    int main()
    {
        int N;
        int M;
        string str;
        cout << "N: ";
        cin >> N;
        cout << "M: ";
        cin >> M;
        cout << "STRINGA: ";
        cin >> str;
    
        unsigned int dim = str.size();
        unsigned int i = 0;
        int m = -1;
        while(i < dim)
        {
            if(is_vocale(str[i++]))
            {
                if(m == M)
                {
                    if(!(--N))
                    {
                        break;
                    }
                }
                m = 0;
            }
            else if(m >= 0)
            {
                ++m;
            }
        }
    
        if(N)
        {
            cout << "NO";
        }
        else
        {
            cout << "SI";
        }
    }
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    Nippolo ha scritto:


    Io invece intendevo semplicemente qualcosa del genere:
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    bool is_vocale(const char c)
    {
        if(c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
        {
            return true;
        }
        return false;
    }
    
    int main()
    {
        int N;
        int M;
        string str;
        cout << "N: ";
        cin >> N;
        cout << "M: ";
        cin >> M;
        cout << "STRINGA: ";
        cin >> str;
    
        unsigned int dim = str.size();
        unsigned int i = 0;
        int m = -1;
        while(i < dim)
        {
            if(is_vocale(str[i++]))
            {
                if(m == M)
                {
                    if(!(--N))
                    {
                        break;
                    }
                }
                m = 0;
            }
            else if(m >= 0)
            {
                ++m;
            }
        }
    
        if(N)
        {
            cout << "NO";
        }
        else
        {
            cout << "SI";
        }
    }
    Grazie mille, ho riscritto il codice e funziona, ho provato anche questo ed è corretto
Devi accedere o registrarti per scrivere nel forum
30 risposte