Problemas con c++.

Iniciado por #Aitor, 24 Marzo 2014, 08:09 AM

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

#Aitor

Hola buenas estoy empezando con C++ y se me puse hacer el tonto, quería escribir un string en la consola, y que en la salida de ésta lo mostrase al revés.

Estuve mirando y lo que más fácil me pareció fue contar los caracteres que tenía el string, meterlo en un ciclo y que los recorriese uno a uno desde el final hasta el principio. De modo que generé este código.

Código (c++) [Seleccionar]
#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;

int main() {

    string cadena;
    cin >> cadena;

    int f = strlen(Cadena);


while ( f >= 0){
cout << char(Cadena[f-1]);
f--;

}

}


Pero no se podía compilar, generaba un error que decía Cadena was not declared in the scape. En la linea 12 es decir...

Código (c++) [Seleccionar]
    int f = strlen(Cadena);

Después estuve leyendo sobre Strlen en la página de c++
http://www.cplusplus.com/reference/cstring/strlen/

Por lo que acabé generando este código.

Código (c++) [Seleccionar]
#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;

int main() {

    char Cadena[256];
    gets(Cadena);

int f = strlen(Cadena);


while ( f >= 0){
cout << char(Cadena[f-1]);
f--;

}

}


En este, si compilaba y funcionaba perfecto, pero no entendía muy bien el código, en especial

Código (c++) [Seleccionar]
char Cadena[256];

¿A qué se refiere ese 256 en ASCII (Supongo)? ¿Por qué sin el genera un error en el gets?

Y por último.. ¿Qué es gets?

Código (c++) [Seleccionar]
gets(Cadena);

Parece que actuase como un Cin ¿Cuál es la diferencia?.

Gracias por la ayuda.

Saludos!
Mi algoritmo en PHP (estupideces y más).
Código (php) [Seleccionar]
while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}

amchacon

Estas mezclando muchas cosas....

El primer ejemplo funcionaba, lo que pasa es que no tienes que usar srttlen sino el método size:

Cadena.size()

Tampoco hace falta hacerle un cast a los caracteres que saques por [].
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

eferion

#2
Código (cpp) [Seleccionar]
string cadena;

"cadena", tal y como la has declarado, es de tipo "string".

En C++, "string" es una clase y como tal tiene una serie de funciones y métodos a modo de interfaz que te permiten utilizarla.

Para el caso que comentas debes saber que las clases de C++ no las puedes usar como si fuese C. Son cosas diferentes.

Si miras la documentación de la clase string, verás que tiene un método "size( )", como te comento amchacon. Este método te devuelve la longitud de la cadena almacenada en el objeto correspondiente.

Código (cpp) [Seleccionar]

#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;

int main()
{
 string cadena;
 cin >> cadena;

 int f = cadena.size( );

 while ( f >= 0)
 {
   cout << char( cadena[ f-1 ] );
   f--;
 }
}


Ahora el código compila, que no es poco. Sin embargo, tu bucle tiene demasiado código para lo que hace:

* Si usas C++ no pongas includes de C ( los que acaban en .h )
* No hace falta hacer un cast a char, ya que la clase std::string gestiona un array de char internamente.
* f-1 y f-- viene a ser más o menos lo mismo... estás haciendo dos veces lo mismo.
* while ( f>=0 )... si estás decrementando dentro del bucle tienes un problema... si f == 0, entonces cout << char( cadena[ 0-1 ] ); ... te puedes hacer a la idea.

Código (cpp) [Seleccionar]

#include <iostream>
#include <string>

using namespace std;

int main()
{
 string cadena;
 cin >> cadena;

 int f = cadena.size( ) - 1;

 while ( f >= 0)
 {
   cout << cadena[ f ];
   f--;
 }
}


Por cierto, aunque no venga a cuento del hilo:

Código (php) [Seleccionar]

while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}


Así queda más claro ;)

#Aitor

#3
Buenas, muchas gracias a los dos por resolver mis dudas en gran medida.

Se agradece la limpieza del código tanto  el del hilo como el de la firma. También me llamó mucho la atención el -1 que usaba en el [f-1] acabar poniéndolo después de contar la longitud de caracteres. Pareciese una obviedad pero no lo había visto tan claro como hasta ahora.

¿A qué os referís cuando decís cast?

También aprovecho y os pregunto una cosita más, actualmente hago 'intento' de aprender c++ de Pau Fernández (No sé si lo conoceréis, pero me gustó su forma de explicar en los vídeos, y su página). Ahora bien, ¿recomendáis algún otro que no sea 0utkast? Sinceramente con Jesús conde (0utkast) acabo muriendo de aburrimiento.

¿Hay algún reference como en php lo es www.php.net? Me refiero a algo oficial o por el estilo.

Sin más, de nuevo agradezco la ayuda aquí dada.

Un saludo!
Mi algoritmo en PHP (estupideces y más).
Código (php) [Seleccionar]
while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}

amchacon

Yo la referencia la cojo de aquí:
http://www.cplusplus.com/reference/

Ahí arriba en la barra "buscar", pones el objeto que quieras mirar y ya lo tienes. Otra opción es buscarlo en google con la sufijo "C++", suele ser el primer resultado:
Citarstring c++
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

eferion

Cita de: #Aitor en 24 Marzo 2014, 12:16 PM
¿A qué os referís cuando decís cast?

Cast es una operación de conversión:

Código (cpp) [Seleccionar]

int numero = -5;

cout << numero << endl << (unsigned int ) numero << endl;


Las conversiones, en C++, se pueden hacer de dos formas:

* Usando la sintaxis de C (opción no recomendable ), esto es, poniendo entre paréntesis el tipo al que se quiere convertir el dato ( como el ejemplo anterior ).

* Usando la sintaxis de C++. C++ dispone de herramientas para hacer conversiones ( static_cast, dynamic_cast, reinterpret_cast, const_cast ). Cada una tiene un uso determinado, aunque las más comunes son static_cast y dynamic_cast.

Algunas de las ventaja de este tipo de conversiones frente a las clásicas de C:

* Es más fácil localizar las conversiones buscando en el código. No es lo mismo buscar static_cast que "( int )" + "(int)" + "( int)" + "(int )" + ...

* Ofrecen más seguridad en la conversión. Si la conversión no es segura o no se puede realizar aparecerá un error en compilación... sin embargo los conversores de C no dan nunca error.

#Aitor

Más o menos me hago una idea, gracias de nuevo a los dos.

Saludos!
Mi algoritmo en PHP (estupideces y más).
Código (php) [Seleccionar]
while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}