Una ayudita en C++.

El típico lugar donde abrir hilos que no tienen cabida en otro lugar

Moderadores: SGM, Moderador, GM

Datzu

#1

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");
}
Avatar de Usuario
dB
Superviviente
Superviviente
Mensajes: 4446
Registrado: 13 Nov 2010, 16:11

#2

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

Última edición por dB el 11 Ene 2013, 16:18, editado 1 vez en total.
Datzu

#3

Ohhh, vaya vaya, ya ví el error, será sumarle uno y ya, muchas gracias. Casi destruyo el mundo.

Avatar de Usuario
Ubathfenome
Superviviente
Superviviente
Mensajes: 185
Registrado: 14 Oct 2011, 00:25

#4

Pos si, menudo ojo que tienes dbu! :D

Imagen
ImagenImagen

Datzu

#5

El problema que tengo, es que muchas veces me centro tanto en algo que no veo lo que tengo alrededor :P

Avatar de Usuario
pfgluigi
Superviviente
Superviviente
Mensajes: 2355
Registrado: 11 Sep 2012, 16:32
Contactar:

#6

Error típico de programador

Avatar de Usuario
Ubathfenome
Superviviente
Superviviente
Mensajes: 185
Registrado: 14 Oct 2011, 00:25

#7

Nononono el error tipico de programador es que te falte un ; al final de una instrucción y luego te vuelves loco para encontrarlo

Imagen
ImagenImagen

Avatar de Usuario
pfgluigi
Superviviente
Superviviente
Mensajes: 2355
Registrado: 11 Sep 2012, 16:32
Contactar:

#8

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.

Datzu

#9

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.

Datzu

#10

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();     } }
Avatar de Usuario
pfgluigi
Superviviente
Superviviente
Mensajes: 2355
Registrado: 11 Sep 2012, 16:32
Contactar:

#11

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

Avatar de Usuario
dB
Superviviente
Superviviente
Mensajes: 4446
Registrado: 13 Nov 2010, 16:11

#12

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.

Avatar de Usuario
pfgluigi
Superviviente
Superviviente
Mensajes: 2355
Registrado: 11 Sep 2012, 16:32
Contactar:

#13

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 :D)

Datzu

#14

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.

Avatar de Usuario
dB
Superviviente
Superviviente
Mensajes: 4446
Registrado: 13 Nov 2010, 16:11

#15

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.

Responder