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

#171
Seguridad / Re: Robo de portátil
13 Enero 2014, 23:37 PM
Cita de: Cascada1 en 10 Enero 2014, 20:30 PM
¿Me podéis decir si hay alguna aplicación de geolocalización de IP que diga hasta el piso donde está situado el ordenador, por favor?

Qué miedo si eso fuera posible con una simple herramienta al alcance de cualquiera...
#172
int leeCaracter (char *p1, char *p2)
{
    char a, b;
    int correctos = 0;

    // lees los caracteres y verificas si son correctos como haces en el main
    // supon que tienes una variable llamada 'correctos' que es 1 si estan bien
    // y 0 si no lo estan

    if (correctos)
    {
        // cosas a hacer si son correctos
        // ...

        *p1 = a;  // asignas 'a' al caracter apuntado por p1
        *p2 = b;  // asignas 'b' al caracter apuntado por p2
        return 1;
    }
    else
    {
        // cosas a hacer si no son correctos
        // ...

        return 0;
    }
}


Y en el main tendrías que llamarla así:

char c1, c2;

//...

if (leeCaracter(&c1, &c2) == 1)  // te puedes ahorrar el '== 1'
{
     // caracteres correctos
     // c1 tiene el primer caracter y c2 el segundo
}
else
{
     // caracteres incorrectos
}


En la llamada a la función, lo que haces es pasarle la referencia de las variables a la función; es decir, le pasas su dirección de memoria para poder modificar su valor dentro de la función. En este caso, 'c1' es una variable de tipo 'char', y '&c1' es del tipo puntero a caracter o 'char*', que es lo que ve la función.

Un saludo.
#173
Cita de: leosansan en  9 Enero 2014, 07:01 AM
Yo lo haría así. Aunque la condición de (i < valor) puedes reducirla a (i*i<valor) para ahorrarte muchísimos ciclos en el for. Además el incremento de i lo haría como i+=2, con en valor inicial de 3, ya que sabemos que los primos, con excepción del 2, son impares.

Pues sí, con esa condición aun te ahorras más ciclos en el for, pero yo creo que te dejaste el '=' en ella: (i*i <= valor)

Saludos.
#174
leer valor --> i=2 --> (valor%i == 0) --> Sí --> Fin (No es primo)
                                                        --> No --> (i++) --> (i < valor) --> Sí --> Volver a (valor%i == 0)
                                                                                                        --> No --> Fin (Sí es primo)

Yo lo haría así. Aunque la condición de (i < valor) puedes reducirla a (i <= valor/2) para ahorrarte ciclos en el for.

Saludos.
#175
Java / Re: Duda con el uso de porcentaje
2 Enero 2014, 01:45 AM
En enteros, '%' es el operador MOD o resto. Por ejemplo:

2 mod 4 = 2 -> 2/4 = 0 con 2 de resto
13 mod 3 = 1 -> 13/3 = 4 con 1 de resto


Y como ya sabrás, '/' es el operador de división, pero si se trata de enteros solo se redondea hasta la unidad. Por ejemplo:

2 / 4 = 0
13 / 3 = 4


Y iendo a tu programa, cuando haces cuenta%13 es porque hay 13 distintos tipos de cartas: A,2,3,...Q,K, por lo que tendrás:

cuenta = 0 -> caras[0%13]=caras[0]="As"
cuenta = 1 -> caras[1%13]=caras[1]="Dos"
...
cuenta = 13 -> caras[13%13]=caras[0]="As"
cuenta = 14 -> caras[14%13]=caras[1]="Dos"


Por lo que cada 13 cartas, se repite el ciclo hasta que haya una carta de cada palo, lo que harían las 4x13=52 cartas.

Y para el tema de los palos, a cada pack de 13 cartas le asignas un palo distinto:

cuenta = 0 -> palos[0/13]=palos[0]="Corazones"
cuenta = 1 -> palos[1/13]=palos[0]="Corazones"
...
cuenta = 13 -> palos[13/13]=palos[1]="Diamantes"
cuenta = 14 -> palos[14/13]=palos[1]="Diamantes"


Espero haberte ayudado, saludos.
#176
Partiendo de que 1 AND 0 = 0 y que 1 OR 0 = 1, el operador '&' es el AND a nivel de bit y el '|' el OR, y la operación se lleva a cabo entre bits que ocupen la mismas posiciones en los dos operandos. Por si no quedó del todo claro te dejo unos ejemplos:

num = 1100
num & 0100 = 0100
num & 1111 = num
num | 1001 = 1101
num | 0000 = num


Si quieres profundizar aquí tienes una explicación más detallada: http://c.conclase.net/curso/?cap=018

Un saludo.
#177
De nada. Pensándolo un poco mejor también se podría hacer con máscaras y operaciones a nivel de bit. Te dejo también el código:

#include <stdio.h>

int main()
{
char cadena[]="HoLaPEpe";
int len = sizeof(cadena)/sizeof(cadena[0])-1;
printf("len = %d\n", len);
int i;

for (i=0; i<len; i++)
// 0x20 es en binario = 0010 0000
if (cadena[i]&0x20) // devuelve cierto si el bit 5 esta puesto a 1
printf("%c -> minuscula\n", cadena[i]);
else
printf("%c -> mayuscula\n", cadena[i]);

// 0xDF es en binario = 1101 1111
for (i=0; i<len; i++) cadena[i]&=0xDF; // pones a 0 el bit 5
printf("En mayusculas: %s\n", cadena);

for (i=0; i<len; i++) cadena[i]|=0x20; // pones a 1 el bit 5
printf("En minusculas: %s\n", cadena);

return 0;
}


Y su salida:

xiruko:~$ gcc prueba2.c -o prueba2
xiruko:~$ ./prueba2
H -> mayuscula
o -> minuscula
L -> mayuscula
a -> minuscula
P -> mayuscula
E -> mayuscula
p -> minuscula
e -> minuscula
En mayusculas: HOLAPEPE
En minusculas: holapepe
xiruko:~$


Un saludo.

Edito: que puse al revés las máscaras... ahora ya funciona correctamente.

Felices fiestas.

#178
También podrías probar a hacerlo con uniones y campos de bit. Por ejemplo:

#include <stdio.h>

union caracter
{
unsigned char c;
struct c_bits
{
unsigned b0:1;
unsigned b1:1;
unsigned b2:1;
unsigned b3:1;
unsigned b4:1;
unsigned b5:1;
unsigned b6:1;
unsigned b7:1;
} bits;
};

int main()
{
union caracter cadena[]={'h','O','L','a'};
int len = sizeof(cadena)/sizeof(cadena[0]);
int i;

for (i=0; i<len; i++)
if (cadena[i].bits.b5 == 1)
printf("%c -> minuscula\n", cadena[i].c);
else
printf("%c -> mayuscula\n", cadena[i].c);

printf("En mayusculas: ");
for (i=0; i<len; i++)
{
cadena[i].bits.b5 = 0;
printf("%c", cadena[i].c);
}
printf("\n");

printf("En minusculas: ");
for (i=0; i<len; i++)
{
cadena[i].bits.b5 = 1;
printf("%c", cadena[i].c);
}
printf("\n");

return 0;
}


Y su salida:

xiruko:~$ gcc prueba.c -o prueba
xiruko:~$ ./prueba
h -> minuscula
O -> mayuscula
L -> mayuscula
a -> minuscula
En mayusculas: HOLA
En minusculas: hola
xiruko:~$


Saludos.
#179
CitarNi si quiera se por ejemplo que tipo de fichero es un ".dat" ni que diferencia tiene almacenar los datos en un fichero de este tipo en vez de un ".txt"

Te propongo algo: cambia la extensión de tu archivo por ".miextension", o por ".quepasasipongoestoasi", y prueba a correr el programa.

CitarGracias por  ofrecerme el código hecho con un montón de cosas que no entiendo, pero yo lo único que buscaba es un pequeño empujón o retoque a lo que yo había puesto para así poder aprender y entender por que son así las cosas.

Qué hay mejor para entender las cosas que leerte la teoría a la vez que miras ejemplos? Tú tenías una duda y te di las herramientas necesarias para solventarla. Vale, no te di código, me daba pereza, pero es que había código de sobras en los enlaces.

CitarDe todas formas a base de hace pruebas ya he logrado sacarlo, cambiando la extension del fichero y alguna cosa mas.

Me alegro, esa es la actitud.

Un saludo.
#180
CitarGracias por la respuesta, pero no me has solucionado nada. igual es que no te he entendido.

Sin ofender, pero yo añadiría a eso las ganas que te lo den todo hecho. Si te miras el ejemplo que hay en en enlace de la función fgetpos() lo entenderás. Entiendo que es mucho trabajo copiar y pegar el código, compilarlo, y correrlo tú mismo para hacer la prueba, así que te dejo el código y la salida aquí:

#include <stdio.h>

int main()
{
  char nombre[11] = "datos4.dat",
       mensaje[81]="Esto es nua rpueba usando fgetpos y fsetpos.";
  FILE *fichero;
  fpos_t posicion=0, comienzo;

  fichero = fopen( nombre, "w+" );
  printf( "Fichero: %s -> ", nombre );
  if( fichero )
    printf( "creado (ABIERTO)\n" );
  else
  {
    printf( "Error (NO ABIERTO)\n" );
    return 1;
  }

  fgetpos( fichero, &comienzo );
  printf( "Posicion del fichero: %d\n", posicion );

  fprintf( fichero, mensaje );
  printf( "\nEscrito: \"%s\"\n", mensaje );

  fgetpos( fichero, &posicion );
  printf( "Posicion del fichero: %d\n", posicion );

  fsetpos( fichero, &comienzo );
  fprintf( fichero, "%s", "Esto es una prueba" );
  printf( "Corregiendo errores...Escrito: \"Esto es una prueba\"\n" );

  fgetpos( fichero, &posicion );
  printf( "Posicion del fichero: %d\n", posicion );

  rewind( fichero );
  printf( "\"Rebobinando\" el fichero -> Vuelta al comienzo\n" );
  fgetpos( fichero, &posicion );
  printf( "Posicion del fichero: %d\n", posicion );

  printf( "\nLeyendo del fichero \"%s\"\n", nombre );
  fgets( mensaje, 81, fichero );
  printf( "\"%s\"\n\n", mensaje );

  fgetpos( fichero, &posicion );
  printf( "Posicion del fichero: %d\n", posicion );

  if( !fclose(fichero) )
    printf( "Fichero cerrado\n" );
  else
  {
    printf( "Error: fichero NO CERRADO\n" );
    return 1;
  }

  return 0;
}


Y su salida:
:~$ ./fichero
Fichero: datos4.dat -> creado (ABIERTO)
Posicion del fichero: 0

Escrito: "Esto es nua rpueba usando fgetpos y fsetpos."
Posicion del fichero: 44
Corregiendo errores...Escrito: "Esto es una prueba"
Posicion del fichero: 18
"Rebobinando" el fichero -> Vuelta al comienzo
Posicion del fichero: 0

Leyendo del fichero "datos4.dat"
"Esto es una prueba usando fgetpos y fsetpos."

Posicion del fichero: 44
Fichero cerrado


Y qué sacamos de todo esto? Tú cuando abres un fichero el cursor asociado a él estaría en la posición 0. Si con fgets(), o la función que sea, lees 10 carácteres (por ejemplo, los correspondientes a tus variables), entonces el cursor avanzará a la posición 10. Si luego quieres sobrescribir las variables que tenías, deberás hacer retroceder el cursor, con rewind(), con fsetpos() o con fseek() (no será porque no tengas opciones), para así cuando escribas las variables éstas sobrescriban a las que habían.

CitarMi verdadera duda esta en como hacer que me almacene el valor de la variable, es que no consigo hacer que me escriba nada.
fprintf()

Un saludo.