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

#41
Hola, hemos empezado con punteros, y me ha surgido una duda, sobre el retorno de funciones.

Supongamos que quiero hacer una función que concatene dos cadenas de caracteres, un strcat "personalizado". La definición de la función la haría así:

void mi_strcat(char *s_dest, char *s_orig)

Pero veo que la función de string.h está definida de la siguiente forma:

char *strcat(char*s1, const char *s2)

Entonces, me gustaría saber cuál es la diferencia, ya que no entiendo por qué se especifica como retorno char si no "devuelve" (con la sentencia return) nada. Supongo que será por esclarecer el código, pero no estoy seguro, ya que a efectos prácticos no hay diferencia.

Saludos.
#42
Ya sé por qué no funcionaba mi código, no era más que un error tonto... En cada vuelta del bucle, a la posición del primer carácter que se debía copiar, le sumaba la variable equivocada. Le estaba sumando el número de partes en las que se iba a dividir el fichero, en lugar de la cantidad de caracteres que se debían de copiar a cada ciclo. Es decir, en lugar de
pos += num_partes;

Tenía que poner
pos += cantidad_por_fich

Muchas gracias a todos por vuestra atención, de veras, vuestra dedicación es impagable  ;) ;)
#43
Cita de: rir3760 en 25 Febrero 2013, 19:13 PM
En el calculo de las partes no consideras si el numero de caracteres en el archivo no es múltiplo del tamaño de cada parte, en ese escenario perderías la ultima.

No necesitas de tres llamadas a función para generar el nombre, en su lugar puedes utilizar sprintf de esta forma:
sprintf(fich_dest_nombre, "%s.%03d", fich_nombre, i);

El nombre del archivo generado se almacena en el array "fich_dest_nombre" pero tu llamas a fopen usando el array "fitx_dest_izena", aquí no se si es un error del programa o de traducción. Caso similar con "fitxategi_orig".

Mejor publica el código fuente del programa (reducido al mínimo, por supuesto).

Un saludo
¿Entonces se trata de que sea múltiplo o no? Entonces, debería primero ver los caracteres que hay en el fichero, y ofrecer al usuario la posibilidad de dividir el archivo en cantidades que sean divisoras del número de caracteres, ¿no?
#44
Cita de: rir3760 en 25 Febrero 2013, 19:13 PM
En el calculo de las partes no consideras si el numero de caracteres en el archivo no es múltiplo del tamaño de cada parte, en ese escenario perderías la ultima.

No necesitas de tres llamadas a función para generar el nombre, en su lugar puedes utilizar sprintf de esta forma:
sprintf(fich_dest_nombre, "%s.%03d", fich_nombre, i);

El nombre del archivo generado se almacena en el array "fich_dest_nombre" pero tu llamas a fopen usando el array "fitx_dest_izena", aquí no se si es un error del programa o de traducción. Caso similar con "fitxategi_orig".

Mejor publica el código fuente del programa (reducido al mínimo, por supuesto).

Un saludo
Ah sí, se me ha ido la cabeza con la traducción del euskera al castellano, jajaja.
#45
Tengo que hacer un programa que coja un fichero de texto y lo divida en otros varios archivos, de extensión .001, .002, etc. En cuántas partes quiere dividirlo, lo introduce el usuario. Mi programa funciona a veces sí, a veces no...

Os dejo el bucle principal del código:



cantidad_por_fich = fread( buffer, 1, sizeof(buffer), fichero_orig);
cantidad_por_fich /= num_partes;

for(i=0; i < num_partes; i++)
{
fichero_orig= fopen(fich_nombre, "r");
strcpy(fich_dest_nombre, fich_nombre);
sprintf(buffer_nombre, ".00%i", i);
strcat(fich_dest_nombre, buffer_nombre);

fichero_dest = fopen(fich_dest_nombre, "w");
while( ! feof(fichero_orig) )
{
fseek(fichero_orig, pos, SEEK_CUR);
fread( buffer, 1, sizeof(buffer), fichero_orig);

fwrite( buffer, 1, cantidad_por_fich, fichero_dest);
pos += num_partes;
}
fclose(fichero_orig);
}
#46
Buenas, estoy en el proyecto del semestre y estamos haciendo un juego. Se trata del típico juego de motos de ir haciendo saltos. Y claro, en el aire se tendría que poder rotar la moto, ya que si no el juego no tiene ninguna gracia.

En principio hemos pensado en varias opciones. Serían estas:

-Insertar una imagen y rotarla. He estado buscando y al parecer la función "rotozoomSurface" permite hacerlo. El caso es que no sé cómo utilizarla.

-A partir de la primera imagen, crear varias imágenes, pero rotadas. Sería una implementación bastante cutre... Aparte de laboriosa, y los problemas que surgirían (ya sabéis, al rotar una imagen, se crea una de mayores dimensiones).

-Crear nosotros mismos una imagen píxel por píxel. Otra muy laboriosa... Además que no sabría si sabríamos implementarla.

La implementación física está prácticamente hecha (MRUA y tiro parabólico casi en su totalidad), ahora nos falta éso. Os agradecería mucho vuestra ayuda.

Gracias de antemano y saludos.
#47
Buenas, mi duda es la siguiente: qué forma hay de trabajar con cadenas de caracteres de una forma segura con las funciones scanf() y/o gets()? Ya sabéis, a ceñirnos a los espacios en la memoria reservados para el array en cuestión. Sé qué existe la función gets_s(), pero me gustaría saber si se puede con las otras dos mencionadas al principio.

Gracias de antemano y saludos.
#48
Hola buenas, necesito en un programa manejar valores más altos que los máximos de los int (ya sabéis, 2^31 - 1). Más concretamente, necesito manejar valores entre 1.000.000 y 9.999.999.

Cuando en el programa meto, por ejemplo, una unidad más del valor máximo (2^31), el programa lo toma como negativo, y no funciona como debería. Lo he intentado con otros tipos de datos, unsigned, long, etc. pero no consigo solucionarlo. Lo raro es que con algunos de los valores que superan ese máximo sí funciona el programa, y con otros no.

El código de ese programa os lo pongo a continuación; en otro necesito también valores altos (para calcular factoriales de números relativamente altos).

Para que entendáis el sentido del programa, os pongo la condición para que el número sea válido.
CitarSuponer que los numero de las cuentas corrientes son de 10 dígitos. El ultimo digito de la suma de los primeros 9 dígitos debe de ser el mismo que el decimo digito.

#include <stdio.h>

//Definición de funciones

int cantidadDigitos(int num);
int sumaDigitos(int num);
int ultimoDigito(int num);
void comprobaciones(int numero);

//Cuerpo del programa

int main()
{
   int numero;   //Número de tarjeta de crédito

   printf("Mete el numero de la tarjeta de credito: ");

   //Hasta meter un número positibo, no saldrá del bucle
   do{
      scanf("%i", &numero);
      if(numero < 0)
      {
         printf("\nEl numero tiene que ser positibo! Metelo otra vez: ");
      }
   }while(numero < 0);

   comprobaciones(numero);

   printf("\nIntro para salir...");
   fflush(stdin);
   getchar();

   return 0;
}

int cantidadDigitos(int num)
{
   int i = 0;            //Para contar el número de dígitos
   int numAux = num;      //Variable auxiliar

   while(numAux > 0)      //Hasta que no sea 0...
   {
      numAux /= 10;      //...pasamos al siguiente dígito
      i++;            //...y un dígito más que tenemos
   }
   
   return i;
}

int sumaDigitos(int num)
{
   int suma = 0;            //para guardar la suma entre los 9 primeros digitos del numero de la tarjeta
   int divisor = 1000000000;   //Para sacar los dígitos de uno en uno, empezando por el más significativo
   int resto = num;         //auxiliar, para avanzar de dígito en dígito
   int ultimo_digito = 0;         //Batuketaren azken digitua gordeko duen aldagaia
   int i;                     //Buklerako

   for(i=0; i<9; i++)
   {
      suma += (resto/divisor);      //la suma entre los dígitos
      resto = resto % divisor;      //pasamos al siguiente dígito
      divisor /= 10;                  //y para sacar el siguiente digito
   }

   ultimo_digito = ultimoDigito(suma);      //El último dígito de la suma

   return ultimo_digito;
}

int ultimoDigito(int num)
{
   int digito = 0;

   digito = num % 10;

   return digito;
}

void comprobaciones(int numero)
{
   int cantidad = 0;
   int suma_digitos = 0;
   
   //Calculamos en número de dígitos
   cantidad = cantidadDigitos(numero);

   //Si la cantidad de dígitos es correcta (10)
   if(cantidad == 10)
   {
      printf("\nLa cantidad de digitos es correcta.\n");
       
      //Si el último dígito de la suma de los primeros 9 dígitos es igual al último dígito de la tarjeta:
      if(sumaDigitos(numero) == ultimoDigito(numero))
      {
         printf("\nSe cumplen las condiciones.\n");
      }
      else
      {
         printf("\nEl numero de tarjeta de credito no cumple las condiciones.\n");
      }
   }
   //Si el número de dígitos no es el correcto
   else
   {
      printf("\nEl numero de digitos no es el adecuado.\n");
   }
}