elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  (Aporte) Diagrama de flujo del operador std::cin>> (std::istream>>)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: (Aporte) Diagrama de flujo del operador std::cin>> (std::istream>>)  (Leído 2,172 veces)
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
(Aporte) Diagrama de flujo del operador std::cin>> (std::istream>>)
« en: 2 Noviembre 2015, 09:21 am »

Hola a todos. He visto que muchos de mis amigos y que algunas personas de Internet no comprenden muy bien que es lo que hacen cuando usan std::cin >> variable. Por esto mismo, y pareciendo ser una tontería, he diseñado un pequeño diagrama de flujo para que así vea la gente como funciona. Aquí os lo dejo



Procedo a explicarlo. Lo primero que tenemos que saber es que hay un buffer por ahí que guarda lo que metemos por consola. Entonces, lo primero que hace std::cin>> es comprobar que no haya datos en ese buffer. Si no los hay, entonces procedemos a pedir datos por la consola. Si le damos a enter sin meter nada, entonces se imprimirá un espacio de línea y te pedirá de nuevo que ingreses datos (pues no has ingresado nada), y así hasta que introduzcas algún dato. Entonces, sabiendo que el buffer que maneja std::cin tiene algo, procedemos a comprobar. Lo primero que tenemos que saber es que std::cin recogerá datos de su buffer (que es como una cadena de caracteres) hasta que se encuentre con un espacio (' ') o un salto de línea ('\n'). Entonces, comprobamos si esos datos pueden ser almacenados en la variable que queríamos modificar. Por ejemplo, si la variable es de tipo entero pero "Hola", entonces se determina que no son datos compatibles. En ese caso, a esa variable se le asigna el valor 0 y se establece una bandera de error para que así sepamos que ha habido un error. Date cuenta que si los datos no corresponden, el buffer no se limpia, sino que permanece con los datos introducidos. Pero si los datos concuerdan, entonces se transforman al tipo de variable de entrada y se eliminan esos datos del buffer que maneja std::cin (se eliminan los datos hasta el espacio o salto de línea) y en último lugar se imprime un salto de línea.

Espero que lo hayan entendido y que despeje muchas dudas :D

Ejemplos prácticos de las consecuencias de este diagrama:

Código
  1. #include <iostream>
  2. #include <limits>
  3.  
  4. int main() {
  5.    int nValor = 1;
  6.    std::string cString;
  7.  
  8.    std::cout << "Introduzca un número: ";
  9.    std::cin >> nValor;
  10.  
  11.    std::cin >> cString;
  12.  
  13.    std::cout << "nValor = " << nValor << std::endl;
  14.    std::cout << "cString = \"" << cString << "\"";
  15.  
  16.    std::cin.clear();
  17.    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  18.    std::cin.get();
  19.    return 0;
  20. }

Si compilamos y ejecutamos este código, obtendremos la siguiente salida (la salida está enmarcada. Lo otro son explicaciones):

Código:
Introduzca un número: 
Puesto que inicialmente el buffer que maneja std::cin está vacio, entonces el programa se detiene ahí para que introduzcas algo.
Vamos a teclear Hola (que evidentemente no es un entero como se pide) para ver que pasa:

Vamos a comprobar si estáis atentos. ¿Qué debería pasar ahora?

Bien, lo que va a pasar ahora es que std::cin >> cString va a ver que el buffer ya tiene datos guardados (no se han eliminado puesto que se ha producido un error), por lo que el thread no se va a detener como esperaríamos desde un principio, sino que directamente va a asignar esos datos a cString (aquí no hay ningún error, pues "Hola" es un string)

Entonces, una vez pulsado enter al introducir hola, la salida quedaría así:

Código:
Introduzca un número: Hola
nValor = 0
cString = "Hola"

Como veis, la variable 'nValor' tiene un valor de 0, pese a que la hemos inicializado como 1. Eso quiere decir que std::cin ha cambiado el valor de esta variable a 0 (tal y como sale en el diagrama).

Bueno, eso es todo. La mejor manera de que lo veáis es que ejecutéis el código por vosotros mismos y experimentéis. Un último apunte: la función std::cin.clear() lo que hace es limpiar la lista de errores producidos, no limpia el buffer!

Gracias por su atención.

Se aceptan sugerencias y/o optimicaciones :D


« Última modificación: 2 Noviembre 2015, 09:41 am por class_OpenGL » En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
Erecc

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: (Aporte) Diagrama de flujo del operador std::cin>> (std::istream>>)
« Respuesta #1 en: 2 Noviembre 2015, 10:04 am »

Que grande tio, muchas gracias!!! estoy en clase pero en poder le voy a dar un buen ojo XP


En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: (Aporte) Diagrama de flujo del operador std::cin>> (std::istream>>)
« Respuesta #2 en: 2 Noviembre 2015, 11:17 am »

De nada! Cualquier duda, o si ves algún error, coméntalo!
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Diagrama de Flujo (duda)
Programación C/C++
Raastah 4 9,525 Último mensaje 20 Abril 2011, 07:13 am
por <<<-Basura->>>
practica de diagrama de flujo
Programación Visual Basic
el.benefactor 1 3,183 Último mensaje 2 Octubre 2011, 01:59 am
por raul338
practica de diagrama de flujo
Ejercicios
el.benefactor 1 7,394 Último mensaje 2 Octubre 2011, 22:42 pm
por s00rk
Duda con diagrama de flujo
ASM
.:UND3R:. 2 4,108 Último mensaje 5 Enero 2012, 10:46 am
por .:UND3R:.
ayuda diagrama de flujo DFD
Ejercicios
Kacoae 0 2,809 Último mensaje 30 Mayo 2013, 16:53 pm
por Kacoae
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines