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

#281
Hola, muy buenas. Tengo una duda que se podría catalogar como matemática más que duda de programación.

El caso es que la manera que he visto más eficiente para saber si un número es primo en C es la siguiente:
(Código corregido)
unsigned int is_prime = 1, numero_a_comprobar = 2453564567U;

for(j = 2; is_prime == 1 && j*j <= numero_a_comprobar; j++)
   is_prime = numero_a_comprobar%j != 0;

// Ahora 'is_prime' almacena si 'numero_a_comprobar' es primo


Mi duda es: ¿Por qué solo comprobamos los posibles divisores del número a comprobar con la condición 'j*j <= numero_a_comprobar'? Seguro que tiene una respuesta matemática, pero no la se...

Muchas gracias
#282
Ahora que me doy cuenta, mi función estaba hecha una pena XDD.

Versión mejorada:
void insertar(FILE * archivo, unsigned int pos, const char *nueva_cadena, unsigned int longitud_cadena) {
   char *buffer = malloc(longitud_cadena);

   while(feof(archivo) != 0) {
       fseek(archivo, pos, SEEK_CUR); // Nos movemos por el archivo hasta la posición 'pos'
       fread((void *)buffer, sizeof(char), longitud_cadena, archivo);
       clearerr(archivo); // Por si hemos llegado al final del archivo...
       fseek(archivo, pos, SEEK_CUR);
       fwrite((const void *)nueva_cadena, sizeof(char), longitud_cadena, archivo);
       pos += longitud_cadena;
   }

   free(buffer);
}
#283
Cita de: fary en  5 Mayo 2016, 21:01 PM
Aunque ya se solucionó pongo otra alternativa: Mapear el archivo en la memoria.

saludos.

Eso ya se había propuesto, pero pensamos que si el archivo es demasiado grande, había que buscar otra solución
#284
Es sencillo. Puedes ver el patrón restando la posición del carácter que estás escribiendo menos la fila y la columna en la que esté el 0. El valor de la casilla será el mayor valor de esas dos restas. Por supuesto, tendrás que hacer el valor absoluto si no quieres números negativos
#285
Lo que más me gusta de C++, con diferencia, es la sobrecarga y el paso por referencia... Cuando digo sobrecarga, digo tanto sobrecarga de operadores como de funciones
#286
Es cierto. Se me olvidó mencionarlo. La basura se crearía cuando hay saltos de línea en archivos de texto, pues Windows usa salto de carro y salto de línea, mientras que otros sistemas operativos usan solo el salto de línea
#287
Yo tampoco sé mucho sobre C, también estoy aprendiendo xD.

Creo que una forma fácil de implementar este algoritmo sería:
Código (cpp) [Seleccionar]
void insertar(FILE * archivo, unsigned int pos, const char *nueva_cadena, unsigned int longitud_cadena) {
   char *buffer = malloc(longitud_cadena);

   fseek(archivo, pos, SEEK_CUR); // Nos movemos por el archivo hasta la posición 'pos'
   fread((void *)buffer, sizeof(char), longitud_cadena, archivo);
   clearerr(archivo); // Por si hemos llegado al final del archivo...
   fseek(archivo, pos, SEEK_CUR);
   fwrite((const void *)nueva_cadena, sizeof(char), longitud_cadena, archivo);

   if(feof(archivo) != 0)
       insertar(archivo, pos+longitud_cadena, buffer, longitud_cadena);

   free(buffer);
}


¡OJO! El código no lo he probado. Si alguien ve algun error (lo cual es muy posible), por favor, avise
#288
Como mucho, si solo vas a reemplazar una linea de un archivo muy grande, creo que lo más eficiente sería leer el archivo desde la posición que quieres reemplazar, guardarlo todo en un búfer, sobreescribir desde la posición a reemplazar, y volver a escribir todo el búfer con fwrite... No se me ocurre nada más D:




Creo que si el archivo es demasiado grande para la RAM, se podría hacer esto:
* Obtenemos la cadena del archivo desde la posición que quieras con longitud de la nueva cadena con, por ejemplo, fread.
* Reemplazamos desde la posición deseada con la cadena con, por ejemplo, fwrite.
* Obtenemos la siguiente cadena desde la posición original con un desplazamiento (offset) de la longitud de la cadena que has reemplazado antes. Es fácil pues la función seek permite poner desplazamientos.
* Reemplazamos la cadena que acabamos de leer con la cadena que obtuvimos antes del archivo con, por ejemplo, fread
* Hacemos esto hasta que hayamos llegado al final del archivo
#289
Eso me pasa por las prisas xD En cualquier caso, es muy sencillo usar sprintf para concatenar cadenas
#290
Para concatenar cadenas, ¿no puedes usar sscanf?