Página 1 de 2
Una ayudita en C++.
Publicado: 11 Ene 2013, 15:59
por Datzu
Tengo el siguiente problema, cuando entra en el primer for por alguna extraña razón me peta y no tengo ni idea de por que.
¿Podéis echarle un vistazo y ver si veis algo que yo no veo? Lo que intento primero es encontrar primos.
Código: Seleccionar todo
main() {
int num,cnum,divp[20],divs[20],i,j,pp=0,ps=0,can;
bool sw=false;
do {
system("cls");
cout<<"Numero entero y positivo: ";
cin>>num;
cnum=num;
} while (num<1);
for (i=0;i<cnum;i++) {
can=num%i;cout<<"Correcto";
if (can==0) {
divp[j]=i;
cout<<i;
j++;
}
num=num/i;
}
cout<<"\n\n";
system("pause");
}
Re:Una ayudita en C++.
Publicado: 11 Ene 2013, 16:15
por dB
Así a ojo, diría que i vale 0 en la primera vuelta y como estas dividiendo entre i (en num%i y num/i) => batacazo
Re:Una ayudita en C++.
Publicado: 11 Ene 2013, 16:23
por Datzu
Ohhh, vaya vaya, ya ví el error, será sumarle uno y ya, muchas gracias. Casi destruyo el mundo.
Re:Una ayudita en C++.
Publicado: 11 Ene 2013, 16:46
por Ubathfenome
Pos si, menudo ojo que tienes dbu! 
Re:Una ayudita en C++.
Publicado: 11 Ene 2013, 17:25
por Datzu
El problema que tengo, es que muchas veces me centro tanto en algo que no veo lo que tengo alrededor 
Re:Una ayudita en C++.
Publicado: 12 Ene 2013, 08:55
por pfgluigi
Error típico de programador
Re:Una ayudita en C++.
Publicado: 12 Ene 2013, 12:02
por Ubathfenome
Nononono el error tipico de programador es que te falte un ; al final de una instrucción y luego te vuelves loco para encontrarlo
Re:Una ayudita en C++.
Publicado: 14 Ene 2013, 10:01
por pfgluigi
cuanto tiempo llevas programando?
Typical errors:
; al final
-
Paréntesis de más y de menos
Condición del while erronea, y hacer bucle infinito (mi preferido <3)
No cierras comillas en algún lado
En alguna condición hacer x=n
Y un sin fin mas de errores que a mi me han llegado a hacer perder 2 días buscando una tontería.
Re:Una ayudita en C++.
Publicado: 14 Ene 2013, 13:08
por Datzu
Llevaré ya como 4 meses más o menos. Si ya más o menos lo controlo no del todo, pero es que esa era una parte de un programa más largo y por mas que lo miraba y remiraba no me di cuenta de que estaba diviendo por 0, que el bucle empezaba en 0. Pero por lo general esos errores no me pasan, me fallan más el algoritmo a seguir que otra cosa, a la hora de compilación 0 errores.
Re:Una ayudita en C++.
Publicado: 25 Ene 2013, 02:59
por Datzu
Por si alguien tenía curiosidad de lo que era, al final ha salido esto, aunque es una basura por que tiene varios errores que me da pereza solucionar, oye, por algo se empieza, el siguiente será mejor. A ver si aprendo a hacerlo por partes el programa, que aún me lío con los void y el return y todo eso.
https://docs.google.com/file/d/0BwYPyEI ... BqeDA/edit
Aquí os dejo el código fuente por si alguien siente más curiosidad:
Código: Seleccionar todo
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <time.h>
using namespace std;
int i, j, x, mx, my, max_su, max_iz, max_in, max_de, probabilidad, pxt, pyt, inicio_x, inicio_y, final_x, final_y;
char t[2], opt;
char terreno[50][50];
bool evento_activo=true, evento_final=true, ganar=true;
struct personaje
{
char nombre[40];
int vida;
int karma;
int evento;
int personaje_probabilidad;
};
personaje jugador;
int main()
{
srand (time(NULL));
jugador.karma=0;
do {
//Inicio configuracion personaje
cout<<"====================================\n";
cout<<"Bienvenido aventurero!\n";
cout<<"====================================\n";
cout<<"-Escribe tu nombre: ";
cin.getline(jugador.nombre,40);
cout<<"\n-Elige la difucltad: \n\t1- Facil\n\t2- Normal\n\t3- Dificil";
cout<<"\n-Opcion: ";
cin>>opt;
cin.getline(t,2);
//Inicio configuracion mapa
switch (opt) {
case '1':
x=7;
jugador.personaje_probabilidad=10;
jugador.vida=10;
break;
case '2':
x=15;
jugador.personaje_probabilidad=20;
jugador.vida=7;
break;
case '3':
x=21;
jugador.personaje_probabilidad=30;
jugador.vida=5;
break;
}
jugador.evento=10;
max_su=1;
max_in=x-2;
max_iz=1;
max_de=x-2;
//Fin configuracion mapa
//Fin configuracion personaje
system("cls");
} while(opt<1 && opt>3);
//Fin configuracion personaje
//Creacion de puntos
do {
inicio_x=rand()%x;
inicio_y=rand()%x;
} while ((inicio_x<2 && inicio_x>x-2) || (inicio_y<2 && inicio_x>x-2));
do {
final_x=rand()%x;
final_y=rand()%x;
} while ((final_x<2 && final_x>x-2) || (final_y<2 && final_x>x-2));
mx=inicio_x;
my=inicio_y;
//Fin de creacion de puntos
//Creacion terreno
for (i=0;i<x;i++) {
for (j=0;j<x;j++) {
if (i==0 || i==x-1 || j==0 || j==x-1) {
terreno[i][j]='M';
} else if (inicio_x==i && inicio_y==j) {
terreno[i][j]='I';
} else if (final_x==i && final_y==j) {
terreno[i][j]='F';
} else {
terreno[i][j]=' ';
}
}
}
//Fin creacion terreno
do {
//Inicio interfaz parte arriba
system("cls");
cout<<"========================================\nPersonaje: "<<jugador.nombre;
cout<<" || Vidas restantes: "<<jugador.vida<<"\n========================================\n";
//Fin interfaz parte arriba
//Inicio
cout<<"\n\n==== Mapa ====\n\n";
evento_activo=false;
for (i=0;i<x;i++) {
for (j=0;j<x;j++) {
if (i==mx && j==my) {
probabilidad=rand()%101;
if (probabilidad<jugador.personaje_probabilidad) {
cout<<"E";
evento_activo=true;
pxt=i;
pyt=j;
} else {
cout<<"X";
pxt=i;
pyt=j;
}
} else if (mx==final_x && my==final_y) {
ganar==false;
break;
} else {
cout<<terreno[i][j];
}
}
cout<<"\n";
}
//Inicio de posible evento
if (evento_activo==true) {
cout<<"\n\n==== Perdiste una vida ====";
jugador.vida--;
}
//Fin de posible evento
//Inicio del movimiento del jugador
opt=getch();
switch (opt) {
case 'a':
if (max_iz==my) {
break;
} else {
my--;
break;
}
case 's':
if (max_in==mx) {
break;
} else {
mx++;
break;
}
case 'd':
if (max_de==my) {
break;
} else {
my++;
break;
}
case 'w':
if (max_su==mx) {
break;
} else {
mx--;
break;
}
}
//Fin del movimiento del jugador
//Fin
if (mx==final_x && my==final_y) {
ganar==false;
system("cls");
cout<<"\n\n\n\n\n\n\t\t==== Has ganado ====";
getch();
break;
}
} while(jugador.vida>0 && ganar==true);
if (jugador.vida==0) {
system("cls");
cout<<"\n\n\n\n\n\n\t\t==== Has perdido ====";
getch();
}
}
Re:Una ayudita en C++.
Publicado: 25 Ene 2013, 09:26
por pfgluigi
El do while que engloba la selección de opción, la parte del while creo que has puesto mal la condición: while(opt<1 && opt>3);
si pones eso nunca bucleará. Ya que un numero nunca puede ser <1 y > que 3.
También te has equivocado en la forma de poner el while. Tendrías que haber puesto: while(opt>=1 && opt<=3);
Así ya te obliga a poner la opción 1, 2 o 3
Re:Una ayudita en C++.
Publicado: 25 Ene 2013, 10:26
por dB
pfgluigi escribió:
El do while que engloba la selección de opción, la parte del while creo que has puesto mal la condición: while(opt<1 && opt>3);
si pones eso nunca bucleará. Ya que un numero nunca puede ser <1 y > que 3.
También te has equivocado en la forma de poner el while. Tendrías que haber puesto: while(opt>=1 && opt<=3);
En realidad creo que tendria que ser while (opt<1 || opt>3), repetir si la opción estan por debajo de 1 o por encima de 3. Yo dejaría en ese bucle unicamente la pregunta al usuario sobre la dificultad.
Re:Una ayudita en C++.
Publicado: 25 Ene 2013, 10:44
por pfgluigi
Ooohhhh... que fail mas grande. No me había dando cuenta que es para volver a pedir una opción.
db, thanks!
(PD, ayer te encontré en twitter
)
Re:Una ayudita en C++.
Publicado: 25 Ene 2013, 13:10
por Datzu
Ese while es <1 (0, -1, -2...) y >3 (4, 5, 6...) El poner un OR o un AND es indeferente en este caso, ya que el OR al cumplirse solo una te volvería repetirlo.
Re:Una ayudita en C++.
Publicado: 25 Ene 2013, 13:20
por dB
Datzu escribió:
Ese while es <1 (0, -1, -2...) y >3 (4, 5, 6...) El poner un OR o un AND es indeferente en este caso, ya que el OR al cumplirse solo una te volvería repetirlo.
Nop, si pones un AND se tienen que cumplir las dos condiciones, cosa que nunca pasaria (un numero no puede ser menor de 1 y mayor que 3 a la vez). Asi que con AND el bucle nunca se repite, valga lo que valga opt.