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


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 :P


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


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.