• Lunes 29 de Abril de 2024, 11:32

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - Leber

Páginas: [1] 2 3
1
C/C++ / Información fichero Linux
« en: Miércoles 21 de Diciembre de 2011, 15:46 »
Buenos dias,

Mi pregunta es si hay alguna manera de saber con la API de linux si cierto fichero esta siendo usado por algun proceso ( si esta abierto digamos ).
La funcion stat no sirve, ya que da todos los datos sobre el fichero pero este no, y tampoco quiero hacer una busqueda en /proc/[pids]/[fd] para saber si ahi se encuentra el fichero, ya que perderia mucho tiempo.

Se os ocurre algo?

Gracias



2
C/C++ / Algoritmo de Huffman
« en: Jueves 25 de Agosto de 2011, 13:10 »
Hola, que tal.

Llevo un par de dias intentando implementar el algoritmo de huffman ( solo por aprender un poco más ), y a pesar de haber leido varios textos todavía tengo algunas dudas que no consigo resolver, a ver si alguien puede echarme una mano.

De momento tengo hecho:

- Tabla con valor-frequencia.
- Lista enlazada con los valores de la tabla ordenada de menor a mayor.

Es decir, teniendo la frase: "hola papa":

Código: [Seleccionar]
hola papa
Table [ 0 ]      Char:           Freq: 1
Table [ 1 ]      Char: o         Freq: 1
Table [ 2 ]      Char: h         Freq: 1
Table [ 3 ]      Char: l         Freq: 1
Table [ 4 ]      Char: p         Freq: 2
Table [ 5 ]      Char: a         Freq: 3
Total r 6
List: Char:     Freq: 1
List: Char: o   Freq: 1
List: Char: h   Freq: 1
List: Char: l   Freq: 1
List: Char: p   Freq: 2
List: Char: a   Freq: 3

Segun lo leido, el arbol huffman se forma así:

Teniendo eso: [espacio](1) - o(1) - h(1) - l(1) - p(2) - a(3)

- Se toman los dos valores con menos frequencia, por ejemplo: ( [espacio] y o ) y se forma un arbol:

   (          2         )
        /               \
" "[1 peso]          o[1 peso]

Y seguimos, ahora nos quedan: h(1) - l(1) - 2 - p(2) - a(3)
Así que cogemos "h" y "l".

Mi duda es que, a mi parecer, h y l deberían quedar asi:


               (          4        )
                   /            \
(          2         )        (         2     )             
        /          \                /       \
" "[1]           o[1]       h(1)       l(1)

Y nos queda:   p(2) - a(3) - 4


Cogemos p( 2 ) y a(3):

                                 (          9       )
                                    /                  \

               (          4        )                 (       5        )
                   /            \                        /          \
(          2         )        (         2     )         p(2)      a(3)     
        /          \                /       \
" "[1]           o[1]       h(1)       l(1)

Y nos queda: 4:

                              (               14             )
                            /                             \

                                  (          9       )            (         4       )
                                    /                  \

               (          4        )                 (       5        )
                   /            \                        /          \
(          2         )        (         2     )         p(2)      a(3)     
        /          \                /       \
" "[1]           o[1]       h(1)       l(1)

Así que de esta forma quedaría el arbol, pero creo que no es correcto.
A ver si me podéis decir donde me voy del plano y me pierdo.

Gracias de antemano

3
C/C++ / Re: matriz
« en: Lunes 6 de Junio de 2011, 18:39 »
Aquí no se te va a hacer la tarea, y mucho menos algo tan sencillo como una matriz de 3 x 3, o "un programa que me muestre una cadena" (haciendo referencia al otro post).
Además, ya que tienes el valor de pedirlo, al menos, pidelo con educación.

4
C/C++ / Re: Crear Siete y media, no se por donde empezar!!!
« en: Sábado 28 de Mayo de 2011, 11:10 »
Hola,

Ahora mismo no recuerdo mucho el juego del siete y medio, solo se que las figuras valen 0.5 y las demás 1.
Puedes empezar por idear el algoritmo, algo como:

Código: C
  1.  
  2. Dar carta
  3. Verificar que la carta no es repetida ( La carta puede repetirse 4 veces, tantas como palos haya. Una solución es hacer un array de 10 enteros, e ir incrementando el valor de cada una de ellos cuando te salga. Si te han salido dos veces 5, el entero en la posición n5 -1 del array valdrá dos. Esto puedes usarlo para contrastar si ya has mostrado, por ejemplo, los 4 reyes)
  4. Si es repetido
  5. -Vuelves a dar carta
  6. Sino
  7. -Sigues con la jugada
  8. Si carta >= 1 y carta <= 9
  9. - Carta vale n puntos (si han puesto un 5, valdrà 5 )
  10. Sino (esto quiere decir que es de 10, 11 u 12)
  11. - Carta vale medio punto
  12. Sumar el valor a la suma actual  (esto es si en la 1 jugada teníamos un 6, y ahora nos ha salido un 12, sumamos 6 + 0.5)
  13. Preguntar al usuario si quiere carta
  14.  

Se puede mejorar bastante más, de hecho la forma de ver si es repetida no es la optima, pero bueno, para que vayas haciendo creo que sirve.

NOTA: La variable que guarda la suma actual de tus cartas debe ser un float.

Una vez acabada la jugada, es decir, cuando el usuario no quiere más cartas, pasamos al otro usuario, y cuando este también termina, procedemos a ver quien se ha quedado mas cerca del 7.5.

Una forma de descartar ya de entrada es ver si alguno de los dos se ha pasado de dicho valor. Esto es si el resultado de la suma de sus cartas es superior a 7.5, si es así ya no hace falta mirar mas.
Si ambos son inferiores, comparas a ver quien tiene el valor mas alto ( a > b ) ? a : b y ya tienes al ganador.

Espero haberte ayudado.

Saludos

5
C/C++ / Re: Reconocer las flechas del teclado
« en: Viernes 13 de Mayo de 2011, 21:37 »
Ahora no tengo mucho tiempo, llego tarde, pero te dejo el link de un post donde se hablo esto: viewtopic.php?f=18&t=45519&p=162094#p162094

Saludos y espero que te sirva

6
C/C++ / Re: Complementos(1 y 2)
« en: Viernes 13 de Mayo de 2011, 18:08 »
Cita de: "Epa"
El tema del complemento es unicamente para los controladores o procesadores. Como solo funcionan con 0's y 1's se busco la forma de representar el  signo -

Por otro lado, si una pc usa un complemento u otro no es algo que realmente deberia preocuparte como programador. (aunque es bueno saber como funcionan las cosas).

Saludos

Entonces el ordenador no entiende  -11011 , no? Si no que cuando le damos un: -9, el ordenador pasa a C2 el valor absoluto del numero que le hemos dado, en este caso 9, para saber como representar internamente el -9. Es así?  

Se que doy bastante la bara, disculpad.  :ouch:

7
C/C++ / Re: Complementos(1 y 2)
« en: Viernes 13 de Mayo de 2011, 17:50 »
Gracias, creo que me ha quedado algo más claro, a medida de ir leyendo en webs, y las explicaciones aquí expuestas.

Era solo por curiosidad de saber como funcionan las cosas ^_^

Saludos!

8
C/C++ / Re: Complementos(1 y 2)
« en: Viernes 13 de Mayo de 2011, 10:35 »
ProfesorX, gracias por tu tiempo.

Por lo que tengo entendido, tanto el complemento a 1 y a 2, ambos solo se usan para buscar y representar números negativos.
Y lo de rellenar con 0's o 1's, me guie por esto que encontre:

" En realidad, un número en complemento a dos se expresa con una cantidad arbitraria de unos a la izquierda, de la misma manera que un número binario positivo se expresa con una cantidad arbitraria de ceros."

Fuente: http://es.wikipedia.org/wiki/Complemento_a_dos

Quizá simplemente lo he interpretado mal.


Sobre esto que diceS:

Citar
Ahora, segundo error que tienes, recuerda cuando se utiliza el complemento a 1 y 2, el primer digito indica que el numero es un numero NEGATIVO, no un numero positivo, suponiendo que el numero esta en complemento a 2, 10111 es negativo, ya que su primer digito es uno.

Uhm, si por ejemplo yo presentara el numero 10111 a alguien, y no le dijera si esta en complemento 1 o 2, uno tiende a pensar que es un numero binario sin mas, el 23.
Ahora, si yo lo presento como: 00010111, o como 11110111, entonces sabrá por el 1 o 0 del principio si se trata de un número negativo, o un numero positivo. Es correcto?

Algo que pensaba que tenia claro, pero viendo esto
Citar
Recapitulando, solo se calcula el complemento a 2, si el primer digito es uno
se me tambalea un poco. El complemento a 2  se usa para encontrar el negativo de un numero positivo en binario, no?
Entonces, si quiero encontrar el numero en binario que representa el -9, tengo que hacer el complemento a 2 del 9, que es lo que hice en el anterior post. Esto es así, o me lo he inventado?

Respecto a lo de C, todo empezó por eso, porque vi un ejercicio donde hablaban sobre esto, y me di cuenta de que yo no tenía ni idea respecto al tema, así que me puse a investigar.
Creo que puse el enlace al principio pero viniendo a resumir, diciendo que no se puede representar en complemento a dos el numero negativo más grande en su valor absoluto. Como CHAR_MIN = -128, no se podría representar el +128.  Y a partir de ahí fui leyendo a poco, pero no se, me cuesta un poco xD

Gracias chicos  ^_^

9
C/C++ / Re: Complementos(1 y 2)
« en: Jueves 12 de Mayo de 2011, 16:09 »
Epa, gracias por responder.

Ahora más o menos empiezo a tener una idea bastante clara.

Debido a que en el complemento a 1, existe la doble representación del cero, el rango seria: {-127...-1, -0, 0, 1..., 127}
Mientras en el C2, solo existe una sola representación del cero, tenemos espacio para un byte mas, es decir un numero más, que en este caso es el -128. ¿Es correcto?

EDITO, así no creo una respuesta nueva:

Haciendo unas pruebas sobre lo leído, imaginemos que quiero encontrar el valor en binario del -9.

El 9 en binario es: 1001

Uso el C2:

Código: C
  1. -Torno todos sus bits: 0110
  2. - Le sumo 1: 0111
  3.  

Y le agrego un 1 al bit mas significativo, quedando que:
Código: ASM
  1. 10111 -> -9
  2.  

Sin embargo, usando conversores web para verificarlo, veo que 10111 da 23.

Esto creo que es porque he limitado el numero de bits a 5, pero si lo hiciera con 8, el numero 23 quedaría: 00010111, y el numero -9 en lugar de 0, 1. Voy muy desviado?

Se que el tema se ha desvirtuado mucho, y que poco cabe aquí, lo siento.  :unsure:
 
Gracias y saludos

10
C/C++ / Re: Apoyo con arreglos bidimensionales!!
« en: Jueves 12 de Mayo de 2011, 14:11 »
Hola:

1- Podrías etiquetar el código? Arriba tienes una pestañita. Más que nada es más leible, y da menos "pereza" visual.
2- Puedes explicar mejor el problema, o como debes hacerlo, o para que necesitas los arrays? Ya que al menos por mi parte no lo he visto demasiado claro.

Gracias :hola:

11
C/C++ / Re: Complementos(1 y 2)
« en: Jueves 12 de Mayo de 2011, 10:51 »
Hola punteroNulo,

Si, lo he leído como 4 o 5 veces xD, pero no me acabo de aclarar.

Es decir, se que el complemento a 2 se usa para representar los números negativos, invirtiendo los bits después de encontrar el primero 1 a la derecha, o usando el complemento a 1 y sumando 1 luego. Esto lo tengo claro, o creo tenerlo vaya.

Creo entender que en complemento a 2, los números negativos van de -128 a 127(siempre hablando de 1 byte claro), y en cambio en complemento a 1 van de -127 a 127 porque en C1 los números negativos son 2^n-1, mientras que en C2 es 2^n.

De todos modos, lo unico que no acabo de cazar muy bien es el hecho de cuando usar uno u otro, y además, ¿por qué en C se usa C2 ?.
Tal y como dije, en limits.h:

Aparece CHAR_MIN como -128.

Quizá es una duda muy tonta, pero no lo se ver, y también se que esta duda no esta muy relacionada con este ámbito, ya que no pregunto dudas especificas de programación, pero no se me ha ocurrido un lugar más apropiado. Aunque si lo creéis oportuno moved el hilo a otro sitio y disculpad las molestias.

Saludos

12
C/C++ / Re: Copiar archivos con C
« en: Jueves 12 de Mayo de 2011, 09:27 »
Cita de: "su -"
La función getc() no devuelve un entero en vez un char ?  :huh:

Si, devuelve un entero, que es el codigo en ascii que representa dicha letra o numero.  ^_^

13
C/C++ / Complementos(1 y 2)
« en: Miércoles 11 de Mayo de 2011, 18:51 »
Hola, que tal.

Leyendo un libro, me surgió una duda que no logro aclarar por mas que lo leo.

He leido que en una variable de 8 bits(1 byte), usando un complemento a 2, el rango oscila de -128 a 127, mientras que usando complemento a 1, va de -127 a 127.
Estamos hablando de variables con signo claro.

He mirado el archivo limits.h:

Código: C
  1. #  define CHAR_BIT  8
  2.  
  3. /* Minimum and maximum values a `signed char' can hold.  */
  4. #  define SCHAR_MIN (-128)
  5. #  define SCHAR_MAX 127
  6.  

Así que supongo que usan complemento a 2.

Pero no logro ver porque usando complemento a 2, el numero negativo es -128, mientras que usando 1 es -127.
Por lo que he leido, el C2(complemento 2) es igual a: C1+1, pero no se si va por ahi la cosa. Estoy bastante liado la verdad.

Este es el enlace que estoy leyendo, y que de ahí surgió la duda: http://users.powernet.co.uk/eton/kandr2/krx304.html

No se si me he explicado bien, llevo todo el dia con esto y tengo la cabeza muy espesa ya.

Gracias de antemano

14
C/C++ / Re: Tabla de verdad
« en: Jueves 28 de Abril de 2011, 10:56 »
Aclarado entonces  :P , fallo mio por no pensar en castellano  :lol:

15
C/C++ / Re: Tabla de verdad
« en: Miércoles 27 de Abril de 2011, 23:36 »
Uhm, creo que me he colado pues, pensaba que se refería a los otros. Fallo mio  :brickwall:

16
C/C++ / Re: Tabla de verdad
« en: Miércoles 27 de Abril de 2011, 16:45 »
|| -> OR :

&& -> AND

Código: C
  1. if( numero == 4 || numero == 6 ) //Entrara al if si el número es 4 O 6.
  2.  
  3. if( numero > 5 && numero < 10 ) //Entrara al ciclo si numero es mayor que 5 Y menor que 10
  4.  

Saludos  ^_^

17
C/C++ / Re: Fin de linea de un archivo .txt!!
« en: Miércoles 27 de Abril de 2011, 09:31 »
En C++ no se bien bien como sería. En C lo he hecho así y funciona:


Código: C
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.     int c;
  6.     FILE *f;
  7.     int nw = 0;
  8.  
  9.         f = fopen("archivo.txt", "r");
  10.         if( f ==  NULL )
  11.             return -1;
  12.  
  13.         while( feof(f) == 0 ) {
  14.  
  15.             c = fgetc(f);
  16.             if( c == 'n' )
  17.                 nw++;
  18.         }
  19.  
  20.         fclose(f);
  21.  
  22.         printf("Saltos de linea: %dn", nw );
  23.         return 0;
  24. }
  25.  

Código: C
  1. test@test:~/c/ejercicios/foro$ cat archivo.txt
  2. hola que ta
  3. hola jaja
  4. test@test:~/c/ejercicios/foro$
  5.  

Saludos!  ^_^

18
C/C++ / Re: Fin de linea de un archivo .txt!!
« en: Martes 26 de Abril de 2011, 09:23 »
Si solo quieres saber si es fin de linea ves cogiendo caracteres hasta que encuentres un salto de linea: 'n'. Eso querrá decir que la linea se ha acabado.

Saludos

19
C/C++ / Re: Hilos o procesos
« en: Sábado 23 de Abril de 2011, 13:47 »
Ahí tienes información y ejemplos: http://www.chuidiang.com/clinux/procesos/procesoshilos.php

Saludos  ^_^

20
C/C++ / Re: Parar la ejecución hasta pulsar una tecla.
« en: Miércoles 20 de Abril de 2011, 10:10 »
Si estás en linux puedes re-programar la terminal: http://www.mkssoftware.com/docs/man5/st ... mios.5.asp   ^_^
Tendrías que hacerlo en modo no canónico.

21
C/C++ / Re: Efiencia con punteros
« en: Jueves 14 de Abril de 2011, 09:47 »
Supongo que este tipo de dudas solo pueden verse a bajo nivel, viendo el código ensamblador que genera.

22
C/C++ / Re: Problema de novato con clases
« en: Jueves 14 de Abril de 2011, 09:40 »
Bueno,  más que nada fue para darme a entender.  :)

23
C/C++ / Re: Efiencia con punteros
« en: Jueves 14 de Abril de 2011, 09:39 »
Si, se que es lo mismo, y no, no fue a mi pero vi que se lo comentabas a alguien, pero no me refería a esto como si fueran dos tipos distintos, si no la manera de acceder a ellos, aunque ya lo has explicado.

Esto lo vi en una web donde explicaban un poco sobre punteros.

"Sin embargo, hay que tener en cuenta que la forma *(x+i) es mucho más eficiente que x, por lo que suele preferirse cuando la velocidad del ejecución es un factor determinante."

Quizá soy yo que lo he malinterpretado, pero creo que se refiere a lo que he dicho.

gracias  ^_^

24
C/C++ / Re: Serializacion en C!!
« en: Jueves 14 de Abril de 2011, 09:22 »
Podrías poner un poco de código. No esperarás que adivinemos que te esta fallando, verdad?  ^_^

25
C/C++ / Efiencia con punteros
« en: Miércoles 13 de Abril de 2011, 22:18 »
Hola, quizás el titulo no es muy descriptivo. Intentare explicarme:

Supongamos un array como este:

Código: C
  1. int enteros[2] = {4 ,5 };
  2.  

Para acceder a su contenido puede hacerse:

Código: C
  1. enteros[1]
  2.  

o

Código: C
  1. *(enteros + 1)
  2.  

La segunda forma, por lo que he podido comprobar, toma la dirección en la que empieza la variable enteros, y dado que un entero ocupa 4 bytes, le suma 4 a la direccion base para así obtener el contenido del segundo indice.

Sería algo como: 0x7fff00a49620(dirección del primer indice de enteros) + 4. Creo que no me equivoco, es así, no?

Ahora bien, leyendo por ahí vi que decían que la segunda forma es más rápida y eficiente que la primera.  Y mi pregunta es, de que forma esta accediendo con enteros[1] para que sea menos rápido ?

Gracias de antemano

Páginas: [1] 2 3