Autor
|
Tema: Ciclo DO WHILE (Leído 6,590 veces)
|
snoopty
Desconectado
Mensajes: 86
|
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
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
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
Mensajes: 1.603
|
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 ); }
|
|
|
En línea
|
|
|
|
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?.
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
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: 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/couthttps://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
Mensajes: 86
|
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
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
¿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. 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/isdigithttps://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt2https://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgtEn 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: 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
|
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, 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
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
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
Mensajes: 86
|
Gracias por reponder, Eternal Idol. No, no me refería a eso. Quizá bastante primitivo lo mío. Saludos !
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
ciclo for()
Programación C/C++
|
noah222
|
2
|
6,897
|
18 Abril 2013, 15:23 pm
por rir3760
|
|
|
Ciclo For en ListBox
.NET (C#, VB.NET, ASP)
|
el_cantante
|
2
|
2,437
|
9 Agosto 2015, 14:50 pm
por el_cantante
|
|
|
ciclo con mysql c
Programación C/C++
|
yoelmend
|
2
|
2,192
|
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
|
7,016
|
4 Enero 2018, 14:19 pm
por Baldomero123
|
|
|
ciclo for o while?
Programación C/C++
|
Inmovile
|
1
|
4,223
|
14 Abril 2022, 12:45 pm
por Falo Zipo Pixote
|
|