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]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.

lunes, 14 de marzo de 2011

Un programilla en C


Aquí ponemos un programilla en C, que hemos hecho por divertirnos, por si a alguno le interesa duplicar cualquier altar cúbico, tenga las dimensiones que tenga. :-)

Programa mat1.c
#include < stdio.h >
#include < math.h >
/*Ojo, al compilar con GNU-Linux añadir -lm; es decir gcc mat1.c -o mat1 -lm; mat1 es el nombre del ejecutable. Se ejecuta en la consola con ./mat1 */
double main()
{
double a,h,rc,na;
/*Cálculo del cubo doble; "na", nueva arista; "h", ln de la raiz cúbica de 2, "rc" raiz cúbica de 2, exponencial de h.*/
printf("Deme la longitud de la arista 'a' del cubo: ");
scanf("%lf",&a);
h=(log(2))/3; //También podríamos poner rc=pow(2.0,0.3333)
rc=exp(h);
/*"na", nueva arista, que resulta de multiplicar la primitiva por raíz cúbica de 2 */
na=rc*a;
printf("Nueva arista = %lf\n",na);
printf("Comprobación, el volumen del cubo primitivo valía %lf y el del doble vale %lf\n",pow(a,3), pow(na,3));
return 0;
}
Comentarios: No podemos copiar y pegar el programa sin más; hay algunos caracteres sospechosos que puede no reconocerlos el compilador, como mayor, menor que, <, >, &, que es el ampersand... Quizás necesitemos algunos retoques. A buen entendedor...

La duplicación del volumen del altar II


Nos habíamos quedado con el grave problema de duplicar el volumen del altar, que era un cubo perfecto. Parece ser que uno de los canteros - los canteros eran los ingenieros de entonces - dió enseguida con la solución. "Para alargar una longitud - dijo - yo la multiplico por un número conveniente, mayor que 1 si la quiero alargar y menor que 1 si la quiero acortar". Claro, para ellos un número algo mayor que uno era siempre una fracción porque no manejaban los números decimales como nosotros. De esta manera fueron capaces de plantear esta ecuación, a su manera (no empleaban nuestra misma notación):

(ax)³ = 2a³

a³x³ = 2a³

x³ = 2

x = 2¹/³

Es decir, el número por el que tenían que multiplicar la arista era la raíz cúbica de 2. Naturalmente, no sabían hallar esa raiz. Solo por aproximaciones  sucesivas encontraron el número que podemos obtener ahora con un solo golpe de nuestras calculadoras: 1,25992105... que, por cierto, es un número irracional, algo que a ellos los traía completamente descolocados.
Supongamos, por ejemplo, que el altar fuese un cubo de 1,25 metros de arista. La nueva medida tendría que ser 1,5749 mts. Efectivamente, el altar tenía un volumen de 1,9531 mc. y ahora tendría 3,9062 mc.
Para aquellas mentes se planteó un grave problema: ¿Cómo es posible que existan números que no puedan ser expresados de ninguna manera por un par de números "normales"? El problema ya había aparecido con la diagonal del cuadrado y con la longitud de la circunferencia (o la relación de la longitud con el diámetro). De todos modos aquellos sacerdotes con la ayuda del cantero pudieron tallar un altar que se ajustaba bastante bien a las medidas exigidas por ¿Apolo?, mientras se quedaban muy pensativos sobre lo que el dios les había dado a entender. Habían aparecido magnitudes "incomensurables" entre sí. No era posible medir exactamente, por ejemplo, la diagonal del cuadrado tomando como unidad de medida el lado y partes alícuotas de este, aunque fueran infinitamente pequeñas. Todo un misterio que se cernió sobre las sabias cabezas de los matemáticos durante muchos años. Un misterio que, como suele ocurrir, desencadenó amplios desarrollos más adelante.

viernes, 11 de marzo de 2011

La duplicación del volumen del altar

Vamos a proponer un problema antiguo. En una ocasión un sabio propuso a los sacerdotes de no sé que templo griego el siguiente problema:

El altar del templo es un bloque cúbico, ¿cuánto se tendrían que alargar los lados de ese cubo para que su volumen resultase exactamente el doble?


Los sacerdotes hicieron un altar cúbico con sus lados el doble de largos que el antiguo. El sabio se rió mucho y les dijo que habían decepcionado a su dios, porque el volumen del altar resultaba ahora ocho veces mayor que el antiguo y además era tan grande que ya no servía para nada.
Los sacerdotes plantearon entonces una ecuación que resultaba ser así:

(a+x)³ = 2a³

Pero cuando se pusieron a resolver esa ecuación se encontraron con dificultades insalvables. Efectivamente:

a³ + 3a² x + 3ax² + x³ = 2a³
x³ + 3ax² + 3a²x - a³ = 0

Entonces pensaron dar a a un valor determinado, puesto que representa la longitud conocida de la arista del primitivo cubo, por ejemplo, 1. Pero aun así, la ecuación resultaba insoluble para ellos:

x³ + 3x² + 3x -1 = 0

¿Cómo se puede plantear la ecuación para que resulte sumamente fácil su solución?
La solución mañana.



domingo, 9 de enero de 2011

Algunos problemas más


 "Una columna de soldados marcha a una velocidad de 5 Km/hora. Un enlace a caballo va desde la cabeza de la columna hasta el final de la misma y regresa inmediatamente, empleando un tiempo total de 10 minutos. Suponiendo que la velocidad del enlace es de 10 Km/hora, hallar la longitud de la columna". 

Solución:
Cuando el enlace camina en contra de la columna habrá recorrido la longitud de la misma menos lo que ésta haya avanzado, y cuando camina con la columna, rebasándola, habrá recorrido la longitud de la misma más lo que ésta, en ese mismo intervalo de tiempo, haya avanzado. Total, si 
v1 es la velocidad del enlace y t el tiempo que tarda en alcanzar la retaguardia, v2 la velocidad de la columna, t' = 10 minutos - t, el tiempo del viaje de regreso, y x la longitud de la columna tendremos:
x=v1*t + v2*t

x= v1*t' - v2*t'
por lo tanto,
v1*t + v2*t = v1*t' - v2*t' 
es decir,
 10*t + 5*t = 10*(1/6 - t) - 5*(1/6 - t)

Resolviendo para 
(1/24 horas) y sustituyendo en cualquiera de los dos miembros, puesto que ambos expresan la longitud de la columna, esta resulta ser de 5/8 de kilómetro. Lo de 1/6 es la manera de convertir 10 minutos en horas para que case con las velocidades expresadas en Kms/hora.

 "Se dispone de 4 litros de una solución anticongelante de agua y glicerina al 10%. Hallar el número de litros de solución que se deben reemplazar por igual cantidad de glicerina para que la solución resultante sea del 25%. Los tantos por ciento son en volumen".

Solución:
¿Qué cantidad de glicerina tenemos en la solución final?: La que había, menos la sustraída, más la añadida; es decir: (0,10)(4) - (0,10)*x + x = (0,25)(4).

"Un mineral de oro y cuarzo tiene una masa de 100 gramos. La densidad del oro es de 19,3, la del cuarzo 2,6 y la del mineral 6,4 (gramos por centímetro cúbico). Hallar la masa de oro que contiene el mineral". 

Solución:
Sabiendo que la densidad se define como masa /volumen, es decir, d=m/V, => V=m/d. El volumen de la muestra es igual a la suma de los volúmenes del oro y del cuarzo (suponiendo que no haya más elementos). Como la densidad se define como el cociente de la masa por el volumen (d=m/V), entonces V=m/d. Planteamos la ecuación:
x/do + (m-x)/dc = m/dm

donde x es la cantidad de oro, do la densidad del oro, dc la del cuarzo, dm la de la muestra y m la masa de la muestra.
Como tenemos datos: 
x/19.3 + (100 - x)/2.6 = 100/6.4

Ver los datos hace unos días. Se resuelve y da 68.5 gramos de oro,