elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


  Mostrar Mensajes
Páginas: 1 [2] 3 4
11  Programación / Programación C/C++ / Re: Duda en búsqueda en vectores de punteros en C en: 26 Julio 2010, 06:30 am
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.

Código:
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:

Código:
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  Programación / Programación C/C++ / Re: Duda en búsqueda en vectores de punteros en C en: 25 Julio 2010, 22:22 pm
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 / Programación C/C++ / Calendario perpetuo en: 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.

Código:
/*
  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 / Programación C/C++ / Re: duda freopen en: 20 Julio 2010, 09:15 am
lo mismo.. pero mas rapido ::)
Código
  1. bool *posibilidades(int a,int b)
  2. {
  3.  const int fi=(a/3)*3,ci=(b/3)*3;
  4.  static bool p[10];
  5.  for(int z=0;z<10;z++)
  6.    p[z]=true;
  7.  for(int k=0;k<9;k++)
  8.  {
  9.    p[sudoku[a][k]]=p[sudoku[k][b]]=p[sudoku[fi+k/3][ci+k%3]]=false;
  10.  }
  11.  return &p[1];
  12. }
  13.  
la verificacion de si la casilla esta ocupada o no se hace fuera de la funcion:
Código
  1. ...
  2. if(sudoku[a][b]==0)
  3.  p=posibilidades(a,b);
  4.  
y ya no hace falta liberar la memoria ocupada por 'p' despues de cada llamada
Saludos  :)
15  Programación / Programación C/C++ / Re: duda freopen en: 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
  1. freopen("sudoku.txt","r",stdin);
  2. ...
  3. freopen("config.txt","r",stdin);
  4.  
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
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int matriz[9][9]={
  6. 1,1,1,2,2,2,3,3,3,
  7. 1,1,1,2,2,2,3,3,3,
  8. 4,4,4,5,5,5,6,6,6,
  9. 4,4,4,5,5,5,6,6,6,
  10. 4,4,4,5,5,5,6,6,6,
  11. 7,7,7,8,8,8,9,9,9,
  12. 7,7,7,8,8,8,9,9,9,
  13. 7,7,7,8,8,8,9,9,9
  14. };
  15.  
  16. int sudoku[9][9], seguros[9][9], posible=0, unicas=1;
  17. bool usado[10];
  18.  
  19. void imprimir();
  20. void unicas_soluciones();
  21. void comprobar(int a, int b);
  22.  
  23. int main()
  24. {...}
  25.  
16  Programación / Programación C/C++ / Re: llenar matriz con Random en Dev C en: 20 Julio 2010, 04:26 am
Código
  1. temp=filas*columnas;
  2. ...
  3. for(i=1;i<=temp;i++)
  4. {
  5.  do
  6.  {
  7.     y = rand() % filas;
  8.     x = rand() % columnas;
  9.  } while(matriz[y][x]);
  10.  matriz[y][x]=i;
  11. }
  12.  
Excelente.. ;-)
17  Programación / Programación C/C++ / Re: Por que no me funciona y como lo corrijo?? en: 16 Julio 2010, 18:43 pm
Bueno si, para que compile tuve que quitar el .h del iostream.h  ;D
y agregar el using namespace std;
18  Programación / Programación C/C++ / Re: Por que no me funciona y como lo corrijo?? en: 16 Julio 2010, 18:12 pm
Podrias probar usando solo enteros..

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

Saludos
19  Programación / Programación C/C++ / Re: [C] Ecuaciones de segundo grado en: 9 Julio 2010, 03:37 am
Hola, se podria incluir la posibilidad que las soluciones sean números complejos..

20  Programación / Programación C/C++ / Re: copiar caracteres en una cadena en: 9 Julio 2010, 01:33 am

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

Saludos.
Páginas: 1 [2] 3 4
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines