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 - MIG80

#11
Citar
... en el programa existe una única copia en memoria de cada vértice ...

Bueno, tomando en cuenta ese detalle hice una función que determina si un triangulo tiene un vecino en una lista de triangulos (un arreglo de punteros a triangulo). En este caso en lugar de pasarle una dupla de vertices del triangulo como parámetro le pasamos el triangulo completo.


struct triangle *buscar_vecinos(struct triangle *lv[], int num_triangulos,
                               struct triangle *t1)
{
 struct vertex *p1,*p2,*p3,*q1,*q2,*q3;
 
 p1=t1->a; p2=t1->b; p3=t1->c;

  for(int i=0;i<num_triangulos;i++)
 {
   q1=lv[i]->a; q2=lv[i]->b; q3=lv[i]->c;
   
   if((p1==q1 && (p2==q2 || p2==q3 || p3==q2 || p3==q3))||
      (p1==q2 && (p2==q1 || p2==q3 || p3==q1 || p3==q3))||
      (p1==q3 && (p2==q1 || p2==q2 || p3==q1 || p3==q2))||
      (p2==q1 && (p1==q2 || p1==q3 || p3==q2 || p3==q3))||
      (p2==q2 && (p1==q1 || p1==q3 || p3==q1 || p3==q3))||
      (p2==q3 && (p1==q1 || p1==q2 || p3==q1 || p3==q2))||
      (p3==q1 && (p1==q2 || p1==q3 || p2==q2 || p2==q3))||
      (p3==q2 && (p1==q1 || p1==q3 || p2==q1 || p2==q3))||
      (p3==q3 && (p1==q1 || p1==q2 || p2==q1 || p2==q2)))
     return lv[i];
 }
 return NULL;
}



La llamada a la funcion se haria de la siguiente manera:


struct triangle *pos_vecinos_tri[12];
struct triangle *A, *vecino;
...
vecino = buscar_vecinos(pos_vecinos_tri,12,A); // buscamos un vecino al triangulo apuntado por A


Creo que que esta función toma en cuenta todas las posibilidades así que deberia funcionar si o si.

Saludos :)
#12
Hola, bueno en el codigo veo que se hacen comparaciones como la siguiente:

dupla.x == s->b

alli dupla.x y s->b son punteros, osea que se están comparando punteros, talves el problema este siendo originado por que en lugar de comparar punteros deberias comparar los valores a los que estos apuntan.

Para ponerlo más sencillo, si se hace la declaración:

int n=2,m=2;

luego n==m es verdadero y &n==&m es falso

pienso que talves hayas pasado eso por alto.

Saludos
#13
Programación C/C++ / Calendario perpetuo
24 Julio 2010, 08:17 AM
Hola a todos! :D

Bueno al punto, vagando por la la Internet me encontré con una página que da el calendario (calendario gregoriano) de cualquier año  y quise hacer un programa en C que haga lo mismo  :rolleyes:, el resultado es el programa que está a continuación.


/*
 Calendario perpetuo.
 Autor: czealt
 fecha: julio de 2010
*/

#include <stdio.h>
#include <stdlib.h>

#define year_ref  2010
#define diainicio Viernes

enum Dia{ Domingo, Lunes, Martes, Miercoles, Jueves, Viernes, Sabado };

enum Mes{ Enero, Febrero, Marzo, Abril, Mayo, Junio, Julio, Agosto, Setiembre,
        Octubre, Noviembre, Diciembre };

int esbisiesto(int year);
int cdiasmes(int mes,int year);
void imprimirmes(int mes, int year, int diaunomes);

int main(int argc, char *argv[])
{
 int a, year, ai=year_ref, af, ndias=0, dia1enero, mes, diaunomes;

 if(argc < 2)
 {
   printf("Uso: %s A¤o\n", argv[0]);
   return 0;
 }
 year = atoi(argv[1]);

 af = year-1;
 if(year < year_ref)
 {
   ai = year;
   af = year_ref-1;
 }
 for(a = ai; a <= af; a++)
   ndias += esbisiesto(a)?2:1;

 dia1enero = (diainicio + ((year >= year_ref)?1:-1) * ndias) %7;
 if(dia1enero < 0)
   dia1enero += 7;

 printf("Calendario del a¤o %d\n", year);
 diaunomes = dia1enero;
 for(mes = Enero; mes <= Diciembre; mes++)
 {
   imprimirmes(mes, year, diaunomes);
   diaunomes = (diaunomes + cdiasmes(mes, year)) %7;
 }
 return 0;
}

int esbisiesto(int year)
/*
"Un año es bisiesto si es divisible por 4, excepto el último de cada siglo
(aquellos divisibles por 100) que para ser bisiestos, tambien deben ser
divisibles por 400."
*/
{
 return (year%4) == 0 && ((year%100) != 0 || (year%400) == 0);
}

int cdiasmes(int mes,int year)
/*
Determina la cantidad de dias que trae cada mes.
*/
{
 static const int diasmes[] = {31,28,31,30,31,30,31,31,30,31,30,31};
 int cdias = diasmes[mes];
 if(mes == Febrero && esbisiesto(year))
   cdias++;
 return cdias;
}

void imprimirmes(int mes, int year, int diaunomes)
{
 static const char *strmes[]={"Enero","Febrero","Marzo","Abril","Mayo",
                              "Junio","Julio","Agosto","Setiembre","Octubre",
                              "Noviembre","Diciembre"};
 const int diasmes = cdiasmes(mes,year);
 int c, dia;
 printf("\n%s\n  D  L  M  M  J  V  S\n", strmes[mes]);
 dia = (35 - diaunomes) % 35 + 1;
 for(c = 35; c; c--)
 {
   if(dia > diasmes)
     printf("   ");
   else
     printf("%3d", dia);
   if((c - 1) % 7 == 0) putchar('\n');
   dia = dia % 35 + 1;
 }
}


Si tienen mejoras y/o criticas al codigo me gustaria conocerlas.

Saludos  :)
#14
Programación C/C++ / Re: duda freopen
20 Julio 2010, 09:15 AM
lo mismo.. pero mas rapido ::)
Código (cpp) [Seleccionar]

bool *posibilidades(int a,int b)
{
 const int fi=(a/3)*3,ci=(b/3)*3;
 static bool p[10];
 for(int z=0;z<10;z++)
   p[z]=true;
 for(int k=0;k<9;k++)
 {
   p[sudoku[a][k]]=p[sudoku[k][b]]=p[sudoku[fi+k/3][ci+k%3]]=false;
 }
 return &p[1];
}

la verificacion de si la casilla esta ocupada o no se hace fuera de la funcion:
Código (cpp) [Seleccionar]

...
if(sudoku[a][b]==0)
 p=posibilidades(a,b);

y ya no hace falta liberar la memoria ocupada por 'p' despues de cada llamada
Saludos  :)
#15
Programación C/C++ / Re: duda freopen
20 Julio 2010, 04:43 AM
bueno.. no se si freopen() se puede usar dos veces para hacer que la entrada venga desde un archivo..
Código (cpp) [Seleccionar]

freopen("sudoku.txt","r",stdin);
...
freopen("config.txt","r",stdin);

pero creo que el segundo freopen() no es necesario dado que se puede inicializar el arreglo con los valores deseados en lugar hacerlo durante la ejecucion del programa
Código (cpp) [Seleccionar]

#include <iostream>

using namespace std;

int matriz[9][9]={
1,1,1,2,2,2,3,3,3,
1,1,1,2,2,2,3,3,3,
4,4,4,5,5,5,6,6,6,
4,4,4,5,5,5,6,6,6,
4,4,4,5,5,5,6,6,6,
7,7,7,8,8,8,9,9,9,
7,7,7,8,8,8,9,9,9,
7,7,7,8,8,8,9,9,9
};

int sudoku[9][9], seguros[9][9], posible=0, unicas=1;
bool usado[10];

void imprimir();
void unicas_soluciones();
void comprobar(int a, int b);

int main()
{...}
#16
Código (cpp) [Seleccionar]

temp=filas*columnas;
...
for(i=1;i<=temp;i++)
{
  do
  {
     y = rand() % filas;
     x = rand() % columnas;
  } while(matriz[y][x]);
  matriz[y][x]=i;
}

Excelente.. ;-)
#17
Bueno si, para que compile tuve que quitar el .h del iostream.h  ;D
y agregar el using namespace std;
#18
Podrias probar usando solo enteros..

PD: con el compilador que uso compila y ejecuta bien.. ¿que compilador usas?

Saludos
#19
Hola, se podria incluir la posibilidad que las soluciones sean números complejos..

#20

Si pues... tienes mucha razón do-while.

Saludos.