Programma con uso di array

di Anonimizzato8504 il
19 risposte
Avrei bisogno di una mano per risolvere questo esercizio di array
ecco il testo
Scrivere una funzione C++ che, data una stringa s,
restituisce la stringa ottenuta rimuovendo da s tutti i caratteri che sono
immediatamente seguiti da due vocali.
Esempio1: s= “Priamo”. Il metodo restituisce la stringa “Piamo” (rimossa la r).
Esempio 2: s= “aiuola”. Il metodo restituisce “uola” (rimossi a ed i ).
Esempio 3: s= “pippo”. Il metodo restituisce “pippo” (nessun carattere rimosso)


#include<iostream>
#include<string>
using namespace std;
string new_stringa(string s, string t){
int ls=s.length();
int i;
for(i=1;i<ls;i++){
if(s.substr(i,1)=="a"||"e"||"i"||"o"||"u" && s.substr(i+1,1)=="a"||"e"||"i"||"o"||"u")
t=s.substr(i,ls-i);
}
cout<<t;
}

int main(){
string p;
string r=p;
cout<<"Inserisci una stringa"<<endl;
cin>>p;
new_stringa(p,r);

return 0;
}

19 Risposte

  • Cos'è questo
    
    if(s.substr(i,1)=="a"||"e"||"i"||"o"||"u" && s.substr(i+1,1)=="a"||"e"||"i"||"o"||"u")
    
  • È ciò che verifica la condizione richiesta nell'esercizio
    o almeno dovrebbe
    come posso risolvere?
  • Praticamente volevo dire che scorrendo lettera per lettera a partire dalla prima non appena incontra una vocale e pure la seguente è anch'essa vocale allora la condizione viene verificata
  • Come si verifica una multi espressione dentro un if,while ecc?
  • Non capisco
    non so che dirti
    ma dov'è l'errore
    è generico(cioè nell'algoritmo) o c'è solamente qualche piccola imprecisione?
  • 
    if((a == b ) || (a == c))
    non
    
    if((a == b) || c)
    
    capito adesso
  • Credo di si
    ma quello che non ho capito e se così facendo il programma o l'agoritmo di per sè siano corretti
    che dici allora?
  • E' un brutte force, ci sono molti altri modi migliori per fare sta cosa. Non ho provato il programma quindi non so se l'algoritmo è corretto.
  • Insomma qualcuno mi può aiutare e trovare un algoritmo per risolvere questo esercizio?
    grazie anticipatamente
  • Prima impara a scrivere codice corretto poi inizia a sviluppare algoritmi. Impara anche ad usare funzioni. Una funzione utlie può essere quella che prende in ingresso un carattere e che ti ritorna true se è una vocale. Spezzettare un problema in piccole parti fa parte della programmazione, se non sei capace a fare questo non riusciresti mai a capire un algoritmo. Sei capace a fare una funzione simile?
  • Ecco qua ho corretto qualche errore formale
    
    
    
    #include<iostream>
    #include<string>
    using namespace std;
    string new_stringa(string s, string t){
    int ls=s.length();
    int i;
    for(i=1;i<ls;i++){
    string prec=s.substr(i,1);
    string succ=s.substr(i+1,1);
    if((prec=="a")||(prec=="e")||(prec=="i")||(prec=="o")||(prec=="u") && (succ=="a")||(succ=="e")||(succ=="i")||(succ=="o")||(succ=="u"))
    t=s.substr(0,i-2)+s.substr(i,ls-i);
    }
    cout<<t;
    return t;
    }
    
    
    int main(){
    string p;
    string r=p;
    cout<<"Inserisci una stringa"<<endl;
    cin>>p;
    new_stringa(p,r);
    
    return 0;
    }
    
  • Confrontalo col mio adesso.
    
    #include <iostream>
    #include <set>
    #include <string>
    #include <algorithm>
    
    std::set<char> vocali;
    
    
    
    bool isVowel(const char & c)
    {
    	return (vocali.find(c) != vocali.end());
    }
    
    struct predicate
    {
    	predicate(const std::string & str) : m_str(str) , lastPos(0){}
    
            const bool operator()(char ch) 
            {
    			size_t pos = m_str.find(ch,lastPos);
    			if(pos + 2 < m_str.length())
    			{
    				lastPos = pos + 1;
    				return (isVowel(m_str[++pos])) && (isVowel(m_str[++pos]));
    			}
    			return false;
            }
    
            private:
    			const std::string m_str;
    			size_t lastPos;
    };
    
    
    int main()
    {
    	vocali.insert('a');
    	vocali.insert('e');
    	vocali.insert('i');
    	vocali.insert('o');
    	vocali.insert('u');
    
    	std::string str("aiuola");
    
    	predicate prd(str);
    	str.erase(std::remove_if(str.begin(),str.end(),prd),str.end());
    
    	std::cout << str;
    }
    
    Come vedi l'algoritmo esiste e non c'è bisogno di fare mille if. Poi non capisco perche usi substr quando l'operatore [] offerto dalla stringa fa la stessa cosa.
  • Piccola modifica per eliminare il std::set che magari non hai ancora imparato.
    
    #include <iostream>
    #include <string>
    #include <algorithm>
    
    std::string vocali("aeiuo");
    
    bool isVowel(const char & c)
    {
    	return (vocali.find(c) != std::string::npos);
    }
    
    struct predicate
    {
    	predicate(const std::string & str) : m_str(str) , lastPos(0){}
    
            const bool operator()(char ch) 
            {
    			size_t pos = m_str.find(ch,lastPos);
    			if(pos + 2 < m_str.length())
    			{
    				lastPos = pos + 1;
    				return (isVowel(m_str[++pos])) && (isVowel(m_str[++pos]));
    			}
    			return false;
            }
    
            private:
    			const std::string m_str;
    			size_t lastPos;
    };
    
    
    int main()
    {
    	std::string str("aiuola");
    
    	predicate prd(str);
    	str.erase(std::remove_if(str.begin(),str.end(),prd),str.end());
    
    	std::cout << str;
    }
    
  • Si ma non l'hai eliminato std::set
    io non l'ho ancora imparato
    e poi volevo sapere
    se cortesemente me lo puoi far vedere come si risolve senza usare gli struct
    grazie anticipatamente
Devi accedere o registrarti per scrivere nel forum
19 risposte