Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - amchacon

#431
Cita de: leosansan en 24 Diciembre 2013, 15:03 PM
El caso es si sabe donde se pone la raíz cuadrada. Y no olvidarse de incluir la librería math.h.
No hace falta usar la librería math.h, estamos hablando de la raiz entera:

for (i = 2; (i*i) <= n;i++)

Cita de: leosansan en 24 Diciembre 2013, 15:03 PMA mi modesto entender, ello implica calcular y guardar en arrays los sucesivos múltiplos de 2,3,5, etc para posteriormente por comparación comprobar que no está en ellos. A mí por lo menos me ha dado una pobre eficiencia, supongo que debido al cambio de calcular si un módulo es cero por el tener que rellenar arrays y posteriormente comparar. Igual tu lo tienes más optimizado.
No guardo los primos, sino todos los numeros naturales hasta N. Te dejo aquí el código:

#include <stdio.h>
#define PRIMO 1
#define COMPUESTO 0
#define NO_DEFINIDO -1

const int MAX = 120;

void tacharMultiplos(char Tabla[],int N)
{
   int i;
   for (i = 2;(N*i) <= MAX;i++)
   {
       Tabla[N*i] = COMPUESTO;
   }
}

void mostrarTabla(char Tabla[])
{
   int i = 2;
   for (; i <= MAX;i++)
       if (Tabla[i] == PRIMO) printf("%d\n",i);
}

int main()
{
   // Generar Criba de erastotenes

   char Tabla[MAX+1]; // tabla booleana
   int i = 0;

   // valor inicial

   for (; i<= MAX;i++) Tabla[i] = NO_DEFINIDO;

   for (i = 2;i<=MAX;i++)
   {
       if (Tabla[i] == NO_DEFINIDO) // si no esta inicializada...
       {
           Tabla[i] = PRIMO;
           tacharMultiplos(Tabla,i);
       }
   }

   mostrarTabla(Tabla);
   return 0;
}


Si haces una solo comprobación no te sale rentable, pero si vas a hacer muchas comprobaciones te puede venir bien generarte esa tabla. De esa forma, cualquier comprobación que necesites hacer la puedes sacar instantaneamente para cualquier número <= MAX:

scanf("%d",&numero);
if (numero < max)
{
 if (Tabla[numero]) puts("Es primo");
 else puts("Es compuesto");
}
else
{
 if (esPrimo(numero)) puts("Es primo");
 else puts("Es compuesto");
}
#432
Cita de: ivancea96 en 24 Diciembre 2013, 01:08 AMSencillamente, mira todos los números, desde 2 hasta la mitad del número
En realidad sería hasta la raiz del número.

Ponte el caso con 36, el máximo divisor aquí es 6 (lo que viene a ser 6x6). Cualquier número que encuentres superior a eso 12 (12x3) no será nada más que el inverso de uno anterior (3x12).

También podríamos generarnos una tabla booleana diciendo cual es primo y cual no. Usando la criba de eratostenes (mira el gif):
http://es.wikipedia.org/wiki/Criba_de_Erat%C3%B3stenes
#433
0 o 1 son los valores que puedes meter.

true y false son solo para el compilador. Internamente no los guarda así
#434
Es una sintaxis de inicialización no de asignación, el operador = no está definido en los arrays por lo que no puedes "reasignarlo in the way".

De hecho eso no es un array, puesto que los arrays no se pasan a las funciones, estas pasando un puntero char* al primer elemento.

Hay parches "chapuceros" como este:
#include <stdio.h>
#include <stdlib.h>
struct matriz
{
   char a[9];
};

struct matriz matriz_a_inicial ();

int main ()
{
   struct matriz a;
   a = matriz_a_inicial();
   return 0;
}

struct matriz matriz_a_inicial ()
{
   struct matriz a= {1,2,3,4,5,6,7,8,9};
   return a;
}


Si lo que quieres hacer es un mapa, quizás te convenga algo así:
typedef unsigned char Mapa[TAMANYOX][TAMANYOY+1];

void ElegirNivel(Mapa Nivel,short Eleccion)
{

   Mapa Nivel1 =
   {
       {"XXXXXXXXXXXXXXXXXX"},
       {"X                X"},
       {"X                X"},
       {"X      H         X"},
       {"X                X"},
       {"X                X"},
       {"X                X"},
       {"X                X"},
       {"X                X"},
       {"X                X"},
       {"X                X"},
       {"X                X"},
       {"X                X"},
       {"X                X"},
       {"X  C     C    C  X"},
       {"X                X"},
       {"X                X"},
       {"X                X"},
       {"X                X"},
       {"X                X"},
       {"X                X"},
       {"X  F     F    F  X"},
       {"X                X"},
       {"X                X"},
       {"XXXXXXXXXXXXXXXXXX"}

   };

      Mapa Nivel2 =
   {
       {"XXXXXXXXXXXXXXXXXX"},
       {"X                X"},
       {"XH    C          X"},
       {"X XXXXXX XXXXXXXXX"},
       {"X        XXXXX   X"},
       {"X      X C       X"},
       {"X      X XXXXXX  X"},
       {"X      X         X"},
       {"X      X XXXXXX  X"},
       {"XX XXXXXCXXXXXXXXX"},
       {"X    C X X       X"},
       {"X      X X       X"},
       {"XXXX XXX X       X"},
       {"X      X         X"},
       {"X      X X    C  X"},
       {"X  C   X X       X"},
       {"X      X X XXXXXXX"},
       {"X      X X       X"},
       {"X      X X       X"},
       {"XXXXXXXX XXXXXXX X"},
       {"XFF              X"},
       {"XFF      CC      X"},
       {"XFF              X"},
       {"XFF              X"},
       {"XXXXXXXXXXXXXXXXXX"}
   };

  switch(Eleccion)
   {
   case 1:
       TraspasarMapas(Nivel1,Nivel);
       break;

   case 2:
       TraspasarMapas(Nivel2,Nivel);
       break;
}

void TraspasarMapas(Mapa Nivel,Mapa Objetivo)
{
   for (int j = 0; j < TAMANYOY; j++)
       for (int i = 0; i < TAMANYOX; i++)
           Objetivo[i][j] = Nivel[i][j];
}



O cargarlo desde un fichero externo.

CitarCreo que como lo tengo en la función me estaré refiriendo al elemento 3,3 en lugar de a toda la matriz.
Que además no existe porque es una matriz de 3x3  :silbar:
#435
Pues:
Código (cpp) [Seleccionar]
std::map<int, Struct*>::iterator Structid = Mapa.begin();

for(std::vector<int>::iterator vectorid = Vector.begin(); vectorid != Vector.end() && Structid != Mapa.end(); ++vectorid)
{
   //...

  Structid++;
}
#436
Programación C/C++ / Re: Compilador C++
22 Diciembre 2013, 11:27 AM
Cita de: rir3760 en 22 Diciembre 2013, 01:58 AM
Dos opciones son Visual C++ 2008 Express (XP) y la versión de g++ para Cygwin (solo para XP SP3).

Un saludo
¿Que hay de Mingw?
#437
Programación C/C++ / Re: AYUDA Función Recursiva
19 Diciembre 2013, 23:06 PM
Lo que tú buscas es el algoritmo de Dijkstra.

Tengo una adaptación de Dijkstra (no es el original) en C++, te lo dejo aquí:

Distancia más corta desde un punto A a un punto B evitando obstaculos
Código (cpp) [Seleccionar]
#include<iostream>
#include<vector>
#include<queue>

using namespace std;

class Celda
{
   int x;
   int y;
public:
   int getx()
   {
       return x;
   }
   int gety()
   {
       return y;
   }
   void setx(int x)
   {
       this->x=x;
   }
   void sety(int y)
   {
       this->y=y;
   }

   bool operator==(Celda o)
   {
       return x==o.x && y==o.y;
   }
   Celda operator=(Celda o)
   {
       x=o.x;
       y=o.y;
       return *this;
   }

   Celda(int x,int y):x(x),y(y) {}
   Celda():x(0),y(0) {}
};
vector<Celda> ObtenerCaminoMasCorto(Celda ori,Celda dest, char array[8][8], int Ancho, int Altura);

int main()
{
   char ejemplo[8][8]=
   {
       {0,1,0,1,0,0,0,0}, //0: vacío
       {0,1,0,1,0,0,0,0}, //1: pared
       {0,1,0,1,0,0,0,0},
       {0,1,0,1,0,0,0,0},
       {0,1,0,1,0,0,0,0},
       {0,1,0,1,0,0,0,0},
       {0,0,0,1,0,0,0,0},
       {0,0,0,0,0,0,0,0}
   };

   vector<Celda> camino= ObtenerCaminoMasCorto(Celda(0,0),Celda(7,0),ejemplo,8,8);
   for(int i=0; i<camino.size(); i++)
   {
       cout<<"("<<camino[i].getx()<<", "<<camino[i].gety()<<")"<<endl;
   }

}

vector<Celda> ObtenerCaminoMasCorto(Celda ori,Celda dest, char array[8][8], int Ancho, int Altura)
{

   if(ori==dest) return vector<Celda>();

   unsigned int *Distancias=new unsigned int[Ancho*Altura];

   Celda *anterior=new Celda[Ancho*Altura];

   for(int i=0; i<Ancho*Altura; i++)
   {
       Distancias[i]=-1;
       anterior[i]=Celda(-1,-1);
   }

   Distancias[ori.getx()+ori.gety()*Ancho]=0;
   anterior[ori.getx()+ori.gety()*Ancho]=ori;


   queue<Celda> porVisitar;
   porVisitar.push(ori);

   while(!porVisitar.empty())
   {
       Celda cur=porVisitar.front();
       porVisitar.pop();
       //cout<<porVisitar.size()<<endl;
       for(int i=-1; i<2; i++)
           for(int j=-1; j<2; j++)
           {
               if ((i == j) || (i == -1 && j == 1) || (i == 1 && j == -1))
                   continue;
               if( (cur.getx()+j)>=0 && (cur.getx()+j)<Ancho && (cur.gety()+i)>=0 && (cur.gety()+i)<Altura && // si no estamos fuera de los limites del array...
                       array[(cur.gety()+i)][(cur.getx()+j)]==0 && // si no es un obstaculo...
                       Distancias[cur.getx()+cur.gety()*Altura]+1 < Distancias[(cur.getx()+j)+(cur.gety()+i)*Ancho] // si no hay otra distancia mejor...
                 )
               {
                   Distancias[(cur.getx()+j)+(cur.gety()+i)*Ancho]= Distancias[cur.getx()+cur.gety()*Ancho]+1;
                   anterior[(cur.getx()+j)+(cur.gety()+i)*Ancho]=Celda(cur.getx(),cur.gety());
                   porVisitar.push(Celda(cur.getx()+j,cur.gety()+i));
               }

           }
   }

   if(anterior[dest.getx()+dest.gety()*Ancho]==Celda(-1,-1)) return vector<Celda>();

   Celda pp=dest;
   vector<Celda> res(Distancias[dest.getx()+dest.gety()*Ancho]+1);
   for(int i=res.size()-1; !(pp==ori); i--)
   {
       res[i]=pp;
       pp=anterior[pp.getx()+pp.gety()*Ancho];
   }
   delete[] Distancias;
   delete[] anterior;
   return res;

}


El tamaño del camino es el tamaño del vector.
#438
Te falta hacerlo en formato plantilla. Asi se parece más a la pila de la librería estándar  :¬¬
#439
Primero: No necesitas la librería Windows.h
Segundo: Esto no tiene ningún sentido:
if((xml>"<englishName>")&&(xml<"</englishName>"))

Te compila porque el compilador interpetra que estas comparando dirrecciones de memoria (las cadenas de texto se identifican con dirreciones de memoria).

Lo más probable esque te ponga algun warning por hacer esto, porque es muy raro comparar dirreciones de memoria con > y <.

Tienes que leer las palabras caracter a caracter, a no ser que te ayudes con alguna función externa  :silbar:
#440
Yo lo de operadores "amigos" nunca los he usado, asi que no te puedo ayudar más en eso  :silbar:

Los de los const es bastante importante ahora que lo dices, no solo con los operadores sino con las funciones también.