Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: MellaSystems en 23 Febrero 2015, 04:38 am



Título: error logico ayuda con este programa
Publicado por: MellaSystems en 23 Febrero 2015, 04:38 am
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
  1. #include <iostream>
  2. #include <string>
  3.  
  4. class cCadena{
  5.      private:
  6.              std::string CadCar;
  7.      public:
  8.             void setCadCar(std::string pCadCar){CadCar=pCadCar;}
  9.             std::string getCadCar(){
  10.                  return CadCar;
  11.                  }
  12.  
  13.             void ImpHorizontal(){
  14.                  std::cout<<CadCar<<std::endl;
  15.                  }
  16.  
  17.             void ImpVertical(){
  18.                  for(int i=0;i<CadCar.length();i++)
  19.                      std::cout<<CadCar[i]<<"\n";      
  20.                  }
  21.  
  22.             bool esVocal(){
  23.                  for(int i=0; CadCar[i]!='\0'; i++){
  24.                  if (CadCar[i] =='A' || CadCar[i] =='E' || CadCar[i] =='I' || CadCar[i] =='O' || CadCar[i] =='U'
  25.                      || CadCar[i] =='a' || CadCar[i] =='e' || CadCar[i] =='i' || CadCar[i] =='o' || CadCar[i] =='u'){
  26.                       return true;
  27.                       }
  28.                       else
  29.                        return false;
  30.                     }
  31.                  }
  32.  
  33.             void ImpCantVocales(){
  34.                  int CanVoc=0;
  35.                  if (esVocal())
  36.                     {
  37.                     CanVoc++;
  38.                        }
  39.               std::cout<<"\nLa cadena tiene "<< CanVoc <<" vocales"<< std::endl;
  40.                  }
  41.  
  42.      };
  43.  
  44. main(){
  45.       cCadena oCadena;
  46.       oCadena.setCadCar("UASD");
  47.       oCadena.ImpHorizontal();
  48.       //oCadena.ImpVertical();
  49.       oCadena.ImpCantVocales();
  50.      // oCadena.ImpCantConsonantes();
  51.  
  52.       system("pause");
  53.       }
  54.  
  55.  

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

y alguien es tan amable de explicarme este codigo?
Código
  1. void displayMaxCharacterWords(std::string& cadena )
  2. {
  3.  std::string palabra;
  4.  string::iterator it = cadena.begin( );
  5.  
  6.  for( string::iterator it2 = it; it2 != cadena.end( ); ++it2 )
  7.  {
  8.    if ( *it2 == ' '  || *it2 == ',' || *it2 == '.' )
  9.    {
  10.      size_t length = std::distance( it, it2 );
  11.      if ( length > palabra.size( ) )
  12.        palabra = std::string(it, it2 );
  13.      it = it2+1;
  14.    }
  15.  }
  16.  
  17.  std::cout << "\n\nLa palabra mas larga de la cadena es: "<< palabra << std::endl;
  18. }
  19.  


Título: Re: error logico ayuda con este programa
Publicado por: engel lex en 23 Febrero 2015, 04:56 am
el error logico
Código
  1. if (esVocal())
  2.                     {
  3.                     CanVoc++;
  4.                        }
junto con
Código
  1. if (CadCar[i] =='A' || CadCar[i] =='E' || CadCar[i] =='I' || CadCar[i] =='O' || CadCar[i] =='U'
  2.                      || CadCar[i] =='a' || CadCar[i] =='e' || CadCar[i] =='i' || CadCar[i] =='o' || CadCar[i] =='u'){
  3.                       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í (http://www.cplusplus.com/reference/string/string/)

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



Título: Re: error logico ayuda con este programa
Publicado por: MellaSystems en 23 Febrero 2015, 05:16 am
Asi dices
Código
  1. bool esVocal(){
  2.                  for(int i=0; CadCar[i]!='\0'; i++)
  3.                  if (CadCar[i] =='A' || CadCar[i] =='E' || CadCar[i] =='I' || CadCar[i] =='O' || CadCar[i] =='U'
  4.                      || CadCar[i] =='a' || CadCar[i] =='e' || CadCar[i] =='i' || CadCar[i] =='o' || CadCar[i] =='u')
  5.                       return true;
  6.                  }
  7.  
  8.             int ImpCantVocales(){
  9.                  int CanVoc=0;
  10.                  if (esVocal()){
  11.                     CanVoc++;
  12.                     return CanVoc;}
  13.                  }
  14.  

eso fue lo que entendi jejejej


Título: Re: error logico ayuda con este programa
Publicado por: engel lex en 23 Febrero 2015, 05:23 am
no ...

sería


Código
  1. int esVocal(){
  2.    int contador = 0;
  3.    for//sin cambios...
  4.      if//sin cambios...
  5.        contador++;
  6.      }
  7.    }
  8.    return contador;
  9. }
  10.  


Título: Re: error logico ayuda con este programa
Publicado por: MellaSystems en 23 Febrero 2015, 05:35 am
no puedo hacer que la funcion es vocal me devuelva falso o verdadero? debe devolverme un entero?


Título: Re: error logico ayuda con este programa
Publicado por: engel lex en 23 Febrero 2015, 05:42 am
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
  1. int esVocal(char letra){
  2. //sin for
  3. //solo if
  4. }


Título: Re: error logico ayuda con este programa
Publicado por: MellaSystems en 23 Febrero 2015, 05:55 am
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


Título: Re: error logico ayuda con este programa
Publicado por: engel lex en 23 Febrero 2015, 06:05 am
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
  1. bool esVocal(char letra){
  2.  string vocales = "aeiouAEIOU";
  3.  for(int i=0; i<10 ; i++)
  4.    if(letra==vocales[i])
  5.      return true;
  6.  return false;
  7. }


Título: Re: error logico ayuda con este programa
Publicado por: MellaSystems en 23 Febrero 2015, 06:19 am
Gracias amigo. ;-) ;-)