Ciclo DO WHILE

Iniciado por snoopty, 7 Septiembre 2021, 10:48 AM

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

snoopty

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 */

Eternal Idol

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.
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

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:
#include <stdio.h>

int main() {
    int dato = 6;

    printf("Dato del bloque externo: %d\n", dato);
   
    {
        int dato = 7; // El dato de este bloque oculta al del bloque externo
        printf("Dato dentro del primer bloque: %d\n", dato);
    }

    printf("Dato del bloque externo: %d\n", dato);

    {
        dato += 4; // Este dato es el del bloque externo
        printf("Dato del segundo bloque: %d\n", dato);
    }

    printf("Dato del bloque externo: %d\n", dato);
}

Serapis

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?.

Eternal Idol

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 (c++) [Seleccionar]
do
{
    operator<<(cout, "Introduzca un numero entre 1 y 9: "); //funcion no miembro
    cin.operator>>(n); //funcion miembro
} while (!(n > 0 && n < 10));


https://en.cppreference.com/w/cpp/io/cout
https://en.cppreference.com/w/cpp/io/cin
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

#5
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 ?? */

Eternal Idol

#6
¿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 (c++) [Seleccionar]
int isdigit( int ch );

template< class Traits > basic_ostream<char,Traits>& operator<<(basic_ostream<char,Traits>& os, const char* s ); //insertar en cout

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 (c++) [Seleccionar]
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).
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

Cita de: Eternal Idol 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,
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...

Eternal Idol

Cita de: Serapis en  9 Septiembre 2021, 00:45 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.
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

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