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ú

Temas - NathanD

#1
Buenas,

actualmente estoy en mi último año de Ingeniería Informática, y tengo varias cosas en mente para el futuro inmediato, que serían varios másters (no necesariamente de seguridad); y certificaciones, estas sí de Seguridad, puesto que he leído que es lo que más se valora.

He visto esta, la de Certified Ethical Hacker (CEH) y me ha interesado, pero por lo que he leído, la certificación expira a los 3 años de conseguirla... Mi idea no es, necesariamente, sacarme la certificación y ya meterme en el mundo laboral en ese ámbito; contemplo muchas ramas. Así que eso de que expire "tan" pronto me echa para atrás.

¿Podríais recomendar certificaciones? Agradecería si además tenéis en cuenta lo dicho arriba sobre que expiren.

Muchas gracias y saludos.
#2
Seguridad / Libro sobre XSS
24 Julio 2015, 21:15 PM
Buenas,

estoy buscando un libro sobre XSS, y el único que he encontrado es este: Xss Attacks: Cross Site Scripting Exploits and Defense, que parece estar bien, pero es de 2007 (8 años ya...), y no sé si iba a estar desactualizado y obsoleto. Y el libro tiene un precio que tampoco es para comprarlo a la ligera.

¿Os merece alguna opinión? ¿Creéis que merece la pena?

Gracias y saludos
#3
Buenas,

estoy con programación concurrente, y la verdad es que me cuesta bastante. En este caso, el ejercicio propuesto es un programa cuya salida sea:
A
BB
CCC
A
BB
CCC
etc.

Donde cada hilo imprime su letra. Esto es lo que he hecho, cuya salida es correcta:

Código (java) [Seleccionar]

public class HiloLetra implements Runnable{

char letra;
int numVeces;
Buffer buffer; //Recurso compartido
static int turno;


public HiloLetra(char letra, int numVeces, Buffer buffer) {
this.letra = letra;
this.numVeces = numVeces;
this.buffer = buffer;
}


@Override
public void run() {
while(true) {
try {
buffer.imprimirLetra(letra, numVeces);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}


Código (java) [Seleccionar]

import java.util.concurrent.Semaphore;


public class Buffer {

int numeroLetras;
Semaphore arrayCandados[];
int posicionArray;


public Buffer(int numeroLetras) {
this.numeroLetras = numeroLetras;
arrayCandados = new Semaphore[this.numeroLetras];
posicionArray = 0;
crearCandados();
}

private void crearCandados() {
arrayCandados[0] = new Semaphore(1);
for(int i = 1; i < numeroLetras; i++) {
arrayCandados[i] = new Semaphore(0);
}
}

public void imprimirLetra(char letra, int numeroLetra) throws InterruptedException {

while(numeroLetra-1 == posicionArray) {
arrayCandados[posicionArray].acquire(numeroLetra);

for(int i = 0; i < numeroLetra; i++) {
System.out.print(letra/*+", posicion array: "+posicionArray*/);
}
System.out.println();

posicionArray++;
if(posicionArray == numeroLetras) {
posicionArray = 0;
}

arrayCandados[posicionArray].release(posicionArray+1);
}
}
}


Código (java) [Seleccionar]

public class Principal {

final int NUMERO_LETRAS = 3;


HiloLetra runnables[];
Thread hilosLetras[];
Buffer buffer;


public Principal() {
runnables = new HiloLetra[NUMERO_LETRAS];
hilosLetras = new Thread[NUMERO_LETRAS];
buffer = new Buffer(NUMERO_LETRAS);
crearHilos();
}

private void crearHilos() {
for(int i = 0; i < NUMERO_LETRAS; i++) {
runnables[i] = new HiloLetra((char)(i+'A'), i+1, buffer);
//System.out.println("creado hilo "+(char)(i+'A')+", num veces: "+(i+1));
hilosLetras[i] = new Thread(runnables[i]);
}
}

private void iniciarHilos() {
for(int i = 0; i < NUMERO_LETRAS; i++) {
hilosLetras[i].start();
}
}


public static void main(String[] args) {
Principal principal = new Principal();
principal.iniciarHilos();
}



}


Buffer es la clase donde se guarda el array de semáforos, y cuya instancia es un recurso compartido por todos los hilos.

Como he dicho, la salida del programa es correcta. Pero mi duda radica en si la concurrencia de veras está bien gestionada. Porque, mientras se ejecuta el programa, el administrador de tareas indica que la CPU está al 100%, lo cual me hace pensar que no se estén gestionando bien los hilos.

Gracias de antemano y saludos.
#4
Buenas, llevo bastante tiempo dándole vueltas a cómo hacer lo de la siguiente imagen, y la verdad es que no tengo ni idea.



No pongo el código porque básicamente es inútil, mi problema es el concepto.

Estaría muy agradecido si me ayudarais aunque fuera a plantearlo.
#5
Buenas, estoy tratando de reproducir un archivo de audio (.wav en este caso, que por lo que he visto es el más extendido en estos casos) para luego implementarlo en otro programa.

Antes de ponerme a ello, he usado AudioSystem.getAudioFileTypes() para ver qué audios están soportados. La salida es la siguiente:
wav
au
aif


Pues bien, al intentar reproducir un .wav, me salta la excepción que he puesto en el título:

Código (java) [Seleccionar]
javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input file

He probado cambiando el nombre del archivo por uno inexistente por si el problema era que no encontraba el archivo, pero no es así; sí lo encuentra, pero no es capaz de reproducirlo.

Os dejo el código fuente:

Código (java) [Seleccionar]
import java.io.File;

import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

public class Reproductor {

public static void main(String[] args) {
try {

Clip sonido = AudioSystem.getClip();

sonido.open(AudioSystem.getAudioInputStream(new File("another.wav")));

sonido.start();

while (sonido.isRunning())
Thread.sleep(1000);

sonido.close();

} catch (Exception e) {
System.out.println(e.getMessage());
}
}

}


Gracias de antemano y un saludo.
#6
Estoy creando una aplicación cliente-servidor lo más sencilla posible (para luego implementar más cosas), pero estoy teniendo problemas para ejecutarlo en la LAN de mi casa (ya entonces de WAN ni de hablamos, el cual es mi propósito...). Sólo funciona cuando tanto el servidor como el cliente son el mismo localhost, si no, me salta la siguiente excepción:
java.net.ConnectException: Connection refused: connect

Os dejo los fuentes. Cliente:
Código (java) [Seleccionar]

import java.io.DataInputStream;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;


public class Cliente {
//Constantes
final int PUERTO = 7000;
//final String HOST = "192.168.1.36";

/************/

//Métodos - constructor
public Cliente(){

try{
InetAddress address = InetAddress.getLocalHost();
Socket skCliente;

skCliente = new Socket(address, PUERTO);
InputStream aux = skCliente.getInputStream();
DataInputStream flujo = new DataInputStream(aux);
System.out.println(flujo.readUTF());
skCliente.close();

} catch(UnknownHostException e){
System.out.println( e );
    System.out.println("Error en la conexión." );
   
} catch (Exception e) {
System.out.println(e);

}
}

//Cuerpo del programa
public static void main(String[] args){
new Cliente();


}

}


Servidor:
Código (java) [Seleccionar]

import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;


public class Servidor {
//Constantes
final int MAX_CLIENTES = 5;
final int PUERTO = 7000;
/************/

//Métodos - constructor
public Servidor(){
ServerSocket skServidor;
try {
skServidor = new ServerSocket(PUERTO);
System.out.println("Escucho el puerto: "+PUERTO);
for(int numCli = 0; numCli < MAX_CLIENTES; numCli++){
Socket skCliente = skServidor.accept();
System.out.println("\tSirvo al cliente: "+skCliente.getRemoteSocketAddress());
OutputStream aux = skCliente.getOutputStream();
DataOutputStream flujo = new DataOutputStream(aux);
flujo.writeUTF("\nHola cliente "+ skCliente.getRemoteSocketAddress());
skCliente.close();
}

} catch(UnknownHostException e){
System.out.println( e );
    System.out.println("Error en la conexión." );
   
}
    catch (Exception e) {
// TODO Auto-generated catch block
System.out.println(e);
}
}

public static void main(String[] args){
new Servidor();
}
}


Gracias de antemano y saludos.
#7
Buenas, estoy con algo que me lleva trayendo de cabeza desde hace bastante. Mi pregunta es ésa, ¿cómo puedo poner una imagen de fondo, y luego superponer figuras con Graphics? Lo he intentado de mil maneras, a veces no me hace caso, y otras da error en tiempo de ejecución, y no sabría ni qué código poner aquí. He conseguido poner otros componentes como JLabels o JButtons, pero con Graphics no puedo.

Gracias de antemano y saludos.
#8
Hola buenas, os expongo mi problema.

Estoy haciendo un clon del Arkanoid y me gustaría añadirle un sistema de puntuaciones, para hacerlo más atractivo y rejugable. Mi idea es la siguiente: cada partida tendrá asociada un nombre (el que usuario escoja), y éste se guardará, junto con los puntos conseguidos, en un fichero que se guardará en un "servidor". Cuando en el menú del juego se seleccionara la opción de mostrar las puntuaciones, pues se mostraría la información almacenada en el fichero.

Y claro, se supone cualquier ordenador desde el cual se estuviera ejecutando el juego puede ver las puntuaciones del fichero. Antes que nada aclarar que mis conocimientos sobre sockets (en cualquier lenguaje de programación) son nulos. Dicho ésto, mi pregunta es, ¿puede ser viable? No os estoy pidiendo cuál sería el código ni nada por el estilo, evidentemente, sino cuáles serían las directrices a seguir para mi propósito.

Creo que no me dejo nada en el tintero. Muchas gracias de antemano (sobretodo por vuestra paciencia).
#9
Buenas, resulta que tengo que coger la información de un fichero .dat con la información de una matriz dinámica. Se supone que la estructura empleada es la siguiente:

typedef struct Matriz{
int f;
int c;
double **m;
}tMatriz;


He probado mil formas, pero no consigo coger correctamente la información del fichero. Ésta es la última forma que he probado:


int main()
{      
//Variables
FILE *fichero;
tMatriz *matriz;
char nombre[15];
int cantidad;
int i;
/****************************/

printf("Nombre del fichero: ");
gets(nombre);

if( (fichero= fopen(nombre, "rb") ) == NULL )
{
printf("\nEl fichero no existe. El programa se cerrará...");
Sleep(2500);
exit(1);
}

matriz = (tMatriz*) malloc( 20 * sizeof(tMatriz) );

matriz->m = (double**) malloc( 20* sizeof(double*) );

for(i=0; i < 20; i++)
matriz->m[i] = (double*) malloc( 20* sizeof(double) );


cantidad= fread(matriz, sizeof(tMatriz), 20, fichero);
printf("%d\n", cantidad);    //9
printf("%d\t%d", matriz->c, matriz->f);   //Basura

fflush(stdin);
getchar();

return 0;
}


El valor de 20 para las filas y columnas es uno elegido al azar.

Cuando imprimo los valores de 'c' y 'f', salen números que no tienen nada que ver con lo que corresponde. Y cuando intento imprimir los valores de la matriz, el programa peta y se cierra.

A ver si me podéis ayudar. Saludos.
#10
Hola, tengo que hacer una lista enlazada simple en la que los elementos que se insertan, sea de una forma ordenada (de menor a mayor). He hecho la función y no consigo que funcione como debe, no sé cuál es el fallo y cómo debo corregirlo...

Os dejo la función (creo que no hace falta poner todo el programa, pero si así fuera decídmelo y lo pongo (igual me he líado con el nombre de alguna variable en la traducción jeje):

LISTA *meterElementoOrdenado(int num, LISTA *lista)
{
LISTA *nodo_aux, *inicio;
int cont = 1;

inicio = lista;
nodo_aux = (LISTA*) malloc( sizeof(LISTA) );

if(nodo_aux == NULL)
printf("\nNo hay sitio para mas elementos...\n");

if(lista == NULL)
{
nodo_aux->numero = num;
nodo_aux->siguiente = NULL;
return nodo_aux;
}

else
{
do
{
          if(num < lista->numero)
          {
                                   nodo_aux->numero = num;
                                   nodo_aux->siguiente = lista->siguiente;
                                  lista->siguiente = nodo_aux;
                                  cont = 0;
           }
           lista = lista->siguiente;

}while( (lista != NULL) && (cont != 0) );

nodo_aux = inicio;
return nodo_aux;
}

}


Gracias de antemano y saludos.
#11
Buenas, mi problema es el siguiente. Tengo una lista simplemente enlazada que la inicializo con los elementos de un array generados aleatoriamente. Esos elementos se insertan sin problema en la lista, pero cuando lo inserto manualmente, por el teclado por ejemplo, no se añade a la lista (o si se añade, no se visualiza). A ver si me podéis ayudar.

La estructura:


typedef struct lista{
int numero;
struct lista *siguiente;
}LISTA;


La función para crear la lista

LISTA *crearLista(int num)
{
LISTA *lista;

lista = (LISTA*) malloc( sizeof(LISTA) );

lista->numero= num;
lista->siguiente= NULL;

return lista;
}

La función de añadir un elemento:


LISTA *anyadirElementoAlPrincipio(int num, LISTA *lista)
{
LISTA *nodo_nuevo;

nodo_nuevo= (LISTA*) malloc( sizeof(LISTA) );
if(nodo_nuevo == NULL)
printf("\nNo hay sitio para más números.\n");

       else
       {
       nodo_nuevo->numero = num;
       nodo_nuevo->siguiente= lista;
       }

return nodo_nuevo;
}


La función de ver la lista entera:


void mostrarLista(LISTA *lista)
{
printf("%d\n", lista->numero);

if(lista->siguiente != NULL)
mostrarLista(lista->siguiente);
}


En el main el uso de la función de añadir un elemento es exactamente igual con los elementos del array y con el introducido desde el teclado... Si ayudara en algo, decídmelo y lo pongo también.

Gracias de antemano y saludos.

PD: aprovecho para preguntar una duda que me ha surgido, cuando se llama a la función de añadir elementos, ¿no habría que liberar con free() el espacio reservado para el nodo que se usa en la función?
#12
Programación C/C++ / Incremento de punteros
29 Marzo 2013, 17:43 PM
Buenas, mi problema esta vez es el siguiente.

En realidad me gustaría que me explicarais el porqué de este resultado de este código.

El código:
#include <stdio.h>

#define MAXLINE 60

int main()
{
char *ptr;
ptr = (char*) malloc(MAXLINE * sizeof(char) );

printf("Introduce una frase: ");
fgets(ptr, MAXLINE+1, stdin);

printf("\n%p = %c", ptr,*ptr);
ptr++;
printf("\n%p = %c", ptr, *ptr);

printf("\n\n%p %p", ptr, ptr++);

getchar();

return 0;
}


El resultado:


Mi duda es, ¿por qué hace el incremento "al revés"? Después de haber incrementado el puntero en uno para que apunte al segundo carácter (ahí en cambio no hay problema), luego en el printf no es la misma dirección de memoria.

Saludos y gracias de antemano.
#13
Buenas, mi ejercicio es el siguiente: tengo que guardar un string en un array, y luego decir cuál es la palabra que más se repite. Para ello, he pensado guardar cada palabra en un array de punteros, y luego hacer las comparaciones y tal.

El problema viene cuando intento copiar manualmente caracteres en los arrays de punteros. En el siguiente ejemplo:


void copiarPalabras(char *string, char *palabras[]);
{
         int  i = 0;
         //Para las primeras 10 letras, por ejemplo
         palabras[0] = (char*) malloc(10 * sizeof(char) );

        while( *(string+ i) != ' ' )   //Copiamos la primera palabra de la frase
       {
       *(palabras[0] + i) = *(string+ i);
       i++;
       }
palabras[i] = '\0';
}

Si, por ejemplo, guardo desde el teclado "hola que tal" en string, en palabras[0] no sólo no se copia "hola", sino basura (strlen me dice que hay 24 caracteres en total). Si compruebo las vueltas que ha dado el bucle, efectivamente son 4 , el número de letras, y además añado el '\0' al final. Funciona mal reserve el espacio que reserve con malloc.

PD: con calloc en lugar de malloc sí funciona correctamente, pero quiero saber qué es lo que hago mal en esa función como está.

Gracias y saludos.
#14
Buenas a todos, mi problema es que no entiendo ciertas cosas sobre los ficheros, más concretamente la diferencia entre ficheros binarios y de texto, las funciones para cada tipo...

Por ejemplo, en un examen de otro día, teníamos en un archivo de extensión .dat (entiendo que es binario, así que lo abrí como tal). Se trataba de un censo con la información de los habitantes, y si cumplían ciertos requisitos, había que copiarlos a un fichero .txt. No se me ocurrió otra forma que hacerlo con fgets, para tener en cuenta los saltos de línea, asumiendo que cada habitante está en una línea (¿cómo puedo hacerlo con fread?). Y claro, lo hice mal (y éso que con fgets funciona sin problema). Por éso, no tengo nada claro por qué con una función sí y con otra no, y cómo usarla...

Gracias de antemano y saludos.
#15
Buenas a todos, tengo unas cuantas dudas y espero poder resolverlas con vosotros.

Tengo que coger un ejercicio de administración de hoteles, hecho anteriormente, y hacerlo, pero esta vez usando punteros.

Por ejemplo, las primeras líneas del .c con main, donde declaro la estructura y la inicializo:


HOTELES hotel[NUM_HOTELES];          //3 hoteles

/***************/
HOTELES_inicializarHoteles(hotel); //Inicializamos el número de clientes de cada hotel a 0
 

Dicha función está definida así:


void HOTELES_inicializarHoteles(HOTELES hotel[])
{
int i;

for(i=0; i<NUM_HOTELES; i++)
{
hotel[i].numero_clientes = 0;
}
}


Como se trata de reescribir el programa usando punteros, me he limitado a cambiar el parámetro:

void HOTELES_inicializarHoteles(HOTELES *hotel)

Pero no consigo hacer nada. Me da error tanto si intento acceder a la posición del hotel con aritmética de punteros

*(hotel + i).numero_clientes = 0;

como accediendo a la estructura con el operador "->"

hotel[i]->numero_clientes = 0;

(Y haciendo ambas cosas juntas también de da error, claro).

En cambio, si en el parámetro de la función defino hotel como indirección doble, sí que debo emplear el operador "->". Pero bueno, que tampoco tengo del todo claro por qué hay que hacerlo así, lo he hecho un poco al tuntún. Además, así da error en ejecución...

Mi otra duda es si también debería modificar las estructuras anidadas, es decir, si en el primer ejercicio tengo una estructura dentro de otra de forma "simple", si ahora tengo que anidarlas usando punteros.

El tema de los punteros lo tengo claro, cómo y cuándo usar los operadores, direcciones de memoria, etc. Pero ahora con las estructuras no lo tengo nada claro.

Gracias de antemano, perdón por el tocho y saludos.
#16
Hola, quiero hacer lo siguiente, pero no lo consigo.

En cada linea del fichero se supone hay un nombre, y cada uno de esos nombres quiero guardarlos en una estructura. Estaría definida así:

typedef struct{
nombre[20];
}ESTRUCTURA


Y en el main así:

ESTRUCTURA estruc[20]

Entonces, lo que yo quiero es guardar la primera línea del fichero en la primera posición, la segunda en la segunda, etc.

Para hacerlo, hago lo siguiente:
while( ! feof(fichero) )
    {
           fseek(fichero, pos_seek, SEEK_SET);
           fgets(estructura[i].nombre, 80, fichero);
           pos_seek += strlen(estructura[i].nombre);
           i++;
    }


Pero no funciona como debería.

Gracias de antemano.
#17
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.
#18
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);
}
#19
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.
#20
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.
#21
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");
   }
}