Menu C++ problema con "for" (bucles)

n1x3r

Pues estaba haciendo unos ejercicios de c++ y bueno, el profesor pedia que todos los ejercicios estubiesen integrados en un menu , asi que me puse ha hacerlos, son unos 12 ejercicios, asi que cree 12 "case" pero mi sorpresa es que monto un for en el primer case tal que asi:

case 1:
clrscr();
for (int i; i<=10; i++)
{
cout<<aleatorio(100)<<"\n";
}
system("pause");
break;

Y funciona sin problemas, ahora monto la misma funcion en el segundo case y no me cunciona:

case 2:
clrscr();
int top;
cout<<"Entre el maximo de la secuencia: ";
cin>>top;
cout<<"\n";
for (int i; i<=10; i++)
{
cout<<aleatorio(top)<<"\n";
}
system("pause");
break;

Creia que tenia algun erros que pase por alto, pero no, copiel el programa del case 1 al case 2 y en el primero funcionaba en bucle y en el segundo no.
Voy a poner el programa completo a ver si vosotros detectais el fallo xq yo estoy ya loco.


//---Librerias------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#pragma argsused
#include
#include <conio.h>
#include <time.h>

//---Encabezado Funciones-------------------------------------------------------
void go (int x, int y, char a[35]); //---Ir a X,Y con el texto Z---//
int Entra(int x, int y); //---Opcion (var) = entra(X,Y)---//
int aleatorio(int max); //---Devuelve numeros aleatorios dentro del valor---//

//---Inicio del programa--------------------------------------------------------
int main(int argc, char* argv[])
{
clrscr(); //---limpiar pantalla---
int salida = 12; //---Menu Var---
int opcion=0; //---Menu Var---

//---Inicio menu---//
do
{ clrscr();
go(3,1,"01.- Ejercicio 1");
go(3,3,"02.- Ejercicio 2");
go(3,5,"03.- Ejercicio 3");
go(3,7,"04.- Ejercicio 4");
go(3,9,"05.- Ejercicio 5");
go(3,11,"06.- Ejercicio 6");
go(3,13,"07.- Ejercicio 7");
go(3,15,"08.- Ejercicio 8");
go(3,17,"09.- Ejercicio 9");
go(3,19,"10.- Ejercicio 10");
go(3,21,"11.- Ejercicio 11");
go(3,23,"12.- EXIT");

    gotoxy (3,25);
    cout <<"Entre su opcion: ";
    opcion=Entra (20, 25);

//---Fin menu---//

//---Inicio Opciones---//
switch (opcion)
{
case 1:
clrscr();
for (int i; i<=10; i++)
{
cout<<aleatorio(100)<<"\n";
}
system("pause");
break;
case 2:
clrscr();
int asdf;
cout<<"Entre el maximo de la secuencia: ";
cin>>asdf;
cout<<"\n";
for (int i; i<=10; i++)
{
cout<<"lol"<<"\n";
}
system("pause");
break;
case 3:
clrscr();
//---Inicio problema 3---//
clrscr();
for (int i; i<=10; i++)
{
cout<<aleatorio(100)<<"\n";
}
system("pause");
//---Fin problema 3---//
break;
case 4:
clrscr();
//---Inicio problema 4---//

//---Fin problema 4---//
break;
case 5:
clrscr();
//---Inicio problema 5---//

//---Fin problema 5---//
break;
case 6:
clrscr();
//---Inicio problema 6---//

//---Fin problema 6---//
break;
case 7:
clrscr();
//---Inicio problema 7---//

//---Fin problema 7---//
break;
case 8:
clrscr();
//---Inicio problema 8---//

//---Fin problema 8---//
break;
case 9:
clrscr();
//---Inicio problema 9---//

//---Fin problema 9---//
break;
case 10:
clrscr();
//---Inicio problema 10---//

//---Fin problema 10---//
break;
case 11:
clrscr();
//---Inicio problema 11---//

//---Fin problema 11---//
break;
case 12:
clrscr();
break;
}
}while (opcion!= salida);
//---Fin Opciones---//
return 0;
}

//---Funciones------------------------------------------------------------------
void go (int x, int y, char a[35]) //---Ir a X,Y con el texto Z---//
{
gotoxy (x,y);
cout<< a<<"\n";
};

int Entra(int x, int y) //---Opcion (var) = entra(X,Y)---//
{
int i =0;
gotoxy (x,y);
cin >>i;
return i;
}
int aleatorio(int max)
{
return(random(max));
}[/i]

Espero vuestras respuestas.

SeRiaL_k

mmmmm en el for inicializa i a 0
for (i=0;i<=10;i++)
{
}

la i sale del primer for con valor 10, entonces no hace el segundo for por la condicion i<=10

n1x3r

#2 pero las variables declaradas en los for no tiene xq estar presenten en los demas, ¿no?

Me refiero q esa variable solo tiene poder dentro del for. Asi me lo explicaron.

Voy a probar a usar otra variable en el segundo for.

EDIT: aun asi me sigue tirando fuera (al menu) sin hacer el for.

sokomizer

for (int i; i<=10; i++)

El problema en el 2º case es que ese for no está funcionando.

El funcionamiento en seudocódigo sería: "para i de num1 a num2".

Ese for no tiene definido un num1 y por tanto no hace un bucle.

Saludos.

javithelong

No piloto mucho de C++, pero creo que si no inicializas la i, puede estar a cualquier valor.

Esto es, cuando haces el int i (en el for) la i tiene un valor indeterminado (134234 por ejemplo) y eso es mayor que 10, tonces no entra.

Se solucionaría con lo que te han dicho antes:

for (int i=0; i<=10; i++)

Igual no es eso, pero vamos, si fuera C, tu fallo sería ese

BlisZ

usa www.pastebin.com para futuros pastes xD

n1x3r

Pues si, era eso, lo inicializo a 0 y listo, se me paso lo de ponerle i=0; en fin.

problema resuelto.

PERO.
Me ha surgido un problema de estos de pensar.
uno de los problemas me pedia que crease numero aleatorio entre 2 rangos , como por ejemplo 20 y 50, y pensando un poco lo consegui ahcer con un do/while, pero ahora riza el rizo y me pide un umero aleatorio entre dos valores pero estos valores pueden ser positivos o negativos.

Por ejemplo: (-27,40) (-678, -234) etc etc

Y la verdad esq no se ni por donde pillarlo.

SeRiaL_k

hay una funcion que genera numeros aleatorios, creo q es random() o rand() o algo asi
1 saludo

GaMuSSo

edito, nada no lo habia leido bien.

gF

n1xer, generar aleatorios entre un determinado rango no se hace con un do/while, se hace de la siguiente forma:

El primer paso es calcular el nº de numeros del intervalo, si el intervalo es 20 - 50, se hace 50 - 20 = 30, entonces haces un rand() % 30 + 1, si te das cuenta, da igual ke nº te devuelva el rand() ya que por muy grande k sea, al hacer el resto entre 30 + 1, siempre te va a dar un valor entre 0 y 30. Finalmente se le suma el inicio de intervalo:
(rand() % 30 + 1) + 20, con lo cual siempre tendras un valor en ese intervalo sea cual sea el valor que devuelva rand()...

Con variables seria así:

nValores = (fin - inicio) + 1;
valorFinal = (rand() % nValores) + inicio;

Con 2 instrucciones lo tienes hecho para cualquier caso...

Me veo que tu generabas aleatorios hasta que por casualidad te salia 1 del intervalo no? lo cual es ineficientisisisisisisisisimo, ya que podría estar en teoriá ejecutandose infinitamente.

Hay que pensar mas amiguito ;)

n1x3r

#10 gracias, tu forma es mucho mas eficaz y directa, esq resulta q el profesor que tengo me explica como se genera un random de la siguiente forma:

random(numero maximo)

y listo, a hacer ejercicios, y normal q me atasque, ahora toy liado con lo que creo q es una array, os pongo el enunciado del ejercicio.

Cree una función a la que introduciendo una fecha en el formato dia, mes, año nos indique si es correcta o no.
Se supondrá que el año es correcto si es mayor que cero.
El mes de febrero tendrá 28 días.

supuestamente quiere que meta la fecha tal que asi..

25/11/2006

y que la procese, y para eso tengo q sacar de hay el 35 por un lado, el 11 por otro y el 2006 por otro, y toy buscando manuales como un loco y na, se que se tiene q hacer con una cadena o mas bien con un array, pero no tengo apuntesde eso, y toy cansado de usar el google.
Si podeis hacerme un breve resumen respecto al ejercicio, lo agradeceria un monton.

La cuestion seri pedir los datos como un "char" y despues pasar los numeros por separado a variables integer.
Pero no se como se hace, toy buscando y no encuentro nada.

SeRiaL_k

mirate la funcion atoi ( alphanumeric to int ), es para pasar char a int

por ejemplo:

int a;
char b[3]="123";

a = atoi (b);

creo q es asi de todas formas documentate
1 saludo :)

gF

Hola n1xer, he estado trabajando y no he podido contestar antes:

Para separar una cadena en trozos cuando haya algun caracter que se pueda usar como delimitador, en tu caso '/', se utiliza la función "strtok" aquí puedes ver como se utiliza:
http://c.conclase.net/librerias/funcion.php?fun=strtok

Despues para pasar a enteros los caracteres utiliza "atoi"

Riu

termina despues de hacer el for
for(){
}
i=0;
case 2:
y ya asi cada vez ke pase por 1 le va poniendo el valor 0 para el sigiente..

n1x3r

Gracias a todos, ya solucione mis problemas y tengo el ejercicio resuelto gracias a vosotros.

TEMA CERRADO

javithelong

Un consejo sobre strtok

NO LO USES!

gF

No lo uses si no tienes ni puta idea diras...

Shalauras

el strtok es muy buena funcion pienso cmo gF, no lo uses si no sabes

javithelong

strtok jode la cadena de entrada, lo cual implica que es una puta mierda de función.

No se para que os empeñais en usar strtok teniendo sscanf y punteros a caracteres

Usuarios habituales

  • javithelong
  • Shalauras
  • gF
  • n1x3r
  • SeRiaL_k
  • GaMuSSo
  • BlisZ