|
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
1
« 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
« 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":
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
« 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
« 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: Dar carta 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) Si es repetido -Vuelves a dar carta Sino -Sigues con la jugada Si carta >= 1 y carta <= 9 - Carta vale n puntos (si han puesto un 5, valdrà 5 ) Sino (esto quiere decir que es de 10, 11 u 12) - Carta vale medio punto 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) Preguntar al usuario si quiere carta
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
6
« en: Viernes 13 de Mayo de 2011, 18:08 »
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.
7
« 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
« 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_dosQuizá simplemente lo he interpretado mal. Sobre esto que diceS: 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 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
« 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: 1001Uso el C2: -Torno todos sus bits: 0110 - Le sumo 1: 0111
Y le agrego un 1 al bit mas significativo, quedando que: 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. Gracias y saludos
10
« 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
11
« 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
« en: Jueves 12 de Mayo de 2011, 09:27 »
La función getc() no devuelve un entero en vez un char ?
Si, devuelve un entero, que es el codigo en ascii que representa dicha letra o numero.
13
« 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: # define CHAR_BIT 8 /* Minimum and maximum values a `signed char' can hold. */ # define SCHAR_MIN (-128) # define SCHAR_MAX 127
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.htmlNo se si me he explicado bien, llevo todo el dia con esto y tengo la cabeza muy espesa ya. Gracias de antemano
14
« en: Jueves 28 de Abril de 2011, 10:56 »
Aclarado entonces , fallo mio por no pensar en castellano
15
« 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
16
« en: Miércoles 27 de Abril de 2011, 16:45 »
|| -> OR : && -> AND if( numero == 4 || numero == 6 ) //Entrara al if si el número es 4 O 6. if( numero > 5 && numero < 10 ) //Entrara al ciclo si numero es mayor que 5 Y menor que 10
Saludos
17
« 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: #include <stdio.h> int main(void) { int c; FILE *f; int nw = 0; f = fopen("archivo.txt", "r"); if( f == NULL ) return -1; if( c == 'n' ) nw++; } printf("Saltos de linea: %dn", nw ); return 0; }
test@test:~/c/ejercicios/foro$ cat archivo.txt hola que ta hola jaja test@test:~/c/ejercicios/foro$
Saludos!
18
« 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
« en: Sábado 23 de Abril de 2011, 13:47 »
21
« 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
« en: Jueves 14 de Abril de 2011, 09:40 »
Bueno, más que nada fue para darme a entender.
23
« 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
« 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
« 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: int enteros[2] = {4 ,5 };
Para acceder a su contenido puede hacerse: o 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
|
|
|