Unamonos los programadores de taringa y compartamos nuestros codigos, ya sea java, C, C++, php, jsp, html, css, python.... etc etc etc.. Enterate tambien de las innovaciones en el software y nuevas distribuciones de Microsoft, Linux y MacOS
Ver más- 1,702 Miembros
- 560 Temas
- 308 Seguidores
[Aporte]Bucle 'while' no funciono pero 'do...while' si
Estaba haciendo otro programita como siempre, y me hice y estaba por preguntarles cual era mi error (como todos los dias, jajajjaja), la primera vez que CREO que no fue mi error, la verdad, tenia que hacer un programa que descomponga un numero en factores primos.
Mi primer codigo fue este
#include <iostream>
using namespace std;
int main()
{
int N; //Es la variable la cual sera descompuesta
cout << "Prueba:" << endl;
cout << "Introduze un numero:" << endl;
cin >> N;
int divi = 2; //Sera la cual testeara a N
while (N > 1 && 0); //REPETIR
{
if (N % divi == 0) //SI N % DIVI DA RESTO 0 HACER
{
N = N / divi;//N = N DIVIDIO DIVI
cout << N << endl; //MOSTRAR N
}
else divi++; //SI NO SUMAR 1 A DIVI
}
return 0;
}
Pero el bucle se ejecutaba una vez, y ademas no funcionaba si no ponia '&& 0' en el 'while' ya que si no lo ponia no se ejecutaba.
y el resultado fue esto:
Prueba1:
Introduze un numero
(puse 60) 60
30
Procesed returned 0
Y eso no es todo, si uno introdusia un numero impar simplemento no hacia nada.
Pero claro habia otro bucle que podia resolver este problema. EL BUCLE 'DO...WHILE'
El 'while' no puede hacerlo todo solo por eso necesita 'do' a veces. Entonces, este es el codigo que SI funciona de maravillas.

#include <iostream>
using namespace std;
int main()
{
int N; //Es la variable la cual sera descompuesta
cout << "Prueba:" << endl;
cout << "Introduze un numero:" << endl;
cin >> N;
int divi = 2; //Sera la cual testeara a N
do
{
if (N % divi == 0)
{
N /= divi;
cout << N << endl;
}
else divi++;
}
while (N > 1);
return 0;
}
La finalidad de esto es mostrar que, mi curso tal vez tenia razon en esto: "El bucle 'do...while' esta a un paso mas adelante que el 'while'". Pero si no me equivoco tal vez el primer codigo ande bien en otro compilador, yo estaba usando G++ en Code::Blocks.
P.D. Perdonenme si mis temas que ago cada 5 segundos les molestan, tan solo ignorenlos si no quieren leerlos

.
- 0Calificación
- 0Seguidores
- 71Visitas
- 0Favoritos
Global
Argentina
Chile
Colombia
España
México
Perú
Uruguay
Venezuela
4 respuestas
El problema no está en las capacidades del while o do-while (que de hecho, yendo al punto, a diferencia de lo que decís el while es superior; es decir que todo lo que podés hacer con un do-while lo podés hacer con un while pero no al revés) sino en tu primer código. Hay 2 errores groseros:
1: al tener && 0 en la condición eso hace que el cuerpo del while no se ejecute nunca, ya que cero siempre evalúa a falso, y algo && falso siempre es falso.
2: al poner un punto y coma inmediatamente después de la condición del while estás forzando la terminación de la estructura while inmediatamente. Lo que suponés que es el cuerpo después (lo que está entre llaves) no es el cuerpo del while sino un bloque de código que no está controlado por la condición del while, por eso es que independientemente del valor de N que ingresaras, ese segmento de código siempre se ejecuta una sóla vez.
En resumen, si modificás la línea
while (N > 1 && 0); //REPETIR
por
while (N > 1) //REPETIR
tu programa hubiera funcionado bien de entrada; tu error fue no debuggear para descubrir el problema real del código.
Como dato adicional te dejo un consejo sobre la elección de qué tipo de bucle usar en cada ocasión:
Si sabés exactamente cuántas veces vas a iterar (y por exactamente no me refiero a un número constante, puede ser una expresión como 100, N, N-1, N*2..... etc, tan compleja como quieras) se debe usar for; si no sabés cuantas veces vas a iterar, pero sí sabés que vas a iterar al menos una vez, se debe usar do-while; para todos los otros casos, while.
la diferencia entre el while y el do while es... while combrueba antes de ejecutar, do while comprueba despues de ejecutar, el &&0 siempre va a evitar que el bloque del do while se ejecute, el 0 es evaluado como falso y cualquier cosa && 0 o && false es false
Y si no usas las condiciones bien no va a funcionar nunca