Cronometro en C

24 01 2009

Por fin, hace unos dos dias mientras vagueaba un poco en el canal #ubuntu-es volvi a programar. Todo empezo con un tio que queria saber si habia algun cronometro para ubuntu, estaba resolviendo estos cubos (creo que se llaman rubik) y queria saber cuanto tardaba. Nadie le dio una respuesta satisfactoria y yo me interese en el caso, le dije que no debia ser tan dificil  hacer uno sencillo en C, que me diera un poco de tiempo y yo lo hacia. Bien, tarde unas dos horas porque no tenia ni idea de como hacer para que el tiempo siguiera corriendo mientras se esperaba la respuesta del usuario, despues estaba que el solo tenia que presionar una tecla y el programa tenia que terminar (algo como getch() ). Despues de pasar todo el tiempo del mundo preguntando en #c y leyendo man pages (sudo aptitude install manpages-dev), me salio este codigo:

/*librerias*/
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <termios.h>
#include <stdlib.h>
int main() {

	struct timeval timeout;

	fd_set rdfs; 

	FD_ZERO(&rdfs);
	FD_SET(0,&rdfs);

	struct termios my_term, old_term;

	my_term.c_lflag &= (~ICANON);
	my_term.c_cc[VTIME] = 0;
	my_term.c_cc[VMIN] = 1;
	tcsetattr(0,TCSANOW,&my_term);
	int total = 0;
	int segundos = 0;
	int minutos = 0;

	while ( total == 0  ) {
		if ( segundos == 60 ) {
			minutos += 1;
			segundos = 0;
			}
		timeout.tv_sec = 1;
		timeout.tv_usec = 0;
		segundos += 1;
		total = select( 1, &rdfs, NULL, NULL, &timeout ) ;
		FD_ZERO(&rdfs);
		FD_SET(0,&rdfs);
		}
	printf("%i seconds and %i minutes!\n",segundos+1, minutos);
	tcsetattr(0,TCSANOW,&old_term);
	return(EXIT_SUCCESS);
	}

No es lo mejor que pude haber hecho, pero es suficiente. Todavia tengo que estudiar un poco sobre termios.h para ver si puedo regresar la terminal a la normalidad despues de cambiar las cosas (old_term parece no funcionar), tambien me han dicho que no es muy portable, ya tendre que solucionar eso tambien. De momento eso es lo que tengo y compilado en mi laptop bajo ubuntu GNU/Linux 8.04 con gcc (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu3) funciona bien.





Averiguando el tamaño de un archivo en C

4 07 2008

El otro dia estaba haciendo un programa de broma (Aunque bastante… digamos, desagradable) que llenaba un archivo de texto a base espacios (jj) pero necesitaba una forma de controlarlo y se me ocurrio hacer otro programa que comprobara el tamaño del archivo para no excederme. El programa no utiliza ninguna libreria de sistema o llamada a sistema por lo que pienso que es portable, de todos modos, si encuentran que no es portable en algun SO, me envian un mail, solo utilizo un puntero FILE y lo basico en abrir archivos. El codigo lo dejo aqui: (Es corto)
Leer el resto de esta entrada »





Averiguando si un numero es palindromo

25 06 2008

Hoy estaba de buen humor asi que me puse a revisar capitulos viejos de mi libro de programacion y me encontre con un ejercicio sorbe los palindromos que ya habia resuelto de la manera mas floja posible y me dieron ganas de volverlo a hacer a ver que tal me iba, el resultado fue: un metodo infalible para detectar palindromos de numeros (Quien sabe palabras) en numeros menores de 11 digitos! Dejo la solucion (17 Lineas) y una explicacion porque esta algo engorroso xD:
Leer el resto de esta entrada »





Una pequeña explicacion sobre el programa de “Hola Mundo” que puse antes

31 05 2008

Y si no la puse junto al programa fuew porque ya era de noche y me faltaban terminar de entender algunas cosas (basicas por supuesto) sobre su funcionamiento, ahora creo que las podre explicar un poco mejor, de todos modos, ahi les va, si encuentran algo malo, corrijanme en los comentarios:

Leer el resto de esta entrada »





Hello World en ASM para compilador TASM

28 05 2008

Para mostrar mis grandes progresos O.O, les dejo el programa mas escrito en el mundo, el “hola mundo”:

.MODEL TINY
.STACK
.DATA
hola db 'Hola mundo, estoy aprendiendo ASM.$'
.CODE
main proc:
mov ax, seg hola
mov ds, ax
mov dx, offset hola
mov ah, 09
int 21h
mov ah, 04ch
mov al, 00
int 21h
endp main
END main

Bien sencillo a decir verdadm pero eso es porque uso interrupciones (^^) del sistema, esperen a ver cuando use las del BIOS xD