sábado, 6 de abril de 2013

Una fiesta familiar


Vamos a poner aquí algún problema que nos sirva para discurrir un poco. Lo trae Ian Stewart en uno de sus libros.
Fue una fiesta maravillosa - dijo Lucilla a su amiga Harriet.
¿Quiénes estaban?
A ver. Había un abuelo, una abuela, dos padres, dos madres, cuatro hijos, de los cuales dos eran varones y dos hembras, tres nietos, un hermano, dos hermanas, un suegro, una suegra y una nuera.
¡Vaya! Ventitrés personas.
No, menos que eso. Mucho menos.
¿Cuál es el número mínimo, el tamaño más pequeño de esa población, compatible con la descripción de Lucilla?
Doy el resultado: 7. Que cada uno se haga el arbolito para ver cómo es la cosa. Y de paso que adivine dónde está tomada la foto de arriba. Esos pinos son bastante reveladores. Adelanto que el lugar es famoso en el mundo entero.

viernes, 15 de julio de 2011

La serie armónica


Pongo aquí un programa en C para calcular los 100 primeros términos de la serie armónica. Contra lo que parece esta serie no es convergente, aunque crece tan lentamente que da la impresión de que lo es.

#include <stdio.h>
#define T_ENES 100
main()
{
int n;
float t[101];
float s[101];
s[0]=0;
for(n=1;n <= T_ENES;n++){
t[n]=1.0/n;
s[n] = s[n-1] + t[n];
}
for(n=1;n <= T_ENES;n++)
if(n%11 != 0)
printf("%.4f\t",s[n]);
else printf("\n");
return 0;
}

domingo, 10 de julio de 2011

Un programa en C para contar frecuencias

Tengo este blog medio abandonado, porque me dedico al otro, de temática general. Este tendría que ser de matemáticas, pero tengo bastante problema con lo de usar signos matemáticos como a mí me gustaría. En tiempos atrás usé el Tex para poner exámenes y para escribir en general, es genial, pero no veo la manera de introducirlo aquí. Si alguno lo sabe que me ayude. Mientras tanto voy a seguir poniendo programas de C, Python y Pascal, que me entretienen bastante. Quizás a alguno le sirvan. Este, en C, está inspirado en uno que ví en Deitel y Deitel. Se trata de contar el número de veces que aparece, en este caso, un número del 1 a 10. La sentencia esencial es ++frecuencia[clases[i]]. Se mueve uno de los diez contadores cada vez que en el barrido del bucle aparece un determinado número. Por ejemplo, clases[0] es 1, y clases[1] es 3; entonces se moverán, es decir, contarán, frecuencia[1] y frecuencia[3]. Me parece muy agudo. Se puede adaptar fácilmente para contar letras, por ejemplo.
.................
Bueno, no hay forma de poner el programa escrito. El signo "<" lo interpreta a su manera. No hay manera de poder poner programas en este editor. Solo cabe poner el pantallazo. Es decir, la foto de mi editor.



Aquí abajo pongo en una fotografía de pantalla el mismo programa adaptado a contar letras. Para verlo bien ampliarlo con el ratón:



domingo, 10 de abril de 2011

Arreglando el último programa de Pascal



Hay que perfeccionarse todos los días un poco. Así que aquí está el programa del último día un poco retocadito. ¡Hasta funciona! Lo de arriba es una prueba para ver si se pueden poner así los programas. Y lo de abajo también. Evidentemente, en un editor adecuado se ven las cosas mucho mejor.

program pruf12 (input, output);
var
i:integer;
cantidad:array[1..100] of real;
fecha:packed array[1..100] of string[2];
cpto: array[1..100] of string[30];
c,suma,reman:real;
mes:string[10];

begin
i:=0;
write('Mes actual: ');
readln(mes);
write('Remanente del mes anterior: ');
readln(reman);
repeat
i:=i+1;
writeln('Apunte nº',i);
write('Fecha: '); readln(fecha[i]);
write('Concepto (no metas acentos): '); readln(cpto[i]);
write('Cantidad ingres. o gast. (+/-): ');readln(c);
cantidad[i]:=c;
writeln('-----------');
until c=0;
i:=1;
suma:=reman;
writeln(mes);
writeln('Remanente del mes anterior: ',suma:10:2);
writeln('Fecha Concepto...........Entrada ..Salida ...Saldo.....');
while cantidad[i]<>0 do
begin
suma:= suma + cantidad[i];
write(fecha[i],': ');
write(cpto[i]:15,'...');
if (cantidad[i]>0) then
begin
write(cantidad[i]:10:2);
writeln(suma:20:2);
end
else
begin
write(cantidad[i]:20:2);
writeln(suma:10:2);
end;
i:=i+1;
end;
writeln;
writeln('..........Saldo final: ',suma:29:2);
end.

Y así es como queda la salida:


sábado, 9 de abril de 2011

Perfeccionando el Pascal



Arreglando un poquito el programa del otro día en Pascal. Serviría para una contabilidad doméstica. Un poco la "cuenta de la vieja". Los gastos hay que meterlos como números negativos. Si ponemos acentos o eñes en el concepto nos descabala la salida - que fácilmente se descabala-. Que cada uno lo arregle a su manera.


program pruf12 (input, output);
var
i:integer;
cantidad:array[1..100] of real;
fecha:packed array[1..100] of string[8];
cpto: array[1..100] of string[30];
c,suma:real;

begin
i:=0;
repeat
i:=i+1;
writeln('Apunte nº',i);
write('Fecha: '); readln(fecha[i]);
write('Concepto: '); readln(cpto[i]);
write('Cantidad ingres. o gast. (+/-): '); readln(c);
cantidad[i]:=c;
writeln('-----------');
until c=0;
i:=1;
suma:=0;
writeln('Fecha.... Concepto..........   Caja..... Saldo.....');
while cantidad[i] <> 0 do
begin
suma:= suma + cantidad[i];
write(fecha[i],': ');
write(cpto[i]:15,'...');
write(cantidad[i]:10:2);
writeln(suma:10:2);
i:=i+1;
end;
writeln;
writeln('Saldo final: ',suma:10:2);
end.


La salida sería, por ejemplo, así:
Apunte nº1
Fecha: 01/01/11
Concepto: Sueldo recibido
Cantidad ingres. o gast. (+/-): 1346
-----------
Apunte nº2
Fecha: 11/01/11
Concepto: Alquiler del piso
Cantidad ingres. o gast. (+/-): -670
-----------
Apunte nº3
Fecha: 23/01/11
Concepto: Gastos de alimentacion
Cantidad ingres. o gast. (+/-): -346
-----------
Apunte nº4
Fecha: 
Concepto: 
Cantidad ingres. o gast. (+/-): 0
-----------
Fecha....  Concepto..........      Caja.....    Saldo.....
01/01/11: Sueldo recibido...   1346.00   1346.00
11/01/11: Alquiler del pi...        -670.00     676.00
23/01/11: Gastos de alime...   -346.00     330.00


Saldo final:     330.00

El lenguaje Python


Pues hablando de lenguajes de programación, ahora está de moda el Python. No es un lenguaje como el C o el Pascal. Es un lenguaje interpretado, que en ese sentido se parece a aquel mítico BASIC de nuestra juventud. Pero, al parecer, es muy potente y muy fácil de aprender. Yo empecé ayer mismo, no leí más que cuatro cosas y ya hice algunos programillas. Aquí pongo mi último "parto". Hasta puede ser bueno para hacer concursos, exámenes y otros divertimentos. Desde luego, no es muy sofisticado, pero se puede prolongar todo lo que la memoria dé de sí:

#!/usr/bin/env python2.6
# La linea anterior parece que es necesaria. No utilizar en el programa acentos, enyes o el signo de abrir interrogacion. Parece que te la arma.
count=0
print("Cual es la capital del Principado de Asturias?")
nombre=raw_input()
if (nombre=="Oviedo") or (nombre=="oviedo"):
print "Enhorabuena, has acertado"
print "Efectivamente,",nombre,"es la capital del Principado."
count=count+1
print "Tienes",count,"puntos a tu favor"
else:
print "Lo siento, has perdido"
print nombre, "no es la capital del Principado."
print "Tienes",count,"puntos a tu favor"
#-----------------Comentario---------------------
print "----------------------------"
print "Como se llama el idioma propio de los asturianos?"
idioma=raw_input()
if (idioma=="Bable") or (idioma=="bable"):
print "Enhorabuena, has acertado"
print "Efectivamente, el ",idioma,"es el idioma propio de los asturianos"
count=count+1
print "Tienes",count,"puntos a tu favor"
else:
print "Lo siento, has perdido"
print idioma,"no es el idioma propio de los asturianos"
print "Tienes",count,"puntos a tu favor"

Como se ve. coser y cantar. No hay que andar declarando tipos ni cosas por el estilo. Lo único con lo que hay que andar con cuidado es con las indentaciones, como se ve en las sentencias condicionales.
¿Alguna dirección? Esa de ahí abajo puede ser buena para empezar.
http://mundogeek.net/archivos/2008/01/16/mi-primer-programa-en-python/
o bien, http://www.mclibre.org/consultar/python/index.html
Estos programas se escriben con un editor de texto; yo uso el Gedit de Ubuntu y estoy muy contento con él. Luego se guardan con la extensión .py. Desde la consola hay que poner en GNU Linux la orden chmod +x nombre_programa.py para hacerlo ejecutable. Estos programas no se compilan; en realidad son una serie de órdenes que se dan al intérprete. Luego se ejecuta con ./nombre_programa.py
También se pueden ejecutar paso a paso desde la consola sin más que poner, por ejemplo,  mario@mario-desktop:~$ python
automáticamente entras en Python y empiezas a dar órdenes que se ejecutan inmediatamente. En este sentido es ideal como calculadora superpotente.
Ya seguiremos hablando de Python.

viernes, 8 de abril de 2011

programas en pascal


Hablando de programas en informatica, es bueno ejercitarse en varios lenguajes. El C tiene fama de ser el lenguaje por excelencia, el de los expertos, pues con él se han construido los sistemas operativos, pero no es muy amigable. Parece que el C++ arregló algo eso. Y, desde luego, el Pascal, me parece a mí, es el más elegante, claro y didáctico. Pues nada, por divertirnos solo, voy a poner aquí el último "parto", que acabo de hacer hace unos momentos. Es el clásico problema de sumar una serie de cantidades que le vas dando. Puede resultar hasta útil, pero solo se consideran los ingresos. Otro día lo completamos con las salidas.

program pruf12 (input, output);
var
i,last:integer;
cantidad:array[1..100] of real;
c,suma:real;
begin
i:=0;
repeat
i:=i+1;
write('Dame la cantidad ',i, ': ');
readln(c);
cantidad[i]:=c;
until c=0;
i:=1;
suma:=0;
while cantidad[i]<>0 do
begin
suma:= suma + cantidad[i];
write('Cantidad ingresada: ',cantidad[i]:10:2);
writeln('..... Suma acumulada: ',suma:10:2);
i:=i+1;
end;
writeln;
writeln('Cantidad total ingresada: ',suma:10:2);
end.

Se compila en GNU Linux con gpc nombre.pas -o nombre. En este caso el nombre que yo le he dado es pruf12.pas
Luego se ejecuta con ./nombre
Para terminar de ingresar cantidades se introduce 0.