error logico ayuda con este programa

Iniciado por MellaSystems, 23 Febrero 2015, 04:38 AM

0 Miembros y 1 Visitante están viendo este tema.

MellaSystems

Tengo este codigo  creado por mi mismo pero me da un error logico porque al ejecutarlo me dice que la cadena "UASD" solo tiene una vocal y es mentira.
Código (cpp) [Seleccionar]

#include <iostream>
#include <string>

class cCadena{
      private:
              std::string CadCar;
      public:
             void setCadCar(std::string pCadCar){CadCar=pCadCar;}
             std::string getCadCar(){
                  return CadCar;
                  }
                 
             void ImpHorizontal(){
                  std::cout<<CadCar<<std::endl;
                  }
                 
             void ImpVertical(){
                  for(int i=0;i<CadCar.length();i++)
                      std::cout<<CadCar[i]<<"\n";       
                  }
                 
             bool esVocal(){
                  for(int i=0; CadCar[i]!='\0'; i++){
                  if (CadCar[i] =='A' || CadCar[i] =='E' || CadCar[i] =='I' || CadCar[i] =='O' || CadCar[i] =='U'
                      || CadCar[i] =='a' || CadCar[i] =='e' || CadCar[i] =='i' || CadCar[i] =='o' || CadCar[i] =='u'){
                       return true;
                       }
                       else
                        return false;
                     }
                  }
                 
             void ImpCantVocales(){
                  int CanVoc=0;
                  if (esVocal())
                     {
                     CanVoc++;
                        }
               std::cout<<"\nLa cadena tiene "<< CanVoc <<" vocales"<< std::endl;
                  }
     
      };
     
main(){
       cCadena oCadena;
       oCadena.setCadCar("UASD");
       oCadena.ImpHorizontal();
       //oCadena.ImpVertical();
       oCadena.ImpCantVocales();
      // oCadena.ImpCantConsonantes();
       
       system("pause");
       }



me imprime que solo existe una vocal ayuda por favor!!!

y alguien es tan amable de explicarme este codigo?
Código (cpp) [Seleccionar]

void displayMaxCharacterWords(std::string& cadena )
{
  std::string palabra;
  string::iterator it = cadena.begin( );

  for( string::iterator it2 = it; it2 != cadena.end( ); ++it2 )
  {
    if ( *it2 == ' '  || *it2 == ',' || *it2 == '.' )
    {
      size_t length = std::distance( it, it2 );
      if ( length > palabra.size( ) )
        palabra = std::string(it, it2 );
      it = it2+1;
    }
  }

  std::cout << "\n\nLa palabra mas larga de la cadena es: "<< palabra << std::endl;
}

engel lex

#1
el error logico
Código (cpp) [Seleccionar]
if (esVocal())
                    {
                    CanVoc++;
                       }

junto con
Código (cpp) [Seleccionar]
if (CadCar[i] =='A' || CadCar[i] =='E' || CadCar[i] =='I' || CadCar[i] =='O' || CadCar[i] =='U'
                     || CadCar[i] =='a' || CadCar[i] =='e' || CadCar[i] =='i' || CadCar[i] =='o' || CadCar[i] =='u'){
                      return true;


si tiene vocal retorna true... listo, fin de la funcion... no se repite porque el return es definitivo, ya salió de la función... en tal caso tienes que llevar un contardor y retornar un int

te recomiendo que uses el debuuger de tu ide para que puedas visualizarlo...


sobre el segundo... los "iterator" son como punteros, pero con funciones divertidas... más info aquí

en la linea 4, crea un iterador y lo apunta al inicio

en el for, crea un iterador y lo apunta al primero, si el iterador no llega al final, lo avanza 1

el if comprueba el caracter apuntado

distance( it, it2 ); mide la distancia entre 2 punteros

string(it, it2 ); retorna el string creado por el contenido entre los 2 punteros

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

MellaSystems

Asi dices
Código (cpp) [Seleccionar]

bool esVocal(){
                  for(int i=0; CadCar[i]!='\0'; i++)
                  if (CadCar[i] =='A' || CadCar[i] =='E' || CadCar[i] =='I' || CadCar[i] =='O' || CadCar[i] =='U'
                      || CadCar[i] =='a' || CadCar[i] =='e' || CadCar[i] =='i' || CadCar[i] =='o' || CadCar[i] =='u')
                       return true;
                  }
                 
             int ImpCantVocales(){
                  int CanVoc=0;
                  if (esVocal()){
                     CanVoc++;
                     return CanVoc;}
                  }


eso fue lo que entendi jejejej

engel lex

no ...

sería


Código (cpp) [Seleccionar]
int esVocal(){
    int contador = 0;
    for//sin cambios...
      if//sin cambios...
        contador++;
      }
    }
    return contador;
}
 
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

MellaSystems

no puedo hacer que la funcion es vocal me devuelva falso o verdadero? debe devolverme un entero?

engel lex

puedes, pero entonces tendrás que pasarle como parametro una sola letra (como sería logico según su nombre de funcion, ya que to no te digo "hola" es vocal o no :P)

y sería algo como

Código (cpp) [Seleccionar]
int esVocal(char letra){
//sin for
//solo if
}
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

MellaSystems

jejejje Gracias pero eso lo tenia hace un rato de esa manera que me lo planteas y me decia que era solo una vocal jajajajajja.

Pense que podia haber una manera de yo pasar el String y recorriega cada letra y me dijese si era una vocal true. jejeje es que necesito hacer esa funcion para hacerme la vida mas facil con las consonantes

engel lex

el asunto es que si retorna bool como esperas que te digas cuantas fueron? XD...

hazlo como te lo planteo... pero el for va en ImpCantVocales que es ña funcion encargada de contar vocales...

una buena forma de estructurar tu codigo es pensar que es una oficina... no pongas a gente a hacer lo que no le toca... XD

ImpCantVocales cuenta las vocales, pero esVocal decide si es verdadero o falso que lo que recibió es una vocal

esVocal por que se vea bien yo lo haría

Código (cpp) [Seleccionar]
bool esVocal(char letra){
 string vocales = "aeiouAEIOU";
 for(int i=0; i<10 ; i++)
   if(letra==vocales[i])
     return true;
 return false;
}
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.