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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ciclo DO WHILE
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ciclo DO WHILE  (Leído 6,566 veces)
snoopty

Desconectado Desconectado

Mensajes: 86


Ver Perfil
Ciclo DO WHILE
« en: 7 Septiembre 2021, 10:48 am »

Hola a todos ! Respecto del Código que pondré a Continuación, yo sí entiendo que el Ciclo se cumple mientras se cumpla la condición impuesta por el WHILE, y cuando no se cumpla el Código continúa con lo que uno escriba - y NO necesariamente vinculado al Ciclo DO WHILE ya finalizado .... Pero no entiendo porqué " n " tiene ingerencia fuera del Ciclo : SÍ puedo entenderlo porque fue declarada antes del DO  .... pero lo que no entiendo realmente es que la línea ( cout << "Valor: " << n << endl; ) sea válida, pues este cout<< está DEPENDIENDO del cin>> que está dentro del Ciclo, que ya finalizó.
Aquí, el Código =


#include <iostream>

using namespace std;

int main()
{
   int n = 0;
   do
   {
      cout << "Introduzca un numero entre 1 y 9: ";
      cin >> n;
   } while (!(n > 0 && n < 10));
   cout << "Valor: " << n << endl;
}
/* Gracias por leer el mensaje */


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Ciclo DO WHILE
« Respuesta #1 en: 7 Septiembre 2021, 11:09 am »

El punto del bucle es forzar a que se introduzca un valor entre 1 y 9, y solo cuando esto ocurra n se usara, no es un contador. El bucle puede haber finalizado pero a la variable n se le asigno un valor y no lo pierde por haberse terminado ... su ambito no es el bucle.


En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Ciclo DO WHILE
« Respuesta #2 en: 7 Septiembre 2021, 14:03 pm »

Para entender cómo funciona eso debes comprender sobre el ámbito de las variables. Una variable existe desde el bloque que se crea (lo que hay dentro de unas llaves { }) y ocupa tanto a ese bloque como a todos los internos. Por lo tanto un bloque interno puede manipular una variable de un bloque más externo y esta se verá afectada pues sigue trabajando en su bloque.

Después está la ocultación: una puede declarar una variable en un bloque interno con el mismo nombre que una variable de un bloque externo. A partir de entonces y hasta el final de ese bloque interno cunado se nombre dicha variable hará referencia a la del bloque interno, la más externa está oculta del código.

Un programa ejemplo:
Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.    int dato = 6;
  5.  
  6.    printf("Dato del bloque externo: %d\n", dato);
  7.  
  8.    {
  9.        int dato = 7; // El dato de este bloque oculta al del bloque externo
  10.        printf("Dato dentro del primer bloque: %d\n", dato);
  11.    }
  12.  
  13.    printf("Dato del bloque externo: %d\n", dato);
  14.  
  15.    {
  16.        dato += 4; // Este dato es el del bloque externo
  17.        printf("Dato del segundo bloque: %d\n", dato);
  18.    }
  19.  
  20.    printf("Dato del bloque externo: %d\n", dato);
  21. }
En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Ciclo DO WHILE
« Respuesta #3 en: 7 Septiembre 2021, 19:38 pm »

Falta por terminar de aclarar, que 'cin' y 'cout' son funciones no variables, no están sometidas a restricción alguna por el bucle. Aunque las funciones al igual que las variables tienen un ámbito de uso, las que suelen proveerse a través de una cláusula include tienen un ámbito a nivel del módulo donde se declaran.

Lo que sucede con 'cin' y 'cout' es similar a si vas a comprar a un comercio, cada producto que compras sería como usar ese 'cin' dentro del bucle y cuando vas a a pagar sería ese 'cout' fuera del bucle...
¿No sería absurdo que por cada producto que compraras tuvieras que ir a pagarlo a la caja (tras un cin forzar un cout), acaso no es mejor 'acumular' todos tus productos y finalmente cuando 'termines' pasar por caja y pagar?.
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Ciclo DO WHILE
« Respuesta #4 en: 7 Septiembre 2021, 22:20 pm »

cin y cout no son funciones (las funciones se llaman con sus parametros entre parentesis), son objetos y de hecho son variables del namespace std. Obviamente los operadores >> y << estan sobrecargados, en realidad lo que sucede es equivalente a esto:

Código
  1. do
  2. {
  3.    operator<<(cout, "Introduzca un numero entre 1 y 9: "); //funcion no miembro
  4.    cin.operator>>(n); //funcion miembro
  5. } while (!(n > 0 && n < 10));

https://en.cppreference.com/w/cpp/io/cout
https://en.cppreference.com/w/cpp/io/cin
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
snoopty

Desconectado Desconectado

Mensajes: 86


Ver Perfil
Re: Ciclo DO WHILE
« Respuesta #5 en: 8 Septiembre 2021, 03:26 am »

Eternal Idol, Mafus y Serapis : muchas gracias.
Se podría resumir, entonces, que una variable puede ser " afectada " de manera directa por una función ( isdigit ( Var ) ); , un objeto ( cout<< Var ..... ) un Bucle(for (int Var= 1; Var<= 20; Var++)), etc, etc ..... Pero por ejemplo un modificador ( o " stoi o stof son métodos o funciones ?? ) lo haría de manera indirecta :
/* Para la Variable " s " */
string s = "0.0176487659456789432558";
int i = stoi(s);
float f = stof(s);
cout << s << "\n" << i << "\n" << f << endl;
/* Esta diferenciación estaría mal ?? */
« Última modificación: 8 Septiembre 2021, 04:32 am por snoopty » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Ciclo DO WHILE
« Respuesta #6 en: 8 Septiembre 2021, 09:26 am »

¿A que te referis con modificador? Ni isdigit ni cout tienen ningun efecto sobre la variable que se le pasa al primero ni la que se inserta al segundo, si podes asignar el valor de retorno de isdigit a una variable pero eso es otra cosa.

Para que isdigit pudiera asignarle un valor a su parametro tendria que recibirlo por referencia (eso se puede hacer con un puntero o una referencia; ver https://www.genbeta.com/desarrollo/punteros-y-referencias) y no por valor como lo hace (ver http://conclase.net/c/curso/cap15). Lo mismo pasa con el operador << cuando insertas en cout pero cin es diferente, cuando extraes le estas pasando un parametro por refrencia.

Código
  1. int isdigit( int ch );
  2.  
  3. template< class Traits > basic_ostream<char,Traits>& operator<<(basic_ostream<char,Traits>& os, const char* s ); //insertar en cout
  4.  
  5. basic_istream& operator>>( int& value ); //extraer de cin

https://en.cppreference.com/w/cpp/string/byte/isdigit
https://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt2
https://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt

En las 3 primeras lineas de codigo que dejaste hay asignaciones, la primera es simplemente un literal de cadena, las 2 siguientes asignan el resultado de funciones (los metodos son funciones miembro de una clase) y en la 4 no cambia ninguna variable, se insertan 6 valores - de diferentes tipos y por eso se usan diferentes operadores (funciones) sobrecargados - en cout que los escribe en la consola o casi.

¿Como es posible insertar i en "\n"? ¿O peor aun como es posible que una funcion (std::endl es un manipulador) sea insertada en un float (f)? La clave esta en el valor de retorno del operador << que es basicamente una referencia a std::cout. En la ultima linea pasa esto:

Código
  1. operator<<(operator<<(operator<<(cout, s), "\n").operator<<(i), "\n").operator<<(f).operator<<(endl);

Notese que la variable cout solo se pasa UNA vez en toda la linea y los operadores la van retornando, con funciones miembro (caso en el que llama al operador con un solo parametro) y no miembro (cuando usa dos parametros siendo el primero el valor de retorno de otro operador, siempre la referencia a cout en nuestro ejemplo).
« Última modificación: 8 Septiembre 2021, 09:30 am por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Ciclo DO WHILE
« Respuesta #7 en: 9 Septiembre 2021, 00:45 am »

cin y cout no son funciones (las funciones se llaman con sus parametros entre parentesis), son objetos y de hecho son variables del namespace std. Obviamente los operadores >> y << estan sobrecargados,
Citar
By specification of std::cin, std::cin.tie() returns &std::cout. This means that that any input operation on std::cin executes std::cout.flush() (via std::basic_istream::sentry's constructor).
La sintaxis oculta la semántica subyacente, al caso no cambia nada, excepto la comodidad y tal vez claridad en según que casos...
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Ciclo DO WHILE
« Respuesta #8 en: 9 Septiembre 2021, 07:31 am »

La sintaxis oculta la semántica subyacente, al caso no cambia nada, excepto la comodidad y tal vez claridad en según que casos...

cin y cout no son funciones, ya esta explicado y nadie que entienda minimamento POO diria eso.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
snoopty

Desconectado Desconectado

Mensajes: 86


Ver Perfil
Re: Ciclo DO WHILE
« Respuesta #9 en: 10 Septiembre 2021, 09:54 am »

Gracias por reponder, Eternal Idol.
No, no me refería a eso. Quizá bastante primitivo lo mío.
Saludos !
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ciclo for()
Programación C/C++
noah222 2 6,858 Último mensaje 18 Abril 2013, 15:23 pm
por rir3760
Ciclo For en ListBox
.NET (C#, VB.NET, ASP)
el_cantante 2 2,430 Último mensaje 9 Agosto 2015, 14:50 pm
por el_cantante
ciclo con mysql c
Programación C/C++
yoelmend 2 2,185 Último mensaje 7 Junio 2017, 14:24 pm
por engel lex
Ciclo Do While anidado que no coge al ciclo interior
Programación Visual Basic
Baldomero123 1 6,975 Último mensaje 4 Enero 2018, 14:19 pm
por Baldomero123
ciclo for o while?
Programación C/C++
Inmovile 1 4,207 Último mensaje 14 Abril 2022, 12:45 pm
por Falo Zipo Pixote
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines