Archivo sección programando
Por culpa de los
juankers he tenido que borrar los comentarios de las últimas 3 semanas del blog, así como algunos otros datos. Los intentaré restaurar lo antes posible. Disculpen las molestias -si alguien necesita ser disculpado-.
Actualización: Ya ha vuelto todo a su sitio, me quedan por restaurar algunos de
mis marcadores (una especie de
del.icio.us personal), pero con paciencia, cada cosa a su tiempo. Ahora, a ver si me pongo en serio y retomo la programación, que no es plan de que me
juankeen mil millones de veces.
Proceso de migración a PHP en modo
on.
3 comentarios | 321 clicks
¿Cuáles es la probabilidad de aprobar un examen tipo test sin tener absolutamente ni idea? Entiéndase ni idea, como responder aleatoriamente cada una de las preguntas. La respuesta, es evidente, depende del tipo de examen: ¿cuántas preguntas son? ¿cuántas respuestas posibles tiene cada pregunta? ¿es respuesta única o multirespuesta? ¿cuánto suma una pregunta acertada y cuánto resta una pregunta fallada? etc... Ciertamente, variando el tipo de examen, varían también las probabilidades de aprobar.
Mañana (lunes, 19-mayo-2008) a las 9.00 tengo un examen tipo test del cual se podría decir no tengo ni idea. ¿Aprobaré? Pues no, para saber eso no hace falta hacer experimentos frikis como este. Pero el caso es que se me ocurrió hacer un programilla (en C, aunque a ver si lo paso a JavaScript) que calcule las probabilidades de aprobar un examen tipo test variando las características del mismo. Como de probabilidad y estadística tengo unos conocimientos muy limitados y a un ordenador lo que se le da realmente bien es realizar operaciones muy rápido, me he basado en esta última posibilidad he creado un programilla que realiza el mismo examen 50.000 veces respondiendo siempre de forma aleatoria cada una de las preguntas, y el resultado es el siguiente:
Nota: en cada uno de los casos, se realiza el mismo examen 50.000 veces respondiendo de forma aleatoria.
- Caso 1: A primera vista muy sencillo de aprobar. 10 preguntas, respuesta única por pregunta, 1 punto pregunta acertada y las preguntas falladas no restan, 3 respuestas posibles por pregunta, se responde a todas las preguntas, y el resultado es el siguiente:
- La nota máxima es: 10.000
- La nota mínima es: 0.000
- La nota media es: 3.340
- Ha suspendido 39374 veces, lo que supone el 78.75 % y has aprobado 10626 veces, lo que supone el 21.25 %.
- Caso 2: A primera vista sencillo de aprobar. 10 preguntas, respuesta única por pregunta, 1 punto pregunta acertada y -0.125 puntos cada respuesta fallada, 3 respuestas posibles por pregunta, se responde a todas las preguntas, y el resultado es el siguiente:
- La nota máxima es: 8.875
- La nota mínima es: 0.000
- La nota media es: 2.518
- Ha suspendido 46191 veces, lo que supone el 92.38 % y has aprobado 3809 veces, lo que supone el 7.62 %.
- Caso 3: parecido al anterior, tampo es difícil de aprobar a primera vista. 20 preguntas, respuesta única por pregunta, 0.5 punto pregunta acertada y -0.125 puntos cada respuesta fallada, 3 respuestas posibles por pregunta, se responde a todas las preguntas, y el resultado es el siguiente:
- La nota máxima es: 7.500
- La nota mínima es: 0.000
- La nota media es: 1.707
- Ha suspendido 49395 veces, lo que supone el 98.79 % y has aprobado 605 veces, lo que supone el 1.21 %.
-
Caso 4: típico caso de examen. 20 preguntas, respuesta única por pregunta, 0.5 punto pregunta acertada y -0.125 puntos cada respuesta fallada, 4 respuestas posibles por pregunta, se responde a todas las preguntas, y el resultado es el siguiente:
- La nota máxima es: 6.250
- La nota mínima es: 0.000
- La nota media es: 0.842
- Ha suspendido 49956 veces, lo que supone el 99.91 % y has aprobado 44 veces, lo que supone el 0.09 %.
Y como habéis podido observar, aprobar un examen tipo test respondiendo de forma aleatoria, por muy sencillo que pueda parecer en un principio, es altamente difícil, lo mejor es estudiar.
Y por si a alguien le interesa, el código es el que sigue:
#include <stdio.h>
#define VECES 50000
#define PREG_ACERTADA 0.5
#define PREG_FALLADA -0.125
#define TOT_PREGUNTAS 20
#define NUM_RESPUESTAS_PREG 3
int respuestas_correctas[TOT_PREGUNTAS];
void generar_respuestas_correctas()
{
int i;
srand(time(NULL));
system("clear");
printf("Respuestas correctas:\n");
for(i=0;i<TOT_PREGUNTAS;i++)
{
respuestas_correctas[i]=(rand()%NUM_RESPUESTAS_PREG)+1;
printf("%2d",respuestas_correctas[i]);
}
printf("\n\n");
}
float calcular_nota()
{
float nota=0;
int i,respuesta;
for(i=0;i<TOT_PREGUNTAS;i++)
{
respuesta=(rand()%NUM_RESPUESTAS_PREG)+1;
if (respuesta==respuestas_correctas[i])
nota=nota+PREG_ACERTADA;
else
nota=nota+PREG_FALLADA;
}
return nota;
}
int main(void)
{
int i,j;
float nota;
int aprobados=0,suspensos=0;
float nota_media=0,nota_max=0,nota_min=10;
generar_respuestas_correctas();
for (i=0;i<VECES;i++)
{
nota=calcular_nota();
nota_media=nota_media+nota;
if (nota_max<nota) nota_max=nota;
if (nota_min>nota) nota_min=nota;
if (nota>=5)
aprobados++;
else
suspensos++;
}
printf("\nSe ha hecho el examen %d veces, y los resultados son:\n",VECES);
printf("\nLa nota máxima es: %0.3f",nota_max);
printf("\nLa nota mínima es: %0.3f",nota_min);
printf("\nLa nota media es: %0.3f",nota_media/VECES);
printf("\nHa suspendido %d veces, lo que supone el %0.2f por cien.",suspensos,(float)suspensos*100/VECES);
printf("\nHa aprobado %d veces, lo que supone el %0.2f por cien.",aprobados,(float)aprobados*100/VECES);
printf("\n\n");
}
6 comentarios | 7451 clicks
robots.txt es un archivo de texto que se cuelga en la raíz de la web para indicarle a los buscadores que partes de la web no quieres que sean indexadas por ellos (
este es el de blogovic). En principio parece una tontería no querer ser indexado por un buscador, pero puede que existan razones por las que ciertas partes de la web no desees que sean indexadas, como por ejemplo, la parte del administrador o ciertas imágenes o módulos. En mi caso, estos últimos días he estado recibiendo cientos, o en casos, miles de visitas buscando una imagen del día de la mujer. La entrada
Día internacional de la mujer aparecía indexada en google en la primera página de búsqueda de imágenes, lo cual supuso un gran incremento en el tráfico diario, llegando a triplicarse el número normal de visitas diarias.
La
imagen que indexaban, a parte de no ser yo el autor de la misma, ya que la había copiado de
otra web (viñeta de
Forges) en la que además, me he saltado los derechos de autor (aunque la enlazo, la licencia no es Creative Commons), ya suponen motivos suficientes para no querer salir indexado en Google con una imagen que no es mía. Además de esto, creo que las visitas que llegan en forma de búsqueda de imágenes tampoco aportan nada, simplemente vienen a buscar una imagen que yo no estoy interesado en difundir, que simplemente había usado para dar color a una entrada. No van a aportar comentarios, ni tan siquiera se van a fijar en nada de la web, no van a hacer click en los anuncios adSense (aparecen cuando alguien llega desde un buscador). En resumen, que simplemente consumen recursos y no aportan nada. Desde mi punto de vista, claro.
Ante tal situación he decidido decirle a los buscadores que no indexen (que no aparezcan en los resultados de las búsquedas) mis imágenes. Y para ello sólo hay que escribir unas cuantas líneas en el archivo robots.txt. También cabe destacar que no todos los buscadores hacen caso al archivo, es decir, algunos de ellos lo ignoran e indexarán indiscriminadamente todo lo que encuentren, pero el más importante de todos, Google, sí hace caso.
Configurarlo es muy simple. Hemos de crear un archivo de texto llamado robots.txt y colocarlo en la raíz de la página (http://www.mipagina.com/robots.txt). Es muy importante colocarlo en la raíz puesto que es el lugar donde van a buscarlo los buscadores antes de comenzar a indexar el contenido de la web, si no está ahí, no lo encontrarán y lo ignorarán. Para restringir direcciones a ser indexadas todo se basa en dos comandos:
User-agent y
Disallow. Con user-agent se indica cual es el buscador que quieres restringir y con Disallow se indica cuales son las urls que no quieres que sean indexadas. Veamos unos ejemplos, que se entenderá mucho mejor:
User-agent: *
Disallow: /admin/
Disallow: /img/
Disallow: /archivo/
Disallow: /buscar.asp
Disallow: /llegaron_desde.asp
User-agent: Googlebot-Image
Disallow: /
En el ejemplo anterior en
User-agent se indica con un asterísco que las siguientes líneas se aplican a todos los buscadores, indexadores o arañas. Y con el comando
Disallow se indican todas aquellas URLs o partes de URLs que no quieres que sean indexadas, por lo tanto, todas aquellas URLs que contengan alguna de las cadenas de texto que se indican no serán indexadas por los buscadores indicados en el comando
user-agent. Es decir, las siguientes URLs no será indexadas por los buscadores:
- http://www.mipagina.com/img/coches/ferrari.jpg
- http://www.mipagina.com/noticias/2008/img/foto.jpg
- http://www.mipagina.com/archivo/pdf/informe.pdf
En el segundo caso se indica un
user-agent en concreto, que es el Googlebot-Image, que es el indexador de imágenes de Google, y en las siguientes líneas se indica cuales son las URLs restringidas para este robot. En este caso, se le restringe el acceso a toda la web. Se pueden especificar tantas
user-agent como necesitemos y para cada uno de ellas restringir las URLs que consideremos. Se puede obtener un listado de los
user-agent conocidos en
esta web.
Una vez configurado el archivo robots.txt y colocado en su sitio, sólo nos queda esperar a que haga su efecto y que los buscadores dejen de indexar las URLs que les hemos específicado. Incluso que borren de su base de datos las que ya tienen indexadas y que ahora ya no están permitidas por la configuración del archivo robots.txt. En la teoría, la próxima vez que uno de los robots de los buscadores visita nustra página, lo primero que hará será leer dicho archivo y actuar en consecuencia. Pero esto no siempre se cumple con las páginas que ya tenían indexadas y que ahora ya no queremos que sigan indexando. En mi caso, unos 10 días después de haber configurado mi archivo, y pese a ser visitado varias veces por el robot de Google, este seguía indexando imágenes de mi sitio, por lo que parece ser que hay que esperar más tiempo a que actualize su base de datos.
Si tenemos prisa y queremos que Google deje de indexar ciertas páginas existe otra solución mucho más rápida: la
herramienta para webmasters de Google en la que existe la posibilidad de eliminar de su base de datos ciertas URLs o directorios completos y que dejen de ser indexados en 24 horas aproximadamente. Simplemente tenemos que dirigirnos a dicha web, identificarnos y buscar en el menú la herramienta adecuada para eliminar el contenido de nuestra web.Una herramienta realmente útil para webmasters con otras muchas posibilidades. Si tienes una web échale un ojo. En la
web de asistencia de Google para webmasters está perfectamente descrito su funcionamiento.
Enlaces para seguir indagando:
robotstxt.org [Eng]
Indicaciones de Google para configurar robots.txt
Centro de asistencia de Google para webmasters
Robots.txt: todo lo que deberías saber
5 comentarios | 632 clicks
Hoy tocaba un conecta 4. Estos días me han propuesto-retado a hacer un conecta 4 en C, y estas cosas me encantan. Y este es el resultado, el código está escrito para Linux, aunque con un par de cambios funciona también en Windows. El nivel de la máquina es muy malo, coloca las fichas aleatoriamente, no es muy complicado ganarle. En la próxima versión le subo el nivel. Después de cada jugada verifica si hay algún ganador.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define FILAS 8
#define COLUMNAS 8
char tablero[FILAS][COLUMNAS];
void inicializar_tablero()
{
int i,j;
for(i=0;i<FILAS;i++)
for(j=0;j<COLUMNAS;j++)
tablero[i][j]=' ';
}
int jugada_correcta(int fila, int col)
{
int jugada_correcta; //Guarda un 1 ó un 0 para indicar si la jugada es correcta o no. 1-Jugada correcta. 0-Jugada errónea: La fila y/o columna no son válidas. Se sale del tablero la jugada.
jugada_correcta=1;
if (fila>=FILAS || fila<0 || col>=COLUMNAS || col<0)
jugada_correcta=0;
if (jugada_correcta==1)
{
if (tablero[fila][col]=='0' || tablero[fila][col]=='X')
jugada_correcta=0;
}
if (jugada_correcta==1)
{
if (fila!=FILAS-1 && tablero[fila+1][col]==' ')
jugada_correcta=0;
}
return jugada_correcta;
}
int hacer_jugada(int jug)
{
int fila,col; //Para guardar la fila y columna en la que se introduce la ficha.
int i; //Para el contador.
char ficha; //Para guardar la ficha del jugador actual. 0- Para humano, X- Para la máquina.
int resultado_jugada;
resultado_jugada=1;
if (jug==0)
{
ficha='0';
printf("\n\nEl usuario coloca ficha.\n");
do
{
if (resultado_jugada==0)
printf("\n\nJugada incorrecta.\n\n");
printf("Introduce la columna en la que quieres colocar tu ficha: ");
scanf("%d",&col);
i=FILAS-1;
if (tablero[FILAS-1][col]!=' ')
{
while(i<FILAS && (tablero[i][col]=='X' || tablero[i][col]=='0'))
i--;
}
fila=i;
resultado_jugada=jugada_correcta(fila,col);
}while(resultado_jugada==0);
}
else
{
ficha='X';
do
{
col=generar_numero();
i=FILAS-1;
if (tablero[FILAS-1][col]!=' ')
{
while(i<FILAS && (tablero[i][col]=='X' || tablero[i][col]=='0'))
i--;
}
fila=i;
resultado_jugada=jugada_correcta(fila,col);
}while(resultado_jugada==0);
}
if (resultado_jugada==1) tablero[fila][col]=ficha;
return resultado_jugada;
}
int generar_numero()
{
int num;
srand(time(NULL));
num=rand() % COLUMNAS; //Devuelve un número entre 0 y COLUMNAS-1, porque al devolver el resto, este nunca puede ser superior a COLUMNAS-1.
return num;
}
int mostrar_tablero()
{
int i,j;
int ficha;
system("clear");
printf("\n");
for(j=0;j<COLUMNAS*5/2;j++)
printf(" ");
printf("CONECTA 4\n\n");
printf(" F -");
for(j=0;j<COLUMNAS;j++)
printf("----");
printf("\n");
for(i=0;i<FILAS;i++)
{
printf(" ");
if (i==0)
printf("I");
else if (i==1)
printf("A");
else
printf(" ");
printf(" %d |",i);
for(j=0;j<COLUMNAS;j++)
{
printf(" ");
printf("%c",tablero[i][j]);
printf(" |");
}
printf("\n ");
if (i==0)
printf("L");
else if (i==1)
printf("S");
else
printf(" ");
printf(" -");
for(j=0;j<COLUMNAS;j++)
printf("----");
printf("\n");
}
printf(" ");
for(j=0;j<COLUMNAS;j++)
printf("%d ",j);
printf("\n\n COLUMNAS");
printf("\n");
}
int comprobar_fin()
{
int i,j; //Para el for, para recorrer el tablero
int ganador; // -1: no gana nadie, 1: gana humano, 0: gana máquina
ganador=-1;
//Comprobar si hay cuatro en línea en horizontal
for(i=0;i<FILAS;i++)
{
for(j=0;j<COLUMNAS-3;j++)
{
if (tablero[i][j]=='X' && tablero[i][j+1]=='X' && tablero[i][j+2]=='X' && tablero[i][j+3]=='X')
ganador=0;
else if (tablero[i][j]=='0' && tablero[i][j+1]=='0' && tablero[i][j+2]=='0' && tablero[i][j+3]=='0')
ganador=1;
}
}
if (ganador==-1)
{
//Comprobar si hay cuatro en línea en vertical
for(i=0;i<FILAS-3;i++)
{
for(j=0;j<COLUMNAS;j++)
{
if (tablero[i][j]=='X' && tablero[i+1][j]=='X' && tablero[i+2][j]=='X' && tablero[i+3][j]=='X')
ganador=0;
else if (tablero[i][j]=='0' && tablero[i+1][j]=='0' && tablero[i+2][j]=='0' && tablero[i+3][j]=='0')
ganador=1;
}
}
}
if (ganador==-1)
{
//Comprobar si hay cuatro en línea en diagonal 1
for(i=0;i<FILAS;i++)
{
for(j=0;j<COLUMNAS;j++)
{
if (i+3<FILAS && j+3<COLUMNAS)
{
if (tablero[i][j]=='X' && tablero[i+1][j+1]=='X' && tablero[i+2][j+2]=='X' && tablero[i+3][j+3]=='X')
ganador=0;
else if (tablero[i][j]=='0' && tablero[i+1][j+1]=='0' && tablero[i+2][j+2]=='0' && tablero[i+3][j+3]=='0')
ganador=1;
}
}
}
}
if (ganador==-1)
{
//Comprobar si hay cuatro en línea en diagonal 2
for(i=0;i<FILAS;i++)
{
for(j=0;j<COLUMNAS;j++)
{
if (i+3<FILAS && j-3>=0)
{
if (tablero[i][j]=='X' && tablero[i+1][j-1]=='X' && tablero[i+2][j-2]=='X' && tablero[i+3][j-3]=='X')
ganador=0;
else if (tablero[i][j]=='0' && tablero[i+1][j-1]=='0' && tablero[i+2][j-2]=='0' && tablero[i+3][j-3]=='0')
ganador=1;
}
}
}
}
return ganador;
}
int main (int argc,char **argv)
{
int jugador; //Indica el jugador al que le toca jugar. 0-Juega humano 1-Juega máquina
int total_jugadas; //Indica el total de jugadas que se están haciendo. En las jugadas pares juega el humano, en las impares la máquina.
total_jugadas=0;
inicializar_tablero();
do
{
if (total_jugadas % 2 == 0)
jugador=0;
else
jugador=1;
total_jugadas++;
mostrar_tablero();
if (hacer_jugada(jugador)==0)
{
printf("\n\nJugada incorrecta.\n\n");
system("pause");
}
}while(comprobar_fin()==-1);
mostrar_tablero();
if (comprobar_fin()==1)
printf("\n\nEnhorabuena!! Has ganado!!\n\n");
else
printf("\n\nEl ordenador ha ganado la partida!!\n\n");
}
0 comentarios | 2244 clicks
Por fin me he subido a la web 2.0 y ya tengo mis propios RSS, que ya iba siendo hora... El Really Simple Syndication (RSS 2.0) es una forma de difundir los contenidos de una web en un formato estándar XML que puede ser manipulado por otras personas sin tener que visitar la web. En definitiva, la utilidad que tiene para un navegante tipo es poder leer las últimas entradas de un blog sin tener que visitar dicho blog. Esto ahorra mucho tiempo de navegación, puesto que si eres lector habitual de varios blogs, puedes usar un agregador o lector RSS como el propio Mozilla Firefox o Google Reader y añadir las fuentes RSS de todos los blogs o webs que ofrezcan este servicio y estés interesado en leer. De esta forma, dicho agregador, te muestra las últimas entradas y un breve resumen de todos los blogs que hayas añadido obteniendo un primer vistazo de la entrada en cuestión. Si dicha entrada te parece interesante, con un simple click puedes acceder al contenido completo.
Bien, pues esto que os cuento y que parece maravilloso, a mi no me gusta. Será que todavía no me he adaptado o que simplemente prefiero perder mi valioso tiempo y seguir con la vieja usanza de los típicos clicks. ¿Qué queréis que os diga? Me gusta más ese contacto directo... Aunque que a mi no me guste no quiere decir que BLOGOVIC.com no lo deba tener, y desde hoy, ya está disponible el RSS para todos los que sí os guste.
Y a partir de aquí, para los más friquis
. Y yo, que soy muy friqui, he generado mi propio RSS con ASP. Aunque ya hay algunos creados en la web (1, 2) yo prefiero documentarme, entender esto del RSS y luego crear el mío-Me lo contaron y lo olvidé, lo vi y lo entendí, lo hice y lo aprendí-. Lo primero que he hecho fue documentarme a cerca del estándar RSS, y para ello en esta web tenemos muy bien documentadas las especificaciones del estándar RSS 2.0. Una vez conocido el estándar, es también muy importante un validador RSS para comprobar que efectivamente cumplimos los estándares. Y ya finalmente, sólo nos queda programar, y a continuación, el script en ASP que genera mis RSS:
<!--#include virtual="inc/inc_conexion.asp"-->
<!--#include virtual="inc/funciones.asp"-->
<%
response.contenttype="text/xml"
response.expires=0
response.write("<?xml version=""1.0"" encoding=""iso-8859-1"" ?>" & vbcrlf)
response.write(space(2) & "<rss version=""2.0"" xmlns:atom=""http://www.w3.org/2005/Atom"" xmlns:dc=""http://purl.org/dc/elements/1.1/"" xmlns:content=""http://purl.org/rss/1.0/modules/content/"">" & vbcrlf)
response.write(space(4) & "<channel>" & vbcrlf)
response.write(space(4) & "<title>BLOGOVIC.com</title>" & vbcrlf)
response.write(space(4) & "<link>http://www.blogovic.com/</link>" & vbcrlf)
response.write(space(4) & "<description>Últimas entradas de BLOGOVIC.com</description>" & vbcrlf)
response.write(space(4) & "<language>es</language>" & vbcrlf)
response.write(space(4) & "<generator>BLOGOVIC.com</generator>" & vbcrlf)
response.write(space(4) & "<docs>http://cyber.law.harvard.edu/rss/rss.html</docs>" & vbcrlf)
response.write(space(4) & "<atom:link href=""http://www.blogovic.com/rss.asp"" rel=""self"" type=""application/rss+xml"" />" & vbcrlf)
dim temp
fecha=buscardato("SELECT TOP 1 fecha FROM entradas WHERE visible=1 ORDER BY fecha DESC")
response.write(space(4) & "<lastBuildDate>" & fecha_rss(fecha) & "</lastBuildDate>" & vbcrlf)
sql="SELECT TOP 5 id,titulo,noticia,fecha FROM entradas WHERE visible=1 AND privado=0 ORDER BY fecha DESC"
set rst=cnn.execute(sql)
do while not rst.eof
response.write(space(4) & "<item>" & vbcrlf)
response.write(space(6) & "<title>" & trim(rst("titulo")) & "</title>" & vbcrlf)
response.write(space(6) & "<link>http://www.blogovic.com/vernoticia.asp?id=" & trim(rst("id")) & "</link>" & vbcrlf)
response.write(space(6) & "<comments>http://www.blogovic.com/vernoticia.asp?id=" & trim(rst("id")) & "#comentarios</comments>" & vbcrlf)
response.write(space(6) & "<pubDate>" & fecha_rss(cdate(rst("fecha"))) & "</pubDate>" & vbcrlf)
response.write(space(6) & "<guid>http://www.blogovic.com/vernoticia.asp?id=" & trim(rst("id")) & "</guid>" & vbcrlf)
temp=trim(rst("noticia"))
response.write(space(6) & "<description>" & reemplazar_especiales(trim(temp)) & "</description>" & vbcrlf)
response.write(space(4) & "</item>" & vbcrlf)
rst.movenext
loop
response.write(space(2) & "</channel>" & vbcrlf)
response.write("</rss>" & vbcrlf)
cnn.close
set cnn=nothing
set rst=nothing
%>
10 comentarios | 3101 clicks
Hasta hace un par de días yo tampoco lo sabía, pero ahora hasta he creado un programita en c que calcula números armstrong. Un número con n dígitos es un número armstrong si la suma de las potencias n-ésimas de los dígitos que lo forman es igual al propio número. Algunos ejemplos:
153=13+53+33
370=33+73+03
371=33+73+13
407=43+03+73
O lo que viene siendo lo mismo en un lenguaje coloquial. Son números armstrong todos aquellos que al elevar cada uno de los números que lo componen al número total de dígitos que contiene, la suma de dichos resultados es igual al propio número.
#include <stdio.h>
#include <math.h>
const NUM_MAX=999999;
//La función elevar devuleve el resultado de un número que recibe(base) elevado al exponente que recibe(exp), en realidad es lo mismo que pow, pero no me funcionabal en mi ordenador, por lo tanto, tienes que borrarla y sustituir casi al final del programa la línea en la que uso la función elevar por la que está al lado.
long elevar(int base,int exp)
{
long res;
int i;
res=1;
if (base==1)
res=1;
else
for(i=1;i<=exp;i++)
res=res*base;
return res;
}
int main(int argc, char *argv[])
{
int num; //Variable para hacer cálculos.
long int i; //Variable contador, para bulces y cálculos.
int cont; //Variable para guardar el número de cifras del número introducido.
int resto;
long int resultado; //Variable para hacer cálculos. En ella se guarda el resultado de elevar todas las cifras del número a un exponente y compararlas con el número introducido.
//Las siguientes variables son para guardar la cifra correspondiente del número para posteriormente hacer cálculos.
int u; //unidades
int d; //decenas
int c; //centenas
int um; //unidades de millar
int dm; //decenas de millar
int cm; //centenas de millar
printf("** Cálculo de números armstrong menores de %li **\n",NUM_MAX);
for(i=1;i<=NUM_MAX;i++)
{
//Se pasa el valor de i a la variable num para no cambiar el valor de i y hacer cálculos con num.
//Se va comprobando el valor de num y guardando en cada una de las variables la cifra correspondiente. El % devuelve el resto de una operación.
num=i;
u=0;
d=0;
c=0;
um=0;
dm=0;
cm=0;
cont=0;
while (num>0)
{
//Se obtienen las cifras en orden inverso. Primero unidades, luego decenas...
resto=num%10; //Con esta operación obtenemos el resto de dividir por diez, que será siempre la última cifra.
num=(num-resto)/10; //Quitamos la última cifra al número y actualizamos la variable num para obtener la siguiente cifra.
cont++; //Aumentamos en uno el contador de cifras. Según este contador, guardamos la cifra en la variable correspondiente.
if (cont==1) u=resto;
else if(cont==2) d=resto;
else if(cont==3) c=resto;
else if(cont==4) um=resto;
else if(cont==5) dm=resto;
else if(cont==6) cm=resto;
else num=0; //Nunca debería llegar aquí
}
//Ya tenemos el número descompuesto en sus cifras: u,d,c,um,dm,cm
//Inicializamos resultado.
resultado=0; //En resultado se guarda el resultado obtenido después de elevar cada número a sus exponentes.
resultado=elevar(u,cont)+elevar(d,cont)+elevar(c,cont)+elevar(um,cont)+elevar(dm,cont)+elevar(cm,cont);
//Se guarda en la variable el resultado de elevar cada cifra al exponente correspondiente para cada una de las cifras.
//Se comprueba si el resultado es igual al número actual, puesto que i es igual, estamos ante un número armstrong.
if (resultado==i)
printf("El número %d es un número armstrong.\n",i);
}
return 0;
}
14 comentarios | 16719 clicks
...¿Internet Explorer, Mozilla Firefox, Opera,... -ponga aquí el navegador que quiera-? o ¿una web debería estar diseñada simplemente para ser vista por todo el mundo?
Hoy, visitando como de costumbre la web del
ayuntamiento de Lugo, me dispongo a informarme del programa
Lugo máxico, actividad que este desarrolla y para la cual han desarrollado una web propia y me encuentro con esto:
La verdad, es la primera vez que me pasa esto, he navegado con relativa frecuencia por todas las webs del ayuntamiento de Lugo (
lugo.es,
San Froilán,
ardelucus.com,
el blog del alcalde, ...) sin encontrarme con este aviso. Y todas ellas, incluida esta, se ven perfectamente en Firefox, incluso desde GNU/Linux. Lo más desconcertante de todo es que si pinchas en entrar, la web se ve perfectamente en Firefox. Es simplemente una aplicación flash visible desde cualquier navegador con el reproductor Flash Player instalado.
Antes de seguir, quiero matizar que no es una crítica contra el ayuntamiento de Lugo, que seguramente no tengan conocimiento de esto. Ni una crítica contra esta web en particular. Es una crítica general contra todas esas webs diseñadas para... ¿Qué pretenden estas webs? ¿es marketing pro Microsoft?, ¿quieren hacernos ver que Internet Explorer es mejor que Firefox? o ¿es simple desconocimiento de los programadores? o ¿es que los programadores han desarrollado webs orientadas al Internet Explorer durante toda su vida y no quieren cambiar-aprender nuevos sistemas de diseño-programación adaptados a los tiempos en los que vivimos sin discriminar a los visitantes de su sitio web por el navegador o sistema operativo que utilizan? o ¿es que quieren que todos nos compremos un Windows Vista? o ¿quieren que todos los que no tenemos Windows y por lo tanto, no tenemos Internet Explorer no visitemos su web?
En serio, no lo entiendo. ¿Por qué empresas que se consideran profesionales siguen haciendo webs optimizadas para un navegador privado, un navegador que no cumple los estándares web, un navegador que obliga a gastarse dinero en un sistema operativo privativo, un navegador que día a día pierde cuota de mercado? Pero, olvidándonos del navegador, ¿por qué una empresa
profesional desarrolla webs optimizadas para sólo un sector de los visitantes? Aunque en la actualidad dicho navegador sea el de uso mayoritario, no considero profesional hacer webs orientadas a dicho navegador.
Sí, me ha salido la vena antiMicrosoft y pro software libre, pero no es solo eso, no es solo una crítica antiWindows. Es un hecho que una empresa
profesional no puede orientar sus productos a un sector del mercado negando el mismo derecho de acceso a los demás.
3 comentarios | 340 clicks
El tal Ferris este ha hackeado BLOGOVIC

. Sí, es hora de verificar la seguridad. Como podréis comprobar ha cambiado el título de todas las entradas por
You was hacked by ferris
. Muy majo el chaval, que avisa...
grrrr...
En las próximas horas, días intentaré restaurar todo a su estado original. Mientras tanto, queda temporalmente deshabilitado el apartado para identificarse. Disculpen las molestias... Por cierto, ¿he dicho ya que me cago en el Ferris? Pues me cago en el Ferris.
0 comentarios | 236 clicks
He vuelto a programar, si, estos días he retomado el mayor proyecto que he hecho hasta el momento. Está hecho en Visual Basic 6.0, es el lenguaje que conocía en aquel momento (a parte de un poco de C), es el lenguaje que me enseñaron. Y aunque hoy me he decantado más por la programación web, es un lenguaje que me gusta, sencillo de asimilar, con pocas líneas puedes hacer cosas interesantes y aunque ya tiene sus años, muy usado todavía, algunos grandes programas de contabilidad se resisten y aún hablan VB6. He aprendido mucho programando VB6.
Desde el primer programa más o menos grande (más de 1000 líneas de código) que he hecho allá por octubre de 2003 me he dado cuenta que he aprendido muchas cosas. Aún me queda mucho más por aprender, muchísimo, pero cada vez que reviso el código me pregunto ¿en qué estaba pensando cuando he hecho esto? Aún recuerdo la de veces que se colgaba y los errores críticos que daba en su primera etapa de funcionamiento. Hoy, ya funciona sin problemas y sin esos molestos cuelgues inexplicables tipo pantalla azul de Windows. Todavía es muy, muy, muy mejorable, pero va funcionando...
Hoy tiene 17672 líneas de código. Me he sorprendido ahora mismo al contarlas. 17000 líneas sin comentar, sin depurar y sin optimizar. Hay cosas que nunca cambian, nunca se me dio bien lo de comentar el código. Depurar, lo depuro cuando encuentro algún error crítico, y optimizar, poco, solo cuando el ordenador se queda viejo para ejecutar algunos scripts, sino, aprovecho los GigaHertzios y dobles núcleos actuales. Me encanta esto de programar, pero es que soy un vago.
¡¡Ah, que no os había presentado!! Este es mi programa, para los que lo queráis ver, acercaos por el Gran Hotel de Lugo, el Club Baloncesto Breogán está realizando la campaña de abonados.
Se me ha quedado un tema en el tintero. Liberar el código fuente. Si no lo he hecho hasta el momento es por dos motivos. No creo que un código como este sea digno de ser liberado. Y 2, ¿es legítimo liberar un código que has hecho para determinada empresa? ¿Lo hacen las "grandes" empresas gallegas que promueven el software libre?
3 comentarios | 308 clicks
Desde hace un par de días, he decidido convertir ciertos contenidos en privados que ya no están accesibles al público en general, por diversos motivos, pero principalmente, porque atentaban contra la privacidad de los que en ellos aparecían. Ya se aplican en BLOGOVIC las más estrictas reglas de privacidad. Principalmente, los contenidos que han sido
censurados son las fotos de los diversos eventos a los que hemos acudido.
Próximamente, algunos de vosotros podréis seguir teniendo acceso a estos contenidos privados.
0 comentarios | 232 clicks
A la mayoría de los que visitáis habitualmente BLOGOVIC os traerá sin cuidado esto que os voy a contar, a otros os interesará, pero pensaréis que esto no es nada nuevo, que lleva ocurriendo desde tiempos lejanos en Internet, otros, incluso me diréis que esto ya está requetesolucionado y que hay soluciones gratuitas disponibles en Internet, y si, todos tendréis razón, pero a mi es la primera vez que me ocurre y quiero contarlo, así que ahí va.
Seguro que ya os habréis dado cuenta que estos últimos días los
spammers han invadido BLOGOVIC con una media de 50 comentarios spam cada día inundando los comentarios. Algo muy molesto para el que lee y todavía más molesto para el administrador, que ha de defender con uñas y dientes su página. Bien, pues es lo que he estado haciendo, intentando defenderlo, lo cual no ha sido fácil, pero parece que lo empiezo a conseguir, espero que dure más de una semana.
El pasado lunes blogovic recibe su primer mensaje de spam, lo cual, tenía que llegar, antes o después, como cualquier blog que se precie. Al principio los borraba manualmente, hasta que se convirtió en algo habitual y cansino. Empezaron a llegar comentarios spam cada dos horas y de 20 en 20. Aquí fue cuando decidí que había que hacer algo al respecto, y comenzó la lucha del hombre inexperto contra los spammers profesionales. Sí, digo profesionales porque son profesionales. Envían el spam desde unas 15 IPs distintas simultáneamente. Al principio, todos los mensajes de spam eran iguales, por lo tanto, decidí filtrar todos los mensajes en los que el contenido coincidiese con unos parámetros que siempre se repetían. El intento, fue fructuoso durante unas horas, dejaron de entrar mensajes. Pero al cabo de unas horas volvieron los dichosos mensajitos con enlaces a sitios porno. Tenían recursos, habían cambiado esos parámetros que siempre se repetían. Entonces decidí cambiar de estrategia, tenía que contraatacar. Pensé en filtrar los mensajes por la IP de origen, puesto que por lo observado, siempre eran las mismas 15-20 IPs, pero después de valorarlo, no lo creí conveniente puesto que debido a mi excasa experiencia con el spam, puede que esas IPs sean dinámicas y cambien cada cierto tiempo, lo cual, por estas casualidades que se dan siempre en los momentos menos oportunos, puede que alguna vez un fiel lector entre en BLOGOVIC con una de esas IP, intente dejar un mensaje y no es plan de filtrarselo como si fuese spam. Entonces, decidí que esa no era la línea a seguir.
Observé entonces que los mensajes tenían unas cuantas palabras que siempre se repiten, por lo tanto, decidí contraatacar por aquí. Con paciencia, repasé los últimos mensajes spam e hice una lista con las palabras más representativas y que más se repetían. Con este listado, que posteriormente irá creciendo, he creado un filtro que envía al lado oscuro a todos aquellos mensajes que contenga cualquiera de estas palabras. Por supuesto, teniendo cuidado de que no fueran palabras excesivamente comunes en los comentarios, puesto que los comentarios han de funcionar normalmente para un lector-comentarista habitual sin que se percate de esto último. Y por lo de pronto, esta fue la solución satisfactoria, llevamos 24 horas sin mensajes spam en la página principal, eso sí, en el lado oscuro, ahora mismo hay filtrados por mi rudimentario filtro la friolera de 53 comentarios en las últimas 24 horas.
Sé que esta no va a ser la solución definitiva, ni muchísimo menos, y no canto victoria todavía, seguramente pronto volveréis a ver nuevos comentarios spam, pero por ahora. BLOGOVIC 1 - Spammers 0.
Unas últimas reflexiones. El filtro de spam que he creado es totalmente rudimentario y seguramente muy poco eficiente puesto que a medida que la lista de palabras crezca, consumirá muchos recursos. Además, a la hora de filtrar los comentarios, debería tener en cuenta otros parámetros además de las palabras como los e-mails con que se identifican, las IPs de origen y no filtrar solo por palabras concretas e individuales, sino que por un conjunto de palabras. En los próximos días, seguiré investigando, observando algún que otro filtro que ya funciona bien y por supuesto, con la insestimable ayuda de Google. A medida que se vayan colando los comentarios spam, el algorítmo antiSpam BLOGOVIC será reprogramado. Versión actual 0.1 y creciendo.
Un afectuoso saludo a todos los spammers.
0 comentarios | 305 clicks

Corría febrero del año 2004. Y a mi ya me gustaban los unos y lo ceros. Y creé lo que fue mi primera página web que aún está activa. Esto que ves aquí arriba es mi primera web. Y ayer, de casualidad volví a verla después de muuuuucho tiempo. Y la verdad, ahora viéndola de nuevo, veo que no era mala del todo... El diseño, si, un poco chungo... pocas ideas. Pero ya estaba curradita, usa un applet Java para mostrar las imágenes, ya tenía algo de JavaScript e incluso CSS. Sí, es cierto, los divs no flotaban, pero...
Aquí os dejo un enlace a la
Airis Web
1 comentarios | 251 clicks
Me voy a hacer un poco de publicidad. Esta
web que véis aquí abajo, la hice yo. Es de una amiga de un amigo de Madrid. Sólo está hecha con HTML y CSS. No es dinámica.
¿Qué os parece? Críticas, sugerencias y alabanzas en comentarios...Por cierto, si conocéis a alguien que necesite una página web, ya sabéis,
hacedme publicidad...
2 comentarios | 526 clicks

El juego Pong de toda la vida hecho por mi en Visual Basic 6.0. Ya hace bastante tiempo que lo hice, y está a medio hacer, hay muchas funcionalidades que se quedaron por el camino, que algún día le haré aunque creo que en otro lenguaje de programación. Si alguien quiere animarse y seguir programando aquí le dejo el código fuente. O si simplemente quieres
divertirte un rato jugando al PONG, también puedes descargarlo, probarlo y luego comentar qué te ha parecido...
Te agradecería que si cambias algo, me lo comunicases en la sección contacta.Enlaces:El juegoCódigo fuenteEnlaces externos: Otro PONG, hecho en Flash y más chuloUna especie de PONG en JavaPONG en la WikipediaCódigo del PONG en Pascal
1 comentarios | 4281 clicks